From b6f98244dcac749f8b46159b548cde577e225f3c Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 11:28:17 -0700 Subject: [PATCH 01/21] Fix out of bounds access in pair_vashishta_kokkos with skip list --- src/KOKKOS/pair_sw_kokkos.cpp | 2 +- src/KOKKOS/pair_vashishta_kokkos.cpp | 61 ++++++++++++++-------------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index 679d022437..db7320623d 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -47,7 +47,6 @@ PairSWKokkos::PairSWKokkos(LAMMPS *lmp) : PairSW(lmp) { respa_enable = 0; - kokkosable = 1; atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; @@ -138,6 +137,7 @@ void PairSWKokkos::compute(int eflag_in, int vflag_in) } if ((int)d_numneigh_short.extent(0) < ignum) d_numneigh_short = Kokkos::View("SW::numneighs_short",ignum*1.2); + Kokkos::parallel_for(Kokkos::RangePolicy(0,inum), *this); // loop over neighbor list of my atoms diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp index aa8cb550c7..0bb2b49ece 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.cpp +++ b/src/KOKKOS/pair_vashishta_kokkos.cpp @@ -117,24 +117,23 @@ void PairVashishtaKokkos::compute(int eflag_in, int vflag_in) EV_FLOAT ev; EV_FLOAT ev_all; + // build short neighbor list + int max_neighs = d_neighbors.extent(1); - if (((int)d_neighbors_short_2body.extent(1) != max_neighs) || - ((int)d_neighbors_short_2body.extent(0) != ignum)) { - d_neighbors_short_2body = Kokkos::View("Vashishta::neighbors_short_2body",ignum,max_neighs); - } - if ((int)d_numneigh_short_2body.extent(0)!=ignum) { - d_numneigh_short_2body = Kokkos::View("Vashishta::numneighs_short_2body",ignum); + if (((int)d_neighbors_short_2body.extent(1) < max_neighs) || + ((int)d_neighbors_short_2body.extent(0) < ignum)) { + d_neighbors_short_2body = Kokkos::View("Vashishta::neighbors_short_2body",ignum*1.2,max_neighs); } + if ((int)d_numneigh_short_2body.extent(0) < ignum) + d_numneigh_short_2body = Kokkos::View("Vashishta::numneighs_short_2body",ignum*1.2); - if (((int)d_neighbors_short_3body.extent(1) != max_neighs) || - ((int)d_neighbors_short_3body.extent(0) != ignum)) { - d_neighbors_short_3body = Kokkos::View("Vashishta::neighbors_short_3body",ignum,max_neighs); - } - - if ((int)d_numneigh_short_3body.extent(0)!=ignum) { - d_numneigh_short_3body = Kokkos::View("Vashishta::numneighs_short_3body",ignum); + if (((int)d_neighbors_short_3body.extent(1) < max_neighs) || + ((int)d_neighbors_short_3body.extent(0) < ignum)) { + d_neighbors_short_3body = Kokkos::View("Vashishta::neighbors_short_3body",ignum*1.2,max_neighs); } + if ((int)d_numneigh_short_3body.extent(0) < ignum) + d_numneigh_short_3body = Kokkos::View("Vashishta::numneighs_short_3body",ignum*1.2); Kokkos::parallel_for(Kokkos::RangePolicy(0,neighflag==FULL?ignum:inum), *this); @@ -217,17 +216,17 @@ void PairVashishtaKokkos::operator()(TagPairVashishtaComputeShortNei const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; if (rsq < d_params[ijparam].cutsq) { - d_neighbors_short_2body(i,inside_2body) = j; + d_neighbors_short_2body(ii,inside_2body) = j; inside_2body++; } if (rsq < d_params[ijparam].cutsq2) { - d_neighbors_short_3body(i,inside_3body) = j; + d_neighbors_short_3body(ii,inside_3body) = j; inside_3body++; } } - d_numneigh_short_2body(i) = inside_2body; - d_numneigh_short_3body(i) = inside_3body; + d_numneigh_short_2body(ii) = inside_2body; + d_numneigh_short_3body(ii) = inside_3body; } template @@ -252,14 +251,14 @@ void PairVashishtaKokkos::operator()(TagPairVashishtaComputeHalf::operator()(TagPairVashishtaComputeHalf::operator()(TagPairVashishtaComputeHalf::operator()(TagPairVashishtaComputeFullA::operator()(TagPairVashishtaComputeFullA::operator()(TagPairVashishtaComputeFullA::operator()(TagPairVashishtaComputeFullB= nlocal) continue; const int jtype = d_map[type[j]]; @@ -502,10 +501,10 @@ void PairVashishtaKokkos::operator()(TagPairVashishtaComputeFullB Date: Fri, 27 Jan 2023 11:28:41 -0700 Subject: [PATCH 02/21] Fix memory leak in Kokkos ReaxFF --- src/KOKKOS/fix_qeq_reaxff_kokkos.cpp | 2 -- src/KOKKOS/pair_reaxff_kokkos.cpp | 22 ++++++------ src/REAXFF/reaxff_allocate.cpp | 50 ++++++++++++++-------------- src/REAXFF/reaxff_api.h | 2 +- src/REAXFF/reaxff_list.cpp | 24 ++++++------- src/REAXFF/reaxff_lookup.cpp | 36 ++++++++++---------- src/REAXFF/reaxff_tool_box.cpp | 11 ++---- 7 files changed, 70 insertions(+), 77 deletions(-) diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index 40828013ed..386dba6d1d 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -175,8 +175,6 @@ void FixQEqReaxFFKokkos::init_hist() template void FixQEqReaxFFKokkos::setup_pre_force(int vflag) { - //neighbor->build_one(list); - pre_force(vflag); } diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 0bfcef90cf..d4f41f1242 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -184,6 +184,8 @@ void PairReaxFFKokkos::init_style() if (neighflag == FULL) error->all(FLERR,"Must use half neighbor list with pair style reaxff/kk"); + need_dup = lmp->kokkos->need_dup(); + allocate(); setup(); init_md(); @@ -197,6 +199,8 @@ void PairReaxFFKokkos::setup() int i,j,k,m; int n = atom->ntypes; + setup_flag = 1; + // general parameters for (i = 0; i < 39; i ++) gp[i] = api->system->reax_param.gp.l[i]; @@ -577,17 +581,17 @@ void PairReaxFFKokkos::Deallocate_Lookup_Tables() for (j = i; j <= ntypes; ++j) { if (map[i] == -1) continue; if (LR[i][j].n) { - sfree(api->control->error_ptr, LR[i][j].y, "LR[i,j].y"); - sfree(api->control->error_ptr, LR[i][j].H, "LR[i,j].H"); - sfree(api->control->error_ptr, LR[i][j].vdW, "LR[i,j].vdW"); - sfree(api->control->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd"); - sfree(api->control->error_ptr, LR[i][j].ele, "LR[i,j].ele"); - sfree(api->control->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb"); + sfree(LR[i][j].y, "LR[i,j].y"); + sfree(LR[i][j].H, "LR[i,j].H"); + sfree(LR[i][j].vdW, "LR[i,j].vdW"); + sfree(LR[i][j].CEvd, "LR[i,j].CEvd"); + sfree(LR[i][j].ele, "LR[i,j].ele"); + sfree(LR[i][j].CEclmb, "LR[i,j].CEclmb"); } } - sfree(api->control->error_ptr, LR[i], "LR[i]"); + sfree(LR[i], "LR[i]"); } - sfree(api->control->error_ptr, LR, "LR"); + sfree(LR, "LR"); } /* ---------------------------------------------------------------------- */ @@ -738,8 +742,6 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) } } - need_dup = lmp->kokkos->need_dup(); - // allocate duplicated memory if (need_dup) { dup_f = Kokkos::Experimental::create_scatter_view(f); diff --git a/src/REAXFF/reaxff_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp index 16b71d041c..bea4147d22 100644 --- a/src/REAXFF/reaxff_allocate.cpp +++ b/src/REAXFF/reaxff_allocate.cpp @@ -66,7 +66,7 @@ namespace ReaxFF { auto memory = system->mem_ptr; // deallocate the atom list - sfree(error, system->my_atoms, "system->my_atoms"); + sfree(system->my_atoms, "system->my_atoms"); // deallocate the ffield parameters storage memory->destroy(system->reax_param.gp.l); @@ -87,36 +87,36 @@ namespace ReaxFF { auto error = control->error_ptr; /* bond order storage */ - sfree(error, workspace->total_bond_order, "total_bo"); - sfree(error, workspace->Deltap, "Deltap"); - sfree(error, workspace->Deltap_boc, "Deltap_boc"); - sfree(error, workspace->dDeltap_self, "dDeltap_self"); - sfree(error, workspace->Delta, "Delta"); - sfree(error, workspace->Delta_lp, "Delta_lp"); - sfree(error, workspace->Delta_lp_temp, "Delta_lp_temp"); - sfree(error, workspace->dDelta_lp, "dDelta_lp"); - sfree(error, workspace->dDelta_lp_temp, "dDelta_lp_temp"); - sfree(error, workspace->Delta_e, "Delta_e"); - sfree(error, workspace->Delta_boc, "Delta_boc"); - sfree(error, workspace->Delta_val, "Delta_val"); - sfree(error, workspace->nlp, "nlp"); - sfree(error, workspace->nlp_temp, "nlp_temp"); - sfree(error, workspace->Clp, "Clp"); - sfree(error, workspace->vlpex, "vlpex"); - sfree(error, workspace->bond_mark, "bond_mark"); + sfree(workspace->total_bond_order, "total_bo"); + sfree(workspace->Deltap, "Deltap"); + sfree(workspace->Deltap_boc, "Deltap_boc"); + sfree(workspace->dDeltap_self, "dDeltap_self"); + sfree(workspace->Delta, "Delta"); + sfree(workspace->Delta_lp, "Delta_lp"); + sfree(workspace->Delta_lp_temp, "Delta_lp_temp"); + sfree(workspace->dDelta_lp, "dDelta_lp"); + sfree(workspace->dDelta_lp_temp, "dDelta_lp_temp"); + sfree(workspace->Delta_e, "Delta_e"); + sfree(workspace->Delta_boc, "Delta_boc"); + sfree(workspace->Delta_val, "Delta_val"); + sfree(workspace->nlp, "nlp"); + sfree(workspace->nlp_temp, "nlp_temp"); + sfree(workspace->Clp, "Clp"); + sfree(workspace->vlpex, "vlpex"); + sfree(workspace->bond_mark, "bond_mark"); /* force related storage */ - sfree(error, workspace->f, "f"); - sfree(error, workspace->CdDelta, "CdDelta"); + sfree(workspace->f, "f"); + sfree(workspace->CdDelta, "CdDelta"); /* reductions */ if (workspace->CdDeltaReduction) - sfree(error, workspace->CdDeltaReduction, "cddelta_reduce"); + sfree(workspace->CdDeltaReduction, "cddelta_reduce"); if (workspace->forceReduction) - sfree(error, workspace->forceReduction, "f_reduce"); + sfree(workspace->forceReduction, "f_reduce"); if (workspace->valence_angle_atom_myoffset) - sfree(error, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + sfree(workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); } void Allocate_Workspace(control_params *control, storage *workspace, int total_cap) @@ -206,7 +206,7 @@ namespace ReaxFF { if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) - sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); Delete_List(bonds); Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds); @@ -292,7 +292,7 @@ namespace ReaxFF { reax_list *bonds = (*lists)+BONDS; for (int i = 0; i < bonds->num_intrs; ++i) { - sfree(error, bonds->select.bond_list[i].bo_data.CdboReduction, + sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); bonds->select.bond_list[i].bo_data.CdboReduction = diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index d6a0410622..ede99bfd73 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -142,7 +142,7 @@ extern void Reset_Workspace(reax_system *, storage *); extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const std::string &); extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const std::string &); -extern void sfree(LAMMPS_NS::Error *, void *, const std::string &); +extern void sfree(void *, const std::string &); // torsion angles diff --git a/src/REAXFF/reaxff_list.cpp b/src/REAXFF/reaxff_list.cpp index 79d96bb9d9..50be12a0c9 100644 --- a/src/REAXFF/reaxff_list.cpp +++ b/src/REAXFF/reaxff_list.cpp @@ -39,8 +39,8 @@ namespace ReaxFF { l->n = n; l->num_intrs = num_intrs; - if (l->index) sfree(l->error_ptr, l->index, "list:index"); - if (l->end_index) sfree(l->error_ptr, l->end_index, "list:end_index"); + if (l->index) sfree(l->index, "list:index"); + if (l->end_index) sfree(l->end_index, "list:end_index"); l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index"); l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index"); @@ -48,26 +48,26 @@ namespace ReaxFF { switch(l->type) { case TYP_THREE_BODY: - if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); + if (l->select.three_body_list) sfree(l->select.three_body_list,"list:three_bodies"); l->select.three_body_list = (three_body_interaction_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(three_body_interaction_data), "list:three_bodies"); break; case TYP_BOND: - if (l->select.bond_list) sfree(l->error_ptr, l->select.bond_list,"list:bonds"); + if (l->select.bond_list) sfree(l->select.bond_list,"list:bonds"); l->select.bond_list = (bond_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(bond_data), "list:bonds"); break; case TYP_FAR_NEIGHBOR: - if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); + if (l->select.far_nbr_list) sfree(l->select.far_nbr_list,"list:far_nbrs"); l->select.far_nbr_list = (far_neighbor_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(far_neighbor_data), "list:far_nbrs"); break; case TYP_HBOND: - if (l->select.hbond_list) sfree(l->error_ptr, l->select.hbond_list,"list:hbonds"); + if (l->select.hbond_list) sfree(l->select.hbond_list,"list:hbonds"); l->select.hbond_list = (hbond_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(hbond_data), "list:hbonds"); break; @@ -83,26 +83,26 @@ namespace ReaxFF { return; l->allocated = 0; - sfree(l->error_ptr, l->index, "list:index"); - sfree(l->error_ptr, l->end_index, "list:end_index"); + sfree(l->index, "list:index"); + sfree(l->end_index, "list:end_index"); l->index = nullptr; l->end_index = nullptr; switch(l->type) { case TYP_HBOND: - sfree(l->error_ptr, l->select.hbond_list, "list:hbonds"); + sfree(l->select.hbond_list, "list:hbonds"); l->select.hbond_list = nullptr; break; case TYP_FAR_NEIGHBOR: - sfree(l->error_ptr, l->select.far_nbr_list, "list:far_nbrs"); + sfree(l->select.far_nbr_list, "list:far_nbrs"); l->select.far_nbr_list = nullptr; break; case TYP_BOND: - sfree(l->error_ptr, l->select.bond_list, "list:bonds"); + sfree(l->select.bond_list, "list:bonds"); l->select.bond_list = nullptr; break; case TYP_THREE_BODY: - sfree(l->error_ptr, l->select.three_body_list, "list:three_bodies"); + sfree(l->select.three_body_list, "list:three_bodies"); l->select.three_body_list = nullptr; break; diff --git a/src/REAXFF/reaxff_lookup.cpp b/src/REAXFF/reaxff_lookup.cpp index 6471f1e6e2..3a0fa6f6ae 100644 --- a/src/REAXFF/reaxff_lookup.cpp +++ b/src/REAXFF/reaxff_lookup.cpp @@ -90,11 +90,11 @@ namespace ReaxFF { coef[i-1].a = f[i]; } - sfree(error_ptr, a, "cubic_spline:a"); - sfree(error_ptr, b, "cubic_spline:b"); - sfree(error_ptr, c, "cubic_spline:c"); - sfree(error_ptr, d, "cubic_spline:d"); - sfree(error_ptr, v, "cubic_spline:v"); + sfree(a, "cubic_spline:a"); + sfree(b, "cubic_spline:b"); + sfree(c, "cubic_spline:c"); + sfree(d, "cubic_spline:d"); + sfree(v, "cubic_spline:v"); } void Complete_Cubic_Spline(LAMMPS_NS::Error* error_ptr, const double *h, @@ -138,11 +138,11 @@ namespace ReaxFF { coef[i-1].a = f[i]; } - sfree(error_ptr, a, "cubic_spline:a"); - sfree(error_ptr, b, "cubic_spline:b"); - sfree(error_ptr, c, "cubic_spline:c"); - sfree(error_ptr, d, "cubic_spline:d"); - sfree(error_ptr, v, "cubic_spline:v"); + sfree(a, "cubic_spline:a"); + sfree(b, "cubic_spline:b"); + sfree(c, "cubic_spline:c"); + sfree(d, "cubic_spline:d"); + sfree(v, "cubic_spline:v"); } void Init_Lookup_Tables(reax_system *system, control_params *control, @@ -276,16 +276,16 @@ namespace ReaxFF { for (i = 0; i < ntypes; ++i) { for (j = i; j < ntypes; ++j) if (LR[i][j].n) { - sfree(system->error_ptr, LR[i][j].y, "LR[i,j].y"); - sfree(system->error_ptr, LR[i][j].H, "LR[i,j].H"); - sfree(system->error_ptr, LR[i][j].vdW, "LR[i,j].vdW"); - sfree(system->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd"); - sfree(system->error_ptr, LR[i][j].ele, "LR[i,j].ele"); - sfree(system->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb"); + sfree(LR[i][j].y, "LR[i,j].y"); + sfree(LR[i][j].H, "LR[i,j].H"); + sfree(LR[i][j].vdW, "LR[i,j].vdW"); + sfree(LR[i][j].CEvd, "LR[i,j].CEvd"); + sfree(LR[i][j].ele, "LR[i,j].ele"); + sfree(LR[i][j].CEclmb, "LR[i,j].CEclmb"); } - sfree(system->error_ptr, LR[i], "LR[i]"); + sfree(LR[i], "LR[i]"); } - sfree(system->error_ptr, LR, "LR"); + sfree(LR, "LR"); } } diff --git a/src/REAXFF/reaxff_tool_box.cpp b/src/REAXFF/reaxff_tool_box.cpp index 5ebed0360e..bcd061dbc6 100644 --- a/src/REAXFF/reaxff_tool_box.cpp +++ b/src/REAXFF/reaxff_tool_box.cpp @@ -96,16 +96,9 @@ void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const st } /* safe free */ -void sfree(LAMMPS_NS::Error *error_ptr, void *ptr, const std::string &name) +void sfree(void *ptr, const std::string &name) { - if (ptr == nullptr) { - auto errmsg = std::string("Trying to free the already free()'d pointer: ") + name; - if (error_ptr) - error_ptr->one(FLERR, errmsg); - else - fputs(errmsg.c_str(), stderr); - return; - } + if (ptr == nullptr) return; free(ptr); ptr = nullptr; From b954c3ef860cbfd1347706680d3b991f2b25b4c7 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 11:29:02 -0700 Subject: [PATCH 03/21] Fix memory leak in pair_lj_cut_kokkos --- src/KOKKOS/pair_lj_cut_kokkos.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/KOKKOS/pair_lj_cut_kokkos.cpp b/src/KOKKOS/pair_lj_cut_kokkos.cpp index c6353cc083..5cff54a440 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp @@ -130,6 +130,7 @@ void PairLJCutKokkos::compute(int eflag_in, int vflag_in) if (vflag_fdotr) pair_virial_fdotr_compute(this); + copymode = 0; } template From a31af4f46e60a05a5fa6a0469dfbadc508d4423e Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 12:28:21 -0700 Subject: [PATCH 04/21] Fix compile for OPENMP, remove unused var --- src/KOKKOS/pair_reaxff_kokkos.cpp | 16 +++++----- src/OPENMP/pair_reaxff_omp.cpp | 2 +- src/REAXFF/reaxff_allocate.cpp | 51 +++++++++++++++---------------- src/REAXFF/reaxff_api.h | 2 +- src/REAXFF/reaxff_list.cpp | 24 +++++++-------- src/REAXFF/reaxff_lookup.cpp | 36 +++++++++++----------- src/REAXFF/reaxff_tool_box.cpp | 2 +- 7 files changed, 66 insertions(+), 67 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index d4f41f1242..5b5e1fbbea 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -581,17 +581,17 @@ void PairReaxFFKokkos::Deallocate_Lookup_Tables() for (j = i; j <= ntypes; ++j) { if (map[i] == -1) continue; if (LR[i][j].n) { - sfree(LR[i][j].y, "LR[i,j].y"); - sfree(LR[i][j].H, "LR[i,j].H"); - sfree(LR[i][j].vdW, "LR[i,j].vdW"); - sfree(LR[i][j].CEvd, "LR[i,j].CEvd"); - sfree(LR[i][j].ele, "LR[i,j].ele"); - sfree(LR[i][j].CEclmb, "LR[i,j].CEclmb"); + sfree(LR[i][j].y); + sfree(LR[i][j].H); + sfree(LR[i][j].vdW); + sfree(LR[i][j].CEvd); + sfree(LR[i][j].ele); + sfree(LR[i][j].CEclmb); } } - sfree(LR[i], "LR[i]"); + sfree(LR[i]); } - sfree(LR, "LR"); + sfree(LR); } /* ---------------------------------------------------------------------- */ diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 7ac46b6078..96e6389870 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -93,7 +93,7 @@ PairReaxFFOMP::~PairReaxFFOMP() if (setup_flag) { reax_list * bonds = api->lists+BONDS; for (int i=0; inum_intrs; ++i) - sfree(error, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(bonds->select.bond_list[i].bo_data.CdboReduction); } memory->destroy(num_nbrs_offset); } diff --git a/src/REAXFF/reaxff_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp index bea4147d22..cad86df9e8 100644 --- a/src/REAXFF/reaxff_allocate.cpp +++ b/src/REAXFF/reaxff_allocate.cpp @@ -66,7 +66,7 @@ namespace ReaxFF { auto memory = system->mem_ptr; // deallocate the atom list - sfree(system->my_atoms, "system->my_atoms"); + sfree(system->my_atoms); // deallocate the ffield parameters storage memory->destroy(system->reax_param.gp.l); @@ -87,36 +87,36 @@ namespace ReaxFF { auto error = control->error_ptr; /* bond order storage */ - sfree(workspace->total_bond_order, "total_bo"); - sfree(workspace->Deltap, "Deltap"); - sfree(workspace->Deltap_boc, "Deltap_boc"); - sfree(workspace->dDeltap_self, "dDeltap_self"); - sfree(workspace->Delta, "Delta"); - sfree(workspace->Delta_lp, "Delta_lp"); - sfree(workspace->Delta_lp_temp, "Delta_lp_temp"); - sfree(workspace->dDelta_lp, "dDelta_lp"); - sfree(workspace->dDelta_lp_temp, "dDelta_lp_temp"); - sfree(workspace->Delta_e, "Delta_e"); - sfree(workspace->Delta_boc, "Delta_boc"); - sfree(workspace->Delta_val, "Delta_val"); - sfree(workspace->nlp, "nlp"); - sfree(workspace->nlp_temp, "nlp_temp"); - sfree(workspace->Clp, "Clp"); - sfree(workspace->vlpex, "vlpex"); - sfree(workspace->bond_mark, "bond_mark"); + sfree(workspace->total_bond_order); + sfree(workspace->Deltap); + sfree(workspace->Deltap_boc); + sfree(workspace->dDeltap_self); + sfree(workspace->Delta); + sfree(workspace->Delta_lp); + sfree(workspace->Delta_lp_temp); + sfree(workspace->dDelta_lp); + sfree(workspace->dDelta_lp_temp); + sfree(workspace->Delta_e); + sfree(workspace->Delta_boc); + sfree(workspace->Delta_val); + sfree(workspace->nlp); + sfree(workspace->nlp_temp); + sfree(workspace->Clp); + sfree(workspace->vlpex); + sfree(workspace->bond_mark); /* force related storage */ - sfree(workspace->f, "f"); - sfree(workspace->CdDelta, "CdDelta"); + sfree(workspace->f); + sfree(workspace->CdDelta); /* reductions */ if (workspace->CdDeltaReduction) - sfree(workspace->CdDeltaReduction, "cddelta_reduce"); + sfree(workspace->CdDeltaReduction); if (workspace->forceReduction) - sfree(workspace->forceReduction, "f_reduce"); + sfree(workspace->forceReduction); if (workspace->valence_angle_atom_myoffset) - sfree(workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + sfree(workspace->valence_angle_atom_myoffset); } void Allocate_Workspace(control_params *control, storage *workspace, int total_cap) @@ -206,7 +206,7 @@ namespace ReaxFF { if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) - sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(bonds->select.bond_list[i].bo_data.CdboReduction); Delete_List(bonds); Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds); @@ -292,8 +292,7 @@ namespace ReaxFF { reax_list *bonds = (*lists)+BONDS; for (int i = 0; i < bonds->num_intrs; ++i) { - sfree(bonds->select.bond_list[i].bo_data.CdboReduction, - "CdboReduction"); + sfree(bonds->select.bond_list[i].bo_data.CdboReduction); bonds->select.bond_list[i].bo_data.CdboReduction = (double*) smalloc(error, sizeof(double)*nthreads, "CdboReduction"); diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index ede99bfd73..f2e5aa07da 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -142,7 +142,7 @@ extern void Reset_Workspace(reax_system *, storage *); extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const std::string &); extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const std::string &); -extern void sfree(void *, const std::string &); +extern void sfree(void *); // torsion angles diff --git a/src/REAXFF/reaxff_list.cpp b/src/REAXFF/reaxff_list.cpp index 50be12a0c9..0ff0852a04 100644 --- a/src/REAXFF/reaxff_list.cpp +++ b/src/REAXFF/reaxff_list.cpp @@ -39,8 +39,8 @@ namespace ReaxFF { l->n = n; l->num_intrs = num_intrs; - if (l->index) sfree(l->index, "list:index"); - if (l->end_index) sfree(l->end_index, "list:end_index"); + if (l->index) sfree(l->index); + if (l->end_index) sfree(l->end_index); l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index"); l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index"); @@ -48,26 +48,26 @@ namespace ReaxFF { switch(l->type) { case TYP_THREE_BODY: - if (l->select.three_body_list) sfree(l->select.three_body_list,"list:three_bodies"); + if (l->select.three_body_list) sfree(l->select.three_body_list); l->select.three_body_list = (three_body_interaction_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(three_body_interaction_data), "list:three_bodies"); break; case TYP_BOND: - if (l->select.bond_list) sfree(l->select.bond_list,"list:bonds"); + if (l->select.bond_list) sfree(l->select.bond_list); l->select.bond_list = (bond_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(bond_data), "list:bonds"); break; case TYP_FAR_NEIGHBOR: - if (l->select.far_nbr_list) sfree(l->select.far_nbr_list,"list:far_nbrs"); + if (l->select.far_nbr_list) sfree(l->select.far_nbr_list); l->select.far_nbr_list = (far_neighbor_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(far_neighbor_data), "list:far_nbrs"); break; case TYP_HBOND: - if (l->select.hbond_list) sfree(l->select.hbond_list,"list:hbonds"); + if (l->select.hbond_list) sfree(l->select.hbond_list); l->select.hbond_list = (hbond_data*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(hbond_data), "list:hbonds"); break; @@ -83,26 +83,26 @@ namespace ReaxFF { return; l->allocated = 0; - sfree(l->index, "list:index"); - sfree(l->end_index, "list:end_index"); + sfree(l->index); + sfree(l->end_index); l->index = nullptr; l->end_index = nullptr; switch(l->type) { case TYP_HBOND: - sfree(l->select.hbond_list, "list:hbonds"); + sfree(l->select.hbond_list); l->select.hbond_list = nullptr; break; case TYP_FAR_NEIGHBOR: - sfree(l->select.far_nbr_list, "list:far_nbrs"); + sfree(l->select.far_nbr_list); l->select.far_nbr_list = nullptr; break; case TYP_BOND: - sfree(l->select.bond_list, "list:bonds"); + sfree(l->select.bond_list); l->select.bond_list = nullptr; break; case TYP_THREE_BODY: - sfree(l->select.three_body_list, "list:three_bodies"); + sfree(l->select.three_body_list); l->select.three_body_list = nullptr; break; diff --git a/src/REAXFF/reaxff_lookup.cpp b/src/REAXFF/reaxff_lookup.cpp index 3a0fa6f6ae..c0e7bf2c54 100644 --- a/src/REAXFF/reaxff_lookup.cpp +++ b/src/REAXFF/reaxff_lookup.cpp @@ -90,11 +90,11 @@ namespace ReaxFF { coef[i-1].a = f[i]; } - sfree(a, "cubic_spline:a"); - sfree(b, "cubic_spline:b"); - sfree(c, "cubic_spline:c"); - sfree(d, "cubic_spline:d"); - sfree(v, "cubic_spline:v"); + sfree(a); + sfree(b); + sfree(c); + sfree(d); + sfree(v); } void Complete_Cubic_Spline(LAMMPS_NS::Error* error_ptr, const double *h, @@ -138,11 +138,11 @@ namespace ReaxFF { coef[i-1].a = f[i]; } - sfree(a, "cubic_spline:a"); - sfree(b, "cubic_spline:b"); - sfree(c, "cubic_spline:c"); - sfree(d, "cubic_spline:d"); - sfree(v, "cubic_spline:v"); + sfree(a); + sfree(b); + sfree(c); + sfree(d); + sfree(v); } void Init_Lookup_Tables(reax_system *system, control_params *control, @@ -276,16 +276,16 @@ namespace ReaxFF { for (i = 0; i < ntypes; ++i) { for (j = i; j < ntypes; ++j) if (LR[i][j].n) { - sfree(LR[i][j].y, "LR[i,j].y"); - sfree(LR[i][j].H, "LR[i,j].H"); - sfree(LR[i][j].vdW, "LR[i,j].vdW"); - sfree(LR[i][j].CEvd, "LR[i,j].CEvd"); - sfree(LR[i][j].ele, "LR[i,j].ele"); - sfree(LR[i][j].CEclmb, "LR[i,j].CEclmb"); + sfree(LR[i][j].y); + sfree(LR[i][j].H); + sfree(LR[i][j].vdW); + sfree(LR[i][j].CEvd); + sfree(LR[i][j].ele); + sfree(LR[i][j].CEclmb); } - sfree(LR[i], "LR[i]"); + sfree(LR[i]); } - sfree(LR, "LR"); + sfree(LR); } } diff --git a/src/REAXFF/reaxff_tool_box.cpp b/src/REAXFF/reaxff_tool_box.cpp index bcd061dbc6..22ef299b41 100644 --- a/src/REAXFF/reaxff_tool_box.cpp +++ b/src/REAXFF/reaxff_tool_box.cpp @@ -96,7 +96,7 @@ void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const st } /* safe free */ -void sfree(void *ptr, const std::string &name) +void sfree(void *ptr) { if (ptr == nullptr) return; From 69e7dd9fd680807ef73800c689789881eb9a10ce Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 14:28:40 -0700 Subject: [PATCH 05/21] Change default for pair_modify neigh/trim --- src/pair.cpp | 2 +- src/pair_hybrid_overlay.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pair.cpp b/src/pair.cpp index 5d789fbb9b..92d27266b9 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -97,7 +97,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) tabinner_disp = sqrt(2.0); ftable = nullptr; fdisptable = nullptr; - trim_flag = 1; + trim_flag = 0; allocated = 0; suffix_flag = Suffix::NONE; diff --git a/src/pair_hybrid_overlay.cpp b/src/pair_hybrid_overlay.cpp index 12c84c3a71..9d2df6a65c 100644 --- a/src/pair_hybrid_overlay.cpp +++ b/src/pair_hybrid_overlay.cpp @@ -23,7 +23,9 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairHybridOverlay::PairHybridOverlay(LAMMPS *lmp) : PairHybrid(lmp) {} +PairHybridOverlay::PairHybridOverlay(LAMMPS *lmp) : PairHybrid(lmp) { + trim_flag = 1; +} /* ---------------------------------------------------------------------- set coeffs for one or more type pairs From 0677c1c3f598f4adf88a805b8f8b47a0a49b75f3 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 14:29:00 -0700 Subject: [PATCH 06/21] Fix logic for neigh/trim yes and multiple runs --- src/pair_hybrid.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index efc22dbf4e..b6ce87a6de 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -304,8 +304,6 @@ void PairHybrid::settings(int narg, char **arg) // allocate list of sub-styles as big as possibly needed if no extra args styles = new Pair *[narg]; - cutmax_style = new double[narg]; - memset(cutmax_style, 0.0, narg*sizeof(double)); keywords = new char *[narg]; multiple = new int[narg]; @@ -347,6 +345,9 @@ void PairHybrid::settings(int narg, char **arg) nstyles++; } + cutmax_style = new double[nstyles]; + memset(cutmax_style, 0.0, nstyles*sizeof(double)); + // multiple[i] = 1 to M if sub-style used multiple times, else 0 int num_tip4p = 0, num_coul = 0; // count sub-styles with tip4p and coulomb @@ -582,6 +583,8 @@ void PairHybrid::init_style() { int i,m,itype,jtype,used,istyle,skip; + memset(cutmax_style, 0.0, nstyles*sizeof(double)); + // error if a sub-style is not used int ntypes = atom->ntypes; @@ -750,7 +753,7 @@ double PairHybrid::init_one(int i, int j) cutmax_style[istyle] = cut; for (auto &request : neighbor->get_pair_requests()) { - if (styles[istyle] == request->get_requestor() && styles[istyle]->trim_flag) { + if (styles[istyle] == request->get_requestor()) { request->set_cutoff(cutmax_style[istyle]); break; } From e0f090aa9eca6084d46398631dbcdf755a984b54 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Fri, 27 Jan 2023 14:43:16 -0700 Subject: [PATCH 07/21] Fix invalid memory read, from @akohlmey --- src/REAXFF/reaxff_hydrogen_bonds.cpp | 2 +- src/REAXFF/reaxff_init_md.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/REAXFF/reaxff_hydrogen_bonds.cpp b/src/REAXFF/reaxff_hydrogen_bonds.cpp index 6f5c663da0..421dd7e1a4 100644 --- a/src/REAXFF/reaxff_hydrogen_bonds.cpp +++ b/src/REAXFF/reaxff_hydrogen_bonds.cpp @@ -60,7 +60,7 @@ namespace ReaxFF { hbond_list = hbonds->select.hbond_list; for (j = 0; j < system->n; ++j) - if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { + if ((system->my_atoms[j].type >= 0) && (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1)) { type_j = system->my_atoms[j].type; start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); diff --git a/src/REAXFF/reaxff_init_md.cpp b/src/REAXFF/reaxff_init_md.cpp index 268af75358..55c7a03f7c 100644 --- a/src/REAXFF/reaxff_init_md.cpp +++ b/src/REAXFF/reaxff_init_md.cpp @@ -56,7 +56,7 @@ namespace ReaxFF { if (control->hbond_cut > 0) for (i = 0; i < system->n; ++i) { atom = &(system->my_atoms[i]); - if (system->reax_param.sbp[atom->type].p_hbond == 1 && atom->type >= 0) + if ((atom->type >= 0) && (system->reax_param.sbp[atom->type].p_hbond == 1 && atom->type >= 0)) atom->Hindex = system->numH++; else atom->Hindex = -1; } From 03c8b0ff893021df937bc60c075d0f6dfd4a6bd1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jan 2023 20:42:37 -0500 Subject: [PATCH 08/21] use correct type for memset byte and avoid potential memory leaks --- src/pair_hybrid.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index b6ce87a6de..f05a201e33 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -345,8 +345,9 @@ void PairHybrid::settings(int narg, char **arg) nstyles++; } + delete[] cutmax_style; cutmax_style = new double[nstyles]; - memset(cutmax_style, 0.0, nstyles*sizeof(double)); + memset(cutmax_style, 0, nstyles*sizeof(double)); // multiple[i] = 1 to M if sub-style used multiple times, else 0 @@ -583,7 +584,7 @@ void PairHybrid::init_style() { int i,m,itype,jtype,used,istyle,skip; - memset(cutmax_style, 0.0, nstyles*sizeof(double)); + memset(cutmax_style, 0, nstyles*sizeof(double)); // error if a sub-style is not used @@ -822,8 +823,9 @@ void PairHybrid::read_restart(FILE *fp) delete[] compute_tally; styles = new Pair*[nstyles]; + delete[] cutmax_style; cutmax_style = new double[nstyles]; - memset(cutmax_style, 0.0, nstyles*sizeof(double)); + memset(cutmax_style, 0, nstyles*sizeof(double)); keywords = new char*[nstyles]; multiple = new int[nstyles]; From 7e6333fdd1f5986b138f01ec042b4cb9ae2858c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jan 2023 20:48:32 -0500 Subject: [PATCH 09/21] remove dead code --- src/REAXFF/pair_reaxff.cpp | 2 +- src/REAXFF/reaxff_allocate.cpp | 6 ++---- src/REAXFF/reaxff_api.h | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index d0713308c0..41a55aeca0 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -136,7 +136,7 @@ PairReaxFF::~PairReaxFF() Delete_List(api->lists+THREE_BODIES); Delete_List(api->lists+FAR_NBRS); - DeAllocate_Workspace(api->control, api->workspace); + DeAllocate_Workspace(api->workspace); DeAllocate_System(api->system); } diff --git a/src/REAXFF/reaxff_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp index cad86df9e8..5b0a4e513c 100644 --- a/src/REAXFF/reaxff_allocate.cpp +++ b/src/REAXFF/reaxff_allocate.cpp @@ -62,7 +62,6 @@ namespace ReaxFF { void DeAllocate_System(reax_system *system) { - auto error = system->error_ptr; auto memory = system->mem_ptr; // deallocate the atom list @@ -78,13 +77,12 @@ namespace ReaxFF { } /************* workspace *************/ - void DeAllocate_Workspace(control_params *control, storage *workspace) + void DeAllocate_Workspace(storage *workspace) { if (!workspace->allocated) return; workspace->allocated = 0; - auto error = control->error_ptr; /* bond order storage */ sfree(workspace->total_bond_order); @@ -245,7 +243,7 @@ namespace ReaxFF { system->my_atoms = (reax_atom *)::realloc(system->my_atoms, system->total_cap*sizeof(reax_atom)); /* workspace */ - DeAllocate_Workspace(control, workspace); + DeAllocate_Workspace(workspace); Allocate_Workspace(control, workspace, system->total_cap); } diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index f2e5aa07da..44c0adb9b0 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -41,7 +41,7 @@ struct API { extern void Allocate_Workspace(control_params *, storage *, int); extern void DeAllocate_System(reax_system *); -extern void DeAllocate_Workspace(control_params *, storage *); +extern void DeAllocate_Workspace(storage *); extern void PreAllocate_Space(reax_system *, storage *); extern void ReAllocate(reax_system *, control_params *, simulation_data *, storage *, reax_list **); From 373b578dc02c3c1ed6c7a7e42fd3b77077922aa2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jan 2023 21:39:26 -0500 Subject: [PATCH 10/21] this is already checked for in Input class due to setting one_coeff = 1 --- src/REAXFF/pair_reaxff.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index 41a55aeca0..e1580946fd 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -282,11 +282,6 @@ void PairReaxFF::coeff(int nargs, char **args) if (nargs != 3 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); - // ensure I,J args are * * - - if (strcmp(args[0],"*") != 0 || strcmp(args[1],"*") != 0) - error->all(FLERR,"Incorrect args for pair coefficients"); - // read ffield file Read_Force_Field(args[2], &(api->system->reax_param), api->control, world); From 66e3d8c56420173d6ea20f939fed2809cf80b048 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jan 2023 21:48:31 -0500 Subject: [PATCH 11/21] recover failing unit tests --- src/KOKKOS/pair_reaxff_kokkos.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 5b5e1fbbea..fbd74f24de 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -199,8 +199,6 @@ void PairReaxFFKokkos::setup() int i,j,k,m; int n = atom->ntypes; - setup_flag = 1; - // general parameters for (i = 0; i < 39; i ++) gp[i] = api->system->reax_param.gp.l[i]; From 2e52afbd86a80fea02d2917e58c4ed549a20f213 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jan 2023 22:12:33 -0500 Subject: [PATCH 12/21] consistently skip over computing interactions with atoms set to NULL in hybrid styles --- src/OPENMP/reaxff_bonds_omp.cpp | 1 + src/OPENMP/reaxff_forces_omp.cpp | 3 +++ src/OPENMP/reaxff_hydrogen_bonds_omp.cpp | 6 +++--- src/REAXFF/reaxff_bonds.cpp | 1 + src/REAXFF/reaxff_hydrogen_bonds.cpp | 9 +++++---- src/REAXFF/reaxff_init_md.cpp | 3 ++- src/REAXFF/reaxff_nonbonded.cpp | 8 ++++---- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/OPENMP/reaxff_bonds_omp.cpp b/src/OPENMP/reaxff_bonds_omp.cpp index 41fb7a822a..234b17303f 100644 --- a/src/OPENMP/reaxff_bonds_omp.cpp +++ b/src/OPENMP/reaxff_bonds_omp.cpp @@ -99,6 +99,7 @@ namespace ReaxFF { /* set the pointers */ type_i = system->my_atoms[i].type; type_j = system->my_atoms[j].type; + if ((type_i < 0) || (type_j < 0)) continue; sbp_i = &(system->reax_param.sbp[type_i]); sbp_j = &(system->reax_param.sbp[type_j]); twbp = &(system->reax_param.tbp[type_i][type_j]); diff --git a/src/OPENMP/reaxff_forces_omp.cpp b/src/OPENMP/reaxff_forces_omp.cpp index 3cb938213f..50157da594 100644 --- a/src/OPENMP/reaxff_forces_omp.cpp +++ b/src/OPENMP/reaxff_forces_omp.cpp @@ -265,6 +265,7 @@ namespace ReaxFF { for (int i = 0; i < system->N; ++i) { atom_i = &(system->my_atoms[i]); type_i = atom_i->type; + if (type_i < 0) continue; sbp_i = &(system->reax_param.sbp[type_i]); start_i = Start_Index(i, far_nbrs); @@ -276,6 +277,7 @@ namespace ReaxFF { int j = nbr_pj->nbr; atom_j = &(system->my_atoms[j]); type_j = atom_j->type; + if (type_j < 0) continue; sbp_j = &(system->reax_param.sbp[type_j]); twbp = &(system->reax_param.tbp[type_i][type_j]); @@ -376,6 +378,7 @@ namespace ReaxFF { for (int i = 0; i < system->n; ++i) { atom_i = &(system->my_atoms[i]); type_i = atom_i->type; + if (type_i < 0) continue; sbp_i = &(system->reax_param.sbp[type_i]); ihb = sbp_i->p_hbond; diff --git a/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp b/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp index 6e1db5ffe7..94b1bb60e6 100644 --- a/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp +++ b/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp @@ -98,14 +98,14 @@ namespace ReaxFF { // for (j = 0; j < system->n; ++j) for (j = ifrom; j < ito; ++j) { /* j has to be of type H */ - if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + if (system->reax_param.sbp[type_j].p_hbond == 1) { /*set j's variables */ - type_j = system->my_atoms[j].type; start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); hb_start_j = Start_Index(system->my_atoms[j].Hindex, hbonds); hb_end_j = End_Index(system->my_atoms[j].Hindex, hbonds); - if (type_j < 0) continue; top = 0; for (pi = start_j; pi < end_j; ++pi) { diff --git a/src/REAXFF/reaxff_bonds.cpp b/src/REAXFF/reaxff_bonds.cpp index cb28aaa1ca..c3e4b787c7 100644 --- a/src/REAXFF/reaxff_bonds.cpp +++ b/src/REAXFF/reaxff_bonds.cpp @@ -75,6 +75,7 @@ namespace ReaxFF { /* set the pointers */ type_i = system->my_atoms[i].type; type_j = system->my_atoms[j].type; + if ((type_i < 0) || (type_j < 0)) continue; sbp_i = &(system->reax_param.sbp[type_i]); sbp_j = &(system->reax_param.sbp[type_j]); twbp = &(system->reax_param.tbp[type_i][type_j]); diff --git a/src/REAXFF/reaxff_hydrogen_bonds.cpp b/src/REAXFF/reaxff_hydrogen_bonds.cpp index 421dd7e1a4..b66952a630 100644 --- a/src/REAXFF/reaxff_hydrogen_bonds.cpp +++ b/src/REAXFF/reaxff_hydrogen_bonds.cpp @@ -59,14 +59,14 @@ namespace ReaxFF { hbonds = (*lists) + HBONDS; hbond_list = hbonds->select.hbond_list; - for (j = 0; j < system->n; ++j) - if ((system->my_atoms[j].type >= 0) && (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1)) { - type_j = system->my_atoms[j].type; + for (j = 0; j < system->n; ++j) { + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + if (system->reax_param.sbp[type_j].p_hbond == 1) { start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); hb_start_j = Start_Index(system->my_atoms[j].Hindex, hbonds); hb_end_j = End_Index(system->my_atoms[j].Hindex, hbonds); - if (type_j < 0) continue; top = 0; for (pi = start_j; pi < end_j; ++pi) { @@ -154,5 +154,6 @@ namespace ReaxFF { } } } + } } } diff --git a/src/REAXFF/reaxff_init_md.cpp b/src/REAXFF/reaxff_init_md.cpp index 55c7a03f7c..2d0459691f 100644 --- a/src/REAXFF/reaxff_init_md.cpp +++ b/src/REAXFF/reaxff_init_md.cpp @@ -56,7 +56,8 @@ namespace ReaxFF { if (control->hbond_cut > 0) for (i = 0; i < system->n; ++i) { atom = &(system->my_atoms[i]); - if ((atom->type >= 0) && (system->reax_param.sbp[atom->type].p_hbond == 1 && atom->type >= 0)) + if ((atom->type >= 0) + && (system->reax_param.sbp[atom->type].p_hbond == 1 && atom->type >= 0)) atom->Hindex = system->numH++; else atom->Hindex = -1; } diff --git a/src/REAXFF/reaxff_nonbonded.cpp b/src/REAXFF/reaxff_nonbonded.cpp index 7acab9915a..75cbd79b29 100644 --- a/src/REAXFF/reaxff_nonbonded.cpp +++ b/src/REAXFF/reaxff_nonbonded.cpp @@ -233,8 +233,8 @@ namespace ReaxFF { flag = 0; /* kinetic energy terms */ - double xcut = 0.5 * ( system->reax_param.sbp[ system->my_atoms[i].type ].bcut_acks2 - + system->reax_param.sbp[ system->my_atoms[j].type ].bcut_acks2 ); + double xcut = 0.5 * (system->reax_param.sbp[system->my_atoms[i].type].bcut_acks2 + + system->reax_param.sbp[system->my_atoms[j].type].bcut_acks2); if(nbr_pj->d <= xcut) { if (j < natoms) flag = 1; @@ -409,8 +409,8 @@ namespace ReaxFF { flag = 0; /* kinetic energy terms */ - double xcut = 0.5 * ( system->reax_param.sbp[ system->my_atoms[i].type ].bcut_acks2 - + system->reax_param.sbp[ system->my_atoms[j].type ].bcut_acks2 ); + double xcut = 0.5 * (system->reax_param.sbp[ system->my_atoms[i].type ].bcut_acks2 + + system->reax_param.sbp[ system->my_atoms[j].type ].bcut_acks2); if(nbr_pj->d <= xcut) { if (j < natoms) flag = 1; From a92a3ec50b422d357cca167413f0d1f8eae0d912 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 30 Jan 2023 12:27:54 -0700 Subject: [PATCH 13/21] Try again to fix memory leak --- src/KOKKOS/pair_reaxff_kokkos.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index fbd74f24de..273430fd63 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -95,6 +95,8 @@ PairReaxFFKokkos::~PairReaxFFKokkos() { if (copymode) return; + DeAllocate_System(api->system); + memoryKK->destroy_kokkos(k_eatom,eatom); memoryKK->destroy_kokkos(k_vatom,vatom); From a74e57cfc1aca0ef22ec6c81ed8adc37f687935f Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 30 Jan 2023 12:31:27 -0700 Subject: [PATCH 14/21] Revert 69e7dd9 --- src/pair.cpp | 2 +- src/pair_hybrid_overlay.cpp | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/pair.cpp b/src/pair.cpp index 92d27266b9..5d789fbb9b 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -97,7 +97,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) tabinner_disp = sqrt(2.0); ftable = nullptr; fdisptable = nullptr; - trim_flag = 0; + trim_flag = 1; allocated = 0; suffix_flag = Suffix::NONE; diff --git a/src/pair_hybrid_overlay.cpp b/src/pair_hybrid_overlay.cpp index 9d2df6a65c..12c84c3a71 100644 --- a/src/pair_hybrid_overlay.cpp +++ b/src/pair_hybrid_overlay.cpp @@ -23,9 +23,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairHybridOverlay::PairHybridOverlay(LAMMPS *lmp) : PairHybrid(lmp) { - trim_flag = 1; -} +PairHybridOverlay::PairHybridOverlay(LAMMPS *lmp) : PairHybrid(lmp) {} /* ---------------------------------------------------------------------- set coeffs for one or more type pairs From b54cdc48e2fb88a89de5367e900ceb95f83ac747 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 30 Jan 2023 12:34:29 -0700 Subject: [PATCH 15/21] whitespace --- src/REAXFF/reaxff_hydrogen_bonds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REAXFF/reaxff_hydrogen_bonds.cpp b/src/REAXFF/reaxff_hydrogen_bonds.cpp index b66952a630..6a56675f19 100644 --- a/src/REAXFF/reaxff_hydrogen_bonds.cpp +++ b/src/REAXFF/reaxff_hydrogen_bonds.cpp @@ -154,6 +154,6 @@ namespace ReaxFF { } } } - } + } } } From 0870bc3046af89fc3dee00624e35b8a4f2dd69ed Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 30 Jan 2023 16:14:39 -0700 Subject: [PATCH 16/21] Allow neighbor class to set newton flag in Kokkos neigh list --- src/KOKKOS/npair_kokkos.cpp | 151 +++++++++++++------------------ src/KOKKOS/npair_kokkos.h | 172 +++++++++++++++++++++++------------- 2 files changed, 171 insertions(+), 152 deletions(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index aae8592b7a..3ead5a2e34 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -28,8 +28,8 @@ namespace LAMMPS_NS { /* ---------------------------------------------------------------------- */ -template -NPairKokkos::NPairKokkos(LAMMPS *lmp) : NPair(lmp) { +template +NPairKokkos::NPairKokkos(LAMMPS *lmp) : NPair(lmp) { last_stencil_old = -1; @@ -49,8 +49,8 @@ NPairKokkos::NPairKokkos(LAMMPS *lmp) : NP copy needed info from Neighbor class to this build class ------------------------------------------------------------------------- */ -template -void NPairKokkos::copy_neighbor_info() +template +void NPairKokkos::copy_neighbor_info() { NPair::copy_neighbor_info(); @@ -58,7 +58,6 @@ void NPairKokkos::copy_neighbor_info() // general params - newton_pair = force->newton_pair; k_cutneighsq = neighborKK->k_cutneighsq; // overwrite per-type Neighbor cutoffs with custom value set by requestor @@ -93,8 +92,8 @@ void NPairKokkos::copy_neighbor_info() copy per-atom and per-bin vectors from NBin class to this build class ------------------------------------------------------------------------- */ -template -void NPairKokkos::copy_bin_info() +template +void NPairKokkos::copy_bin_info() { NPair::copy_bin_info(); @@ -110,8 +109,8 @@ void NPairKokkos::copy_bin_info() copy needed info from NStencil class to this build class ------------------------------------------------------------------------- */ -template -void NPairKokkos::copy_stencil_info() +template +void NPairKokkos::copy_stencil_info() { NPair::copy_stencil_info(); nstencil = ns->nstencil; @@ -145,8 +144,8 @@ void NPairKokkos::copy_stencil_info() /* ---------------------------------------------------------------------- */ -template -void NPairKokkos::build(NeighList *list_) +template +void NPairKokkos::build(NeighList *list_) { NeighListKokkos* list = (NeighListKokkos*) list_; const int nlocal = includegroup?atom->nfirst:atom->nlocal; @@ -244,7 +243,7 @@ void NPairKokkos::build(NeighList *list_) #endif if (GHOST) { - NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctorGhost f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU if (ExecutionSpaceFromDevice::space == Device) { int team_size = atoms_per_bin*factor; @@ -262,82 +261,42 @@ void NPairKokkos::build(NeighList *list_) Kokkos::parallel_for(nall, f); #endif } else { - if (newton_pair) { - if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); + if (SIZE) { + NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 6 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU - if (ExecutionSpaceFromDevice::space == Device) { - int team_size = atoms_per_bin*factor; - int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); - if (team_size <= team_size_max) { - Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); - Kokkos::parallel_for(config, f); - } else { // fall back to flat method - f.sharedsize = 0; - Kokkos::parallel_for(nall, f); - } - } else + if (ExecutionSpaceFromDevice::space == Device) { + int team_size = atoms_per_bin*factor; + int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); + if (team_size <= team_size_max) { + Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); + Kokkos::parallel_for(config, f); + } else { // fall back to flat method + f.sharedsize = 0; Kokkos::parallel_for(nall, f); -#else + } + } else Kokkos::parallel_for(nall, f); -#endif - } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef LMP_KOKKOS_GPU - if (ExecutionSpaceFromDevice::space == Device) { - int team_size = atoms_per_bin*factor; - int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); - if (team_size <= team_size_max) { - Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); - Kokkos::parallel_for(config, f); - } else { // fall back to flat method - f.sharedsize = 0; - Kokkos::parallel_for(nall, f); - } - } else - Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } } else { - if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef LMP_KOKKOS_GPU - if (ExecutionSpaceFromDevice::space == Device) { - int team_size = atoms_per_bin*factor; - int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); - if (team_size <= team_size_max) { - Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); - Kokkos::parallel_for(config, f); - } else { // fall back to flat method - f.sharedsize = 0; - Kokkos::parallel_for(nall, f); - } - } else + if (ExecutionSpaceFromDevice::space == Device) { + int team_size = atoms_per_bin*factor; + int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); + if (team_size <= team_size_max) { + Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); + Kokkos::parallel_for(config, f); + } else { // fall back to flat method + f.sharedsize = 0; Kokkos::parallel_for(nall, f); -#else + } + } else Kokkos::parallel_for(nall, f); -#endif - } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); -#ifdef LMP_KOKKOS_GPU - if (ExecutionSpaceFromDevice::space == Device) { - int team_size = atoms_per_bin*factor; - int team_size_max = Kokkos::TeamPolicy(team_size,Kokkos::AUTO).team_size_max(f,Kokkos::ParallelForTag()); - if (team_size <= team_size_max) { - Kokkos::TeamPolicy config((mbins+factor-1)/factor,team_size); - Kokkos::parallel_for(config, f); - } else { // fall back to flat method - f.sharedsize = 0; - Kokkos::parallel_for(nall, f); - } - } else - Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } } } Kokkos::deep_copy(h_scalars, d_scalars); @@ -1402,20 +1361,30 @@ void NeighborKokkosExecute::build_ItemSizeGPU(typename Kokkos::TeamP } namespace LAMMPS_NS { -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; #ifdef LMP_KOKKOS_GPU -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; -template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; +template class NPairKokkos; #endif } diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index ce63c30c4b..78d735f829 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -13,75 +13,125 @@ #ifdef NPAIR_CLASS // clang-format off -typedef NPairKokkos NPairKokkosFullBinHost; +typedef NPairKokkos NPairKokkosFullBinHost; NPairStyle(full/bin/kk/host, NPairKokkosFullBinHost, - NP_FULL | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI); + NP_BIN | NP_KOKKOS_HOST | NP_FULL | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI); -typedef NPairKokkos NPairKokkosFullBinDevice; +typedef NPairKokkos NPairKokkosFullBinDevice; NPairStyle(full/bin/kk/device, NPairKokkosFullBinDevice, - NP_FULL | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI); + NP_BIN | NP_KOKKOS_DEVICE | NP_FULL | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI); -typedef NPairKokkos NPairKokkosFullBinGhostHost; +typedef NPairKokkos NPairKokkosFullBinGhostHost; NPairStyle(full/bin/ghost/kk/host, NPairKokkosFullBinGhostHost, - NP_FULL | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); + NP_BIN | NP_KOKKOS_HOST | NP_FULL | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); -typedef NPairKokkos NPairKokkosFullBinGhostDevice; +typedef NPairKokkos NPairKokkosFullBinGhostDevice; NPairStyle(full/bin/ghost/kk/device, NPairKokkosFullBinGhostDevice, - NP_FULL | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); + NP_BIN | NP_KOKKOS_DEVICE | NP_FULL | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); -typedef NPairKokkos NPairKokkosHalfBinHost; -NPairStyle(half/bin/kk/host, - NPairKokkosHalfBinHost, - NP_HALF | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO); +typedef NPairKokkos NPairKokkosHalfBinNewtonHost; +NPairStyle(half/bin/newton/kk/host, + NPairKokkosHalfBinNewtonHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTON | NP_ORTHO); -typedef NPairKokkos NPairKokkosHalfBinDevice; -NPairStyle(half/bin/kk/device, - NPairKokkosHalfBinDevice, - NP_HALF | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_ORTHO); +typedef NPairKokkos NPairKokkosHalfBinNewtoffHost; +NPairStyle(half/bin/newtoff/kk/host, + NPairKokkosHalfBinNewtoffHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTOFF | NP_ORTHO); -typedef NPairKokkos NPairKokkosHalfBinHostTri; -NPairStyle(half/bin/kk/host, - NPairKokkosHalfBinHostTri, - NP_HALF | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtonDevice; +NPairStyle(half/bin/newton/kk/device, + NPairKokkosHalfBinNewtonDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTON | NP_ORTHO); -typedef NPairKokkos NPairKokkosHalfBinDeviceTri; -NPairStyle(half/bin/kk/device, - NPairKokkosHalfBinDeviceTri, - NP_HALF | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtoffDevice; +NPairStyle(half/bin/newtoff/kk/device, + NPairKokkosHalfBinNewtoffDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTOFF | NP_ORTHO); -typedef NPairKokkos NPairKokkosHalfBinGhostHost; -NPairStyle(half/bin/ghost/kk/host, - NPairKokkosHalfBinGhostHost, - NP_HALF | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtonTriHost; +NPairStyle(half/bin/newton/kk/host, + NPairKokkosHalfBinNewtonTriHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTON | NP_TRI); -typedef NPairKokkos NPairKokkosHalfBinGhostDevice; -NPairStyle(half/bin/ghost/kk/device, - NPairKokkosHalfBinGhostDevice, - NP_HALF | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtoffTriHost; +NPairStyle(half/bin/newtoff/kk/host, + NPairKokkosHalfBinNewtoffTriHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTOFF | NP_TRI); -typedef NPairKokkos NPairKokkosHalfSizeBinHost; -NPairStyle(half/size/bin/kk/host, - NPairKokkosHalfSizeBinHost, - NP_HALF | NP_SIZE | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO); +typedef NPairKokkos NPairKokkosHalfBinNewtonTriDevice; +NPairStyle(half/bin/newton/kk/device, + NPairKokkosHalfBinNewtonTriDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTON | NP_TRI); -typedef NPairKokkos NPairKokkosHalfSizeBinDevice; -NPairStyle(half/size/bin/kk/device, - NPairKokkosHalfSizeBinDevice, - NP_HALF | NP_SIZE | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_ORTHO); +typedef NPairKokkos NPairKokkosHalfBinNewtoffTriDevice; +NPairStyle(half/bin/newtoff/kk/device, + NPairKokkosHalfBinNewtoffTriDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTOFF | NP_TRI); -typedef NPairKokkos NPairKokkosHalfSizeBinHostTri; -NPairStyle(half/size/bin/kk/host, - NPairKokkosHalfSizeBinHostTri, - NP_HALF | NP_SIZE | NP_BIN | NP_KOKKOS_HOST | NP_NEWTON | NP_NEWTOFF | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtonGhostHost; +NPairStyle(half/bin/newton/ghost/kk/host, + NPairKokkosHalfBinNewtonGhostHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTON | NP_GHOST | NP_ORTHO | NP_TRI); -typedef NPairKokkos NPairKokkosHalfSizeBinDeviceTri; -NPairStyle(half/size/bin/kk/device, - NPairKokkosHalfSizeBinDeviceTri, - NP_HALF | NP_SIZE | NP_BIN | NP_KOKKOS_DEVICE | NP_NEWTON | NP_NEWTOFF | NP_TRI); +typedef NPairKokkos NPairKokkosHalfBinNewtoffGhostHost; +NPairStyle(half/bin/newtoff/ghost/kk/host, + NPairKokkosHalfBinNewtoffGhostHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtonGhostDevice; +NPairStyle(half/bin/newton/ghost/kk/device, + NPairKokkosHalfBinNewtonGhostDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTON | NP_GHOST | NP_ORTHO | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtoffGhostDevice; +NPairStyle(half/bin/newtoff/ghost/kk/device, + NPairKokkosHalfBinNewtoffGhostDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTOFF | NP_GHOST | NP_ORTHO | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtonSizeHost; +NPairStyle(half/bin/newton/size/kk/host, + NPairKokkosHalfBinNewtonSizeHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTON | NP_SIZE | NP_ORTHO); + +typedef NPairKokkos NPairKokkosHalfBinNewtoffSizeHost; +NPairStyle(half/bin/newtoff/size/kk/host, + NPairKokkosHalfBinNewtoffSizeHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTOFF | NP_SIZE | NP_ORTHO); + +typedef NPairKokkos NPairKokkosHalfBinNewtonSizeDevice; +NPairStyle(half/bin/newton/size/kk/device, + NPairKokkosHalfBinNewtonSizeDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTON | NP_SIZE | NP_ORTHO); + +typedef NPairKokkos NPairKokkosHalfBinNewtoffSizeDevice; +NPairStyle(half/bin/newtoff/size/kk/device, + NPairKokkosHalfBinNewtoffSizeDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTOFF | NP_SIZE | NP_ORTHO); + +typedef NPairKokkos NPairKokkosHalfBinNewtonSizeTriHost; +NPairStyle(half/bin/newton/size/kk/host, + NPairKokkosHalfBinNewtonSizeTriHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTON | NP_SIZE | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtoffSizeTriHost; +NPairStyle(half/bin/newtoff/size/kk/host, + NPairKokkosHalfBinNewtoffSizeTriHost, + NP_BIN | NP_KOKKOS_HOST | NP_HALF | NP_NEWTOFF | NP_SIZE | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtonSizeTriDevice; +NPairStyle(half/bin/newton/size/kk/device, + NPairKokkosHalfBinNewtonSizeTriDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTON | NP_SIZE | NP_TRI); + +typedef NPairKokkos NPairKokkosHalfBinNewtoffSizeTriDevice; +NPairStyle(half/bin/newtoff/size/kk/device, + NPairKokkosHalfBinNewtoffSizeTriDevice, + NP_KOKKOS_DEVICE | NP_HALF | NP_BIN | NP_NEWTOFF | NP_SIZE | NP_TRI); // clang-format on #else @@ -94,7 +144,7 @@ NPairStyle(half/size/bin/kk/device, namespace LAMMPS_NS { -template +template class NPairKokkos : public NPair { typedef ArrayTypes AT; @@ -379,7 +429,7 @@ class NeighborKokkosExecute }; -template +template struct NPairKokkosBuildFunctor { typedef DeviceType device_type; @@ -392,19 +442,19 @@ struct NPairKokkosBuildFunctor { KOKKOS_INLINE_FUNCTION void operator() (const int & i) const { - c.template build_Item(i); + c.template build_Item(i); } #ifdef LMP_KOKKOS_GPU LAMMPS_DEVICE_FUNCTION inline void operator() (typename Kokkos::TeamPolicy::member_type dev) const { - c.template build_ItemGPU(dev, sharedsize); + c.template build_ItemGPU(dev, sharedsize); } size_t team_shmem_size(const int team_size) const { (void) team_size; return sharedsize; } #endif }; -template -struct NPairKokkosBuildFunctor { +template +struct NPairKokkosBuildFunctor { typedef LMPHostType device_type; const NeighborKokkosExecute c; @@ -416,7 +466,7 @@ struct NPairKokkosBuildFunctor { KOKKOS_INLINE_FUNCTION void operator() (const int & i) const { - c.template build_Item(i); + c.template build_Item(i); } void operator() (typename Kokkos::TeamPolicy::member_type /*dev*/) const {} // Should error out @@ -466,7 +516,7 @@ struct NPairKokkosBuildFunctorGhost { void operator() (typename Kokkos::TeamPolicy::member_type /*dev*/) const {} // Should error out }; -template +template struct NPairKokkosBuildFunctorSize { typedef DeviceType device_type; @@ -478,20 +528,20 @@ struct NPairKokkosBuildFunctorSize { KOKKOS_INLINE_FUNCTION void operator() (const int & i) const { - c.template build_ItemSize(i); + c.template build_ItemSize(i); } #ifdef LMP_KOKKOS_GPU LAMMPS_DEVICE_FUNCTION inline void operator() (typename Kokkos::TeamPolicy::member_type dev) const { - c.template build_ItemSizeGPU(dev, sharedsize); + c.template build_ItemSizeGPU(dev, sharedsize); } size_t team_shmem_size(const int team_size) const { (void) team_size; return sharedsize; } #endif }; -template -struct NPairKokkosBuildFunctorSize { +template +struct NPairKokkosBuildFunctorSize { typedef LMPHostType device_type; const NeighborKokkosExecute c; @@ -502,7 +552,7 @@ struct NPairKokkosBuildFunctorSize { KOKKOS_INLINE_FUNCTION void operator() (const int & i) const { - c.template build_ItemSize(i); + c.template build_ItemSize(i); } void operator() (typename Kokkos::TeamPolicy::member_type /*dev*/) const {} // Should error out From e5615f2579f8791ddf02cd2822b6db190de55b9c Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Mon, 30 Jan 2023 17:20:23 -0700 Subject: [PATCH 17/21] Fix bug in ReaxFF with pair hybrid --- src/REAXFF/pair_reaxff.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index e1580946fd..1817efba33 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -649,7 +649,7 @@ int PairReaxFF::write_reax_lists() jlist = firstneigh[i]; Set_Start_Index(i, num_nbrs, far_nbrs); - if (i < inum) + if (itr_i < inum) cutoff_sqr = SQR(api->control->nonb_cut); else cutoff_sqr = SQR(api->control->bond_cut); From e5d921585bad76a810e2072ecd831a73f1dc147c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jan 2023 06:49:21 -0500 Subject: [PATCH 18/21] cosmetic/whitespace --- src/REAXFF/pair_reaxff.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index 1817efba33..1867aec81b 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -110,9 +110,7 @@ PairReaxFF::PairReaxFF(LAMMPS *lmp) : Pair(lmp) setup_flag = 0; fixspecies_flag = 0; - nmax = 0; - list_blocking_flag = 0; } @@ -130,8 +128,8 @@ PairReaxFF::~PairReaxFF() // deallocate reax data-structures if (api->control->tabulate) Deallocate_Lookup_Tables(api->system); - if (api->control->hbond_cut > 0) Delete_List(api->lists+HBONDS); + Delete_List(api->lists+BONDS); Delete_List(api->lists+THREE_BODIES); Delete_List(api->lists+FAR_NBRS); @@ -153,17 +151,16 @@ PairReaxFF::~PairReaxFF() memory->destroy(cutsq); memory->destroy(cutghost); - delete [] chi; - delete [] eta; - delete [] gamma; - delete [] bcut_acks2; + delete[] chi; + delete[] eta; + delete[] gamma; + delete[] bcut_acks2; } memory->destroy(tmpid); memory->destroy(tmpbo); - delete [] pvector; - + delete[] pvector; } /* ---------------------------------------------------------------------- */ @@ -531,7 +528,6 @@ void PairReaxFF::compute(int eflag, int vflag) } FindBond(); } - } /* ---------------------------------------------------------------------- */ From 83b578f6040a0c4a2c1c3077d4ce2dd7b59059d7 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 31 Jan 2023 21:08:32 +0100 Subject: [PATCH 19/21] BUGFIX: update ML_PACE library version (that fix compilation issue with nvcc) extra update doc/src/pair_pace.rst --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- doc/src/pair_pace.rst | 2 +- lib/pace/Install.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index b64584e5a7..50581b0676 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.fix.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "f418d32b60e531063ac4285bf702b468" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "4f0b3b5b14456fe9a73b447de3765caa" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index 01f7df63f6..10c91e31e1 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -6,7 +6,7 @@ pair_style pace command ======================= -Accelerator Variants: *pace/kk* +Accelerator Variants: *pace/kk*, *pace/extrapolation/kk* pair_style pace/extrapolation command ===================================== diff --git a/lib/pace/Install.py b/lib/pace/Install.py index f7f50d4f6d..c72271aa7a 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum # settings thisdir = fullpath('.') -version ='v.2023.01.3' +version ='v.2023.01.3.fix' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2023.01.3': 'f418d32b60e531063ac4285bf702b468' + 'v.2023.01.3.fix': '4f0b3b5b14456fe9a73b447de3765caa' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From 5d16bea899d64abb1d948823dacd8f88a67dcfc1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jan 2023 16:35:06 -0500 Subject: [PATCH 20/21] implement download fallback URLs pointing to download.lammps.org for CMake --- cmake/Modules/ExternalCMakeProject.cmake | 18 ++++++++++++++++-- cmake/Modules/LAMMPSUtils.cmake | 11 +++++++++++ cmake/Modules/Packages/GPU.cmake | 6 ++++-- cmake/Modules/Packages/KOKKOS.cmake | 4 +++- cmake/Modules/Packages/LATTE.cmake | 3 ++- cmake/Modules/Packages/MDI.cmake | 3 ++- cmake/Modules/Packages/ML-HDNNP.cmake | 3 ++- cmake/Modules/Packages/ML-PACE.cmake | 16 +++++++++++++++- cmake/Modules/Packages/PLUMED.cmake | 3 ++- cmake/Modules/Packages/SCAFACOS.cmake | 4 +++- 10 files changed, 60 insertions(+), 11 deletions(-) diff --git a/cmake/Modules/ExternalCMakeProject.cmake b/cmake/Modules/ExternalCMakeProject.cmake index 855ce254c9..75c33ab99e 100644 --- a/cmake/Modules/ExternalCMakeProject.cmake +++ b/cmake/Modules/ExternalCMakeProject.cmake @@ -9,8 +9,22 @@ function(ExternalCMakeProject target url hash basedir cmakedir cmakefile) get_filename_component(archive ${url} NAME) file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) - message(STATUS "Downloading ${url}") - file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) + if(EXISTS ${CMAKE_BINARY_DIR}/_deps/${archive}) + file(MD5 ${CMAKE_BINARY_DIR}/_deps/${archive} DL_MD5) + endif() + if(NOT "${DL_MD5}" STREQUAL "${hash}") + message(STATUS "Downloading ${url}") + file(DOWNLOAD ${url} ${CMAKE_BINARY_DIR}/_deps/${archive} STATUS DL_STATUS SHOW_PROGRESS) + file(MD5 ${CMAKE_BINARY_DIR}/_deps/${archive} DL_MD5) + if((NOT DL_STATUS EQUAL 0) OR (NOT "${DL_MD5}" STREQUAL "${hash}")) + set(${target}_URL ${url}) + GetFallbackURL(${target}_URL fallback) + message(WARNING "Download from primary URL ${url} failed\nTrying fallback URL ${fallback}") + file(DOWNLOAD ${fallback} ${CMAKE_BINARY_DIR}/_deps/${archive} EXPECTED_HASH MD5=${hash} SHOW_PROGRESS) + endif() + else() + message(STATUS "Using already downloaded archive ${CMAKE_BINARY_DIR}/_deps/${archive}") + endif() message(STATUS "Unpacking and configuring ${archive}") execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_BINARY_DIR}/_deps/${archive} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src) diff --git a/cmake/Modules/LAMMPSUtils.cmake b/cmake/Modules/LAMMPSUtils.cmake index 9b42dafc44..bb69104308 100644 --- a/cmake/Modules/LAMMPSUtils.cmake +++ b/cmake/Modules/LAMMPSUtils.cmake @@ -158,3 +158,14 @@ if((CMAKE_SYSTEM_NAME STREQUAL "Linux") AND (EXISTS /etc/os-release)) set(CMAKE_LINUX_DISTRO ${distro}) set(CMAKE_DISTRO_VERSION ${disversion}) endif() + +function(GetFallbackURL input output) + string(REPLACE "_URL" "" _tmp ${input}) + string(TOLOWER ${_tmp} libname) + string(REGEX REPLACE "^https://.*/([^/]+gz)" "${LAMMPS_THIRDPARTY_URL}/${libname}-\\1" newurl "${${input}}") + if ("${newurl}" STREQUAL "${${input}}") + set(${output} "" PARENT_SCOPE) + else() + set(${output} ${newurl} PARENT_SCOPE) + endif() +endfunction(GetFallbackURL) diff --git a/cmake/Modules/Packages/GPU.cmake b/cmake/Modules/Packages/GPU.cmake index 24d9538206..cf321eee9a 100644 --- a/cmake/Modules/Packages/GPU.cmake +++ b/cmake/Modules/Packages/GPU.cmake @@ -428,15 +428,17 @@ elseif(GPU_API STREQUAL "HIP") if(DOWNLOAD_CUB) message(STATUS "CUB download requested") - set(CUB_URL "https://github.com/NVlabs/cub/archive/1.12.0.tar.gz" CACHE STRING "URL for CUB tarball") + # TODO: test update to current version 1.17.2 + set(CUB_URL "https://github.com/nvidia/cub/archive/1.12.0.tar.gz" CACHE STRING "URL for CUB tarball") set(CUB_MD5 "1cf595beacafff104700921bac8519f3" CACHE STRING "MD5 checksum of CUB tarball") mark_as_advanced(CUB_URL) mark_as_advanced(CUB_MD5) + GetFallbackURL(CUB_URL CUB_FALLBACK) include(ExternalProject) ExternalProject_Add(CUB - URL ${CUB_URL} + URL ${CUB_URL} ${CUB_FALLBACK} URL_MD5 ${CUB_MD5} PREFIX "${CMAKE_CURRENT_BINARY_DIR}" CONFIGURE_COMMAND "" diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index de64df7268..b4eb227d61 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -53,8 +53,10 @@ if(DOWNLOAD_KOKKOS) set(KOKKOS_MD5 "f140e02b826223b1045207d9bc10d404" CACHE STRING "MD5 checksum of KOKKOS tarball") mark_as_advanced(KOKKOS_URL) mark_as_advanced(KOKKOS_MD5) + GetFallbackURL(KOKKOS_URL KOKKOS_FALLBACK) + ExternalProject_Add(kokkos_build - URL ${KOKKOS_URL} + URL ${KOKKOS_URL} ${KOKKOS_FALLBACK} URL_MD5 ${KOKKOS_MD5} CMAKE_ARGS ${KOKKOS_LIB_BUILD_ARGS} BUILD_BYPRODUCTS /lib/libkokkoscore.a /lib/libkokkoscontainers.a diff --git a/cmake/Modules/Packages/LATTE.cmake b/cmake/Modules/Packages/LATTE.cmake index d7793fa257..bedd7a64fc 100644 --- a/cmake/Modules/Packages/LATTE.cmake +++ b/cmake/Modules/Packages/LATTE.cmake @@ -19,6 +19,7 @@ if(DOWNLOAD_LATTE) set(LATTE_MD5 "820e73a457ced178c08c71389a385de7" CACHE STRING "MD5 checksum of LATTE tarball") mark_as_advanced(LATTE_URL) mark_as_advanced(LATTE_MD5) + GetFallbackURL(LATTE_URL LATTE_FALLBACK) # CMake cannot pass BLAS or LAPACK library variable to external project if they are a list list(LENGTH BLAS_LIBRARIES} NUM_BLAS) @@ -30,7 +31,7 @@ if(DOWNLOAD_LATTE) include(ExternalProject) ExternalProject_Add(latte_build - URL ${LATTE_URL} + URL ${LATTE_URL} ${LATTE_FALLBACK} URL_MD5 ${LATTE_MD5} SOURCE_SUBDIR cmake CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${CMAKE_REQUEST_PIC} -DCMAKE_INSTALL_LIBDIR=lib diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index c1e25347af..67c1b82dab 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -12,6 +12,7 @@ if(DOWNLOAD_MDI) set(MDI_MD5 "7a222353ae8e03961d5365e6cd48baee" CACHE STRING "MD5 checksum for MDI tarball") mark_as_advanced(MDI_URL) mark_as_advanced(MDI_MD5) + GetFallbackURL(MDI_URL MDI_FALLBACK) enable_language(C) # only ON/OFF are allowed for "mpi" flag when building MDI library @@ -63,7 +64,7 @@ if(DOWNLOAD_MDI) # support cross-compilation and ninja-build include(ExternalProject) ExternalProject_Add(mdi_build - URL ${MDI_URL} + URL ${MDI_URL} ${MDI_FALLBACK} URL_MD5 ${MDI_MD5} PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext CMAKE_ARGS diff --git a/cmake/Modules/Packages/ML-HDNNP.cmake b/cmake/Modules/Packages/ML-HDNNP.cmake index f71d08f3ab..adffcfa77e 100644 --- a/cmake/Modules/Packages/ML-HDNNP.cmake +++ b/cmake/Modules/Packages/ML-HDNNP.cmake @@ -10,6 +10,7 @@ if(DOWNLOAD_N2P2) set(N2P2_MD5 "9595b066636cd6b90b0fef93398297a5" CACHE STRING "MD5 checksum of N2P2 tarball") mark_as_advanced(N2P2_URL) mark_as_advanced(N2P2_MD5) + GetFallbackURL(N2P2_URL N2P2_FALLBACK) # adjust settings from detected compiler to compiler platform in n2p2 library # set compiler specific flag to turn on C++11 syntax (required on macOS and CentOS 7) @@ -72,7 +73,7 @@ if(DOWNLOAD_N2P2) # download compile n2p2 library. much patch MPI calls in LAMMPS interface to accommodate MPI-2 (e.g. for cross-compiling) include(ExternalProject) ExternalProject_Add(n2p2_build - URL ${N2P2_URL} + URL ${N2P2_URL} ${N2P2_FALLBACK} URL_MD5 ${N2P2_MD5} UPDATE_COMMAND "" CONFIGURE_COMMAND "" diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index b64584e5a7..f0e4b49e49 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -3,9 +3,23 @@ set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2 set(PACELIB_MD5 "f418d32b60e531063ac4285bf702b468" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) +GetFallbackURL(PACELIB_URL PACELIB_FALLBACK) # download library sources to build folder -file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS +if(EXISTS ${CMAKE_BINARY_DIR}/libpace.tar.gz) + file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) +endif() +if(NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}") + message(STATUS "Downloading ${PACELIB_URL}") + file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz STATUS DL_STATUS SHOW_PROGRESS) + file(MD5 ${CMAKE_BINARY_DIR}/libpace.tar.gz DL_MD5) + if((NOT DL_STATUS EQUAL 0) OR (NOT "${DL_MD5}" STREQUAL "${PACELIB_MD5}")) + message(WARNING "Download from primary URL ${PACELIB_URL} failed\nTrying fallback URL ${PACELIB_FALLBACK}") + file(DOWNLOAD ${PACELIB_FALLBACK} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5} SHOW_PROGRESS) + else() + message(STATUS "Using already downloaded archive ${CMAKE_BINARY_DIR}/libpace.tar.gz") + endif() +endif() # uncompress downloaded sources execute_process( diff --git a/cmake/Modules/Packages/PLUMED.cmake b/cmake/Modules/Packages/PLUMED.cmake index e0e4ff0dde..f231d148bd 100644 --- a/cmake/Modules/Packages/PLUMED.cmake +++ b/cmake/Modules/Packages/PLUMED.cmake @@ -59,10 +59,11 @@ if(DOWNLOAD_PLUMED) mark_as_advanced(PLUMED_URL) mark_as_advanced(PLUMED_MD5) + GetFallbackURL(PLUMED_URL PLUMED_FALLBACK) include(ExternalProject) ExternalProject_Add(plumed_build - URL ${PLUMED_URL} + URL ${PLUMED_URL} ${PLUMED_FALLBACK} URL_MD5 ${PLUMED_MD5} BUILD_IN_SOURCE 1 CONFIGURE_COMMAND /configure --prefix= diff --git a/cmake/Modules/Packages/SCAFACOS.cmake b/cmake/Modules/Packages/SCAFACOS.cmake index de611a1edb..9a5580163f 100644 --- a/cmake/Modules/Packages/SCAFACOS.cmake +++ b/cmake/Modules/Packages/SCAFACOS.cmake @@ -18,6 +18,8 @@ if(DOWNLOAD_SCAFACOS) set(SCAFACOS_MD5 "bd46d74e3296bd8a444d731bb10c1738" CACHE STRING "MD5 checksum of SCAFACOS tarball") mark_as_advanced(SCAFACOS_URL) mark_as_advanced(SCAFACOS_MD5) + GetFallbackURL(SCAFACOS_URL SCAFACOS_FALLBACK) + # version 1.0.1 needs a patch to compile and linke cleanly with GCC 10 and later. file(DOWNLOAD ${LAMMPS_THIRDPARTY_URL}/scafacos-1.0.1-fix.diff ${CMAKE_CURRENT_BINARY_DIR}/scafacos-1.0.1.fix.diff @@ -30,7 +32,7 @@ if(DOWNLOAD_SCAFACOS) include(ExternalProject) ExternalProject_Add(scafacos_build - URL ${SCAFACOS_URL} + URL ${SCAFACOS_URL} ${SCAFACOS_FALLBACK} URL_MD5 ${SCAFACOS_MD5} PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_BINARY_DIR}/scafacos-1.0.1.fix.diff CONFIGURE_COMMAND /configure --prefix= --disable-doc From 89b37c51dffb7dadffcf2f4d16ac6e58e27cd673 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 1 Feb 2023 06:47:25 -0500 Subject: [PATCH 21/21] implement download fallback for traditional make build --- lib/hdnnp/.gitignore | 3 ++ lib/hdnnp/Install.py | 17 ++++++++---- lib/install_helpers.py | 24 ++++++++++------ lib/latte/Install.py | 16 ++++++++--- lib/mdi/Install.py | 61 ++++++++--------------------------------- lib/mscg/Install.py | 16 +++++++++-- lib/pace/Install.py | 15 +++++++--- lib/plumed/Install.py | 16 ++++++++--- lib/scafacos/Install.py | 21 +++++++++----- 9 files changed, 105 insertions(+), 84 deletions(-) create mode 100644 lib/hdnnp/.gitignore diff --git a/lib/hdnnp/.gitignore b/lib/hdnnp/.gitignore new file mode 100644 index 0000000000..2a6742ed7a --- /dev/null +++ b/lib/hdnnp/.gitignore @@ -0,0 +1,3 @@ +/includelink +/liblink +/n2p2-* diff --git a/lib/hdnnp/Install.py b/lib/hdnnp/Install.py index 3b232f400b..45c14a5aff 100644 --- a/lib/hdnnp/Install.py +++ b/lib/hdnnp/Install.py @@ -10,7 +10,7 @@ import sys, os, platform, subprocess, shutil from argparse import ArgumentParser sys.path.append('..') -from install_helpers import get_cpus, fullpath, geturl, checkmd5sum +from install_helpers import get_cpus, fullpath, geturl, checkmd5sum, getfallback parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") @@ -76,14 +76,21 @@ if pathflag: if buildflag: url = "https://github.com/CompPhysVienna/n2p2/archive/v%s.tar.gz" % (version) - filename = "n2p2-%s.tar.gz" %version - print("Downloading n2p2 ...") - geturl(url, filename) + filename = "n2p2-%s.tar.gz" % version + fallback = getfallback('n2p2', url) + print("Downloading n2p2 from", url) + try: + geturl(url, filename) + except: + geturl(fallback, filename) # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: if not checkmd5sum(checksums[version], filename): - sys.exit("Checksum for n2p2 library does not match") + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, filename) + if not checkmd5sum(checksums[version], filename): + sys.exit("Checksum for n2p2 library does not match for fallback, too.") print("Unpacking n2p2 source tarball ...") if os.path.exists("%s/n2p2-%s" % (homepath, version)): diff --git a/lib/install_helpers.py b/lib/install_helpers.py index e1ebd1cde7..59171ee4e0 100644 --- a/lib/install_helpers.py +++ b/lib/install_helpers.py @@ -1,4 +1,7 @@ -import hashlib,os,subprocess +import hashlib +import os +import re +import subprocess # try to auto-detect the maximum number of available CPUs def get_cpus(): @@ -32,31 +35,31 @@ def which(program): return None -def geturl(url,fname): +def geturl(url, fname): success = False if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) + cmd = 'curl -L -o "%s" %s' % (fname, url) try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) success = True except subprocess.CalledProcessError as e: print("Calling curl failed with: %s" % e.output.decode('UTF-8')) if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) + cmd = 'wget -O "%s" %s' % (fname, url) try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) success = True except subprocess.CalledProcessError as e: print("Calling wget failed with: %s" % e.output.decode('UTF-8')) if not success: - error("Failed to download source code with 'curl' or 'wget'") + raise Exception("Failed to download source code with 'curl' or 'wget' from " + url) return -def checkmd5sum(md5sum,fname): - with open(fname,'rb') as fh: +def checkmd5sum(md5sum, fname): + with open(fname, 'rb') as fh: m = hashlib.md5() while True: data = fh.read(81920) @@ -66,3 +69,6 @@ def checkmd5sum(md5sum,fname): fh.close() return m.hexdigest() == md5sum +def getfallback(lib, url): + archive = re.sub(r'^https://.*/([^/]+gz)', r'-\1', url) + return 'https://download.lammps.org/thirdparty/' + lib + archive diff --git a/lib/latte/Install.py b/lib/latte/Install.py index 2e8f9bee8d..4e3b27859c 100644 --- a/lib/latte/Install.py +++ b/lib/latte/Install.py @@ -10,7 +10,7 @@ import sys, os, subprocess, shutil, tarfile from argparse import ArgumentParser sys.path.append('..') -from install_helpers import fullpath, geturl, checkmd5sum +from install_helpers import fullpath, geturl, checkmd5sum, getfallback parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") @@ -86,17 +86,25 @@ if buildflag: url = "https://github.com/lanl/LATTE/archive/v%s.tar.gz" % version lattepath = fullpath(homepath) lattedir = os.path.join(lattepath, homedir) + fallback = getfallback('latte', url) + filename = 'LATTE.tar.gz' # download and unpack LATTE tarball if buildflag: print("Downloading LATTE ...") - geturl(url, "LATTE.tar.gz") + try: + geturl(url, filename) + except: + geturl(fallback, filename) # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: - if not checkmd5sum(checksums[version], 'LATTE.tar.gz'): - sys.exit("Checksum for LATTE library does not match") + if not checkmd5sum(checksums[version], filename): + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, filename) + if not checkmd5sum(checksums[version], filename): + sys.exit("Checksum for LATTE library does not match for fallback, too.") print("Unpacking LATTE ...") if os.path.exists(lattedir): diff --git a/lib/mdi/Install.py b/lib/mdi/Install.py index 59d218b1f9..77d13d3e8b 100644 --- a/lib/mdi/Install.py +++ b/lib/mdi/Install.py @@ -9,7 +9,7 @@ import sys,os,subprocess import glob sys.path.append('..') -from install_helpers import checkmd5sum +from install_helpers import fullpath, geturl, checkmd5sum, getfallback # help message @@ -51,49 +51,6 @@ def error(str=None): # expand to full path name # process leading '~' or relative path -def fullpath(path): - return os.path.abspath(os.path.expanduser(path)) - -def which(program): - def is_exe(fpath): - return os.path.isfile(fpath) and os.access(fpath, os.X_OK) - - fpath, fname = os.path.split(program) - if fpath: - if is_exe(program): - return program - else: - for path in os.environ["PATH"].split(os.pathsep): - path = path.strip('"') - exe_file = os.path.join(path, program) - if is_exe(exe_file): - return exe_file - - return None - -def geturl(url,fname): - success = False - - if which('curl') != None: - cmd = 'curl -L -o "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling curl failed with: %s" % e.output.decode('UTF-8')) - - if not success and which('wget') != None: - cmd = 'wget -O "%s" %s' % (fname,url) - try: - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - success = True - except subprocess.CalledProcessError as e: - print("Calling wget failed with: %s" % e.output.decode('UTF-8')) - - if not success: - error("Failed to download source code with 'curl' or 'wget'") - return - # parse args args = sys.argv[1:] @@ -123,17 +80,24 @@ lib = os.path.basename(cwd) # download and unpack MDI_Library tarball -homepath = "." +homepath = fullpath('.') homedir = "%s/MDI_Library" % homepath print("Downloading MDI_Library ...") -mditar = "%s/v%s.tar.gz" % (homepath,version) -geturl(url, mditar) +mditar = "%s/v%s.tar.gz" % (homepath, version) +fallback = getfallback('mdi', url) +try: + geturl(url, mditar) +except: + geturl(fallback, mditar) # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: if not checkmd5sum(checksums[version], mditar): - sys.exit("Checksum for MDI library does not match") + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, mditar) + if not checkmd5sum(checksums[version], mditar): + sys.exit("Checksum for MDI library does not match") print("Unpacking MDI_Library tarball ...") if os.path.exists("%s/v%s" % (homepath,version)): @@ -199,7 +163,6 @@ makefile_lammps = open(str(dir_path) + "/Makefile.lammps", "a") makefile_lammps.write(str(rpath_option) + "\n") makefile_lammps.close() - shared_files = glob.glob( os.path.join( homepath, "liblink", "lib%s.a" % lib) ) if len(shared_files) > 0: print("Build was successful") diff --git a/lib/mscg/Install.py b/lib/mscg/Install.py index 9d18b7c083..df17005dca 100644 --- a/lib/mscg/Install.py +++ b/lib/mscg/Install.py @@ -10,7 +10,7 @@ import sys, os, subprocess, shutil, tarfile from argparse import ArgumentParser sys.path.append('..') -from install_helpers import fullpath, geturl +from install_helpers import fullpath, geturl, checkmd5sum, getfallback parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") @@ -84,7 +84,19 @@ if pathflag: if buildflag: print("Downloading MS-CG ...") tarname = os.path.join(homepath, tarname) - geturl(url, tarname) + fallback = getfallback('mscg', url) + try: + geturl(url, tarname) + except: + geturl(fallback, tarname) + + # verify downloaded archive integrity via md5 checksum, if known. + if mscgver in checksums: + if not checkmd5sum(checksums[mscgver], tarname): + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, tarname) + if not checkmd5sum(checksums[mscgver], tarname): + sys.exit("Checksum for LATTE library does not match for fallback, too.") print("Unpacking MS-CG tarfile ...") diff --git a/lib/pace/Install.py b/lib/pace/Install.py index f7f50d4f6d..21cadbb20a 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -13,7 +13,7 @@ import sys from argparse import ArgumentParser sys.path.append('..') -from install_helpers import fullpath, geturl, checkmd5sum +from install_helpers import fullpath, geturl, checkmd5sum, getfallback # settings @@ -77,14 +77,21 @@ if buildflag: print("Downloading pace tarball ...") archive_filename = "%s.%s" % (version, archive_extension) download_filename = "%s/%s" % (thisdir, archive_filename) + fallback = getfallback('pacelib', url) print("Downloading from ", url, " to ", download_filename, end=" ") - geturl(url, download_filename) + try: + geturl(url, download_filename) + except: + geturl(fallback, download_filename) print(" done") # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: - if not checkmd5sum(checksums[version], archive_filename): - sys.exit("Checksum for pace library does not match") + if not checkmd5sum(checksums[version], download_filename): + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, download_filename) + if not checkmd5sum(checksums[version], download_filename): + sys.exit("Checksum for pace library does not match for fallback, too.") print("Unpacking pace tarball ...") src_folder = thisdir + "/src" diff --git a/lib/plumed/Install.py b/lib/plumed/Install.py index bb3a158bd4..bb6f27fddb 100644 --- a/lib/plumed/Install.py +++ b/lib/plumed/Install.py @@ -10,7 +10,7 @@ import sys, os, platform, subprocess, shutil from argparse import ArgumentParser sys.path.append('..') -from install_helpers import get_cpus, fullpath, geturl, checkmd5sum +from install_helpers import get_cpus, fullpath, geturl, checkmd5sum, getfallback parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") @@ -86,6 +86,7 @@ buildflag = args.build pathflag = args.path is not None plumedpath = args.path mode = args.mode +version = args.version homepath = fullpath('.') homedir = "%s/plumed2" % (homepath) @@ -101,14 +102,21 @@ if pathflag: if buildflag: url = "https://github.com/plumed/plumed2/releases/download/v%s/plumed-src-%s.tgz" % (version, version) - filename = "plumed-src-%s.tar.gz" %version + filename = "plumed-src-%s.tar.gz" % version + fallback = getfallback('plumed', url) print("Downloading plumed ...") - geturl(url, filename) + try: + geturl(url, filename) + except: + geturl(fallback, filename) # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: if not checkmd5sum(checksums[version], filename): - sys.exit("Checksum for plumed2 library does not match") + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, filename) + if not checkmd5sum(checksums[version], filename): + sys.exit("Checksum for plumed2 library does not match for fallback, too.") print("Unpacking plumed2 source tarball ...") if os.path.exists("%s/plumed-%s" % (homepath, version)): diff --git a/lib/scafacos/Install.py b/lib/scafacos/Install.py index 8044215d47..28bcf43086 100644 --- a/lib/scafacos/Install.py +++ b/lib/scafacos/Install.py @@ -10,15 +10,13 @@ import sys, os, subprocess, shutil, tarfile from argparse import ArgumentParser sys.path.append('..') -from install_helpers import fullpath, geturl, get_cpus, checkmd5sum +from install_helpers import fullpath, geturl, get_cpus, checkmd5sum, getfallback -parser = ArgumentParser(prog='Install.py', - description="LAMMPS library build wrapper script") +parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") # settings version = "1.0.1" -url = "https://github.com/scafacos/scafacos/releases/download/v%s/scafacos-%s.tar.gz" % (version, version) # known checksums for different ScaFaCoS versions. used to validate the download. checksums = { \ @@ -59,6 +57,7 @@ if not args.build and not args.path: buildflag = args.build pathflag = args.path is not None version = args.version +url = "https://github.com/scafacos/scafacos/releases/download/v%s/scafacos-%s.tar.gz" % (version, version) homepath = fullpath(".") scafacospath = os.path.join(homepath, "scafacos-%s" % version) @@ -76,12 +75,20 @@ if pathflag: if buildflag: print("Downloading ScaFaCoS ...") - geturl(url, "%s/scafacos-%s.tar.gz" % (homepath, version)) + filename = "%s/scafacos-%s.tar.gz" % (homepath, version) + fallback = getfallback('scafacos', url) + try: + geturl(url, filename) + except: + geturl(fallback, filename) # verify downloaded archive integrity via md5 checksum, if known. if version in checksums: - if not checkmd5sum(checksums[version], '%s/scafacos-%s.tar.gz' % (homepath, version)): - sys.exit("Checksum for ScaFaCoS library does not match") + if not checkmd5sum(checksums[version], filename): + print("Checksum did not match. Trying fallback URL", fallback) + geturl(fallback, filename) + if not checkmd5sum(checksums[version], filename): + sys.exit("Checksum for ScaFaCoS library does not match for fallback, too.") print("Unpacking ScaFaCoS tarball ...") if os.path.exists(scafacospath):