From 144739017e0ac5f506659f78dd32ff7d7283032a Mon Sep 17 00:00:00 2001 From: mkirsz <s1351949@sms.ed.ac.uk> Date: Sun, 22 Dec 2024 07:21:38 +0000 Subject: [PATCH] introduced rfidx --- include/tadah/models/descriptors/dm/dm_base.h | 3 ++ .../tadah/models/descriptors/dm/dm_mEAD.hpp | 8 ++-- .../tadah/models/descriptors/dm/dm_mjoin.h | 1 + src/dm_base.cpp | 2 + src/dm_blip.cpp | 8 ++-- src/dm_ead.cpp | 8 ++-- src/dm_eam.cpp | 12 +++--- src/dm_mjoin.cpp | 37 ++++++++----------- 8 files changed, 40 insertions(+), 39 deletions(-) diff --git a/include/tadah/models/descriptors/dm/dm_base.h b/include/tadah/models/descriptors/dm/dm_base.h index 276404e..03ca072 100644 --- a/include/tadah/models/descriptors/dm/dm_base.h +++ b/include/tadah/models/descriptors/dm/dm_base.h @@ -11,6 +11,7 @@ class DM_Base: public D_Base { protected: + size_t rfidx=0; size_t rhoisize=0; public: DM_Base() {}; @@ -125,5 +126,7 @@ public: return s; } virtual std::string label()=0; + virtual size_t get_rfidx(); + virtual void set_rfidx(size_t fidx_); }; #endif diff --git a/include/tadah/models/descriptors/dm/dm_mEAD.hpp b/include/tadah/models/descriptors/dm/dm_mEAD.hpp index 2ff8f72..9c1dc12 100644 --- a/include/tadah/models/descriptors/dm/dm_mEAD.hpp +++ b/include/tadah/models/descriptors/dm/dm_mEAD.hpp @@ -56,7 +56,7 @@ void DM_mEAD<F>::calc_aed( aed_type &aed) { size_t Lshift = 0; - size_t ii=0; + size_t ii=rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const double f = fac[L][o]; @@ -92,7 +92,7 @@ void DM_mEAD<F>::calc_dXijdri_dXjidri( double fc_ij = fcut->calc(rij); double fcp_ij = fcut->calc_prime(rij); - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -185,7 +185,7 @@ void DM_mEAD<F>::calc_dXijdri( size_t Lshift = 0; - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -258,7 +258,7 @@ void DM_mEAD<F>::calc_rho( rho_type& rhoi, const double scale) { - size_t ii=0; + size_t ii=rfidx; double fc_ij = scale*weights[Zj]*fcut->calc(rij); for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { diff --git a/include/tadah/models/descriptors/dm/dm_mjoin.h b/include/tadah/models/descriptors/dm/dm_mjoin.h index 5dd7656..164adf9 100644 --- a/include/tadah/models/descriptors/dm/dm_mjoin.h +++ b/include/tadah/models/descriptors/dm/dm_mjoin.h @@ -85,6 +85,7 @@ public: rho_type& rho, const double scale=1) override; void set_fidx(size_t fidx_) override; + void set_rfidx(size_t rfidx_) override; void init() override; }; diff --git a/src/dm_base.cpp b/src/dm_base.cpp index a76605d..7fe63ac 100644 --- a/src/dm_base.cpp +++ b/src/dm_base.cpp @@ -1 +1,3 @@ #include <tadah/models/descriptors/dm/dm_base.h> +void DM_Base::set_rfidx(size_t rfidx_) { rfidx=rfidx_; } +size_t DM_Base::get_rfidx() { return rfidx; } diff --git a/src/dm_blip.cpp b/src/dm_blip.cpp index 4748b69..f75dc44 100644 --- a/src/dm_blip.cpp +++ b/src/dm_blip.cpp @@ -47,7 +47,7 @@ void DM_Blip::calc_aed( aed_type &aed) { size_t Lshift = 0; - size_t ii=0; + size_t ii=rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const double f = fac[L][o]; @@ -82,7 +82,7 @@ void DM_Blip::calc_dXijdri_dXjidri( size_t Lshift = 0; - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -173,7 +173,7 @@ void DM_Blip::calc_dXijdri( size_t Lshift = 0; - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -243,7 +243,7 @@ void DM_Blip::calc_rho( rho_type& rhoi, const double scale) { - size_t ii=0; + size_t ii=rfidx; double fc_ij = scale*weights[Zj]*fcut->calc(rij); for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { diff --git a/src/dm_ead.cpp b/src/dm_ead.cpp index 08bd5c5..c241da9 100644 --- a/src/dm_ead.cpp +++ b/src/dm_ead.cpp @@ -54,7 +54,7 @@ void DM_EAD::calc_aed( aed_type &aed) { size_t Lshift = 0; - size_t ii=0; + size_t ii=rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const double f = fac[L][o]; @@ -89,7 +89,7 @@ void DM_EAD::calc_dXijdri_dXjidri( size_t Lshift = 0; - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -181,7 +181,7 @@ void DM_EAD::calc_dXijdri( size_t Lshift = 0; - size_t ii=rhoisize; + size_t ii=rhoisize+rfidx; for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { const int lx = orbitals[L][o][0]; @@ -251,7 +251,7 @@ void DM_EAD::calc_rho( rho_type& rhoi, const double scale) { - size_t ii=0; + size_t ii=rfidx; double fc_ij = scale*weights[Zj]*fcut->calc(rij); for (int L=0; L<=Lmax; ++L) { for (size_t o=0; o<orbitals[L].size(); ++o) { diff --git a/src/dm_eam.cpp b/src/dm_eam.cpp index e8878e9..94c0c48 100644 --- a/src/dm_eam.cpp +++ b/src/dm_eam.cpp @@ -39,7 +39,7 @@ void DM_EAM::calc_aed( aed_type &aed) { //std::cout << "rho[i]: " << rho(0) << std::endl; - double p = rho(0)*ef.rdrho + 1.0; + double p = rho(rfidx)*ef.rdrho + 1.0; int m = static_cast<int> (p); m = std::max(1,std::min(m,ef.nrho-1)); p -= m; @@ -47,10 +47,10 @@ void DM_EAM::calc_aed( //std::vector<double> coeff = frho_spline[m]; double phi = ((frho_spline[m][3]*p + frho_spline[m][4])*p + frho_spline[m][5])*p + frho_spline[m][6]; - rho(1) = (frho_spline[m][0]*p + frho_spline[m][1])*p + frho_spline[m][2]; // lammps fp[i] + rho(1+rfidx) = (frho_spline[m][0]*p + frho_spline[m][1])*p + frho_spline[m][2]; // lammps fp[i] //std::cout << "fp[i]: " << rho(1) << std::endl; - if (rho(0) > ef.rhomax) phi += rho(1) * (rho(0)-ef.rhomax); + if (rho(rfidx) > ef.rhomax) phi += rho(1+rfidx) * (rho(rfidx)-ef.rhomax); //phi *= scale[type[i]][type[i]]; aed(fidx) += phi; @@ -80,7 +80,7 @@ void DM_EAM::calc_dXijdri_dXjidri( // here rho_i[1] is a derivative of rho_i at local atom, similarly for rho_j //double psip = rho_i[1]*rhojp + rho_j[1]*rhoip; - double psip = rhoi(1)*rhojp + rhoj(1)*rhoip; + double psip = rhoi(rfidx+1)*rhojp + rhoj(rfidx+1)*rhoip; double f = scale*psip*rinv; fd_ij(fidx,0) = f*vec_ij[0]; @@ -107,7 +107,7 @@ void DM_EAM::calc_dXijdri( double rhojp = (rhor_spline[m][0]*p + rhor_spline[m][1])*p + rhor_spline[m][2]; // here rho_i[1] is a derivative of rho_i at local atom - double psip = rhoi(1)*rhojp; + double psip = rhoi(rfidx+1)*rhojp; double f = scale*psip*rinv; fd_ij(fidx,0) = f*vec_ij[0]; @@ -207,7 +207,7 @@ void DM_EAM::calc_rho( p -= m; p = std::min(p,1.0); std::vector<double> coeff = rhor_spline[m]; - rho(0) += scale*( ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]); + rho(rfidx) += scale*( ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]); } void DM_EAM::init() { diff --git a/src/dm_mjoin.cpp b/src/dm_mjoin.cpp index c9e3eae..7e6a402 100644 --- a/src/dm_mjoin.cpp +++ b/src/dm_mjoin.cpp @@ -18,15 +18,12 @@ DM_mJoin::DM_mJoin(Config &c) : DM_Base(c) { s += ds.back()->size(); rhoisize += ds.back()->rhoi_size(); } + set_rfidx(0); } void DM_mJoin::calc_aed(rho_type& rho, aed_type &aed) { - size_t rho_fidx = 0; for (auto d : ds) { - size_t rho_size = 2 * d->rhoi_size(); - rho_type rho_ptr(&rho[rho_fidx], rho_size, 1); - d->calc_aed(rho_ptr, aed); - rho_fidx += rho_size; + d->calc_aed(rho, aed); } } void DM_mJoin::calc_dXijdri_dXjidri( @@ -39,15 +36,10 @@ void DM_mJoin::calc_dXijdri_dXjidri( rho_type& rhoj, fd_type &fd_ij, const double scale) { - size_t rho_fidx = 0; for (auto d : ds) { - size_t rho_size = 2 * d->rhoi_size(); if (d->is_init_for_atoms(Zi,Zj) && rij < d->get_rcut()) { - rho_type rhoi_ptr(&rhoi[rho_fidx],rho_size); - rho_type rhoj_ptr(&rhoj[rho_fidx],rho_size); - d->calc_dXijdri_dXjidri(Zi,Zj,rij,rij_sq,vec_ij,rhoi_ptr,rhoj_ptr,fd_ij,scale); + d->calc_dXijdri_dXjidri(Zi,Zj,rij,rij_sq,vec_ij,rhoi,rhoj,fd_ij,scale); } - rho_fidx += rho_size; } } void DM_mJoin::calc_dXijdri( @@ -59,14 +51,10 @@ void DM_mJoin::calc_dXijdri( rho_type& rhoi, fd_type &fd_ij, const double scale) { - size_t rho_fidx = 0; for (auto d : ds) { - size_t rho_size = 2 * d->rhoi_size(); if (d->is_init_for_atoms(Zi,Zj) && rij < d->get_rcut()) { - rho_type rhoi_ptr(&rhoi[rho_fidx],rho_size); - d->calc_dXijdri(Zi,Zj,rij,rij_sq,vec_ij,rhoi_ptr,fd_ij,scale); + d->calc_dXijdri(Zi,Zj,rij,rij_sq,vec_ij,rhoi,fd_ij,scale); } - rho_fidx += rho_size; } } void DM_mJoin::init_rhoi(rho_type& rhoi) { @@ -81,14 +69,10 @@ void DM_mJoin::calc_rho( const Vec3d &vec_ij, rho_type& rho, const double scale) { - size_t rho_fidx = 0; for (auto d : ds) { - size_t rho_size = 2 * d->rhoi_size(); if (d->is_init_for_atoms(Zi,Zj) && rij < d->get_rcut()) { - rho_type rho_ptr(&rho[rho_fidx],rho_size); - d->calc_rho(Zi,Zj,rij,rij_sq,vec_ij,rho_ptr,scale); + d->calc_rho(Zi,Zj,rij,rij_sq,vec_ij,rho,scale); } - rho_fidx += rho_size; } } std::string DM_mJoin::label() { @@ -96,6 +80,7 @@ std::string DM_mJoin::label() { } void DM_mJoin::set_fidx(size_t fidx_) { + fidx = fidx_; ds[0]->set_fidx(fidx_); size_t s = 0; for (size_t i = 1; i < ds.size(); ++i) { @@ -103,6 +88,16 @@ void DM_mJoin::set_fidx(size_t fidx_) { ds[i]->set_fidx(fidx_ + s); } } +void DM_mJoin::set_rfidx(size_t rfidx_) { + rfidx = rfidx_; + ds[0]->set_rfidx(rfidx_); + size_t s = 0; + for (size_t i = 1; i < ds.size(); ++i) { + s += ds[i - 1]->rhoi_size(); + s += ds[i - 1]->rhoip_size(); + ds[i]->set_rfidx(rfidx_ + s); + } +} void DM_mJoin::init() { // not really sure about this -- GitLab