From 59c5e5d56cd651ac29419f9ba13c64ad527c8908 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Tue, 26 Sep 2023 18:25:17 -0700 Subject: [PATCH 01/16] Project 01 changes --- Project#01/001.cpp | 66 ++++++++++++++++++++++++++++++++++++++++ Project#01/001.exe | Bin 0 -> 46308 bytes Project#01/a.out | Bin 0 -> 43282 bytes Project#01/makefile | 9 ++++++ Project#01/molecule.cpp | 42 +++++++++++++++++++++++++ Project#01/molecule.h | 26 ++++++++++++++++ 6 files changed, 143 insertions(+) create mode 100644 Project#01/001.cpp create mode 100755 Project#01/001.exe create mode 100755 Project#01/a.out create mode 100644 Project#01/makefile create mode 100644 Project#01/molecule.cpp create mode 100644 Project#01/molecule.h diff --git a/Project#01/001.cpp b/Project#01/001.cpp new file mode 100644 index 0000000..063e30d --- /dev/null +++ b/Project#01/001.cpp @@ -0,0 +1,66 @@ +#include "molecule.h" +#include +#include +#include +#include + +using namespace std; + +/*Code to get introduced to C++ programming techniques + Pulled from the following git repository: + + https://github.com/andrewbovill/ProgrammingProjects/tree/master + + This code achieves the following: + 1. Opening and closing file stream + 2. Reading in atomic masses and x,y,z coordinates + 3. Calculate bond lengths between interatomic coordinates + 4. Calculate all possible bond angles + 5. Calculate all possible out-of-plane angles + 6. Calculate Torsion/Dihedral angles + 7. Calculate Principal Moments of Inertia + 8. Calculate Rotational Constants + + + --Andrew Bovill September 2023 + --Note: Using given "molecule.h" to declare molecule class +*/ + + +int main(int argc, char* argv[]) { + //Variable declaration + + ifstream inputFile; + inputFile.open(argv[1]); + //Check to see if file exists. + if (!inputFile.is_open()) { + std::cerr << "Error: Could not open the file." << std::endl; + return 1; + } + //Create molecule object of class type "Molecule" + Molecule mol; + + inputFile >> mol.natom; + cout <<"Number of atoms: "<> mol.zvals[i]>>mol.geom[i][0]>>mol.geom[i][1]>>mol.geom[i][2]; + } + + for(int i=0; i < mol.natom; i++){ + printf("%d %8.5f %8.5f %8.5f\n", mol.zvals[i], mol.geom[i][0], mol.geom[i][1], mol.geom[i][2]); + } + //cout << "Input Cartesian coordinates:\n"; + + //mol.print_geom(); + + return 0; + +} diff --git a/Project#01/001.exe b/Project#01/001.exe new file mode 100755 index 0000000000000000000000000000000000000000..2d39b18bebf379d0d3599003a699d25ad75f9f55 GIT binary patch literal 46308 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 b*>WoV4(GksH~svlQ(v6@*vY-EO-26)j~>GZ literal 0 HcmV?d00001 diff --git a/Project#01/a.out b/Project#01/a.out new file mode 100755 index 0000000000000000000000000000000000000000..6b3f0b3b88be43fe472ea51f9eb20de6fe6dce76 GIT binary patch literal 43282 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 U%lltG^LEYl7y4Fwx% +#include +#include + +using namespace std; + +class Molecule +{ + public: + int natom; + int charge; + int *zvals; + double **geom; + string point_group; + + void rotate(double phi); + void translate(double x, double y, double z); + double bond(int atom1, int atom2); + double angle(int atom1, int atom2, int atom3); + double torsion(int atom1, int atom2, int atom3, int atom4); + +// Calling constructor and deconstructor functions defined in 'molecule.cpp' + //Molecule(); + //~Molecule(); +}; + From 463483c3efd5814b78c389085bf7749505db36e3 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Wed, 27 Sep 2023 00:42:32 -0700 Subject: [PATCH 02/16] Can't write constructor and deconstructor functions within molecule.cpp --- Project#01/001.cpp | 28 +---------------------- Project#01/molecule.cpp | 49 ++++++++--------------------------------- Project#01/molecule.h | 1 + 3 files changed, 11 insertions(+), 67 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index 063e30d..b0b8128 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -6,27 +6,6 @@ using namespace std; -/*Code to get introduced to C++ programming techniques - Pulled from the following git repository: - - https://github.com/andrewbovill/ProgrammingProjects/tree/master - - This code achieves the following: - 1. Opening and closing file stream - 2. Reading in atomic masses and x,y,z coordinates - 3. Calculate bond lengths between interatomic coordinates - 4. Calculate all possible bond angles - 5. Calculate all possible out-of-plane angles - 6. Calculate Torsion/Dihedral angles - 7. Calculate Principal Moments of Inertia - 8. Calculate Rotational Constants - - - --Andrew Bovill September 2023 - --Note: Using given "molecule.h" to declare molecule class -*/ - - int main(int argc, char* argv[]) { //Variable declaration @@ -43,7 +22,6 @@ int main(int argc, char* argv[]) { inputFile >> mol.natom; cout <<"Number of atoms: "<> mol.zvals[i]>>mol.geom[i][0]>>mol.geom[i][1]>>mol.geom[i][2]; } - - for(int i=0; i < mol.natom; i++){ - printf("%d %8.5f %8.5f %8.5f\n", mol.zvals[i], mol.geom[i][0], mol.geom[i][1], mol.geom[i][2]); - } //cout << "Input Cartesian coordinates:\n"; - //mol.print_geom(); + mol.print_geom(); return 0; diff --git a/Project#01/molecule.cpp b/Project#01/molecule.cpp index 8c6e338..15f73a2 100644 --- a/Project#01/molecule.cpp +++ b/Project#01/molecule.cpp @@ -1,42 +1,11 @@ -//Declaring constructor and deconstructor functions -// Constructor definition - Molecule(int n) - { - // Initialize your attributes here, e.g., zvals, point_group - natom = 0; - charge = 0; - zvals = nullptr; - geom = nullptr; - - // Allocate space - - zvals = new int[natom]; - geom = new double*[natom]; - for (int i = 0; i < natom; i++) { // Iterate up to mol.natom - geom[i] = new double[3]; - } - /*void print_geom(){ - for (int i = 0; i < mol.natom; i++){ - std::cout< +#include +#include +#include + +void Molecule::print_geom(){ + for(int i=0; i < natom; i++){ + printf("%d %8.5f %8.5f %8.5f\n", zvals[i], geom[i][0], geom[i][1], geom[i][2]); } } - -}; - - - diff --git a/Project#01/molecule.h b/Project#01/molecule.h index 27b6142..2e24713 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -13,6 +13,7 @@ class Molecule double **geom; string point_group; + void print_geom(); void rotate(double phi); void translate(double x, double y, double z); double bond(int atom1, int atom2); From 931afcf1f30e3ccc622d706467f7653ba57c3390 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Wed, 27 Sep 2023 01:36:03 -0700 Subject: [PATCH 03/16] FIXED CONSTRUCTOR FUNCTION ERRORgit status! --- Project#01/001.cpp | 24 ++---------------------- Project#01/molecule.cpp | 32 ++++++++++++++++++++++++++++++++ Project#01/molecule.h | 6 +++--- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index b0b8128..9e56725 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -7,31 +7,11 @@ using namespace std; int main(int argc, char* argv[]) { - //Variable declaration - ifstream inputFile; - inputFile.open(argv[1]); - //Check to see if file exists. - if (!inputFile.is_open()) { - std::cerr << "Error: Could not open the file." << std::endl; - return 1; - } //Create molecule object of class type "Molecule" - Molecule mol; + Molecule mol(argv[1],0); - inputFile >> mol.natom; - cout <<"Number of atoms: "<> mol.zvals[i]>>mol.geom[i][0]>>mol.geom[i][1]>>mol.geom[i][2]; - } - //cout << "Input Cartesian coordinates:\n"; + cout << "Input Cartesian coordinates:\n"; mol.print_geom(); diff --git a/Project#01/molecule.cpp b/Project#01/molecule.cpp index 15f73a2..ed2d0d9 100644 --- a/Project#01/molecule.cpp +++ b/Project#01/molecule.cpp @@ -3,9 +3,41 @@ #include #include #include +#include void Molecule::print_geom(){ for(int i=0; i < natom; i++){ printf("%d %8.5f %8.5f %8.5f\n", zvals[i], geom[i][0], geom[i][1], geom[i][2]); } } + +Molecule::Molecule(const char *filename,int q){ + + charge = q; + + //Open filename + std::ifstream inputfile(filename); + if (!inputfile.is_open()) { + std::cerr << "Error: Could not open the file." << std::endl; + } + + inputfile >> natom; + + zvals = new int[natom]; + geom = new double*[natom]; + for (int i = 0; i < natom; i++) { // Iterate up to natom + geom[i] = new double[3]; + } + + for (int i = 0; i < natom; i++){ + inputfile>>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; + } + +} +Molecule::~Molecule(){ + delete[] zvals; + for(int i=0; i < natom; i++) + delete[] geom[i]; + delete[] geom; +} + diff --git a/Project#01/molecule.h b/Project#01/molecule.h index 2e24713..175e7bf 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -20,8 +20,8 @@ class Molecule double angle(int atom1, int atom2, int atom3); double torsion(int atom1, int atom2, int atom3, int atom4); -// Calling constructor and deconstructor functions defined in 'molecule.cpp' - //Molecule(); - //~Molecule(); +// Declaring constructor and deconstructor functions + Molecule(const char *filename,int q); + ~Molecule(); }; From 7fe3b261540f75155433a413ca58367fe50a9cf0 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Wed, 27 Sep 2023 01:38:47 -0700 Subject: [PATCH 04/16] updated makefile --- Project#01/makefile | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Project#01/makefile b/Project#01/makefile index 5e25e9e..6a19934 100644 --- a/Project#01/makefile +++ b/Project#01/makefile @@ -1,9 +1,17 @@ G++ = g++ +SRCS = $(wildcard *.cpp) +OBJS = $(SRCS:.cpp=.o) -all: 001.exe +all: 001.exe -001.exe: 001.cpp molecule.h - $(G++) 001.cpp -o 001.exe +molecule.o: molecule.cpp + $(G++) -c $< -o $@ -clean: - rm -rf 001.exe +001.o: 001.cpp + $(G++) -c $< -o $@ + +001.exe: 001.o molecule.o + $(G++) $^ -o $@ + +clean: + rm -rf 001.exe *.o From ea6dd33292fe5484f5c492d213d96cabe27a6aa6 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Wed, 27 Sep 2023 01:39:20 -0700 Subject: [PATCH 05/16] another touch up to makefile --- Project#01/makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project#01/makefile b/Project#01/makefile index 6a19934..b635d70 100644 --- a/Project#01/makefile +++ b/Project#01/makefile @@ -14,4 +14,4 @@ molecule.o: molecule.cpp $(G++) $^ -o $@ clean: - rm -rf 001.exe *.o + rm -rf *.exe *.o From ccb0dd5bcb6c682fdbdd0c318ec15947b76d8505 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Mon, 2 Oct 2023 00:37:19 -0700 Subject: [PATCH 06/16] Programmed in calculating bond distances between atoms. --- Project#01/001.cpp | 21 ++++++++++++++++++++- Project#01/001.exe | Bin 46308 -> 27200 bytes Project#01/001.o | Bin 0 -> 3120 bytes Project#01/a.out | Bin 43282 -> 0 bytes Project#01/molecule.cpp | 20 ++++++++++++++++++++ Project#01/molecule.h | 2 ++ Project#01/molecule.o | Bin 0 -> 6192 bytes 7 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Project#01/001.o delete mode 100755 Project#01/a.out create mode 100644 Project#01/molecule.o diff --git a/Project#01/001.cpp b/Project#01/001.cpp index 9e56725..e66cd57 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -3,17 +3,36 @@ #include #include #include +#include using namespace std; int main(int argc, char* argv[]) { + + double bond; //Create molecule object of class type "Molecule" Molecule mol(argv[1],0); cout << "Input Cartesian coordinates:\n"; - mol.print_geom(); + + cout << "Interatomic distances (bohr):\n"; + mol.print_bond(); + + cout<<"Temp bond distance for one atom\n"; + //printf("%d %8.5f",mol.geom[1][2]); + +/* bond = pow((mol.geom[0][0]-mol.geom[1][0]),2.0) + + +pow((mol.geom[0][1]-mol.geom[1][1]),2.0) + + +pow((mol.geom[0][2]-mol.geom[1][2]),2.0); + + bond = pow(bond,0.5); + + //bond = (pow(mol.geom[0][1]-mol.geom[1][1]),2.0)+(pow(mol.geom[0][2]-mol.geom[1][2]),2.0)+(pow(mol.geom[0][3]-mol.geom[1][3]),2.0) + //bond = pow(bond,0.5); +*/ + cout<<"Bond distance "<A~lRZ9i3An5$+e~IA$>?Mz&U7GH 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 literal 46308 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 b*>WoV4(GksH~svlQ(v6@*vY-EO-26)j~>GZ diff --git a/Project#01/001.o b/Project#01/001.o new file mode 100644 index 0000000000000000000000000000000000000000..94462e8d12589b53c69e48707d2a3c1c897dbff5 GIT binary patch literal 3120 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 U%lltG^LEYl7y4Fwx% #include #include +#include void Molecule::print_geom(){ for(int i=0; i < natom; i++){ @@ -11,6 +12,20 @@ void Molecule::print_geom(){ } } +void Molecule::print_bond(){ + + printf("Andrew Test\n"); + for(int i = 0; i < natom; i++){ + for (int j = 0; j>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; } + Rij = new double*[natom-1]; + for (int i = 0; i < natom; i++) { // Iterate up to natom + Rij[i] = new double[natom-1]; + } + } Molecule::~Molecule(){ delete[] zvals; diff --git a/Project#01/molecule.h b/Project#01/molecule.h index 175e7bf..d1e40f9 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -11,9 +11,11 @@ class Molecule int charge; int *zvals; double **geom; + double **Rij; string point_group; void print_geom(); + void print_bond(); void rotate(double phi); void translate(double x, double y, double z); double bond(int atom1, int atom2); diff --git a/Project#01/molecule.o b/Project#01/molecule.o new file mode 100644 index 0000000000000000000000000000000000000000..ed66ce7c1e1e33664f4e9bdfcc140b7ce8a8f92b GIT binary patch literal 6192 zcmbtYZ)_Y#6`#Gc6E~!}OXwd%16=`ald3&@=Y%*dEe`IsYc)xY&z7Pp)^>fjJ|Eoe zo_5!RCOe@{97a72;_ZxVTsG)EjIq;ylW-%q>!Bu4g-QMK~1 zTHcV=%2Tx^WfLV=egH4kQ);T$ANNK#)y%u_-r14H?36kav#m6c5i6+LoP*^HeZtJmxE z^KV_6$N1AQfdepsRjNbjOUednUHKStv7}Jw$|Cf^#Hv57jh1P#keRF&l);ovFF;`5 ztpc$VE%QjL)b`cbUInt#-ZrF+r=+cYChr21E8yoH^aGuCet@!iHFjzY#CylC=MdLO zm~88W_!|DlNu5$w=%iI|6e1t)_D(?7aK)e){-k>Qyc1y9AJ6UI6%sOLO|3*(cDlXM z*35gOEx~oc*i$yJ2o`t|U_G-Us7X)*_bVH*^QnK;>r2WSu0>hdz}i^F+5pLJkj&4k z-q^K9eLTIPMqu$PzhC}my{=YXufnJD-0yJUougQ}3R_@_dSQ@9<&~ih)tf`UI(Kdb zJ{P;dqgr{p!S-Q3EPpCJQ+4ODtYa>e(X0vZc!vgg%{FbQn8t49~@ zJ?g^c2xqN#`cYOEdF+)T*p7m#uUU_A)#&w9<7}&}-_6a@UEf%wx&84sx?wWRY1B_P z^9K1oyUh33uP`wzonAjKq`!?|doQx&sg>qroAIN=W+h3>c+6DZR4X3@C)$n(n`=Ad zxIiu|HK?1$RBEyF4?yY~NExKC5ZlUTH!I2Yq3fBs3)T}hgkJ`9U#$uIXv=Cr&ez01 z*UtX5kx##5*AJ_eOF;~l{SsdfvAip*+=H-3_#L47=YE%ZuIk1c1GY2R1+jjN3AWx2 zpe2V2nU$8K{OoTyUGxa6#P=dxLqhOyUC-F>CVkg^0c(j zQR^hn@4(~#k%58xr4x^yDy+X5!LqyLWcY19?Bl@xeyVmt%Y4&qfAr+!475 z4ByAseKENm&OE~9N;w+6IYK#HUwU%rIJLeLuUQi1KE472e6W2PL>OnojtX{ei8g$_ zj527i;*0x=yh7y&g*BXa2l;!wojlseN~<(Vv)78@C`xv00rvnR0e^@|c%F|j{96Is zW%zIa{~3(q3==m39%3gQ!Y4(mU}UD?NXnE-M0@;X+U?V{tl{eULT`_zK&8nMQW-+lsPXmE!hQW~oZrO(pY|qmAp1p%wDuwrbSGc(C#G6ezUGn(Uq+uUF#?Ix3$D9yF?yz2~Rl(Y^nWgrQ@XnK=}e2x4B z=oosjoet6=05I084Z@@!gUh36WsPlEI06fWcMf%%b`NC?+XnTtTW|)q2B{3AFF!Dg z$2FoU>BAbtLG=z9X135a*fzQ&+DH#*e@&wiTLniMdU!Z(r8U1`^0uQ4LwX-K^&%uW zGox$nq-{;Z>Si_Fw)I)fG^VwJVdmUPYJzHHY1jR)GWbv<;oDs*Uvt!)&YM|n*l?zb zH1CZP^VbHWZ=#ZwY){L(c!cfZr*{EC2!{7(g3AQ(n+1O%VtlJpt*P9;h+>((W4td?FED)(!+wyP1q`Xd`M=EcgK-7tf0o${>aQ~WWsr+4 zs6P$DcJ*_LT`KcT8S4l4CfDcngYyacMwOQsv4<4~-t7nl_3`ifVC?`zRz8DoLb3s2 WFn@T51}Ido#^QgLj+(Ea{=Wg Date: Tue, 3 Oct 2023 16:50:09 -0700 Subject: [PATCH 07/16] Modifying to get bond angles --- Project#01/001.cpp | 18 +++--------- Project#01/molecule.cpp | 61 +++++++++++++++++++++++++++++++++++++++-- Project#01/molecule.h | 9 ++++-- 3 files changed, 70 insertions(+), 18 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index e66cd57..36dda28 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -18,22 +18,12 @@ int main(int argc, char* argv[]) { mol.print_geom(); cout << "Interatomic distances (bohr):\n"; - mol.print_bond(); + mol.print_bond_distances(); - cout<<"Temp bond distance for one atom\n"; - //printf("%d %8.5f",mol.geom[1][2]); - -/* bond = pow((mol.geom[0][0]-mol.geom[1][0]),2.0) + - +pow((mol.geom[0][1]-mol.geom[1][1]),2.0) + - +pow((mol.geom[0][2]-mol.geom[1][2]),2.0); - - bond = pow(bond,0.5); - - //bond = (pow(mol.geom[0][1]-mol.geom[1][1]),2.0)+(pow(mol.geom[0][2]-mol.geom[1][2]),2.0)+(pow(mol.geom[0][3]-mol.geom[1][3]),2.0) - //bond = pow(bond,0.5); -*/ - cout<<"Bond distance "< Date: Wed, 4 Oct 2023 15:41:26 -0700 Subject: [PATCH 08/16] Making 002.cpp file --- Project#02/002.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Project#02/002.cpp diff --git a/Project#02/002.cpp b/Project#02/002.cpp new file mode 100644 index 0000000..e69de29 From 54579764931004e32cfb79004db40a528a28b61c Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Mon, 23 Oct 2023 14:34:34 -0700 Subject: [PATCH 09/16] Solution to Step 3 done ... without including eliminating non-interesting bond angles --- Project#01/001.cpp | 9 +++-- Project#01/molecule.cpp | 79 ++++++++++++++++++----------------------- Project#01/molecule.h | 11 +++--- 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index 36dda28..20fafba 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -20,10 +20,15 @@ int main(int argc, char* argv[]) { cout << "Interatomic distances (bohr):\n"; mol.print_bond_distances(); - cout << "Interatomic distances (bohr):\n"; + cout << "Bond angles:\n"; + + cout << "Andrew test dot:\n"; + cout << mol.dot(2,1,0)<<"\n"; + cout << mol.angle(2,1,0)<<"\n"; + cout << mol.angle(3,1,0)<<"\n"; + mol.print_bond_angles(); - cout << "Andrew test: " << mol.Rij[1][0]<<"\n"; return 0; } diff --git a/Project#01/molecule.cpp b/Project#01/molecule.cpp index ce59081..e6371d0 100644 --- a/Project#01/molecule.cpp +++ b/Project#01/molecule.cpp @@ -14,7 +14,6 @@ void Molecule::print_geom(){ void Molecule::print_bond_distances(){ - printf("Andrew Test\n"); for(int i = 0; i < natom; i++){ for (int j = 0; j>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; } - Rij = new double*[natom-1]; + Rij = new double*[natom]; for (int i = 0; i < natom; i++) { // Iterate up to natom - Rij[i] = new double[natom-1]; - } - - ex = new double*[natom-1]; - for (int i = 0; i < natom; i++) { // Iterate up to natom - ex[i] = new double[natom-1]; - } - - ey = new double*[natom-1]; - for (int i = 0; i < natom; i++) { // Iterate up to natom - ey[i] = new double[natom-1]; - } - ez = new double*[natom-1]; - for (int i = 0; i < natom; i++) { // Iterate up to natom - ez[i] = new double[natom-1]; + Rij[i] = new double[natom]; } } @@ -111,10 +104,6 @@ Molecule::~Molecule(){ delete[] Rij[i]; } delete[] Rij; - - for(int i=0; i < natom; i++){ - delete[] ex[i]; delete[] ey[i]; delete[] ez[i]; - } - delete[] ex; delete[] ey; delete[] ez; + } diff --git a/Project#01/molecule.h b/Project#01/molecule.h index 376b61c..a43b953 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -12,19 +12,18 @@ class Molecule int *zvals; double **geom; double **Rij; - //Unit vector matrix; - double **ex; - double **ey; - double **ez; string point_group; void print_geom(); void print_bond_distances(); + + double bond(int atom1,int atom2); + double dot(int a,int b,int c); + double angle(int atom1,int atom2,int atom3); void print_bond_angles(); + void rotate(double phi); void translate(double x, double y, double z); - double bond(int atom1, int atom2); - double angle(int atom1, int atom2, int atom3); double torsion(int atom1, int atom2, int atom3, int atom4); // Declaring constructor and deconstructor functions From cc8f69f024cd0e18083da50ac269b5aabd664d8b Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Tue, 24 Oct 2023 17:04:40 -0700 Subject: [PATCH 10/16] Almost finished step 4 --- Project#01/001.cpp | 19 ++++---- Project#01/molecule.cpp | 98 ++++++++++++++++++++++++++++++++++++++--- Project#01/molecule.h | 14 +++--- 3 files changed, 112 insertions(+), 19 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index 20fafba..6dd148f 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -4,8 +4,7 @@ #include #include #include - -using namespace std; +#include int main(int argc, char* argv[]) { @@ -14,21 +13,25 @@ int main(int argc, char* argv[]) { //Create molecule object of class type "Molecule" Molecule mol(argv[1],0); + //Step 1 Print cout << "Input Cartesian coordinates:\n"; mol.print_geom(); + //Step 2 Print cout << "Interatomic distances (bohr):\n"; mol.print_bond_distances(); + //Step 3 Print cout << "Bond angles:\n"; - - cout << "Andrew test dot:\n"; - cout << mol.dot(2,1,0)<<"\n"; - cout << mol.angle(2,1,0)<<"\n"; - cout << mol.angle(3,1,0)<<"\n"; - mol.print_bond_angles(); + //Step 4 Print + //oop follows crawford notation for "out of plane angles" + cout << "Out-of-plane angles:\n"; + mol.print_oop_angles(); + //Andrew testing individual values + // + return 0; } diff --git a/Project#01/molecule.cpp b/Project#01/molecule.cpp index e6371d0..9572db2 100644 --- a/Project#01/molecule.cpp +++ b/Project#01/molecule.cpp @@ -5,6 +5,9 @@ #include #include #include +#include + +using namespace std; void Molecule::print_geom(){ for(int i=0; i < natom; i++){ @@ -28,31 +31,74 @@ double Molecule::bond(int a,int b) return Rij[a][b]; } -double Molecule::dot(int a,int b,int c) +double Molecule::dot(const vector& vector1, const vector& vector2) { //gives the dot product between two vectors ba and bc //vector 1 = ba //vector 2 = bc + if (vector1.size() != vector2.size()) + { + // You can add proper error handling here. + cerr << "Error: Vectors have different dimensions.\n"; + return 0.0; + } + double dot = 0.0; - dot += (geom[a][0] - geom[b][0]) * (geom[c][0] - geom[b][0]); - dot += (geom[a][1] - geom[b][1]) * (geom[c][1] - geom[b][1]); - dot += (geom[a][2] - geom[b][2]) * (geom[c][2] - geom[b][2]); + for (size_t i = 0; i < vector1.size(); i++) + { + dot += vector1[i] * vector2[i]; + } return dot; } + +vector Molecule::cross(const vector& vector1, const vector& vector2) +{ + cout<<"Vector size 1 :"<< vector1.size()<(); // Return an empty vector for error case. + } + + vector cross(3); + + cross[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1]; + cross[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2]; + cross[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0]; + + return cross; +} + double Molecule::angle(int a,int b,int c) { + //gives the dot product between two vectors ba and bc + //vector 1 = ba + //vector 2 = bc + + vector vectorba; + vectorba.push_back(geom[a][0] - geom[b][0]); + vectorba.push_back(geom[a][1] - geom[b][1]); + vectorba.push_back(geom[a][2] - geom[b][2]); + + vector vectorbc; + vectorbc.push_back(geom[c][0] - geom[b][0]); + vectorbc.push_back(geom[c][1] - geom[b][1]); + vectorbc.push_back(geom[c][2] - geom[b][2]); + double angle = 0.0; - angle = acos(dot(a,b,c)/(bond(a,b)*bond(b,c))); + angle = acos(dot(vectorba,vectorbc)/(bond(a,b)*bond(b,c))); angle *= 180.0/acos(-1.0); return angle; } void Molecule::print_bond_angles(){ - printf("Andrew Test inside bond angle\n"); for(int i = 0; i < natom; i++){ for (int j = 0; j vectorkj(3); + vectorkj[0] = (geom[k][0] - geom[j][0]); + vectorkj[1] = (geom[k][1] - geom[j][1]); + vectorkj[2] = (geom[k][2] - geom[j][2]); + + vector vectorkl(3); + vectorkl[0] = (geom[k][0] - geom[l][0]); + vectorkl[1] = (geom[k][1] - geom[l][1]); + vectorkl[2] = (geom[k][2] - geom[l][2]); + + vector tmpvec(3); + tmpvec = cross(vectorkj,vectorkl); + + //generate ki as right vector + vector vectorki(3); + vectorki[0] = (geom[k][0] - geom[i][0]); + vectorki[1] = (geom[k][1] - geom[i][1]); + vectorki[2] = (geom[k][2] - geom[i][2]); + + //double oop + double oop = dot(tmpvec,vectorki); + +// cout << "Checking function cross: " << cross(vectorkj,vectorkl) << std::endl; +// cout << "Checking function angle: " << sin(angle(i,j,k))<< std::endl; + // cout << "Checking function div: " << div(cross(vectorkj,vectorkl),sin(angle(i,j,k))) << std::endl; + // cout << "Checking function oop: " << dot(tmpvec,vectorki) << std::endl; + printf("%2d-%2d-%2d-%2d %10.6f\n", i,j,k,l, oop); + cout << std::endl; + } + } + } + } +} Molecule::Molecule(const char *filename,int q){ diff --git a/Project#01/molecule.h b/Project#01/molecule.h index a43b953..e6d09c8 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -1,11 +1,11 @@ #include #include #include +#include using namespace std; -class Molecule -{ +class Molecule{ public: int natom; int charge; @@ -13,14 +13,18 @@ class Molecule double **geom; double **Rij; string point_group; - + +// Printing functions void print_geom(); void print_bond_distances(); + void print_bond_angles(); + void print_oop_angles(); double bond(int atom1,int atom2); - double dot(int a,int b,int c); + double dot(const vector& vector1, const vector& vector2); + vector cross(const vector& vector1, const vector& vector2); + vector div(const vector& vector, double divisor); double angle(int atom1,int atom2,int atom3); - void print_bond_angles(); void rotate(double phi); void translate(double x, double y, double z); From 4e2af8aec4e973d6d8ea7fe67f18fcc3c959b461 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Wed, 25 Oct 2023 17:18:06 -0700 Subject: [PATCH 11/16] testdr is a test against the solutions originally written --- Project#01/001.cpp | 63 ++++++--- Project#01/molecule.cpp | 197 +++++++++++++++-------------- Project#01/molecule.h | 6 +- Project#01/testdr/001.cpp | 48 +++++++ Project#01/testdr/001.exe | Bin 0 -> 59076 bytes Project#01/testdr/001.o | Bin 0 -> 101856 bytes Project#01/testdr/acetaldehyde.dat | 8 ++ Project#01/testdr/makefile | 17 +++ Project#01/testdr/molecule.cpp | 98 ++++++++++++++ Project#01/testdr/molecule.h | 25 ++++ Project#01/testdr/molecule.o | Bin 0 -> 129608 bytes 11 files changed, 344 insertions(+), 118 deletions(-) create mode 100644 Project#01/testdr/001.cpp create mode 100755 Project#01/testdr/001.exe create mode 100644 Project#01/testdr/001.o create mode 100644 Project#01/testdr/acetaldehyde.dat create mode 100644 Project#01/testdr/makefile create mode 100644 Project#01/testdr/molecule.cpp create mode 100644 Project#01/testdr/molecule.h create mode 100644 Project#01/testdr/molecule.o diff --git a/Project#01/001.cpp b/Project#01/001.cpp index 6dd148f..ecd1115 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -10,28 +10,53 @@ int main(int argc, char* argv[]) { double bond; - //Create molecule object of class type "Molecule" - Molecule mol(argv[1],0); - - //Step 1 Print - cout << "Input Cartesian coordinates:\n"; - mol.print_geom(); - - //Step 2 Print - cout << "Interatomic distances (bohr):\n"; +//Create molecule object of class type "Molecule" + Molecule mol(argv[1],0); + +//Step 1 Print + cout << "Input Cartesian coordinates:\n"; + mol.print_geom(); + +//Step 2 Print + cout << "Interatomic distances (bohr):\n"; mol.print_bond_distances(); - //Step 3 Print - cout << "Bond angles:\n"; - mol.print_bond_angles(); +//Step 3 Print + cout << "Bond angles:\n"; + mol.print_bond_angles(); + +//Step 4 Print +//oop follows crawford notation for "out of plane angles" + cout << "Out-of-plane angles:\n"; +// Trying to reproduce -0-6-4-5 + cout << "Andrew test cross product\n"; + vector tmpvec1(3); + vector tmpvec2(3); + vector tmpvec3(3); + vector tmpvec4(3); + + tmpvec1[0] = (mol.geom[4][0] - mol.geom[6][0]); + tmpvec1[1] = (mol.geom[4][1] - mol.geom[6][1]); + tmpvec1[2] = (mol.geom[4][2] - mol.geom[6][2]); + + tmpvec2[0] = (mol.geom[4][0] - mol.geom[5][0]); + tmpvec2[1] = (mol.geom[4][1] - mol.geom[5][1]); + tmpvec2[2] = (mol.geom[4][2] - mol.geom[5][2]); + + tmpvec3[0] = (mol.geom[4][0] - mol.geom[0][0]); + tmpvec3[1] = (mol.geom[4][1] - mol.geom[0][1]); + tmpvec3[2] = (mol.geom[4][2] - mol.geom[0][2]); + + cout<<"tmpvec1: "<<" "<& vector1, const vector& vector2) { - //gives the dot product between two vectors ba and bc - //vector 1 = ba - //vector 2 = bc - - if (vector1.size() != vector2.size()) - { - // You can add proper error handling here. - cerr << "Error: Vectors have different dimensions.\n"; - return 0.0; - } +//gives the dot product between two vectors ba and bc +//vector 1 = ba +//vector 2 = bc + + if (vector1.size() != vector2.size()) + { +// You can add proper error handling here. + cerr << "Error: Vectors have different dimensions.\n"; + return 0.0; + } - double dot = 0.0; - for (size_t i = 0; i < vector1.size(); i++) - { - dot += vector1[i] * vector2[i]; - } + double dot = 0.0; + for (size_t i = 0; i < vector1.size(); i++) + { + dot += vector1[i] * vector2[i]; + } - return dot; + return dot; } vector Molecule::cross(const vector& vector1, const vector& vector2) { - cout<<"Vector size 1 :"<< vector1.size()<(); // Return an empty vector for error case. + cerr << "Error: Cross product requires 3D vectors.\n"; + return vector(); // Return an empty vector for error case. } - vector cross(3); + vector cross(3); - cross[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1]; - cross[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2]; - cross[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0]; + cross[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1]; + cross[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2]; + cross[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0]; - return cross; + return cross; } double Molecule::angle(int a,int b,int c) { - //gives the dot product between two vectors ba and bc - //vector 1 = ba - //vector 2 = bc +//gives the dot product between two vectors ba and bc +//vector 1 = ba +//vector 2 = bc - vector vectorba; + vector vectorba; vectorba.push_back(geom[a][0] - geom[b][0]); vectorba.push_back(geom[a][1] - geom[b][1]); vectorba.push_back(geom[a][2] - geom[b][2]); - vector vectorbc; + vector vectorbc; vectorbc.push_back(geom[c][0] - geom[b][0]); vectorbc.push_back(geom[c][1] - geom[b][1]); vectorbc.push_back(geom[c][2] - geom[b][2]); - double angle = 0.0; - angle = acos(dot(vectorba,vectorbc)/(bond(a,b)*bond(b,c))); - angle *= 180.0/acos(-1.0); - return angle; + double angle = 0.0; + angle = acos(dot(vectorba,vectorbc)/(bond(a,b)*bond(b,c))); + angle *= 180.0/acos(-1.0); + return angle; } void Molecule::print_bond_angles(){ - for(int i = 0; i < natom; i++){ - for (int j = 0; j vectorkj(3); - vectorkj[0] = (geom[k][0] - geom[j][0]); - vectorkj[1] = (geom[k][1] - geom[j][1]); - vectorkj[2] = (geom[k][2] - geom[j][2]); - - vector vectorkl(3); - vectorkl[0] = (geom[k][0] - geom[l][0]); - vectorkl[1] = (geom[k][1] - geom[l][1]); - vectorkl[2] = (geom[k][2] - geom[l][2]); - - vector tmpvec(3); - tmpvec = cross(vectorkj,vectorkl); - - //generate ki as right vector - vector vectorki(3); - vectorki[0] = (geom[k][0] - geom[i][0]); - vectorki[1] = (geom[k][1] - geom[i][1]); - vectorki[2] = (geom[k][2] - geom[i][2]); - - //double oop - double oop = dot(tmpvec,vectorki); - -// cout << "Checking function cross: " << cross(vectorkj,vectorkl) << std::endl; -// cout << "Checking function angle: " << sin(angle(i,j,k))<< std::endl; - // cout << "Checking function div: " << div(cross(vectorkj,vectorkl),sin(angle(i,j,k))) << std::endl; - // cout << "Checking function oop: " << dot(tmpvec,vectorki) << std::endl; - printf("%2d-%2d-%2d-%2d %10.6f\n", i,j,k,l, oop); - cout << std::endl; - } - } - } - } + for(int i = 0; i < natom; i++){ + for (int j = 0; j vectorkj(3); + vectorkj[0] = (geom[k][0] - geom[j][0]); + vectorkj[1] = (geom[k][1] - geom[j][1]); + vectorkj[2] = (geom[k][2] - geom[j][2]); + + vector vectorkl(3); + vectorkl[0] = (geom[k][0] - geom[l][0]); + vectorkl[1] = (geom[k][1] - geom[l][1]); + vectorkl[2] = (geom[k][2] - geom[l][2]); + + vector tmpvec(3); + tmpvec = cross(vectorkj,vectorkl); + cout<<"cross product: "< vectorki(3); + vectorki[0] = (geom[k][0] - geom[i][0]); + vectorki[1] = (geom[k][1] - geom[i][1]); + vectorki[2] = (geom[k][2] - geom[i][2]); + + //double oop + double oop = dot(tmpvec,vectorki); + //oop /= sin(angle(j,k,l)); + +// if(i!=j && i!=k && i!=l && j!=k && k!=l && bond(i,k) < 4.0 && bond(k,j) < 4.0 && bond(k,l) < 4.0){ + printf("%2d-%2d-%2d-%2d %10.6f\n", i,j,k,l, oop); + + } + } + } + } } Molecule::Molecule(const char *filename,int q){ @@ -163,22 +167,23 @@ Molecule::Molecule(const char *filename,int q){ inputfile >> natom; - zvals = new int[natom]; - geom = new double*[natom]; - for (int i = 0; i < natom; i++) { // Iterate up to natom - geom[i] = new double[3]; - } + zvals = new int[natom]; + geom = new double*[natom]; + for (int i = 0; i < natom; i++) { // Iterate up to natom + geom[i] = new double[3]; + } - for (int i = 0; i < natom; i++){ - inputfile>>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; - } + for (int i = 0; i < natom; i++){ + inputfile>>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; + } Rij = new double*[natom]; for (int i = 0; i < natom; i++) { // Iterate up to natom Rij[i] = new double[natom]; - } + } } + Molecule::~Molecule(){ delete[] zvals; for(int i=0; i < natom; i++){ @@ -187,7 +192,7 @@ Molecule::~Molecule(){ delete[] geom; for(int i=0; i < natom; i++){ - delete[] Rij[i]; + delete[] Rij[i]; } delete[] Rij; diff --git a/Project#01/molecule.h b/Project#01/molecule.h index e6d09c8..279d83a 100644 --- a/Project#01/molecule.h +++ b/Project#01/molecule.h @@ -16,9 +16,9 @@ class Molecule{ // Printing functions void print_geom(); - void print_bond_distances(); - void print_bond_angles(); - void print_oop_angles(); + void print_bond_distances(); + void print_bond_angles(); + void print_oop_angles(); double bond(int atom1,int atom2); double dot(const vector& vector1, const vector& vector2); diff --git a/Project#01/testdr/001.cpp b/Project#01/testdr/001.cpp new file mode 100644 index 0000000..2aefcde --- /dev/null +++ b/Project#01/testdr/001.cpp @@ -0,0 +1,48 @@ +#include "molecule.h" +#include +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) { + + double bond; + + //Create molecule object of class type "Molecule" + Molecule mol(argv[1],0); + cout << "Number of atoms: " << mol.natom << endl; + cout << "Input Cartesian coordinates:\n"; + mol.print_geom(); + + cout << "Interatomic distances (bohr):\n"; + for(int i=0; i < mol.natom; i++) + for(int j=0; j < i; j++) + printf("%d %d %8.5f\n", i, j, mol.bond(i,j)); + + cout << "\nBond angles:\n"; + for(int i=0; i < mol.natom; i++) { + for(int j=0; j < i; j++) { + for(int k=0; k < j; k++) { + //if(mol.bond(i,j) < 4.0 && mol.bond(j,k) < 4.0) + printf("%2d-%2d-%2d %10.6f\n", i, j, k, mol.angle(i,j,k)*(180.0/acos(-1.0))); + } + } + } + cout << endl; + + cout << "\nOut-of-Plane angles:\n"; + for(int i=0; i < mol.natom; i++) { + for(int k=0; k < mol.natom; k++) { + for(int j=0; j < mol.natom; j++) { + for(int l=0; l < j; l++) { + if(i!=j && i!=k && i!=l && j!=k && k!=l && mol.bond(i,k) < 4.0 && mol.bond(k,j) < 4.0 && mol.bond(k,l) < 4.0) + printf("%2d-%2d-%2d-%2d %10.6f\n", i, j, k, l, mol.oop(i,j,k,l)*(180.0/acos(-1.0))); + } + } + } + } + + return 0; +} diff --git a/Project#01/testdr/001.exe b/Project#01/testdr/001.exe new file mode 100755 index 0000000000000000000000000000000000000000..ec421dd32630bfae1d2a11ec2d0bd8dba4bf4447 GIT binary patch literal 59076 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 literal 0 HcmV?d00001 diff --git a/Project#01/testdr/001.o b/Project#01/testdr/001.o new file mode 100644 index 0000000000000000000000000000000000000000..93154cdd2197d36183f55aa3bf5cda0b0f82891f GIT binary patch literal 101856 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 C5~57oWE9;c%U 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 C!Q1x$ literal 0 HcmV?d00001 diff --git a/Project#01/testdr/acetaldehyde.dat b/Project#01/testdr/acetaldehyde.dat new file mode 100644 index 0000000..e005b69 --- /dev/null +++ b/Project#01/testdr/acetaldehyde.dat @@ -0,0 +1,8 @@ +7 +6 0.000000000000 0.000000000000 0.000000000000 +6 0.000000000000 0.000000000000 2.845112131228 +8 1.899115961744 0.000000000000 4.139062527233 +1 -1.894048308506 0.000000000000 3.747688672216 +1 1.942500819960 0.000000000000 -0.701145981971 +1 -1.007295466862 -1.669971842687 -0.705916966833 +1 -1.007295466862 1.669971842687 -0.705916966833 diff --git a/Project#01/testdr/makefile b/Project#01/testdr/makefile new file mode 100644 index 0000000..c665c0b --- /dev/null +++ b/Project#01/testdr/makefile @@ -0,0 +1,17 @@ +G++ = g++ +SRCS = $(wildcard *.cpp) +OBJS = $(SRCS:.cpp=.o) + +all: 001.exe + +molecule.o: molecule.cpp + $(G++) -g -c $< -o $@ + +001.o: 001.cpp + $(G++) -g -c $< -o $@ + +001.exe: 001.o molecule.o + $(G++) -g $^ -o $@ + +clean: + rm -rf *.exe *.o diff --git a/Project#01/testdr/molecule.cpp b/Project#01/testdr/molecule.cpp new file mode 100644 index 0000000..8b2401e --- /dev/null +++ b/Project#01/testdr/molecule.cpp @@ -0,0 +1,98 @@ +#include "molecule.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +void Molecule::print_geom(){ + for(int i=0; i < natom; i++){ + printf("%d %8.5f %8.5f %8.5f\n", zvals[i], geom[i][0], geom[i][1], geom[i][2]); + } +} + +// Returns the value of the unit vector between atoms a and b +// in the cart direction (cart=0=x, cart=1=y, cart=2=z) +double Molecule::unit(int cart, int a, int b) +{ + return -(geom[a][cart]-geom[b][cart])/bond(a,b); +} + +// Returns the angle between atoms a, b, and c in radians +double Molecule::angle(int a, int b, int c) +{ + return acos(unit(0,b,a) * unit(0,b,c) + unit(1,b,a) * unit(1,b,c) + unit(2,b,a) * unit(2,b,c)); +} + +double Molecule::bond(int a, int b) +{ + return sqrt( (geom[a][0]-geom[b][0])*(geom[a][0]-geom[b][0]) + + (geom[a][1]-geom[b][1])*(geom[a][1]-geom[b][1]) + + (geom[a][2]-geom[b][2])*(geom[a][2]-geom[b][2]) ); +} + +double Molecule::oop(int a, int b, int c, int d) +{ + double ebcd_x = (unit(1,c,b) * unit(2,c,d) - unit(2,c,b) * unit(1,c,d)); + double ebcd_y = (unit(2,c,b) * unit(0,c,d) - unit(0,c,b) * unit(2,c,d)); + double ebcd_z = (unit(0,c,b) * unit(1,c,d) - unit(1,c,b) * unit(0,c,d)); + + double exx = ebcd_x * unit(0,c,a); + double eyy = ebcd_y * unit(1,c,a); + double ezz = ebcd_z * unit(2,c,a); + + cout<<"\n"; + double hold_x = ebcd_x; + double hold_y = ebcd_y; + double hold_z = ebcd_z; + cout< 1.0) theta = asin(1.0); + else theta = asin(theta); + + return theta; +} + +Molecule::Molecule(const char *filename,int q){ + + charge = q; + + //Open filename + std::ifstream inputfile(filename); + if (!inputfile.is_open()) { + std::cerr << "Error: Could not open the file." << std::endl; + } + + inputfile >> natom; + + zvals = new int[natom]; + geom = new double*[natom]; + for (int i = 0; i < natom; i++) { // Iterate up to natom + geom[i] = new double[3]; + } + + for (int i = 0; i < natom; i++){ + inputfile>>zvals[i]>>geom[i][0]>>geom[i][1]>>geom[i][2]; + } + +} +Molecule::~Molecule(){ + delete[] zvals; + for(int i=0; i < natom; i++){ + delete[] geom[i]; + } + delete[] geom; +} + diff --git a/Project#01/testdr/molecule.h b/Project#01/testdr/molecule.h new file mode 100644 index 0000000..57ddcdb --- /dev/null +++ b/Project#01/testdr/molecule.h @@ -0,0 +1,25 @@ +#include + +using namespace std; + +class Molecule +{ + public: + int natom; + int charge; + int *zvals; + double **geom; + string point_group; + + void print_geom(); + void rotate(double phi); + void translate(double x, double y, double z); + double bond(int atom1, int atom2); + double angle(int atom1, int atom2, int atom3); + double torsion(int atom1, int atom2, int atom3, int atom4); + double oop(int atom1, int atom2, int atom3, int atom4); + double unit(int cart, int atom1, int atom2); + + Molecule(const char *filename, int q); + ~Molecule(); +}; diff --git a/Project#01/testdr/molecule.o b/Project#01/testdr/molecule.o new file mode 100644 index 0000000000000000000000000000000000000000..756e6178c1993b1cab436d7044e52b93bae4ef46 GIT binary patch literal 129608 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 Y!2m9 Date: Mon, 30 Oct 2023 15:57:02 -0700 Subject: [PATCH 12/16] step 4 complete --- Project#01/001.cpp | 31 ++---------------- Project#01/molecule.cpp | 71 +++++++++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 56 deletions(-) diff --git a/Project#01/001.cpp b/Project#01/001.cpp index ecd1115..d8c7233 100644 --- a/Project#01/001.cpp +++ b/Project#01/001.cpp @@ -20,42 +20,17 @@ int main(int argc, char* argv[]) { //Step 2 Print cout << "Interatomic distances (bohr):\n"; mol.print_bond_distances(); + cout <<"\n"; //Step 3 Print cout << "Bond angles:\n"; mol.print_bond_angles(); + cout <<"\n"; //Step 4 Print //oop follows crawford notation for "out of plane angles" cout << "Out-of-plane angles:\n"; -// Trying to reproduce -0-6-4-5 - cout << "Andrew test cross product\n"; - vector tmpvec1(3); - vector tmpvec2(3); - vector tmpvec3(3); - vector tmpvec4(3); - - tmpvec1[0] = (mol.geom[4][0] - mol.geom[6][0]); - tmpvec1[1] = (mol.geom[4][1] - mol.geom[6][1]); - tmpvec1[2] = (mol.geom[4][2] - mol.geom[6][2]); - - tmpvec2[0] = (mol.geom[4][0] - mol.geom[5][0]); - tmpvec2[1] = (mol.geom[4][1] - mol.geom[5][1]); - tmpvec2[2] = (mol.geom[4][2] - mol.geom[5][2]); - - tmpvec3[0] = (mol.geom[4][0] - mol.geom[0][0]); - tmpvec3[1] = (mol.geom[4][1] - mol.geom[0][1]); - tmpvec3[2] = (mol.geom[4][2] - mol.geom[0][2]); - - cout<<"tmpvec1: "<<" "<& vector1, const vector& vector2) { //gives the dot product between two vectors ba and bc @@ -58,10 +66,8 @@ double Molecule::dot(const vector& vector1, const vector& vector return dot; } - vector Molecule::cross(const vector& vector1, const vector& vector2) { - if (vector1.size() != 3 || vector2.size() != 3) { // You can add proper error handling here. @@ -78,6 +84,11 @@ vector Molecule::cross(const vector& vector1, const vector vectorkj(3); - vectorkj[0] = (geom[k][0] - geom[j][0]); - vectorkj[1] = (geom[k][1] - geom[j][1]); - vectorkj[2] = (geom[k][2] - geom[j][2]); + vectorkj[0] = (geom[j][0] - geom[k][0])/bond(k,j); + vectorkj[1] = (geom[j][1] - geom[k][1])/bond(k,j); + vectorkj[2] = (geom[j][2] - geom[k][2])/bond(k,j); vector vectorkl(3); - vectorkl[0] = (geom[k][0] - geom[l][0]); - vectorkl[1] = (geom[k][1] - geom[l][1]); - vectorkl[2] = (geom[k][2] - geom[l][2]); + vectorkl[0] = (geom[l][0] - geom[k][0])/bond(k,l); + vectorkl[1] = (geom[l][1] - geom[k][1])/bond(k,l); + vectorkl[2] = (geom[l][2] - geom[k][2])/bond(k,l); vector tmpvec(3); tmpvec = cross(vectorkj,vectorkl); - cout<<"cross product: "< vectorki(3); - vectorki[0] = (geom[k][0] - geom[i][0]); - vectorki[1] = (geom[k][1] - geom[i][1]); - vectorki[2] = (geom[k][2] - geom[i][2]); + vectorki[0] = (geom[i][0] - geom[k][0])/bond(k,i); + vectorki[1] = (geom[i][1] - geom[k][1])/bond(k,i); + vectorki[2] = (geom[i][2] - geom[k][2])/bond(k,i); - //double oop - double oop = dot(tmpvec,vectorki); + //Down below... there's a bunch of conversions from radians to degrees + //Some day I'll make a function for it...whatever + double oop = dot(tmpvec,vectorki)/sin(angle(j,k,l)*acos(-1.0)/180.0); //oop /= sin(angle(j,k,l)); -// if(i!=j && i!=k && i!=l && j!=k && k!=l && bond(i,k) < 4.0 && bond(k,j) < 4.0 && bond(k,l) < 4.0){ + if(oop < -1.0) oop = asin(-1.0); + else if(oop > 1.0) oop = asin(1.0); + else oop = asin(oop); + + oop = oop*180.0/acos(-1.0); printf("%2d-%2d-%2d-%2d %10.6f\n", i,j,k,l, oop); - + } } - } - } + } + } } } @@ -181,7 +197,6 @@ Molecule::Molecule(const char *filename,int q){ for (int i = 0; i < natom; i++) { // Iterate up to natom Rij[i] = new double[natom]; } - } Molecule::~Molecule(){ From 4fff42f74664174d1ca9abd0e719d19d682cf1ad Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Tue, 12 Mar 2024 15:41:33 -0700 Subject: [PATCH 13/16] Compiling base code. input programs later. --- Project#03/003.cpp | 47 +++++++++++++++++++++++++++++++++++++ Project#03/hartree-fock.cpp | 33 ++++++++++++++++++++++++++ Project#03/hartree-fock.h | 19 +++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 Project#03/003.cpp create mode 100644 Project#03/hartree-fock.cpp create mode 100644 Project#03/hartree-fock.h diff --git a/Project#03/003.cpp b/Project#03/003.cpp new file mode 100644 index 0000000..cc220d8 --- /dev/null +++ b/Project#03/003.cpp @@ -0,0 +1,47 @@ +#include "hartree-fock.h" +#include +#include +#include +#include +#include +#include + +/* Andrew --- Programming practice HartreeFock from Github project + * https://github.com/CrawfordGroup/ProgrammingProjects Project #03 + * Note Procedure does not calculate 1 and 2 electron matrices, only reads + * then in! + */ +void error_exit(){ + std::cout<<"ERROR! Hartree-Fock Program terminating.\n"; + exit(0); +} + +int main(int argc, char* argv[]) { + + if (argc!= 3){ + std::cout <<"Incorrect number of files, need molecule name and directory where files are located.\n"; + error_exit(); + } + + std::cout << "Hartree-fock test calculation from PSI4 .dat files.\n"; + std::cout << "Location of files within: " << argv[2] << "\n"; + std::cout << "Argument count: " << argc << "\n"; +//Create molecule object of class type "Molecule" + HF mol(argv[1]); + +//Step 1 Print + +//Read Overlap Matrix + +//Read Nuclear Repulsion from file + +//Read Overlap Matrix + +//Read Kinetic Matrix + +//Read Nuclear AttractionMatrix + + return 0; + +} + diff --git a/Project#03/hartree-fock.cpp b/Project#03/hartree-fock.cpp new file mode 100644 index 0000000..5a45d85 --- /dev/null +++ b/Project#03/hartree-fock.cpp @@ -0,0 +1,33 @@ +#include "hartree-fock.h" +#include +#include +#include +#include +#include +#include +#include + +void HF::read_symm_mat() +{ + printf("calling read_symm_mat()"); +} + +void HF::print_matrix() +{ + printf("calling print_matrix()"); +} + +HF::HF(const char *filename){ + + //Open filename + std::ifstream inputfile(filename); + if (!inputfile.is_open()) { + std::cerr << "Error: Could not open the file." << std::endl; + } + +} + +HF::~HF(){ + +} + diff --git a/Project#03/hartree-fock.h b/Project#03/hartree-fock.h new file mode 100644 index 0000000..450d49e --- /dev/null +++ b/Project#03/hartree-fock.h @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +class HF{ + public: + +// Printing functions + + void print_matrix(); + void read_symm_mat(); + +// Declaring constructor and deconstructor functions + HF(const char *filename); + ~HF(); +}; + + From d8f52ce26558dd135901c5c1dde33f84411af403 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Tue, 12 Mar 2024 16:16:50 -0700 Subject: [PATCH 14/16] Can open s.dat file... now need to close. --- Project#03/003.cpp | 2 +- Project#03/hartree-fock.cpp | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Project#03/003.cpp b/Project#03/003.cpp index cc220d8..c283e0a 100644 --- a/Project#03/003.cpp +++ b/Project#03/003.cpp @@ -27,7 +27,7 @@ int main(int argc, char* argv[]) { std::cout << "Location of files within: " << argv[2] << "\n"; std::cout << "Argument count: " << argc << "\n"; //Create molecule object of class type "Molecule" - HF mol(argv[1]); + HF mol(argv[2]); //Step 1 Print diff --git a/Project#03/hartree-fock.cpp b/Project#03/hartree-fock.cpp index 5a45d85..0c28b24 100644 --- a/Project#03/hartree-fock.cpp +++ b/Project#03/hartree-fock.cpp @@ -9,7 +9,8 @@ void HF::read_symm_mat() { - printf("calling read_symm_mat()"); + //std:cout<<"The second argument is: "< Date: Wed, 13 Mar 2024 19:33:26 -0700 Subject: [PATCH 15/16] Getting rid of OOP paradigm, using ARMADILLO for Linear Algebra. --- Project#03/003.cpp | 31 ++++++++----------- Project#03/hartree-fock.cpp | 61 +++++++++++++++++++++---------------- Project#03/hartree-fock.h | 19 +++--------- Project#03/makefile | 19 ++++++++++++ 4 files changed, 71 insertions(+), 59 deletions(-) create mode 100644 Project#03/makefile diff --git a/Project#03/003.cpp b/Project#03/003.cpp index c283e0a..9df2921 100644 --- a/Project#03/003.cpp +++ b/Project#03/003.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include /* Andrew --- Programming practice HartreeFock from Github project @@ -11,35 +12,29 @@ * Note Procedure does not calculate 1 and 2 electron matrices, only reads * then in! */ -void error_exit(){ - std::cout<<"ERROR! Hartree-Fock Program terminating.\n"; - exit(0); -} int main(int argc, char* argv[]) { - if (argc!= 3){ - std::cout <<"Incorrect number of files, need molecule name and directory where files are located.\n"; + if (argc!= 2){ + std::cerr <<"Incorrect number of files, need molecule name and directory where files are located.\n"; error_exit(); } std::cout << "Hartree-fock test calculation from PSI4 .dat files.\n"; - std::cout << "Location of files within: " << argv[2] << "\n"; - std::cout << "Argument count: " << argc << "\n"; -//Create molecule object of class type "Molecule" - HF mol(argv[2]); - -//Step 1 Print - -//Read Overlap Matrix - -//Read Nuclear Repulsion from file + std::cout << "Location of files within: " << argv[1] << "\n\n"; //Read Overlap Matrix - + arma::mat S_Mat = openfile(argv[1],'s'); + print_mat(S_Mat); + //arma::S_Mat = readsymm_mat(argv[1],'s'); //Read Kinetic Matrix +// openfile(argv[1],'t'); + //arma::T_Mat = readsymm_mat(argv[1],'t'); +//Read Kinetic Matrix + // openfile(argv[1],'v'); + //arma::V_Mat = readsymm_mat(argv[1],'v'); + -//Read Nuclear AttractionMatrix return 0; diff --git a/Project#03/hartree-fock.cpp b/Project#03/hartree-fock.cpp index 0c28b24..2615c5d 100644 --- a/Project#03/hartree-fock.cpp +++ b/Project#03/hartree-fock.cpp @@ -4,38 +4,45 @@ #include #include #include +#include #include #include -void HF::read_symm_mat() -{ - //std:cout<<"The second argument is: "<(4,4); + return A; } -HF::~HF(){ - -} -inputfile.close(); + +/* +arma::mat readsymm_mat(const char *filename,char mat){ + std::cout<<"Hello World!\n"; + } +*/ diff --git a/Project#03/hartree-fock.h b/Project#03/hartree-fock.h index 450d49e..691f893 100644 --- a/Project#03/hartree-fock.h +++ b/Project#03/hartree-fock.h @@ -2,18 +2,9 @@ #include #include #include +#include -class HF{ - public: - -// Printing functions - - void print_matrix(); - void read_symm_mat(); - -// Declaring constructor and deconstructor functions - HF(const char *filename); - ~HF(); -}; - - +void error_exit(); +void print_mat(const arma::mat& mat); +arma::mat openfile(const char *filename,char mat); +//arma::mat readsymm_mat(const char *filename,char mat); diff --git a/Project#03/makefile b/Project#03/makefile new file mode 100644 index 0000000..95411ee --- /dev/null +++ b/Project#03/makefile @@ -0,0 +1,19 @@ +G++ = g++ +SRCS = $(wildcard *.cpp) +OBJS = $(SRCS:.cpp=.o) +LIBS = -larmadillo + +all: 003.exe + +hartree-fock.o: hartree-fock.cpp + $(G++) -c $< -o $@ $(LIBS) + +003.o: 003.cpp + $(G++) -c $< -o $@ $(LIBS) + +003.exe: 003.o hartree-fock.o + $(G++) $^ -o $@ $(LIBS) + +clean: + rm -rf *.exe *.o + From a52894c53ddd79a286da49d175bbdace52ebc488 Mon Sep 17 00:00:00 2001 From: andrewbovill Date: Thu, 14 Mar 2024 19:58:08 -0700 Subject: [PATCH 16/16] Added in modifications to openfile function. Next is to rdmat --- Project#03/003.cpp | 14 ++++---- Project#03/hf.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++ Project#03/hf.h | 10 ++++++ 3 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 Project#03/hf.cpp create mode 100644 Project#03/hf.h diff --git a/Project#03/003.cpp b/Project#03/003.cpp index 9df2921..7237cb5 100644 --- a/Project#03/003.cpp +++ b/Project#03/003.cpp @@ -1,4 +1,4 @@ -#include "hartree-fock.h" +#include "hf.h" #include #include #include @@ -24,14 +24,16 @@ int main(int argc, char* argv[]) { std::cout << "Location of files within: " << argv[1] << "\n\n"; //Read Overlap Matrix - arma::mat S_Mat = openfile(argv[1],'s'); + arma::mat S_Mat = openfile_mat(argv[1],'s'); print_mat(S_Mat); - //arma::S_Mat = readsymm_mat(argv[1],'s'); //Read Kinetic Matrix -// openfile(argv[1],'t'); + arma::mat T_Mat = openfile_mat(argv[1],'t'); + print_mat(T_Mat); //arma::T_Mat = readsymm_mat(argv[1],'t'); -//Read Kinetic Matrix - // openfile(argv[1],'v'); +//Read Potential Nuclear-Electron Matrix + arma::mat Vne_Mat = openfile_mat(argv[1],'v'); + print_mat(Vne_Mat); + // openfile_mat(argv[1],'v'); //arma::V_Mat = readsymm_mat(argv[1],'v'); diff --git a/Project#03/hf.cpp b/Project#03/hf.cpp new file mode 100644 index 0000000..66c548a --- /dev/null +++ b/Project#03/hf.cpp @@ -0,0 +1,81 @@ +#include "hf.h" +#include +#include +#include +#include +#include +#include +#include +#include + +void error_exit(){ + std::cerr<<"ERROR! Hartree-Fock Program terminating.\n"; + exit(0); +} +void print_mat(const arma::mat& mat){ + size_t numRows = mat.n_rows; + size_t numCols = mat.n_cols; + for (size_t i = 0; i < numRows; ++i) { + std::cout << "|| "; + for (size_t j = 0; j < numCols; ++j) { + // Print the element followed by a space + std::cout << mat(i, j) << " "; + } + std::cout << "||" << std::endl; + } +} + +arma::mat openfile_mat(const char *filename,char mat){ + //Variable Declarations + arma::mat A; + std::ifstream file; + std::string sdat_path, tdat_path, vdat_path; + + + std::cout<<"Called open file procedure.\n"; + + switch (mat) { + case 's': + std::cout<<"Reading S matrix.\n"; + sdat_path = std::string(filename) + "s.dat"; + file.open(sdat_path); + if (!file.is_open()){ + std::cerr<<"s.dat file does not exist in this location\n"; + error_exit(); + } + A = arma::randu(4,4); + break; + case 't': + std::cout<<"Reading t matrix.\n"; + tdat_path = std::string(filename) + "t.dat"; + file.open(tdat_path); + if (!file.is_open()){ + std::cerr<<"t.dat file does not exist in this location\n"; + error_exit(); + } + A = arma::randu(3,3); + break; + case 'v': + std::cout<<"Reading Vne Matrix.\n"; + vdat_path = std::string(filename) + "v.dat"; + file.open(vdat_path); + if (!file.is_open()){ + std::cerr<<"v.dat file does not exist in this location\n"; + error_exit(); + } + A = arma::randu(5,5); + break; + default: + std::cout<<"Incorrect input for openfile argument.\n"; + error_exit(); + break; + } + return A; +} + + +/* +arma::mat readsymm_mat(const char *filename,char mat){ + std::cout<<"Hello World!\n"; + } +*/ diff --git a/Project#03/hf.h b/Project#03/hf.h new file mode 100644 index 0000000..a4d3e40 --- /dev/null +++ b/Project#03/hf.h @@ -0,0 +1,10 @@ +#include +#include +#include +#include +#include + +void error_exit(); +void print_mat(const arma::mat& mat); +arma::mat openfile_mat(const char *filename,char mat); +//arma::mat readsymm_mat(const char *filename,char mat);