diff --git a/NVC_COMPILE b/NVC_COMPILE index 705c8c1..903e8d7 100644 --- a/NVC_COMPILE +++ b/NVC_COMPILE @@ -6,7 +6,7 @@ CXX="nvc++" LINKFLAG="-L/opt/nvidia/hpc_sdk/Linux_x86_64/22.5/cuda/lib64 -L/usr/lib64/ -L/opt/local/lib/gcc11/" -NVCFLAG="-O3 -std=c++20 -gpu=cc86 -Minline -fopenmp -cuda -stdpar=multicore" +NVCFLAG="-O3 -std=c++20 -target=gpu -Minline -fopenmp -cuda -stdpar=multicore" $CXX $NVCFLAG $LINKFLAG -c axpy.cu diff --git a/cppflow_NVC_COMPILE b/cppflow_NVC_COMPILE index 82313cb..1bcd354 100644 --- a/cppflow_NVC_COMPILE +++ b/cppflow_NVC_COMPILE @@ -6,7 +6,7 @@ CXX="nvc++" LINKFLAG="-ltensorflow -L/opt/nvidia/hpc_sdk/Linux_x86_64/22.5/cuda/lib64 -L/usr/lib64/ -L/opt/local/lib/gcc11/" -NVCFLAG="-O3 -std=c++20 -gpu=cc86 -Minline -fopenmp -cuda -stdpar=multicore" +NVCFLAG="-O3 -std=c++20 -target=gpu -Minline -fopenmp -cuda -stdpar=multicore" $CXX $NVCFLAG $LINKFLAG -c axpy.cu diff --git a/libtorch-patch/Allegro/PATCH_ALLEGRO_main.cpp.txt b/libtorch-patch/Allegro/PATCH_ALLEGRO_main.cpp.txt index 3a0c6ed..dfb26ad 100644 --- a/libtorch-patch/Allegro/PATCH_ALLEGRO_main.cpp.txt +++ b/libtorch-patch/Allegro/PATCH_ALLEGRO_main.cpp.txt @@ -10,6 +10,8 @@ PATCH_ALLEGRO_MAIN_PREP printf("Setting up Allegro model\n"); SystemComponents[a].DNN.ReadModel(SystemComponents[a].ModelName[0]); printf("DONE Reading the model, model name %s\n", SystemComponents[a].ModelName[0].c_str()); + SystemComponents[a].DNN.Match_Element_PseudoAtom_with_model(SystemComponents[a].PseudoAtoms); + SystemComponents[a].DNN.UCAtoms.resize(SystemComponents[a].NComponents.x); SystemComponents[a].DNN.ReplicaAtoms.resize(SystemComponents[a].NComponents.x); diff --git a/libtorch_NVC_COMPILE b/libtorch_NVC_COMPILE index 1c6f6ec..4b4bcff 100644 --- a/libtorch_NVC_COMPILE +++ b/libtorch_NVC_COMPILE @@ -11,7 +11,7 @@ LINKFLAG="-D_GLIBCXX_USE_CXX11_ABI=1 -L${torchDir}/lib -I${torchDir}/include/ -I #LINKFLAG="-ltensorflow -L/opt/nvidia/hpc_sdk/Linux_x86_64/22.5/cuda/lib64 -L/usr/lib64/ -L/opt/local/lib/gcc11/" #NVCFLAG="-O3 -std=c++20 -gpu=cc86 -Minline -fopenmp -Minfo -DUSE_DOUBLE -cuda" -NVCFLAG="-O3 -std=c++20 -gpu=cc86 -Minline -fopenmp -cuda -stdpar=multicore" +NVCFLAG="-O3 -std=c++20 -target=gpu -Minline -fopenmp -cuda -stdpar=multicore" $CXX $NVCFLAG $LINKFLAG -c axpy.cu diff --git a/src_clean/data_struct.h b/src_clean/data_struct.h index 9d98d84..b5650df 100644 --- a/src_clean/data_struct.h +++ b/src_clean/data_struct.h @@ -774,18 +774,19 @@ struct FRAMEWORK_COMPONENT_LISTS struct PseudoAtomDefinitions //Always a host struct, never on the device { std::vector Name; - std::vector Symbol; + std::vector Symbol; //Symbol name for each pseudo-atom + std::vector UniqueSymbol; //all the unique Symbol list // std::vector SymbolIndex; //It has the size of the number of pseudo atoms, it tells the ID of the symbol for the pseudo-atoms, e.g., CO2->C->2 std::vector oxidation; std::vector mass; std::vector charge; std::vector polar; //polarizability - size_t MatchSymbolTypeFromSymbolName(std::string& SymbolName) + size_t MatchUniqueSymbolTypeFromSymbolName(std::string& SymbolName) { - size_t SymbolIdx = 0; - for(size_t i = 0; i < Symbol.size(); i++) + size_t SymbolIdx = UniqueSymbol.size(); + for(size_t i = 0; i < UniqueSymbol.size(); i++) { - if(SymbolName == Symbol[i]) + if(SymbolName == UniqueSymbol[i]) { SymbolIdx = i; break; } diff --git a/src_clean/read_data.cpp b/src_clean/read_data.cpp index 3e94610..886af7a 100644 --- a/src_clean/read_data.cpp +++ b/src_clean/read_data.cpp @@ -1081,9 +1081,12 @@ void PseudoAtomParser(ForceField& FF, PseudoAtomDefinitions& PseudoAtom) { Split_Tab_Space(termsScannedLined, str); if(termsScannedLined[0] != PseudoAtom.Name[counter-3]) throw std::runtime_error("Order of pseudo-atom and force field definition don't match!"); - PseudoAtom.Symbol.push_back(termsScannedLined[2]); + //Match 1-to-1 list of pseudo_atom type and symbol type// - size_t SymbolIdx = PseudoAtom.MatchSymbolTypeFromSymbolName(termsScannedLined[2]); + PseudoAtom.Symbol.push_back(termsScannedLined[2]); + size_t SymbolIdx = PseudoAtom.MatchUniqueSymbolTypeFromSymbolName(termsScannedLined[2]); + if(SymbolIdx >= PseudoAtom.UniqueSymbol.size()) PseudoAtom.UniqueSymbol.push_back(termsScannedLined[2]); + PseudoAtom.SymbolIndex.push_back(SymbolIdx); PseudoAtom.oxidation.push_back(std::stod(termsScannedLined[4])); PseudoAtom.mass.push_back(std::stod(termsScannedLined[5])); diff --git a/src_clean/torch_allegro.h b/src_clean/torch_allegro.h index 1e10ace..2cb154b 100644 --- a/src_clean/torch_allegro.h +++ b/src_clean/torch_allegro.h @@ -6,6 +6,8 @@ struct Allegro Boxsize ReplicaBox; std::vector UCAtoms; std::vector ReplicaAtoms; + std::vector ElementSymbolUsed; + std::vectorMatch_AllegroElement_PseudoAtom_order; //length = # of PseudoAtoms, value stored = order in the Allegro Model// double Cutoff = 6.0; double Cutoffsq = 0.0; NeighList NL; @@ -15,6 +17,22 @@ struct Allegro size_t nstep = 0; + void Match_Element_PseudoAtom_with_model(PseudoAtomDefinitions& PseudoAtoms) + { + printf("------- MATCHING ALLEGRO ELEMENTS WITH PSEUDO ATOM ELEMENT SYMBOLS -------\n"); + Match_AllegroElement_PseudoAtom_order.resize(PseudoAtoms.Symbol.size(), -1); + for(size_t i = 0; i < PseudoAtoms.Symbol.size(); i++) + { + for(size_t j = 0; j < ElementSymbolUsed.size(); j++) + if(PseudoAtoms.Symbol[i] == ElementSymbolUsed[j]) + { + Match_AllegroElement_PseudoAtom_order[i] = j; + printf("PseudoAtom Symbol[%zu]: %s, Allegro Symbol[%zu]: %s, MATCHED\n", i, PseudoAtoms.Symbol[i].c_str(), j, ElementSymbolUsed[j].c_str()); + break; + } + } + } + void GetSQ_From_Cutoff() { Cutoffsq = Cutoff * Cutoff; @@ -190,9 +208,9 @@ struct Allegro if(comp != 0) if(!ConsiderThisAdsorbateAtom[i]) continue; UCAtoms[comp].pos[update_i] = HostAtoms.pos[i]; - size_t SymbolIdx = PseudoAtoms.GetSymbolIdxFromPseudoAtomTypeIdx(HostAtoms.Type[i]); + size_t SymbolIdx = Match_AllegroElement_PseudoAtom_order[HostAtoms.Type[i]]; UCAtoms[comp].Type[update_i] = SymbolIdx; - //printf("Component %zu, Atom %zu, xyz %f %f %f, Type %zu, SymbolIndex %zu\n", comp, i, UCAtoms[comp].pos[i].x, UCAtoms[comp].pos[i].y, UCAtoms[comp].pos[i].z, HostAtoms.Type[i], UCAtoms[comp].Type[i]); + if(i < 5 || i > (NAtoms - 5)) printf("Component %zu, Atom %zu, xyz %f %f %f, Type %zu, SymbolIndex %zu\n", comp, i, UCAtoms[comp].pos[i].x, UCAtoms[comp].pos[i].y, UCAtoms[comp].pos[i].z, HostAtoms.Type[i], UCAtoms[comp].Type[i]); update_i ++; } } @@ -239,6 +257,15 @@ struct Allegro Model.eval(); //Freeze the model Model = torch::jit::freeze(Model); + std::cout << "MODEL TYPE NAMES " << metadata["type_names"] << "\n"; + std::cout << "MODEL SPECIES " << metadata["n_species"] << "\n"; + //std::string name = std::to_string(metadata["type_names"]); + std::string name = metadata["type_names"]; + std::vector termsScannedLined{}; + Split_Tab_Space(termsScannedLined, name); + ElementSymbolUsed = termsScannedLined; + printf("First element of type: %s, first: %s\n", name.c_str(), ElementSymbolUsed[0].c_str()); + //printf("Model"); //ReadCutOffFromModel(ModelName); } @@ -265,7 +292,7 @@ struct Allegro pos[counter][2] = ReplicaAtoms[comp].pos[i].z; ij2type[counter]= ReplicaAtoms[comp].Type[i]; //if(comp != 0) - // printf("comp %zu, counter %zu, ij2type %zu\n", comp, counter, ij2type[counter]); + //printf("comp %zu, counter %zu, ij2type %zu\n", comp, counter, ij2type[counter]); counter ++; } size_t N_Replica_FrameworkAtoms = 0; size_t NFrameworkAtoms = 0; @@ -551,6 +578,7 @@ struct Allegro WrapSuperCellAtomIntoUCBox(comp); GenerateReplicaCells(Initialize); Get_Neighbor_List_Replica(Initialize); + //printf("Doing Neighbor list\n"); double DNN_E = Predict(); //This generates the unit of eV, convert to 10J/mol. //https://www.weizmann.ac.il/oc/martin/tools/hartree.html