From fcf6c4ef5c25d4ff29b8d8b76a3750722bc05586 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 30 May 2018 15:29:58 -0400 Subject: [PATCH 001/199] Add MEMC-1 method --- src/ConfigSetup.cpp | 126 +++++++++++++++++++++++++++++++++++++++++--- src/ConfigSetup.h | 19 ++++++- 2 files changed, 137 insertions(+), 8 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index abfbcd8cc..6c0918f25 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -47,6 +47,7 @@ ConfigSetup::ConfigSetup(void) sys.elect.tolerance = DBL_MAX; sys.elect.oneFourScale = DBL_MAX; sys.elect.dielectric = DBL_MAX; + sys.memcVal.enable = false; sys.step.total = ULONG_MAX; sys.step.equil = ULONG_MAX; sys.step.adjustment = ULONG_MAX; @@ -245,8 +246,59 @@ void ConfigSetup::Init(const char *fileName) printf("%-40s %-s \n", "Info: Long Range Correction", "Inactive"); } else if(line[0] == "Rswitch") { sys.ff.rswitch = stringtod(line[1]); - printf("%-40s %-4.4f \n", "Info: Switch distance", - sys.ff.rswitch); + printf("%-40s %-4.4f \n", "Info: Switch distance", sys.ff.rswitch); + } else if(line[0] == "ExchangeVolumeDim") { + if(line.size() == 4) { + XYZ temp; + temp.x = stringtod(line[1]); + temp.y = stringtod(line[2]); + temp.z = stringtod(line[3]); + sys.memcVal.subVol = temp; + printf("%-40s %-4.3f %-4.3f %-4.3f A\n", + "Info: Exchange Sub-Volume Dimensions", temp.x, temp.y, temp.z); + sys.memc.readVol = true; + } + } else if(line[0] == "ExchangeRatio") { + if(line.size() == 2) { + uint val = stringtoi(line[1]); + sys.memcVal.exchangeRatio = val; + sys.memcVal.readRatio = true; + printf("%-40s %-d \n", "Info: ExchangeRatio", val); + } + } else if(line[0] == "ExchangeLargeKind") { + if(line.size() == 2) { + std::string resName = line[1]; + sys.memcVal.largeKind = resName; + sys.memcVal.readLK = true; + printf("%-40s %-s \n", "Info: Exchange Large Kind", resName); + } + } else if(line[0] == "ExchangeSmallKind") { + if(line.size() == 2) { + std::string resName = line[1]; + sys.memcVal.smallKind = resName; + sys.memcVal.readSK = true; + printf("%-40s %-s \n", "Info: Exchange Small Kind", resName); + } + } else if(line[0] == "SmallKindBackBone") { + if(line.size() == 3) { + uint atom1 = stringtoi(line[1]); + uint atom2 = stringtoi(line[2]); + sys.memcVal.smallBBAtom1 = atom1; + sys.memcVal.smallBBAtom2 = atom2; + sys.memcVal.readSmallBB = true; + printf("%-40s %-d - %-d \n", "Info: Atom Index in Small Kind BackBone", + atom1, atom2); + } + } else if(line[0] == "LargeKindBackBone") { + if(line.size() == 3) { + uint atom1 = stringtoi(line[1]); + uint atom2 = stringtoi(line[2]); + sys.memcVal.largeBBAtom1 = atom1; + sys.memcVal.largeBBAtom2 = atom2; + sys.memcVal.readLargeBB = true; + printf("%-40s %-d - %-d \n", "Info: Atom Index in Large Kind BackBone", + atom1, atom2); + } } else if(line[0] == "Rcut") { sys.ff.cutoff = stringtod(line[1]); printf("%-40s %-4.4f A\n", "Info: Cutoff", sys.ff.cutoff); @@ -312,7 +364,7 @@ void ConfigSetup::Init(const char *fileName) sys.step.pressureCalcFreq = stringtoi(line[2]); if(sys.step.pressureCalc && (line.size() == 2)) { - std::cout << "Error: Pressure calculation frequency is not specified!\n"; + std::cout <<"Error: Pressure calculation frequency is not specified!\n"; exit(EXIT_FAILURE); } if(!sys.step.pressureCalc) @@ -364,6 +416,30 @@ void ConfigSetup::Init(const char *fileName) #endif printf("%-40s %-4.4f \n", "Info: Molecule swap move frequency", sys.moves.transfer); + } else if(line[0] == "MEMC-1Freq") { + sys.moves.memc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: MEMC-1 move frequency", + sys.moves.memc); + if(sys.moves.memc > 0.0) { + sys.memcVal.enable = true; + sys.memcVal.MEMC1 = true + } + } else if(line[0] == "MEMC-2Freq") { + sys.moves.memc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: MEMC-2 move frequency", + sys.moves.memc); + if(sys.moves.memc > 0.0) { + sys.memcVal.enable = true; + sys.memcVal.MEMC2 = true + } + } else if(line[0] == "MEMC-3Freq") { + sys.moves.memc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: MEMC-3 move frequency", + sys.moves.memc); + if(sys.moves.memc > 0.0) { + sys.memcVal.enable = true; + sys.memcVal.MEMC3 = true + } } #endif else if(line[0] == "CellBasisVector1") { @@ -613,6 +689,15 @@ void ConfigSetup::fillDefaults(void) sys.moves.regrowth); } + #ifdef VARIABLE_PARTICLE_NUMBER + if(sys.moves.memc == DBL_MAX) + { + sys.moves.memc = 0.0; + printf("%-40s %-4.4f \n", "Default: MEMC move frequency", + sys.moves.memc); + } +#endif + if(sys.exclude.EXCLUDE_KIND == UINT_MAX) { sys.exclude.EXCLUDE_KIND = sys.exclude.EXC_ONEFOUR_KIND; printf("%-40s %-s \n", "Default: Exclude", "ONE-FOUR"); @@ -819,8 +904,8 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.transfer + - sys.moves.intraSwap + sys.moves.volume + - sys.moves.regrowth - 1.0) > 0.01) { + sys.moves.intraSwap + sys.moves.volume + sys.moves.regrowth + + sys.moves.memc - 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!\n"; exit(EXIT_FAILURE); } @@ -841,7 +926,7 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.transfer + sys.moves.regrowth - 1.0) > 0.01) { + sys.moves.transfer + sys.moves.regrowth +sys.moves.memc- 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!!\n"; exit(EXIT_FAILURE); } @@ -868,7 +953,7 @@ void ConfigSetup::verifyInputs(void) } } if(!sys.volume.hasVolume && !in.restart.enable) { - std::cout << "Error: This simulation requires to define " << 3 * BOX_TOTAL << + std::cout << "Error: This simulation requires to define " << 3 * BOX_TOTAL<< " Cell Basis vectors!" << std::endl; exit(EXIT_FAILURE); } @@ -903,6 +988,33 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: CBMC number of nth site trials is not specified!\n"; exit(EXIT_FAILURE); } + if(sys.memcVal.enable) { + if(!sys.memcVal.readVol) { + std::cout << "Error: In MEMC method, Sub-Volume is not specified!\n"; + exit(EXIT_FAILURE); + } + if(!sys.memcVal.readRatio) { + std::cout << "Error: In MEMC method, Exchange Ratio is not specified!\n"; + exit(EXIT_FAILURE); + } + if(!sys.memcVal.readSK) { + std::cout << "Error: In MEMC method, Small Kind is not specified!\n"; + exit(EXIT_FAILURE); + } + if(!sys.memcVal.readLK) { + std::cout << "Error: In MEMC method, Large Kind is not specified!\n"; + exit(EXIT_FAILURE); + } + if(!sys.memcVal.readLargeBB) { + std::cout << "Error: In MEMC method, Large Kind BackBone is not specified!\n"; + exit(EXIT_FAILURE); + } + if(sys.memcVal.MEMC2 && !sys.memcVal.readSmallBB) { + std::cout << "Error: In MEMC method, Small Kind BackBone is not specified!\n"; + exit(EXIT_FAILURE); + } + } + #endif if(sys.T.inKelvin == DBL_MAX) { std::cout << "Error: Temperature is not specified!\n"; diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index e2332a62d..a1799e3e5 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -160,7 +160,7 @@ struct MovePercents { double volume; #endif #ifdef VARIABLE_PARTICLE_NUMBER - double transfer; + double transfer, memc; #endif }; @@ -208,6 +208,22 @@ struct CBMC { GrowBond bonded; }; +struct MEMCVal { + bool enable, readVol, readRatio, readSmallBB, readLargeBB; + bool readSK, readLK; + bool MEMC1, MEMC2, MEMC3; + XYZ subVol; + std::string smallKind, largeKind; + uint exchangeRatio; + uint smallBBAtom1, smallBBAtom2; + uint largeBBAtom1, largeBBAtom2; + MEMCVal(void) : { + MEMC1 = MEMC2 = MEMC3 = false; + readVol = readRatio = readSmallBB = false; + readLargeBB = readSK = readLK = false; + } +}; + #if ENSEMBLE == GCMC struct ChemicalPotential { bool isFugacity; @@ -223,6 +239,7 @@ struct SystemVals { MovePercents moves; Volume volume; //May go unused CBMC cbmcTrials; + MEMCVal memcVal; #if ENSEMBLE == GCMC ChemicalPotential chemPot; #elif ENSEMBLE == GEMC || ENSEMBLE == NPT From a3162040ccde773ee1bff3bec859a70aaa327683 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 30 May 2018 16:12:28 -0400 Subject: [PATCH 002/199] Add MEMC-1 to System. --- CMake/FileLists.cmake | 5 +++- src/ConfigSetup.cpp | 62 +++++++++++++++++++++---------------------- src/ConfigSetup.h | 6 ++--- src/MoveConst.cpp | 55 -------------------------------------- src/MoveConst.h | 20 ++++++++------ src/StaticVals.cpp | 5 +++- src/StaticVals.h | 5 ++++ src/System.cpp | 16 +++++++++-- src/System.h | 2 +- 9 files changed, 74 insertions(+), 102 deletions(-) delete mode 100644 src/MoveConst.cpp diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 87df4b1e2..01254f431 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -86,6 +86,9 @@ set(headers src/InputFileReader.h src/IntraSwap.h src/MersenneTwister.h + src/MoleculeExchange1.h + src/MoleculeExchange2.h + src/MoleculeExchange3.h src/MoleculeKind.h src/MoleculeLookup.h src/MoleculeTransfer.h @@ -155,4 +158,4 @@ set(cudaSources source_group("Header Files" FILES ${headers}) source_group("Lib Headers" FILES ${libHeaders}) source_group("CUDA Header Files" FILES ${cudaHeaders}) -source_group("CUDA Source Files" FILES ${cudaSources}) \ No newline at end of file +source_group("CUDA Source Files" FILES ${cudaSources}) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 6c0918f25..1018e5bc0 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -249,55 +249,55 @@ void ConfigSetup::Init(const char *fileName) printf("%-40s %-4.4f \n", "Info: Switch distance", sys.ff.rswitch); } else if(line[0] == "ExchangeVolumeDim") { if(line.size() == 4) { - XYZ temp; - temp.x = stringtod(line[1]); - temp.y = stringtod(line[2]); - temp.z = stringtod(line[3]); - sys.memcVal.subVol = temp; - printf("%-40s %-4.3f %-4.3f %-4.3f A\n", - "Info: Exchange Sub-Volume Dimensions", temp.x, temp.y, temp.z); - sys.memc.readVol = true; + XYZ temp; + temp.x = stringtod(line[1]); + temp.y = stringtod(line[2]); + temp.z = stringtod(line[3]); + sys.memcVal.subVol = temp; + printf("%-40s %-4.3f %-4.3f %-4.3f A\n", + "Info: Exchange Sub-Volume Dimensions", temp.x, temp.y, temp.z); + sys.memc.readVol = true; } } else if(line[0] == "ExchangeRatio") { if(line.size() == 2) { uint val = stringtoi(line[1]); - sys.memcVal.exchangeRatio = val; - sys.memcVal.readRatio = true; - printf("%-40s %-d \n", "Info: ExchangeRatio", val); + sys.memcVal.exchangeRatio = val; + sys.memcVal.readRatio = true; + printf("%-40s %-d \n", "Info: ExchangeRatio", val); } } else if(line[0] == "ExchangeLargeKind") { if(line.size() == 2) { std::string resName = line[1]; - sys.memcVal.largeKind = resName; - sys.memcVal.readLK = true; - printf("%-40s %-s \n", "Info: Exchange Large Kind", resName); + sys.memcVal.largeKind = resName; + sys.memcVal.readLK = true; + printf("%-40s %-s \n", "Info: Exchange Large Kind", resName); } } else if(line[0] == "ExchangeSmallKind") { if(line.size() == 2) { std::string resName = line[1]; - sys.memcVal.smallKind = resName; - sys.memcVal.readSK = true; - printf("%-40s %-s \n", "Info: Exchange Small Kind", resName); + sys.memcVal.smallKind = resName; + sys.memcVal.readSK = true; + printf("%-40s %-s \n", "Info: Exchange Small Kind", resName); } } else if(line[0] == "SmallKindBackBone") { if(line.size() == 3) { - uint atom1 = stringtoi(line[1]); - uint atom2 = stringtoi(line[2]); - sys.memcVal.smallBBAtom1 = atom1; - sys.memcVal.smallBBAtom2 = atom2; - sys.memcVal.readSmallBB = true; - printf("%-40s %-d - %-d \n", "Info: Atom Index in Small Kind BackBone", - atom1, atom2); + std::string atom1 = line[1]; + std::string atom2 = line[2]; + sys.memcVal.smallBBAtom1 = atom1; + sys.memcVal.smallBBAtom2 = atom2; + sys.memcVal.readSmallBB = true; + printf("%-40s %-s - %-s \n", "Info: Atom Names in Small Kind BackBone", + atom1, atom2); } } else if(line[0] == "LargeKindBackBone") { if(line.size() == 3) { - uint atom1 = stringtoi(line[1]); - uint atom2 = stringtoi(line[2]); - sys.memcVal.largeBBAtom1 = atom1; - sys.memcVal.largeBBAtom2 = atom2; - sys.memcVal.readLargeBB = true; - printf("%-40s %-d - %-d \n", "Info: Atom Index in Large Kind BackBone", - atom1, atom2); + std::string atom1 = line[1]; + std::string atom2 = line[2]; + sys.memcVal.largeBBAtom1 = atom1; + sys.memcVal.largeBBAtom2 = atom2; + sys.memcVal.readLargeBB = true; + printf("%-40s %-s - %-s \n", "Info: Atom Names in Large Kind BackBone", + atom1, atom2); } } else if(line[0] == "Rcut") { sys.ff.cutoff = stringtod(line[1]); diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index a1799e3e5..f97023120 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -208,15 +208,15 @@ struct CBMC { GrowBond bonded; }; -struct MEMCVal { +struct MEMCVal { bool enable, readVol, readRatio, readSmallBB, readLargeBB; bool readSK, readLK; bool MEMC1, MEMC2, MEMC3; XYZ subVol; std::string smallKind, largeKind; uint exchangeRatio; - uint smallBBAtom1, smallBBAtom2; - uint largeBBAtom1, largeBBAtom2; + std::string smallBBAtom1, smallBBAtom2; + std::string largeBBAtom1, largeBBAtom2; MEMCVal(void) : { MEMC1 = MEMC2 = MEMC3 = false; readVol = readRatio = readSmallBB = false; diff --git a/src/MoveConst.cpp b/src/MoveConst.cpp deleted file mode 100644 index 8583e3af2..000000000 --- a/src/MoveConst.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* -GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 -Copyright (C) 2018 GOMC Group -A copy of the GNU General Public License can be found in the COPYRIGHT.txt -along with this program, also can be found at . -********************************************************************************/ -#include "MoveConst.h" //Spec file. - -std::vector mv::MoveNames() -{ - std::vector v; -#if ENSEMBLE == NVT - v.push_back("Displace (Box 0)"); - v.push_back("Rotate (Box 0)"); - v.push_back("IntraSwap (Box 0)"); -#elif ENSEMBLE == GCMC - v.push_back("Displace (Box 0)"); - v.push_back("Rotate (Box 0)"); - v.push_back("Deletion (from Box 0)"); - v.push_back("Insertion (into Box 0)"); - v.push_back("IntraSwap (Box 0)"); -#elif ENSEMBLE == GEMC - v.push_back("Displace (Box 0)"); - v.push_back("Displace (Box 1)"); - v.push_back("Rotate (Box 0)"); - v.push_back("Rotate (Box 1)"); - v.push_back("Volume Transfer (Box 0 -> Box 1)"); - v.push_back("Volume Transfer (Box 1 -> Box 0)"); - v.push_back("Molecule Transfer (Box 0 -> Box 1)"); - v.push_back("Molecule Transfer (Box 1 -> Box 0)"); - v.push_back("IntraSwap (Box 0)"); - v.push_back("IntraSwap (Box 1)"); -#elif ENSEMBLE == NPT - v.push_back("Displace (Box 0)"); - v.push_back("Rotate (Box 0)"); - v.push_back("Volume Transfer (Box 0)"); - v.push_back("IntraSwap (Box 0)");; -#endif - return v; -} - -std::vector mv::ScaleMoveNames() -{ -#if ENSEMBLE == GEMC || ENSEMBLE == NPT - std::vector v(VOL_TRANSFER + 1); -#else - std::vector v(ROTATE + 1); -#endif - v[DISPLACE] = "DISPLACE"; - v[ROTATE] = "ROTATE"; -#if ENSEMBLE == GEMC || ENSEMBLE == NPT - v[VOL_TRANSFER] = "VOLUME"; -#endif - return v; -} diff --git a/src/MoveConst.h b/src/MoveConst.h index 2f4066c6b..51c9c9b82 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -35,14 +35,16 @@ const uint MOVE_KINDS_TOTAL = 4; #elif ENSEMBLE == GCMC const uint INTRA_SWAP = 2; const uint REGROWTH = 3; -const uint MOL_TRANSFER = 4; -const uint MOVE_KINDS_TOTAL = 5; +const uint MEMC = 4; +const uint MOL_TRANSFER = 5; +const uint MOVE_KINDS_TOTAL = 6; #elif ENSEMBLE == GEMC const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; const uint REGROWTH = 4; -const uint MOL_TRANSFER = 5; -const uint MOVE_KINDS_TOTAL = 6; +const uint MEMC = 5; +const uint MOL_TRANSFER = 6; +const uint MOVE_KINDS_TOTAL = 7; #elif ENSEMBLE == NPT const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; @@ -106,14 +108,16 @@ const uint IT_KINDS_TOTAL = 2; // 4. Regrowth (box 0) // //GCMC: 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) 5. Deletion (box 0) 6. Insertion (box 0) +// 4. Regrowth (box 0) 5. MEMC (box 0) 6. Deletion (box 0) +// 7. Insertion (box 0) // //GEMC: 1. Disp (box 0) 2. Disp (box 1) // 3. Rotate (box 0) 4. Rotate (box 1) // 5. Vol. (b0->b1) 6. Vol. (b1->b0) // 7. IntraSwap (box 0) 8. IntraSwap (box 1) // 9. Regrowth (box 0) 10. Regrowth (box 1) -// 11. Mol Trans (b0->b1), 12. Mol Trans (b1->b0) +// 11. MEMC (box 0) 12. MEMC (box 1) +// 13. Mol Trans (b0->b1), 14. Mol Trans (b1->b0) // //NPT : 1. Disp (box 0) 2. Rotate (box 0) 3. Vol. (box 0) // 4. IntraSwap (box 0) 5. Regrowth (box 0) @@ -122,10 +126,10 @@ const uint IT_KINDS_TOTAL = 2; const uint COUNT = 4; const uint SCALEABLE = 2; #elif ENSEMBLE == GCMC -const uint COUNT = 6; +const uint COUNT = 7; const uint SCALEABLE = 2; #elif ENSEMBLE == GEMC -const uint COUNT = 12; +const uint COUNT = 14; const uint SCALEABLE = 6; #elif ENSEMBLE == NPT const uint COUNT = 5; diff --git a/src/StaticVals.cpp b/src/StaticVals.cpp index d64455c0d..dc8bf46e7 100644 --- a/src/StaticVals.cpp +++ b/src/StaticVals.cpp @@ -65,6 +65,9 @@ void StaticVals::InitMovePercents(config_setup::MovePercents const& perc) case mv::MOL_TRANSFER : movePerc[m] = perc.transfer; break; + case mv::MEMC : + movePerc[m] = perc.memc; + break; #endif #endif default: @@ -103,7 +106,7 @@ void StaticVals::IsBoxOrthogonal(config_setup::Volume const& vol) } -StaticVals::StaticVals(Setup & set) +StaticVals::StaticVals(Setup & set) : memcVal(set.config.sys.memcVal) { isOrthogonal = true; IsBoxOrthogonal(set.config.sys.volume); diff --git a/src/StaticVals.h b/src/StaticVals.h index a7142c459..e4be68ec3 100644 --- a/src/StaticVals.h +++ b/src/StaticVals.h @@ -24,6 +24,7 @@ along with this program, also can be found at . class Setup; class System; +struct config_setup::MEMCVal; class StaticVals { @@ -62,6 +63,10 @@ class StaticVals #ifndef VARIABLE_PARTICLE_NUMBER MoleculeLookup molLookup; #endif +#ifdef VARIABLE_PARTICLE_NUMBER + MEMCVal memcVal +#endif + bool IsEquil(const uint step) { return step >= simEventFreq.tillEquil; diff --git a/src/System.cpp b/src/System.cpp index df5e29599..85b5ac352 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -21,6 +21,9 @@ along with this program, also can be found at . #include "MoleculeTransfer.h" #include "IntraSwap.h" #include "Regrowth.h" +#include "MoleculeExchange1.h" +#include "MoleculeExchange2.h" +#include "MoleculeExchange3.h" System::System(StaticVals& statics) : statV(statics), @@ -60,6 +63,7 @@ System::~System() #endif #if ENSEMBLE == GEMC || ENSEMBLE == GCMC delete moves[mv::MOL_TRANSFER]; + delete moves[mv::MEMC]; #endif } @@ -105,12 +109,12 @@ void System::Init(Setup const& set) calcEnergy.Init(*this); calcEwald->Init(); potential = calcEnergy.SystemTotal(); - InitMoves(); + InitMoves(set); for(uint m = 0; m < mv::MOVE_KINDS_TOTAL; m++) moveTime[m] = 0.0; } -void System::InitMoves() +void System::InitMoves(Setup const& set) { moves[mv::DISPLACE] = new Translate(*this, statV); moves[mv::ROTATE] = new Rotate(*this, statV); @@ -121,6 +125,13 @@ void System::InitMoves() #endif #if ENSEMBLE == GEMC || ENSEMBLE == GCMC moves[mv::MOL_TRANSFER] = new MoleculeTransfer(*this, statV); + if(set.config.sys.memcVal.MEME1) { + moves[mv::MEMC] = new MoleculeExchange1(*this, statV); + } else if (set.config.sys.memcVal.MEME2) { + moves[mv::MEMC] = new MoleculeExchange2(*this, statV); + } else { + moves[mv::MEMC] = new MoleculeExchange3(*this, statV); + } #endif } @@ -189,6 +200,7 @@ void System::PrintTime() #if ENSEMBLE == GEMC || ENSEMBLE == GCMC printf("%-30s %10.4f sec.\n", "Molecule-Transfer:", moveTime[mv::MOL_TRANSFER]); + printf("%-30s %10.4f sec.\n", "Molecule-Exchange:", moveTime[mv::MEMC]); #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT printf("%-30s %10.4f sec.\n", "Volume-Transfer:", moveTime[mv::VOL_TRANSFER]); diff --git a/src/System.h b/src/System.h index 3b3836bd7..a78a4974a 100644 --- a/src/System.h +++ b/src/System.h @@ -100,7 +100,7 @@ class System ~System(); private: - void InitMoves(); + void InitMoves(Setup const& set); void PickMove(uint & kind, double & draw); uint SetParams(const uint kind, const double draw); uint Transform(const uint kind); From afb7905ba7f23bce66e1d7b810180a0762e5d1bd Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 30 May 2018 17:10:12 -0400 Subject: [PATCH 003/199] Add MEMC-1 and set MEMC value from config file --- src/MoleculeExchange1.h | 794 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 794 insertions(+) create mode 100644 src/MoleculeExchange1.h diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h new file mode 100644 index 000000000..d1540034b --- /dev/null +++ b/src/MoleculeExchange1.h @@ -0,0 +1,794 @@ +#ifndef MOLECULEEXCHANGE1_H +#define MOLECULEEXCHANGE1_H + +#if ENSEMBLE==GCMC || ENSEMBLE==GEMC + +#include "MoveBase.h" +#include "cbmc/TrialMol.h" + +using std::vector; + +// MEMC-1 Move: +// +// Swapping one Large molecule with one or more small molecules in dense phase +// and vice versa. +// Sub-Volume location and orientation is random. + +class MoleculeExchange1 : public MoveBase +{ + public: + + MoleculeExchange1(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()) + { + enableID = statV.memcVal.enable; + largeBB[0] = -1; + largeBB[1] = -1; + if(enableID) { + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.memcVal.exchangeRatio; + + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + if(molRef.kinds[k].name == statV.memcVal.largeKind) { + kindL = k; + } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + kindS = k; + } + } + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames == statV.memcVal.smallBBAtom1) { + largeBB[0] == i; + } else if(molRef.kinds[kindL].atomNames == statV.memcVal.smallBBAtom2) { + largeBB[1] == i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in the residue %s.\n", + statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom1, + statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + } + } + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + void AdjustExRatio(); + void ShiftMol(const bool A, const uint n, const uint from, const uint to); + void RecoverMol(const bool A, const uint n, const uint from, const uint to); + uint PickMolInCav(); + uint ReplaceMolecule(); + void CalcTc(); + double GetCoeff() const; + //calculate factorial + double Factorial(const uint n) const; + //calculate ratio of factorial + double Factorial(const uint n, const uint count) const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); + + bool insertL, enableID; + uint largeBB[2]; + uint sourceBox, destBox; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector< vector > molInCav; + vector oldMolA, newMolA, oldMolB, newMolB; + + int exDiff; + double volCav, lastAccept; + double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; + XYZ center, cavity; + XYZArray cavA, invCavA; + double W_tc, W_recip; + double correct_oldA, correct_newA, self_oldA, self_newA; + double correct_oldB, correct_newB, self_oldB, self_newB; + double recipDest, recipSource; + Intermolecular tcNew[BOX_TOTAL]; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void MoleculeExchange1::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = ceil((float)exMax / 2.0); + if(exMin == 0) + exMin = 1; + + subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) + { + if(currAccept > lastAccept) + { + exchangeRatio += exDiff; + } + else + { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + printf("Average Mol In Cavity: %d. Exchange Ratio: %d \n", exMax, + exchangeRatio); + } +} + + +inline uint MoleculeExchange1::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random location in dense phase + XYZ axis = boxDimRef.GetAxis(sourceBox); + XYZ temp(prng.randExc(axis.x), prng.randExc(axis.y), prng.randExc(axis.z)); + //Use to shift the new insterted molecule + center = temp; + //Pick random vector anad find two vectors that are perpendicular to V1 + cavA.Set(0, prng.RandomUnitVect()); + cavA.GramSchmidt(); + //Calculate inverse matrix for cav here Inv = transpose + cavA.TransposeMatrix(invCavA); + + //Find the molecule kind 0 in the cavity + if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, + sourceBox, kindS, exchangeRatio)) + { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + //printf("MolS in cav: %d.\n", molInCav[kindS].size()); + //Find the exchangeRatio number of molecules kind 0 in cavity + numInCavA = exchangeRatio; + totMolInCav = molInCav[kindS].size(); + for(uint n = 0; n < numInCavA; n++) + { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from Large kind in destBox + numInCavB = 1; + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + } + else + { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + molInCavCount += totMolInCav; + counter++; + + return state; +} + + +inline uint MoleculeExchange1::ReplaceMolecule() +{ + uint state = mv::fail_state::NO_FAIL; + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + numInCavA = 1; + numInCavB = exchangeRatio; + //pick a random molecule of Large kind in dens box + state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + + if(state == mv::fail_state::NO_FAIL) + { + //Set the V1 to the vector from first to last atom + uint pStart = 0; + uint pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); + if(pLen == 1) + { + cavA.Set(0, prng.RandomUnitVect()); + } + else + { + uint pEnd = pStart + pLen -1; + cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + sourceBox)); + } + cavA.GramSchmidt(); + //Calculate inverse matrix for cav. Here Inv = Transpose + cavA.TransposeMatrix(invCavA); + //Use to shift to the COM of new molecule + center = comCurrRef.Get(molIndexA[0]); + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRatio); + totMolInCav = molInCav[kindS].size(); + //pick exchangeRatio number of Small molecule from dest box + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + } + return state; +} + +inline uint MoleculeExchange1::GetBoxPairAndMol +(const double subDraw, const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + //deside to insert or remove the big molecule + prng.PickBool(insertL, subDraw, movPerc); + +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif + + //adjust exchange rate based on number of small kind in cavity + //AdjustExRatio(); + + if(insertL) + { + state = PickMolInCav(); + trial[sourceBox][kindL]++; + } + else + { + state = ReplaceMolecule(); + trial[sourceBox][kindS]++; + } + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) + { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) + { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) + { + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); + numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); + numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); + numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); + + //transfering type A from source to dest + for(uint n = 0; n < numInCavA; n++) + { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + destBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) + { + //transfering type B from dest to source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + destBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) + { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //set coordinate of moleA to newMolA, later it will shift to center + newMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //set coordinate of moleB to newMolB, later it will shift to tempD + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + if(insertL) + { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } + else + { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); + } + } + + for(uint n = 0; n < numInCavA; n++) + { + if(insertL) + { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + ////perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + else + { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + } + } + + return state; +} + + +inline uint MoleculeExchange1::Transform() +{ + CalcTc(); + + //Calc Old energy and delete A from source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + } + + //Calc old energy and delete B from destBox + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert A to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + //Insert B in sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void MoleculeExchange1::CalcTc() +{ + W_tc = 1.0; + if (ffRef.useLRC) + { + double delTC = 0.0; + for (uint b = 0; b < BOX_TOTAL; ++b) + { + uint kCount[molRef.kindsCount]; + for (uint k = 0; k < molRef.kindsCount; ++k) + { + kCount[k] = molLookRef.NumKindInBox(k, b); + } + + if (b == sourceBox) + { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } + else if (b == destBox) + { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; + } + tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); + delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + } + W_tc = exp(-1.0 * ffRef.beta * delTC); + } +} +inline void MoleculeExchange1::CalcEn() +{ + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + for(uint n = 0; n < numInCavA; n++) + { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + + for(uint n = 0; n < numInCavB; n++) + { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + +} + +inline double MoleculeExchange1::GetCoeff() const +{ + double volSource = boxDimRef.volume[sourceBox]; + double volDest = boxDimRef.volume[destBox]; +#if ENSEMBLE == GEMC + if(insertL) + { + //kindA is the small molecule + double ratioF = Factorial(totMolInCav) / + (Factorial(totMolInCav - exchangeRatio) * + Factorial(numTypeADest, exchangeRatio)); + + double ratioV = (volSource / volDest) * pow(volDest / volCav, exchangeRatio); + + return ratioF * ratioV * numTypeBDest / (numTypeBSource + 1.0); + } + else + { + //kindA is the big molecule + double ratioF = Factorial(totMolInCav) * + Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = (volDest / volSource) * pow(volCav / volDest, exchangeRatio); + + return ratioF * ratioV * numTypeASource / (numTypeADest + 1.0); + } +#elif ENSEMBLE == GCMC + if(ffRef.isFugacity) + { + double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; + double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav - exchangeRatio); + + double ratioV = volSource / pow(volCav, exchangeRatio); + return (insB / delA) * ratioF * ratioV / (numTypeBSource + 1.0); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = pow(volCav, exchangeRatio) / volSource; + return (insB / delA) * ratioF * ratioV * numTypeASource; + } + } + else + { + double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); + double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); + if(insertL) + { + // Insert Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav - exchangeRatio); + + double ratioV = volSource / pow(volCav, exchangeRatio); + return exp(delA + insB) * ratioF * ratioV / (numTypeBSource + 1.0); + } + else + { + //Delete Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = pow(volCav, exchangeRatio) / volSource; + return exp(delA + insB) * ratioF * ratioV * numTypeASource; + } + } +#endif +} + +inline void MoleculeExchange1::ShiftMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + //Add type A to dest box + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + //Add type B to source box + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, to); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, to); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +//return n! +inline double MoleculeExchange1::Factorial(const uint n) const +{ + double result = 1.0; + for(uint i = 2; i <= n; i++) + { + result *= i; + } + + return result; +} + +//return (n+count)!/n! +inline double MoleculeExchange1::Factorial(const uint n, const uint count) const +{ + double result = 1.0; + for(uint i = 1; i <= count; i++) + { + result *= n + i; + } + + return result; +} + +inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) +{ + bool result; + //print acceptance information + PrintAcceptance(step); + + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) + { + double molTransCoeff = GetCoeff(); + double Wrat = W_tc * W_recip; + + for(uint n = 0; n < numInCavA; n++) + { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) + { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) + { + //update acceptance + accept[sourceBox][kindIndexB[0]]++; + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) + { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) + { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } + + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) + { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } + else + { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } + } + } + else //else we didn't even try because we knew it would fail + result = false; + +#if ENSEMBLE == GEMC + subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, sourceBox); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, destBox); + moveSetRef.Update(result, subPick, step); +#elif ENSEMBLE == GCMC + subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE); + moveSetRef.Update(result, subPick, step); +#endif +} + +#endif + +#endif From 4ba34b9a5f1623238562ac4a5e6a0b77d86e383f Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 30 May 2018 17:32:09 -0400 Subject: [PATCH 004/199] Pring MEMC move acceptance to console output. --- src/ConsoleOutput.cpp | 10 +++++++++- src/MoleculeExchange1.h | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 1f3a98d57..3ab771176 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -123,7 +123,11 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const printElement(var->GetTries(sub), elementWidth); printElement(var->GetAccepted(sub), elementWidth); printElement(var->GetAcceptPercent(sub), elementWidth); - //printElement(var->GetScale(sub), elementWidth); + + sub = mv::GetMoveSubIndex(mv::MEMC, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT @@ -294,6 +298,10 @@ void ConsoleOutput::PrintMoveTitle() printElement("TRANSFER", elementWidth); printElement("TRANACCEPT", elementWidth); printElement("TRANACCEPT%", elementWidth); + + printElement("MOLEXCHANGE", elementWidth); + printElement("MOLEXACCEPT", elementWidth); + printElement("MOLEXACCEPT%", elementWidth); #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index d1540034b..6547a62d6 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -129,7 +129,7 @@ inline void MoleculeExchange1::AdjustExRatio() if(exMin == 0) exMin = 1; - subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, sourceBox); + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); double currAccept = moveSetRef.GetAccept(subPick); if(abs(currAccept - lastAccept) > 0.05 * currAccept) { @@ -779,12 +779,12 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) result = false; #if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, sourceBox); + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE, destBox); + subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); moveSetRef.Update(result, subPick, step); #elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::ID_EXCHANGE); + subPick = mv::GetMoveSubIndex(mv::MEMC); moveSetRef.Update(result, subPick, step); #endif } From d15201ea6acfdf94edebd65ae1ab8b3597500028 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 30 May 2018 18:26:18 -0400 Subject: [PATCH 005/199] Add energy Function for MEMC. --- src/CalculateEnergy.cpp | 20 ++++++++++++ src/CalculateEnergy.h | 4 +++ src/Ewald.cpp | 71 +++++++++++++++++++++++++++++++++++++++-- src/Ewald.h | 21 +++++++----- src/EwaldCached.cpp | 15 +++++++-- src/EwaldCached.h | 7 +++- src/NoEwald.cpp | 14 ++++++-- src/NoEwald.h | 8 +++-- 8 files changed, 142 insertions(+), 18 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 2aa9483a8..ec323f55e 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -657,6 +657,26 @@ void CalculateEnergy::MoleculeIntra(const uint molIndex, MolNonbond_1_3(bondEn[1], molKind, molIndex, box); } +//used in molecule exchange for calculating bonded and intraNonbonded energy +void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, + const uint molIndex) const +{ + uint box = mol.GetBox(); + double bondEn = 0.0, intraNonbondEn = 0.0; + MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; + // *2 because we'll be storing inverse bond vectors + XYZArray bondVec(molKind.bondList.count * 2); + BondVectors(bondVec, molKind, molIndex, box); + + MolBond(bondEn, molKind, bondVec, box); + MolAngle(bondEn, molKind, bondVec, box); + MolDihedral(bondEn, molKind, bondVec, box); + MolNonbond(intraNonbondEn, molKind, molIndex, box); + MolNonbond_1_4(intraNonbondEn, molKind, molIndex, box); + MolNonbond_1_3(intraNonbondEn, molKind, molIndex, box); + mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); +} + void CalculateEnergy::BondVectors(XYZArray & vecs, MoleculeKind const& molKind, const uint molIndex, diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index e4ac02c81..385580828 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -140,6 +140,10 @@ class CalculateEnergy //! Calculates intramolecular energy of a full molecule void MoleculeIntra(const uint molIndex, const uint box, double *bondEn) const; + //used in molecule exchange for calculating bonded and intraNonbonded energy + void MoleculeIntra(cbmc::TrialMol &mol, const uint molIndex) const; + + //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule //for Martini forcefield double IntraEnergy_1_3(const double distSq, const uint atom1, diff --git a/src/Ewald.cpp b/src/Ewald.cpp index ec65690e2..d5416b4f0 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -292,8 +292,7 @@ double Ewald::BoxReciprocal(uint box) const //calculate reciprocate term for displacement and rotation move double Ewald::MolReciprocal(XYZArray const& molCoords, - const uint molIndex, const uint box, - XYZ const*const newCOM) + const uint molIndex, const uint box) { double energyRecipNew = 0.0; double energyRecipOld = 0.0; @@ -482,6 +481,74 @@ double Ewald::SwapSourceRecip(const cbmc::TrialMol &oldMol, } +//calculate reciprocate term for inserting some molecules (kindA) in destination +// box and removing molecule (kindB) from destination box +double Ewald::SwapRecip(const std::vector &newMol, + const std::vector &oldMol) +{ + double energyRecipNew = 0.0; + double energyRecipOld = 0.0; + uint box = newMol[0].GetBox(); + + if (box < BOXES_WITH_U_NB) + { + uint p, i, m, lengthNew, lengthOld; + MoleculeKind const& thisKindNew = newMol[0].GetKind(); + MoleculeKind const& thisKindOld = oldMol[0].GetKind(); + double dotProductNew, sumRealNew, sumImaginaryNew; + lengthNew = thisKindNew.NumAtoms(); + lengthOld = thisKindOld.NumAtoms(); + +#ifdef _OPENMP +#pragma omp parallel for default(shared) private(i, p, dotProductNew, sumRealNew, sumImaginaryNew) reduction(+:energyRecipNew) +#endif + for (i = 0; i < imageSizeRef[box]; i++) + { + sumRealNew = 0.0; + sumImaginaryNew = 0.0; + dotProductNew = 0.0; + + for (m = 0; m < newMol.size(); m++) + { + for (p = 0; p < lengthNew; ++p) + { + dotProductNew = currentAxes.DotProduct(p, kxRef[box][i], + kyRef[box][i],kzRef[box][i], + newMol[m].GetCoords(), box); + + sumRealNew += (thisKindNew.AtomCharge(p) * cos(dotProductNew)); + sumImaginaryNew += (thisKindNew.AtomCharge(p) *sin(dotProductNew)); + } + } + + for (m = 0; m < oldMol.size(); m++) + { + for (p = 0; p < lengthOld; ++p) + { + dotProductNew = currentAxes.DotProduct(p, kxRef[box][i], + kyRef[box][i],kzRef[box][i], + oldMol[m].GetCoords(), box); + + sumRealNew -= (thisKindOld.AtomCharge(p) * cos(dotProductNew)); + sumImaginaryNew -= (thisKindOld.AtomCharge(p) *sin(dotProductNew)); + } + } + + //sumRealNew; + sumRnew[box][i] = sumRref[box][i] + sumRealNew; + //sumImaginaryNew; + sumInew[box][i] = sumIref[box][i] + sumImaginaryNew; + + energyRecipNew += (sumRnew[box][i] * sumRnew[box][i] + sumInew[box][i] + * sumInew[box][i]) * prefactRef[box][i]; + } + + energyRecipOld = sysPotRef.boxEnergy[box].recip; + } + + return energyRecipNew - energyRecipOld; +} + //restore cosMol and sinMol void Ewald::RestoreMol(int molIndex) { diff --git a/src/Ewald.h b/src/Ewald.h index dbf4c0dee..a2a52df39 100644 --- a/src/Ewald.h +++ b/src/Ewald.h @@ -71,9 +71,6 @@ class Ewald //calculate reciprocate energy term for a box virtual double BoxReciprocal(uint box) const; - //calculate correction term for a molecule - virtual double MolCorrection(uint molIndex, uint box)const; - //calculate self term for a box virtual double BoxSelf(BoxDimensions const& boxAxes, uint box) const; @@ -82,8 +79,11 @@ class Ewald //calculate reciprocate term for displacement and rotation move virtual double MolReciprocal(XYZArray const& molCoords, const uint molIndex, - const uint box, XYZ const*const newCOM = NULL); + const uint box); + //calculate correction term for a molecule + virtual double MolCorrection(uint molIndex, uint box)const; + //calculate reciprocate term in destination box for swap move virtual double SwapDestRecip(const cbmc::TrialMol &newMol, const uint box, const int sourceBox, const int molIndex); @@ -91,13 +91,18 @@ class Ewald //calculate reciprocate term in source box for swap move virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, const uint box, const int molIndex); + + //calculate reciprocate term for inserting some molecules (kindA) in + //destination box and removing a molecule (kindB) from destination box + virtual double SwapRecip(const std::vector &newMol, + const std::vector &oldMol); + //calculate correction term after swap move + virtual double SwapCorrection(const cbmc::TrialMol& trialMol) const; + //back up reciptocate value to Ref (will be called during initialization) virtual void SetRecipRef(uint box); - - //calculate correction term after swap move - virtual double SwapCorrection(const cbmc::TrialMol& trialMo) const; - + //update reciprocate values virtual void UpdateRecip(uint box); diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index 50970e7f4..95e5cdd02 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -227,8 +227,7 @@ double EwaldCached::BoxReciprocal(uint box) const //calculate reciprocate term for displacement and rotation move double EwaldCached::MolReciprocal(XYZArray const& molCoords, const uint molIndex, - const uint box, - XYZ const*const newCOM) + const uint box) { double energyRecipNew = 0.0; @@ -359,6 +358,18 @@ double EwaldCached::SwapSourceRecip(const cbmc::TrialMol &oldMol, return energyRecipNew - energyRecipOld; } +//calculate reciprocate term for inserting some molecules (kindA) in destination +// box and removing a molecule (kindB) from destination box +double EwaldCached::SwapRecip(const std::vector &newMol, + const std::vector &oldMol) +{ + //This function should not be called in IDExchange move + std::cout << "Error: Cached Fourier method cannot be used while " << + "performing Identity Exchange move!" << std::endl; + exit(EXIT_FAILURE); + return 0.0; +} + //restore cosMol and sinMol void EwaldCached::RestoreMol(int molIndex) { diff --git a/src/EwaldCached.h b/src/EwaldCached.h index 76e0e0256..7d5873570 100644 --- a/src/EwaldCached.h +++ b/src/EwaldCached.h @@ -79,7 +79,7 @@ class EwaldCached : public Ewald //calculate reciprocate term for displacement and rotation move virtual double MolReciprocal(XYZArray const& molCoords, const uint molIndex, - const uint box, XYZ const*const newCOM = NULL); + const uint box); //calculate reciprocate term in destination box for swap move virtual double SwapDestRecip(const cbmc::TrialMol &newMol, const uint box, @@ -88,6 +88,11 @@ class EwaldCached : public Ewald //calculate reciprocate term in source box for swap move virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, const uint box, const int molIndex); + + //calculate reciprocate term for inserting some molecules (kindA) in + //destination box and removing a molecule (kindB) from destination box + virtual double SwapRecip(const std::vector &newMol, + const std::vector &oldMol); //restore cosMol and sinMol virtual void RestoreMol(int molIndex); diff --git a/src/NoEwald.cpp b/src/NoEwald.cpp index ddb28498a..2cb2e3e76 100644 --- a/src/NoEwald.cpp +++ b/src/NoEwald.cpp @@ -81,8 +81,7 @@ Virial NoEwald::ForceCorrection(Virial& virial, uint box) const //calculate reciprocate term for displacement and rotation move double NoEwald::MolReciprocal(XYZArray const& molCoords, - const uint molIndex, const uint box, - XYZ const*const newCOM) + const uint molIndex, const uint box) { return 0.0; } @@ -119,6 +118,15 @@ double NoEwald::SwapSourceRecip(const cbmc::TrialMol &oldMol, } +//calculate reciprocate term for inserting some molecules (kindA) in destination +// box and removing a molecule (kindB) from destination box +double NoEwald::SwapRecip(const std::vector &newMol, + const std::vector &oldMol) +{ + return 0.0; +} + + //calculate self term after swap move double NoEwald::SwapSelf(const cbmc::TrialMol& trialMol) const { @@ -164,4 +172,4 @@ void NoEwald::exgMolCache() void NoEwald::UpdateVectorsAndRecipTerms() { return; -} \ No newline at end of file +} diff --git a/src/NoEwald.h b/src/NoEwald.h index cf6f9ede7..b9da0325f 100644 --- a/src/NoEwald.h +++ b/src/NoEwald.h @@ -73,7 +73,7 @@ class NoEwald : public Ewald //calculate reciprocate term for displacement and rotation move virtual double MolReciprocal(XYZArray const& molCoords, const uint molIndex, - const uint box, XYZ const*const newCOM = NULL); + const uint box); //calculate self term after swap move virtual double SwapSelf(const cbmc::TrialMol& trialMo) const; @@ -89,7 +89,11 @@ class NoEwald : public Ewald virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, const uint box, const int molIndex); - + //calculate reciprocate term for inserting some molecules (kindA) in + //destination box and removing a molecule (kindB) from destination box + virtual double SwapRecip(const std::vector &newMol, + const std::vector &oldMol); + //back up reciptocate value to Ref (will be called during initialization) virtual void SetRecipRef(uint box); From bbd84053d8e8b251f063e1aae36abe357a704326 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 31 May 2018 13:40:09 -0400 Subject: [PATCH 006/199] Add MEMC-2 and MEMC-3 files. --- src/ConfigSetup.cpp | 8 +- src/EwaldCached.cpp | 2 +- src/MoleculeExchange1.h | 1553 ++++++++++++++++++++------------------- src/MoleculeExchange2.h | 860 ++++++++++++++++++++++ src/MoleculeExchange3.h | 814 ++++++++++++++++++++ 5 files changed, 2460 insertions(+), 777 deletions(-) create mode 100644 src/MoleculeExchange2.h create mode 100644 src/MoleculeExchange3.h diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 1018e5bc0..1e6317ff2 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -256,7 +256,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.subVol = temp; printf("%-40s %-4.3f %-4.3f %-4.3f A\n", "Info: Exchange Sub-Volume Dimensions", temp.x, temp.y, temp.z); - sys.memc.readVol = true; + sys.memcVal.readVol = true; } } else if(line[0] == "ExchangeRatio") { if(line.size() == 2) { @@ -989,6 +989,12 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(sys.memcVal.enable) { + if((sys.memcVal.MEMC1 && sys.memcVal.MEMC2) || + (sys.memcVal.MEMC1 && sys.memcVal.MEMC3) || + (sys.memcVal.MEMC2 && sys.memcVal.MEMC3)) { + std::cout << "Error: Multiple MEMC methods are specified!\n"; + exit(EXIT_FAILURE); + } if(!sys.memcVal.readVol) { std::cout << "Error: In MEMC method, Sub-Volume is not specified!\n"; exit(EXIT_FAILURE); diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index 95e5cdd02..13bc4968c 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -365,7 +365,7 @@ double EwaldCached::SwapRecip(const std::vector &newMol, { //This function should not be called in IDExchange move std::cout << "Error: Cached Fourier method cannot be used while " << - "performing Identity Exchange move!" << std::endl; + "performing Molecule Exchange move!" << std::endl; exit(EXIT_FAILURE); return 0.0; } diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 6547a62d6..1b7db0b6c 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -1,31 +1,32 @@ -#ifndef MOLECULEEXCHANGE1_H -#define MOLECULEEXCHANGE1_H - -#if ENSEMBLE==GCMC || ENSEMBLE==GEMC - -#include "MoveBase.h" -#include "cbmc/TrialMol.h" - -using std::vector; - -// MEMC-1 Move: -// -// Swapping one Large molecule with one or more small molecules in dense phase -// and vice versa. -// Sub-Volume location and orientation is random. - -class MoleculeExchange1 : public MoveBase -{ - public: - - MoleculeExchange1(System &sys, StaticVals const& statV) : - ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), - perAdjust(statV.GetPerAdjust()) - { - enableID = statV.memcVal.enable; +#ifndef MOLECULEEXCHANGE1_H +#define MOLECULEEXCHANGE1_H + +#if ENSEMBLE==GCMC || ENSEMBLE==GEMC + +#include "MoveBase.h" +#include "cbmc/TrialMol.h" + +using std::vector; + +// MEMC-1 Move: +// +// Swapping one Large molecule with one or more small molecules in dense phase +// and vice versa. +// Sub-Volume location and orientation is random. + +class MoleculeExchange1 : public MoveBase +{ + public: + + MoleculeExchange1(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()) + { + enableID = statV.memcVal.enable; largeBB[0] = -1; - largeBB[1] = -1; + largeBB[1] = -1; + if(enableID) { if(cavity.x >= cavity.y) cavity.y = cavity.x; @@ -34,761 +35,763 @@ class MoleculeExchange1 : public MoveBase volCav = cavity.x * cavity.y * cavity.z; exchangeRatio = statV.memcVal.exchangeRatio; - + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { kindL = k; } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { kindS = k; - } - } - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); - exit(EXIT_FAILURE); - } - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); - exit(EXIT_FAILURE); } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames == statV.memcVal.smallBBAtom1) { - largeBB[0] == i; - } else if(molRef.kinds[kindL].atomNames == statV.memcVal.smallBBAtom2) { - largeBB[1] == i; - } - } + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { + largeBB[0] == i; + } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ + largeBB[1] == i; + } + } - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in the residue %s.\n", - statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom1, - statV.memcVal.largeKind); - exit(EXIT_FAILURE); - } - } - } - - //checking the acceptance statistic for each kind - counter = 0; - molInCavCount = 0; - lastAccept = 0.0; - exDiff = 1; - } - - virtual uint Prep(const double subDraw, const double movPerc); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint earlyReject, const uint step); - - private: - - void AdjustExRatio(); - void ShiftMol(const bool A, const uint n, const uint from, const uint to); - void RecoverMol(const bool A, const uint n, const uint from, const uint to); - uint PickMolInCav(); - uint ReplaceMolecule(); - void CalcTc(); - double GetCoeff() const; - //calculate factorial - double Factorial(const uint n) const; - //calculate ratio of factorial - double Factorial(const uint n, const uint count) const; - uint GetBoxPairAndMol(const double subDraw, const double movPerc); + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, + statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + } + } + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + void AdjustExRatio(); + void ShiftMol(const bool A, const uint n, const uint from, const uint to); + void RecoverMol(const bool A, const uint n, const uint from, const uint to); + uint PickMolInCav(); + uint ReplaceMolecule(); + void CalcTc(); + double GetCoeff() const; + //calculate factorial + double Factorial(const uint n) const; + //calculate ratio of factorial + double Factorial(const uint n, const uint count) const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool insertL, enableID; - uint largeBB[2]; - uint sourceBox, destBox; - uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; - vector pStartA, pLenA, pStartB, pLenB; - vector molIndexA, kindIndexA, molIndexB, kindIndexB; - vector< vector > molInCav; - vector oldMolA, newMolA, oldMolB, newMolB; - - int exDiff; - double volCav, lastAccept; - double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; - XYZ center, cavity; - XYZArray cavA, invCavA; - double W_tc, W_recip; - double correct_oldA, correct_newA, self_oldA, self_newA; - double correct_oldB, correct_newB, self_oldB, self_newB; - double recipDest, recipSource; - Intermolecular tcNew[BOX_TOTAL]; - MoleculeLookup & molLookRef; - Forcefield const& ffRef; -}; - -inline void MoleculeExchange1::AdjustExRatio() -{ - if(((counter + 1) % perAdjust) == 0) - { - uint exMax = ceil((float)molInCavCount / (float)perAdjust); - uint exMin = ceil((float)exMax / 2.0); - if(exMin == 0) - exMin = 1; - - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) - { - if(currAccept > lastAccept) - { - exchangeRatio += exDiff; - } - else - { - exDiff *= -1; - exchangeRatio += exDiff; - } - lastAccept = currAccept; - if(exchangeRatio < exMin) - exchangeRatio = exMin; - if(exchangeRatio > exMax) - exchangeRatio = exMax; - } - molInCavCount = 0; - counter = 0; - printf("Average Mol In Cavity: %d. Exchange Ratio: %d \n", exMax, - exchangeRatio); - } -} - - -inline uint MoleculeExchange1::PickMolInCav() -{ - uint state = mv::fail_state::NO_FAIL; - //pick a random location in dense phase - XYZ axis = boxDimRef.GetAxis(sourceBox); - XYZ temp(prng.randExc(axis.x), prng.randExc(axis.y), prng.randExc(axis.z)); - //Use to shift the new insterted molecule - center = temp; - //Pick random vector anad find two vectors that are perpendicular to V1 - cavA.Set(0, prng.RandomUnitVect()); - cavA.GramSchmidt(); - //Calculate inverse matrix for cav here Inv = transpose - cavA.TransposeMatrix(invCavA); - - //Find the molecule kind 0 in the cavity - if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, - sourceBox, kindS, exchangeRatio)) - { - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); - //printf("MolS in cav: %d.\n", molInCav[kindS].size()); - //Find the exchangeRatio number of molecules kind 0 in cavity - numInCavA = exchangeRatio; - totMolInCav = molInCav[kindS].size(); - for(uint n = 0; n < numInCavA; n++) - { - //pick random exchangeRatio number of kindS in cavity - uint picked = prng.randIntExc(molInCav[kindS].size()); - molIndexA.push_back(molInCav[kindS][picked]); - kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); - molInCav[kindS].erase(molInCav[kindS].begin() + picked); - } - - //pick a molecule from Large kind in destBox - numInCavB = 1; - state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); - } - else - { - //reject the move - state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; - } - - molInCavCount += totMolInCav; - counter++; - - return state; -} - - -inline uint MoleculeExchange1::ReplaceMolecule() -{ - uint state = mv::fail_state::NO_FAIL; - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); - numInCavA = 1; - numInCavB = exchangeRatio; - //pick a random molecule of Large kind in dens box - state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); - - if(state == mv::fail_state::NO_FAIL) - { - //Set the V1 to the vector from first to last atom - uint pStart = 0; - uint pLen = 0; - molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); - if(pLen == 1) - { - cavA.Set(0, prng.RandomUnitVect()); - } - else - { - uint pEnd = pStart + pLen -1; - cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), - sourceBox)); - } - cavA.GramSchmidt(); - //Calculate inverse matrix for cav. Here Inv = Transpose - cavA.TransposeMatrix(invCavA); - //Use to shift to the COM of new molecule - center = comCurrRef.Get(molIndexA[0]); - //find how many of KindS exist in this center - calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio); - totMolInCav = molInCav[kindS].size(); - //pick exchangeRatio number of Small molecule from dest box - state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); - } - return state; -} - -inline uint MoleculeExchange1::GetBoxPairAndMol -(const double subDraw, const double movPerc) -{ - uint state = mv::fail_state::NO_FAIL; - //deside to insert or remove the big molecule - prng.PickBool(insertL, subDraw, movPerc); - -#if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } - - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; -#endif - - //adjust exchange rate based on number of small kind in cavity - //AdjustExRatio(); - - if(insertL) - { - state = PickMolInCav(); - trial[sourceBox][kindL]++; - } - else - { - state = ReplaceMolecule(); - trial[sourceBox][kindS]++; - } - - if(state == mv::fail_state::NO_FAIL) - { - pStartA.clear(); - pStartB.clear(); - pStartA.resize(numInCavA); - pStartB.resize(numInCavB); - pLenA.clear(); - pLenB.clear(); - pLenA.resize(numInCavA); - pLenB.resize(numInCavB); - - for(uint n = 0; n < numInCavA; n++) - { - pStartA[n] = pLenA[n] = 0; - molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); - } - - for(uint n = 0; n < numInCavB; n++) - { - pStartB[n] = pLenB[n] = 0; - molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); - } - } - - return state; -} - - -inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) -{ - uint state = GetBoxPairAndMol(subDraw, movPerc); - if(state == mv::fail_state::NO_FAIL) - { - newMolA.clear(); - oldMolA.clear(); - newMolB.clear(); - oldMolB.clear(); - - numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); - numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); - numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); - numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); - - //transfering type A from source to dest - for(uint n = 0; n < numInCavA; n++) - { - newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, - destBox)); - oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, - sourceBox)); - } - - for(uint n = 0; n < numInCavB; n++) - { - //transfering type B from dest to source - newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, - sourceBox)); - oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, - destBox)); - } - - //set the old coordinate after unwrap them - for(uint n = 0; n < numInCavA; n++) - { - XYZArray molA(pLenA[n]); - coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); - boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); - oldMolA[n].SetCoords(molA, 0); - //set coordinate of moleA to newMolA, later it will shift to center - newMolA[n].SetCoords(molA, 0); - //copy cavA matrix to slant the old trial of molA - oldMolA[n].SetCavMatrix(cavA); - } - - for(uint n = 0; n < numInCavB; n++) - { - XYZArray molB(pLenB[n]); - coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); - boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); - oldMolB[n].SetCoords(molB, 0); - //set coordinate of moleB to newMolB, later it will shift to tempD - newMolB[n].SetCoords(molB, 0); - //copy cavA matrix to slant the new trial of molB - newMolB[n].SetCavMatrix(cavA); - } - - for(uint n = 0; n < numInCavB; n++) - { - //SetSeed(has cavity, COM is fixed, rotate around Backbone) - if(insertL) - { - //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - //perform rotational trial move in destBox for L oldMol - oldMolB[n].SetSeed(false, false, false); - } - else - { - //Inserting S mol from destBox to the cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, false, false); - //perform trial move in destBox for S oldMol - oldMolB[n].SetSeed(false, false, false); - } - } - - for(uint n = 0; n < numInCavA; n++) - { - if(insertL) - { - //Inserting S mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - ////perform trial move in cavity in sourceBox for S oldMol - oldMolA[n].SetSeed(center, cavity, true, false, false); - } - else - { - //Inserting L mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - } - } - } - - return state; -} - - -inline uint MoleculeExchange1::Transform() -{ - CalcTc(); - - //Calc Old energy and delete A from source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); - molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); - } - - //Calc old energy and delete B from destBox - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); - molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); - } - - //Insert A to destBox - for(uint n = 0; n < numInCavA; n++) - { - molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); - ShiftMol(true, n, sourceBox, destBox); - cellList.AddMol(molIndexA[n], destBox, coordCurrRef); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); - } - - //Insert B in sourceBox - for(uint n = 0; n < numInCavB; n++) - { - molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); - ShiftMol(false, n, destBox, sourceBox); - cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); - } - - return mv::fail_state::NO_FAIL; -} - -inline void MoleculeExchange1::CalcTc() -{ - W_tc = 1.0; - if (ffRef.useLRC) - { - double delTC = 0.0; - for (uint b = 0; b < BOX_TOTAL; ++b) - { - uint kCount[molRef.kindsCount]; - for (uint k = 0; k < molRef.kindsCount; ++k) - { - kCount[k] = molLookRef.NumKindInBox(k, b); - } - - if (b == sourceBox) - { - kCount[kindIndexA[0]] -= numInCavA; - kCount[kindIndexB[0]] += numInCavB; - } - else if (b == destBox) - { - kCount[kindIndexA[0]] += numInCavA; - kCount[kindIndexB[0]] -= numInCavB; - } - tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); - delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; - } - W_tc = exp(-1.0 * ffRef.beta * delTC); - } -} -inline void MoleculeExchange1::CalcEn() -{ - W_recip = 1.0; - correct_oldA = 0.0, correct_newA = 0.0; - self_oldA = 0.0, self_newA = 0.0; - correct_oldB = 0.0, correct_newB = 0.0; - self_oldB = 0.0, self_newB = 0.0; - recipDest = 0.0, recipSource = 0.0; - - for(uint n = 0; n < numInCavA; n++) - { - correct_newA += calcEwald->SwapCorrection(newMolA[n]); - correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); - self_newA += calcEwald->SwapSelf(newMolA[n]); - self_oldA += calcEwald->SwapSelf(oldMolA[n]); - } - recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - - for(uint n = 0; n < numInCavB; n++) - { - correct_newB += calcEwald->SwapCorrection(newMolB[n]); - correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); - self_newB += calcEwald->SwapSelf(newMolB[n]); - self_oldB += calcEwald->SwapSelf(oldMolB[n]); - } - recipSource = calcEwald->SwapRecip(newMolB, oldMolA); - - //need to contribute the self and correction energy - W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + - correct_newA - correct_oldA + - correct_newB - correct_oldB + - self_newA - self_oldA + - self_newB - self_oldB)); - -} - -inline double MoleculeExchange1::GetCoeff() const -{ - double volSource = boxDimRef.volume[sourceBox]; - double volDest = boxDimRef.volume[destBox]; -#if ENSEMBLE == GEMC - if(insertL) - { - //kindA is the small molecule - double ratioF = Factorial(totMolInCav) / - (Factorial(totMolInCav - exchangeRatio) * - Factorial(numTypeADest, exchangeRatio)); - - double ratioV = (volSource / volDest) * pow(volDest / volCav, exchangeRatio); - - return ratioF * ratioV * numTypeBDest / (numTypeBSource + 1.0); - } - else - { - //kindA is the big molecule - double ratioF = Factorial(totMolInCav) * - Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / - Factorial(totMolInCav + exchangeRatio); - - double ratioV = (volDest / volSource) * pow(volCav / volDest, exchangeRatio); - - return ratioF * ratioV * numTypeASource / (numTypeADest + 1.0); - } -#elif ENSEMBLE == GCMC - if(ffRef.isFugacity) - { - double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; - double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; - if(insertL) - { - //Insert Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav - exchangeRatio); - - double ratioV = volSource / pow(volCav, exchangeRatio); - return (insB / delA) * ratioF * ratioV / (numTypeBSource + 1.0); - } - else - { - //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRatio); - - double ratioV = pow(volCav, exchangeRatio) / volSource; - return (insB / delA) * ratioF * ratioV * numTypeASource; - } - } - else - { - double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); - double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); - if(insertL) - { - // Insert Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav - exchangeRatio); - - double ratioV = volSource / pow(volCav, exchangeRatio); - return exp(delA + insB) * ratioF * ratioV / (numTypeBSource + 1.0); - } - else - { - //Delete Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRatio); - - double ratioV = pow(volCav, exchangeRatio) / volSource; - return exp(delA + insB) * ratioF * ratioV * numTypeASource; - } - } -#endif -} - -inline void MoleculeExchange1::ShiftMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - //Add type A to dest box - newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - //Add type B to source box - newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - XYZArray molA(pLenA[n]); - oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); - boxDimRef.WrapPBC(molA, to); - - molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - XYZArray molB(pLenB[n]); - oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); - boxDimRef.WrapPBC(molB, to); - - molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -//return n! -inline double MoleculeExchange1::Factorial(const uint n) const -{ - double result = 1.0; - for(uint i = 2; i <= n; i++) - { - result *= i; - } - - return result; -} - -//return (n+count)!/n! -inline double MoleculeExchange1::Factorial(const uint n, const uint count) const -{ - double result = 1.0; - for(uint i = 1; i <= count; i++) - { - result *= n + i; - } - - return result; -} - -inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) -{ - bool result; - //print acceptance information - PrintAcceptance(step); - - //If we didn't skip the move calculation - if(rejectState == mv::fail_state::NO_FAIL) - { - double molTransCoeff = GetCoeff(); - double Wrat = W_tc * W_recip; - - for(uint n = 0; n < numInCavA; n++) - { - Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); - } - - for(uint n = 0; n < numInCavB; n++) - { - Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); - } - - result = prng() < molTransCoeff * Wrat; - - if(result) - { - //update acceptance - accept[sourceBox][kindIndexB[0]]++; - //Add tail corrections - sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; - sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; - - //Add rest of energy. - for(uint n = 0; n < numInCavB; n++) - { - sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); - } - - for(uint n = 0; n < numInCavA; n++) - { - sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); - } - - - //Add Reciprocal energy - sysPotRef.boxEnergy[sourceBox].recip += recipSource; - sysPotRef.boxEnergy[destBox].recip += recipDest; - //Add correction energy - sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; - sysPotRef.boxEnergy[sourceBox].correction += correct_newB; - sysPotRef.boxEnergy[destBox].correction += correct_newA; - sysPotRef.boxEnergy[destBox].correction -= correct_oldB; - //Add self energy - sysPotRef.boxEnergy[sourceBox].self -= self_oldA; - sysPotRef.boxEnergy[sourceBox].self += self_newB; - sysPotRef.boxEnergy[destBox].self += self_newA; - sysPotRef.boxEnergy[destBox].self -= self_oldB; - - for (uint b = 0; b < BOX_TOTAL; b++) - { - calcEwald->UpdateRecip(b); - } - - //molA and molB already transfered to destBox and added to cellist - - //Retotal - sysPotRef.Total(); - } - else - { - //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); - RecoverMol(true, n, destBox, sourceBox); - cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); - } - //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); - RecoverMol(false, n, sourceBox, destBox); - cellList.AddMol(molIndexB[n], destBox, coordCurrRef); - } - } - } - else //else we didn't even try because we knew it would fail - result = false; - -#if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); - moveSetRef.Update(result, subPick, step); -#elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::MEMC); - moveSetRef.Update(result, subPick, step); -#endif -} - -#endif - -#endif + uint largeBB[2]; + uint sourceBox, destBox; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector< vector > molInCav; + vector oldMolA, newMolA, oldMolB, newMolB; + + int exDiff; + double volCav, lastAccept; + double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; + XYZ center, cavity; + XYZArray cavA, invCavA; + double W_tc, W_recip; + double correct_oldA, correct_newA, self_oldA, self_newA; + double correct_oldB, correct_newB, self_oldB, self_newB; + double recipDest, recipSource; + Intermolecular tcNew[BOX_TOTAL]; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void MoleculeExchange1::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = ceil((float)exMax / 2.0); + if(exMin == 0) + exMin = 1; + + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) + { + if(currAccept > lastAccept) + { + exchangeRatio += exDiff; + } + else + { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + printf("Average Mol In Cavity: %d. Exchange Ratio: %d \n", exMax, + exchangeRatio); + } +} + + +inline uint MoleculeExchange1::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random location in dense phase + XYZ axis = boxDimRef.GetAxis(sourceBox); + XYZ temp(prng.randExc(axis.x), prng.randExc(axis.y), prng.randExc(axis.z)); + //Use to shift the new insterted molecule + center = temp; + //Pick random vector anad find two vectors that are perpendicular to V1 + cavA.Set(0, prng.RandomUnitVect()); + cavA.GramSchmidt(); + //Calculate inverse matrix for cav here Inv = transpose + cavA.TransposeMatrix(invCavA); + + //Find the molecule kind 0 in the cavity + if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, + sourceBox, kindS, exchangeRatio)) + { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + //printf("MolS in cav: %d.\n", molInCav[kindS].size()); + //Find the exchangeRatio number of molecules kind 0 in cavity + numInCavA = exchangeRatio; + totMolInCav = molInCav[kindS].size(); + for(uint n = 0; n < numInCavA; n++) + { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from Large kind in destBox + numInCavB = 1; + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + } + else + { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + molInCavCount += totMolInCav; + counter++; + + return state; +} + + +inline uint MoleculeExchange1::ReplaceMolecule() +{ + uint state = mv::fail_state::NO_FAIL; + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + numInCavA = 1; + numInCavB = exchangeRatio; + //pick a random molecule of Large kind in dens box + state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + + if(state == mv::fail_state::NO_FAIL) + { + //Set the V1 to the vector from first to last atom + uint pStart = 0; + uint pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); + if(pLen == 1) + { + cavA.Set(0, prng.RandomUnitVect()); + } + else + { + uint pEnd = pStart + pLen -1; + cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + sourceBox)); + } + cavA.GramSchmidt(); + //Calculate inverse matrix for cav. Here Inv = Transpose + cavA.TransposeMatrix(invCavA); + //Use to shift to the COM of new molecule + center = comCurrRef.Get(molIndexA[0]); + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRatio); + totMolInCav = molInCav[kindS].size(); + //pick exchangeRatio number of Small molecule from dest box + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + } + return state; +} + +inline uint MoleculeExchange1::GetBoxPairAndMol +(const double subDraw, const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + //deside to insert or remove the big molecule + prng.PickBool(insertL, subDraw, movPerc); + +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif + + //adjust exchange rate based on number of small kind in cavity + //AdjustExRatio(); + + if(insertL) + { + state = PickMolInCav(); + trial[sourceBox][kindL]++; + } + else + { + state = ReplaceMolecule(); + trial[sourceBox][kindS]++; + } + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) + { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) + { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) + { + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); + numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); + numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); + numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); + + //transfering type A from source to dest + for(uint n = 0; n < numInCavA; n++) + { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + destBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) + { + //transfering type B from dest to source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + destBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) + { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //set coordinate of moleA to newMolA, later it will shift to center + newMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //set coordinate of moleB to newMolB, later it will shift to tempD + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + if(insertL) + { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } + else + { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); + } + } + + for(uint n = 0; n < numInCavA; n++) + { + if(insertL) + { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + ////perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + else + { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + } + } + + return state; +} + + +inline uint MoleculeExchange1::Transform() +{ + CalcTc(); + + //Calc Old energy and delete A from source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + } + + //Calc old energy and delete B from destBox + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert A to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + //Insert B in sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void MoleculeExchange1::CalcTc() +{ + W_tc = 1.0; + if (ffRef.useLRC) + { + double delTC = 0.0; + for (uint b = 0; b < BOX_TOTAL; ++b) + { + uint kCount[molRef.kindsCount]; + for (uint k = 0; k < molRef.kindsCount; ++k) + { + kCount[k] = molLookRef.NumKindInBox(k, b); + } + + if (b == sourceBox) + { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } + else if (b == destBox) + { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; + } + tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); + delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + } + W_tc = exp(-1.0 * ffRef.beta * delTC); + } +} +inline void MoleculeExchange1::CalcEn() +{ + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + for(uint n = 0; n < numInCavA; n++) + { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + + for(uint n = 0; n < numInCavB; n++) + { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + +} + +inline double MoleculeExchange1::GetCoeff() const +{ + double volSource = boxDimRef.volume[sourceBox]; + double volDest = boxDimRef.volume[destBox]; +#if ENSEMBLE == GEMC + if(insertL) + { + //kindA is the small molecule + double ratioF = Factorial(totMolInCav) / + (Factorial(totMolInCav - exchangeRatio) * + Factorial(numTypeADest, exchangeRatio)); + + double ratioV = (volSource / volDest) * pow(volDest / volCav, exchangeRatio); + + return ratioF * ratioV * numTypeBDest / (numTypeBSource + 1.0); + } + else + { + //kindA is the big molecule + double ratioF = Factorial(totMolInCav) * + Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = (volDest / volSource) * pow(volCav / volDest, exchangeRatio); + + return ratioF * ratioV * numTypeASource / (numTypeADest + 1.0); + } +#elif ENSEMBLE == GCMC + if(ffRef.isFugacity) + { + double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; + double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav - exchangeRatio); + + double ratioV = volSource / pow(volCav, exchangeRatio); + return (insB / delA) * ratioF * ratioV / (numTypeBSource + 1.0); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = pow(volCav, exchangeRatio) / volSource; + return (insB / delA) * ratioF * ratioV * numTypeASource; + } + } + else + { + double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); + double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); + if(insertL) + { + // Insert Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav - exchangeRatio); + + double ratioV = volSource / pow(volCav, exchangeRatio); + return exp(delA + insB) * ratioF * ratioV / (numTypeBSource + 1.0); + } + else + { + //Delete Large molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRatio); + + double ratioV = pow(volCav, exchangeRatio) / volSource; + return exp(delA + insB) * ratioF * ratioV * numTypeASource; + } + } +#endif +} + +inline void MoleculeExchange1::ShiftMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + //Add type A to dest box + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + //Add type B to source box + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, to); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, to); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +//return n! +inline double MoleculeExchange1::Factorial(const uint n) const +{ + double result = 1.0; + for(uint i = 2; i <= n; i++) + { + result *= i; + } + + return result; +} + +//return (n+count)!/n! +inline double MoleculeExchange1::Factorial(const uint n, const uint count) const +{ + double result = 1.0; + for(uint i = 1; i <= count; i++) + { + result *= n + i; + } + + return result; +} + +inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) +{ + bool result; + //print acceptance information + PrintAcceptance(step); + + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) + { + double molTransCoeff = GetCoeff(); + double Wrat = W_tc * W_recip; + + for(uint n = 0; n < numInCavA; n++) + { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) + { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) + { + //update acceptance + accept[sourceBox][kindIndexB[0]]++; + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) + { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) + { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } + + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) + { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } + else + { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } + } + } + else //else we didn't even try because we knew it would fail + result = false; + +#if ENSEMBLE == GEMC + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); + moveSetRef.Update(result, subPick, step); +#elif ENSEMBLE == GCMC + subPick = mv::GetMoveSubIndex(mv::MEMC); + moveSetRef.Update(result, subPick, step); +#endif +} + +#endif + +#endif diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h new file mode 100644 index 000000000..0c9aabc72 --- /dev/null +++ b/src/MoleculeExchange2.h @@ -0,0 +1,860 @@ +#ifndef MOLECULEEXCHANGE2_H +#define MOLECULEEXCHANGE2_H + +#if ENSEMBLE==GCMC || ENSEMBLE==GEMC + +#include "MoveBase.h" +#include "cbmc/TrialMol.h" + +using std::vector; + +// MEMC-2 Move: +// +// Swapping one Large molecule with one or more small molecules in dense phase +// and vice versa. +// Sub-Volume location and orientation is based on the COM and backbone of the +// the small molecule. + +class MoleculeExchange2 : public MoveBase +{ + public: + + MoleculeExchange2(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()) + { + enableID = statV.memcVal.enable; + largeBB[0] = -1; + largeBB[1] = -1; + smallBB[0] = -1; + smallBB[1] = -1; + if(enableID) { + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.memcVal.exchangeRatio; + + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + if(molRef.kinds[k].name == statV.memcVal.largeKind) { + kindL = k; + } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + kindS = k; + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { + largeBB[0] == i; + } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ + largeBB[1] == i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, + statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + } + + for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { + if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom1) { + smallBB[0] == i; + } else if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom2){ + smallBB[1] == i; + } + } + + for(uint i = 0; i < 2; i++) { + if(smallBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom2, + statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + } + + } + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + void AdjustExRatio(); + void ShiftMol(const bool A, const uint n, const uint from, const uint to); + void RecoverMol(const bool A, const uint n, const uint from, const uint to); + uint PickMolInCav(); + uint ReplaceMolecule(); + void CalcTc(); + double GetCoeff() const; + //calculate factorial + double Factorial(const uint n) const; + //calculate ratio of factorial + double Factorial(const uint n, const uint count) const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); + + bool insertL, enableID; + uint largeBB[2], smallBB[2]; + uint sourceBox, destBox; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector< vector > molInCav; + vector oldMolA, newMolA, oldMolB, newMolB; + + int exDiff; + double volCav, lastAccept; + double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; + XYZ center, cavity; + XYZArray cavA, invCavA; + double W_tc, W_recip; + double correct_oldA, correct_newA, self_oldA, self_newA; + double correct_oldB, correct_newB, self_oldB, self_newB; + double recipDest, recipSource; + Intermolecular tcNew[BOX_TOTAL]; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void MoleculeExchange2::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) + { + if(currAccept >= lastAccept) + { + exchangeRate += exDiff; + } + else + { + exDiff *= -1; + exchangeRate += exDiff; + } + lastAccept = currAccept; + if(exchangeRate < exMin) + exchangeRate = exMin; + if(exchangeRate > exMax) + exchangeRate = exMax; + } + molInCavCount = 0; + counter = 0; + } +} + +inline uint MoleculeExchange2::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random small kind in dense phase and use the COM as cavity center + uint pickedS, pickedKS; + state = prng.PickMol(kindL, pickedKS, pickedS, sourceBox); + if(state == mv::fail_state::NO_FAIL) + { + center = comCurrRef.Get(pickedS); + ///* + //If we want to orient the cavity with backbone of picked small mol + uint pStart = 0; + uint pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, pickedS); + if(pLen == 1) + { + cavA.Set(0, prng.RandomUnitVect()); + } + else + { + uint pEnd = pStart + pLen -1; + cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + sourceBox)); + } + //*/ + //else Pick random vector and find two vectors that are perpendicular to V1 + //cavA.Set(0, prng.RandomUnitVect()); + cavA.GramSchmidt(); + //Calculate inverse matrix for cav here Inv = transpose + cavA.TransposeMatrix(invCavA); + + //Find the molecule kind 0 in the cavity + if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate)) + { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + //Find the exchangeRate number of molecules kind 0 in cavity + numInCavA = exchangeRate; + //add the random picked small molecule to the list. + molIndexA.push_back(pickedS); + kindIndexA.push_back(pickedKS); + totMolInCav = molInCav[kindS].size(); + for(uint s = 0; s < totMolInCav; s++) + { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + for(uint n = 1; n < numInCavA; n++) + { + //pick random exchangeRate number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from Large kind in destBox + numInCavB = 1; + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + } + else + { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + molInCavCount += totMolInCav; + counter++; + } + + return state; +} + + +inline uint MoleculeExchange2::ReplaceMolecule() +{ + uint state = mv::fail_state::NO_FAIL; + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + numInCavA = 1; + numInCavB = exchangeRate; + //pick a random molecule of Large kind in dens box + state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + + if(state == mv::fail_state::NO_FAIL) + { + //Set the V1 to the vector from first to last atom + uint pStart = 0; + uint pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); + if(pLen == 1) + { + cavA.Set(0, prng.RandomUnitVect()); + } + else + { + uint pEnd = pStart + pLen -1; + cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + sourceBox)); + } + cavA.GramSchmidt(); + //Calculate inverse matrix for cav. Here Inv = Transpose + cavA.TransposeMatrix(invCavA); + //Use to shift to the COM of new molecule + center = comCurrRef.Get(molIndexA[0]); + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate); + totMolInCav = molInCav[kindS].size(); + //pick exchangeRate number of Small molecule from dest box + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + } + return state; +} + +inline uint MoleculeExchange2::GetBoxPairAndMol(const double subDraw, + const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + //deside to insert or remove the big molecule + prng.PickBool(insertL, subDraw, movPerc); + +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif + + //adjust exchange rate based on number of small kind in cavity + //AdjustExRatio(); + + if(insertL) + { + state = PickMolInCav(); + trial[sourceBox][kindL]++; + } + else + { + state = ReplaceMolecule(); + trial[sourceBox][kindS]++; + } + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) + { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) + { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) + { + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); + numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); + numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); + numTypeBDest =(double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); + //transfering type A from source to dest + for(uint n = 0; n < numInCavA; n++) + { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + destBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) + { + //transfering type B from dest to source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + destBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) + { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //set coordinate of moleA to newMolA, later it will shift to center + newMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //set coordinate of moleB to newMolB, later it will shift to tempD + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + if(insertL) + { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } + else + { + if(n == 0) + { + //Inserting Smol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + } + else + { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + } + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); + } + } + + for(uint n = 0; n < numInCavA; n++) + { + if(insertL) + { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + if(n == 0) + { + //perform trial move in cavity with fix COM for S oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + else + { + //perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + } + else + { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + } + } + + return state; +} + + +inline uint MoleculeExchange2::Transform() +{ + CalcTc(); + + //Calc Old energy and delete A from source + if(insertL) + { + //Remove the fixed COM small mol at the end because we insert it at fist + for(uint n = numInCavA; n > 0; n--) + { + cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + } + } + else + { + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + } + } + + //Calc old energy and delete B from destBox + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert A to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + //Insert B in sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void MoleculeExchange2::CalcTc() +{ + W_tc = 1.0; + if (ffRef.useLRC) + { + double delTC = 0.0; + for (uint b = 0; b < BOX_TOTAL; ++b) + { + uint kCount[molRef.kindsCount]; + for (uint k = 0; k < molRef.kindsCount; ++k) + { + kCount[k] = molLookRef.NumKindInBox(k, b); + } + + if (b == sourceBox) + { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } + else if (b == destBox) + { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; + } + tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); + delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + } + W_tc = exp(-1.0 * ffRef.beta * delTC); + } +} +inline void MoleculeExchange2::CalcEn() +{ + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + for(uint n = 0; n < numInCavA; n++) + { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + + for(uint n = 0; n < numInCavB; n++) + { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + +} + +inline double MoleculeExchange2::GetCoeff() const +{ + double volSource = boxDimRef.volume[sourceBox]; + double volDest = boxDimRef.volume[destBox]; +#if ENSEMBLE == GEMC + if(insertL) + { + //kindA is the small molecule + double ratioF = Factorial(totMolInCav - 1) / + (Factorial(totMolInCav - exchangeRate) * + Factorial(numTypeADest, exchangeRate)); + double ratioV = pow(volDest / volCav, exchangeRate - 1); + double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); + return ratioF * ratioV * ratioM; + } + else + { + //kindA is the big molecule + double ratioF = Factorial(totMolInCav) * + Factorial(numTypeBDest - exchangeRate, exchangeRate) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioV = pow(volCav / volDest, exchangeRate - 1); + double ratioM = numTypeASource / + ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); + return ratioF * ratioV * ratioM; + } +#elif ENSEMBLE == GCMC + if(ffRef.isFugacity) + { + double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; + double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav - 1) / + Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } + else + { + double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); + double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav - 1) / + Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } +#endif +} + +inline void MoleculeExchange2::ShiftMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + //Add type A to dest box + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + //Add type B to source box + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange2::RecoverMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, to); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, to); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +//return n! +inline double MoleculeExchange2::Factorial(const uint n) const +{ + double result = 1.0; + for(uint i = 2; i <= n; i++) + { + result *= i; + } + + return result; +} + +//return (n+count)!/n! +inline double MoleculeExchange2::Factorial(const uint n, const uint count) const +{ + double result = 1.0; + for(uint i = 1; i <= count; i++) + { + result *= n + i; + } + + return result; +} + +inline void MoleculeExchange2::Accept(const uint rejectState, const uint step) +{ + bool result; + //print acceptance information + PrintAcceptance(step); + + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) + { + double molTransCoeff = GetCoeff(); + double Wrat = W_tc * W_recip; + + for(uint n = 0; n < numInCavA; n++) + { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) + { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) + { + //update acceptance + accept[sourceBox][kindIndexB[0]]++; + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) + { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) + { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } + + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) + { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } + else + { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } + } + } + else //else we didn't even try because we knew it would fail + result = false; + +#if ENSEMBLE == GEMC + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); + moveSetRef.Update(result, subPick, step); +#elif ENSEMBLE == GCMC + subPick = mv::GetMoveSubIndex(mv::MEMC); + moveSetRef.Update(result, subPick, step); +#endif +} + +#endif + +#endif diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h new file mode 100644 index 000000000..703f0accc --- /dev/null +++ b/src/MoleculeExchange3.h @@ -0,0 +1,814 @@ +#ifndef MOLECULEEXCHANGE3_H +#define MOLECULEEXCHANGE3_H + +#if ENSEMBLE==GCMC || ENSEMBLE==GEMC + +#include "MoveBase.h" +#include "cbmc/TrialMol.h" + +using std::vector; + +// MEMC-3 Move: +// +// Swapping one Large molecule with one or more small molecules in dense phase +// and vice versa. +// Sub-Volume location at the COM of the small molecule with random orientation. +// Large molecule insertion and deletion is perfomed by CD-CBMC. + + +class MoleculeExchange3 : public MoveBase +{ + public: + + MoleculeExchange3(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()) + { + enableID = statV.memcVal.enable; + + if(enableID) { + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.memcVal.exchangeRatio; + + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + if(molRef.kinds[k].name == statV.memcVal.largeKind) { + kindL = k; + } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + kindS = k; + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + void AdjustExRatio(); + void ShiftMol(const bool A, const uint n, const uint from, const uint to); + void RecoverMol(const bool A, const uint n, const uint from, const uint to); + uint PickMolInCav(); + uint ReplaceMolecule(); + void CalcTc(); + double GetCoeff() const; + //calculate factorial + double Factorial(const uint n) const; + //calculate ratio of factorial + double Factorial(const uint n, const uint count) const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); + + bool insertL, enableID; + uint sourceBox, destBox; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector< vector > molInCav; + vector oldMolA, newMolA, oldMolB, newMolB; + + int exDiff; + double volCav, lastAccept; + double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; + XYZ center, cavity; + XYZArray cavA, invCavA; + double W_tc, W_recip; + double correct_oldA, correct_newA, self_oldA, self_newA; + double correct_oldB, correct_newB, self_oldB, self_newB; + double recipDest, recipSource; + Intermolecular tcNew[BOX_TOTAL]; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void MoleculeExchange3::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) + { + if(currAccept > lastAccept) + { + exchangeRate += exDiff; + } + else + { + exDiff *= -1; + exchangeRate += exDiff; + } + lastAccept = currAccept; + if(exchangeRate < exMin) + exchangeRate = exMin; + if(exchangeRate > exMax) + exchangeRate = exMax; + } + molInCavCount = 0; + counter = 0; + } +} + + +inline uint MoleculeExchange3::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random small kind in dense phase and use the COM as cavity center + uint pickedS, pickedKS; + state = prng.PickMol(kindL, pickedKS, pickedS, sourceBox); + if(state == mv::fail_state::NO_FAIL) + { + center = comCurrRef.Get(pickedS); + //Pick random vector and find two vectors that are perpendicular to V1 + cavA.Set(0, prng.RandomUnitVect()); + cavA.GramSchmidt(); + //Calculate inverse matrix for cav here Inv = transpose + cavA.TransposeMatrix(invCavA); + + //Find the molecule kind 0 in the cavity + if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate)) + { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + //Find the exchangeRate number of molecules kind 0 in cavity + numInCavA = exchangeRate; + //add the random picked small molecule to the list. + molIndexA.push_back(pickedS); + kindIndexA.push_back(pickedKS); + totMolInCav = molInCav[kindS].size(); + for(uint s = 0; s < totMolInCav; s++) + { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + for(uint n = 1; n < numInCavA; n++) + { + //pick random exchangeRate number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from Large kind in destBox + numInCavB = 1; + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + } + else + { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + molInCavCount += totMolInCav; + counter++; + } + + return state; +} + + +inline uint MoleculeExchange3::ReplaceMolecule() +{ + uint state = mv::fail_state::NO_FAIL; + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + numInCavA = 1; + numInCavB = exchangeRate; + //pick a random molecule of Large kind in dens box + state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + + if(state == mv::fail_state::NO_FAIL) + { + //Set the V1 to the vector from first to last atom + uint pStart = 0; + uint pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); + //use random for now + cavA.Set(0, prng.RandomUnitVect()); + cavA.GramSchmidt(); + //Calculate inverse matrix for cav. Here Inv = Transpose + cavA.TransposeMatrix(invCavA); + //use the first atom in molecule as the center + center = coordCurrRef.Get(pStart); + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate); + totMolInCav = molInCav[kindS].size(); + //pick exchangeRate number of Small molecule from dest box + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + } + return state; +} + +inline uint MoleculeExchange3::GetBoxPairAndMol(const double subDraw, + const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + //deside to insert or remove the big molecule + prng.PickBool(insertL, subDraw, movPerc); + +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif + + //adjust exchange rate based on number of small kind in cavity + //AdjustExRatio(); + + if(insertL) + { + state = PickMolInCav(); + trial[sourceBox][kindL]++; + } + else + { + state = ReplaceMolecule(); + trial[sourceBox][kindS]++; + } + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) + { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) + { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) + { + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); + numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); + numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); + numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); + //transfering type A from source to dest + for(uint n = 0; n < numInCavA; n++) + { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + destBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) + { + //transfering type B from dest to source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + destBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) + { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //set coordinate of moleA to newMolA, later it will shift to center + newMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //set coordinate of moleB to newMolB, later it will shift to tempD + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + if(insertL) + { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } + else + { + if(n == 0) + { + //Inserting Smol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, false); + } + else + { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + } + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); + } + } + + for(uint n = 0; n < numInCavA; n++) + { + if(insertL) + { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + if(n == 0) + { + //perform trial move in cavity with fix COM for S oldMol + oldMolA[n].SetSeed(center, cavity, true, true, false); + } + else + { + //perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + } + else + { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + } + } + + return state; +} + + +inline uint MoleculeExchange3::Transform() +{ + CalcTc(); + + //Deleting A, B from their box + if(insertL) + { + //Remove the fixed COM small mol at the end because we insert it at fist + for(uint n = numInCavA; n > 0; n--) + { + cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + } + //Calc old energy and delete Large kind from dest box + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildOld(oldMolB[n], molIndexB[n]); + } + } + else + { + //Calc old energy and delete Large kind from source box + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildGrowOld(oldMolA[n], molIndexA[n]); + } + //Calc old energy and delete Small kind from dest box + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + } + + //Inserting A, B to new box + if(insertL) + { + //Insert Small kind to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + //Insert Large kind to sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildGrowNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + } + } + else + { + //Insert Large kind to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + } + //Insert Small kind to sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + } + + return mv::fail_state::NO_FAIL; +} + +inline void MoleculeExchange3::CalcTc() +{ + W_tc = 1.0; + if (ffRef.useLRC) + { + double delTC = 0.0; + for (uint b = 0; b < BOX_TOTAL; ++b) + { + uint kCount[molRef.kindsCount]; + for (uint k = 0; k < molRef.kindsCount; ++k) + { + kCount[k] = molLookRef.NumKindInBox(k, b); + } + + if (b == sourceBox) + { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } + else if (b == destBox) + { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; + } + tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); + delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + } + W_tc = exp(-1.0 * ffRef.beta * delTC); + } +} +inline void MoleculeExchange3::CalcEn() +{ + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + for(uint n = 0; n < numInCavA; n++) + { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + + for(uint n = 0; n < numInCavB; n++) + { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + +} + +inline double MoleculeExchange3::GetCoeff() const +{ + double volSource = boxDimRef.volume[sourceBox]; + double volDest = boxDimRef.volume[destBox]; +#if ENSEMBLE == GEMC + if(insertL) + { + //kindA is the small molecule + double ratioF = Factorial(totMolInCav - 1) / + (Factorial(totMolInCav - exchangeRate) * + Factorial(numTypeADest, exchangeRate)); + double ratioV = pow(volDest / volCav, exchangeRate - 1); + double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); + return ratioF * ratioV * ratioM; + } + else + { + //kindA is the big molecule + double ratioF = Factorial(totMolInCav) * + Factorial(numTypeBDest - exchangeRate, exchangeRate) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioV = pow(volCav / volDest, exchangeRate - 1); + double ratioM = numTypeASource / + ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); + return ratioF * ratioV * ratioM; + } +#elif ENSEMBLE == GCMC + if(ffRef.isFugacity) + { + double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; + double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav - 1) / + Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } + else + { + double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); + double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); + if(insertL) + { + //Insert Large molecule + double ratioF = Factorial(totMolInCav - 1) / + Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = Factorial(totMolInCav) / + Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } +#endif +} + +inline void MoleculeExchange3::ShiftMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + //Add type A to dest box + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + //Add type B to source box + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange3::RecoverMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, to); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, to); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +//return n! +inline double MoleculeExchange3::Factorial(const uint n) const +{ + double result = 1.0; + for(uint i = 2; i <= n; i++) + { + result *= i; + } + + return result; +} + +//return (n+count)!/n! +inline double MoleculeExchange3::Factorial(const uint n, const uint count) const +{ + double result = 1.0; + for(uint i = 1; i <= count; i++) + { + result *= n + i; + } + + return result; +} + +inline void MoleculeExchange3::Accept(const uint rejectState, const uint step) +{ + bool result; + //print acceptance information + PrintAcceptance(step); + + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) + { + double molTransCoeff = GetCoeff(); + double Wrat = W_tc * W_recip; + + for(uint n = 0; n < numInCavA; n++) + { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) + { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) + { + //update acceptance + accept[sourceBox][kindIndexB[0]]++; + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) + { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) + { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } + + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) + { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } + else + { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } + } + } + else //else we didn't even try because we knew it would fail + result = false; + +#if ENSEMBLE == GEMC + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); + moveSetRef.Update(result, subPick, step); +#elif ENSEMBLE == GCMC + subPick = mv::GetMoveSubIndex(mv::MEMC); + moveSetRef.Update(result, subPick, step); +#endif +} + +#endif + +#endif From d9d2e0939a158f448e0e5eea5cb722dcf3a5c619 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 31 May 2018 22:22:40 -0400 Subject: [PATCH 007/199] Update PRNG file. Add Matrix transformation. Add function to find molecule within subvolume. --- src/BoxDimensions.h | 19 ++++++++++++ src/CalculateEnergy.cpp | 63 ++++++++++++++++++++++++++++++++++++++++ src/CalculateEnergy.h | 5 ++++ src/MoleculeExchange1.h | 22 ++++++-------- src/MoleculeExchange2.h | 36 ++++++++--------------- src/MoleculeExchange3.h | 22 ++++++-------- src/PRNG.h | 29 +++++++++++++++++-- src/XYZArray.h | 64 ++++++++++++++++++++++++++++++++++++++++- 8 files changed, 205 insertions(+), 55 deletions(-) diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index f058a5935..bac7d2f6b 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -118,6 +118,10 @@ class BoxDimensions //Dist squared with same coordinate array void GetDistSq(double & distSq, XYZArray const& arr, const uint i, const uint j, const uint b) const; + + //True if arr is inside cavDim with geometric center of center. + bool InCavity(XYZ const& arr, XYZ const& center, XYZ const& cavDim, + XYZArray const& invCav, const uint b) const; //Transform A to unslant coordinate virtual XYZ TransformUnSlant(const XYZ &A, const uint b) const; @@ -256,6 +260,21 @@ inline void BoxDimensions::GetDistSq(double & distSq, XYZArray const& arr, distSq = dist.x * dist.x + dist.y * dist.y + dist.z * dist.z; } +inline bool BoxDimensions::InCavity(XYZ const& arr, XYZ const& center, + XYZ const& cavDim, XYZArray const& invCav, + const uint b) const +{ + XYZ halfDim = cavDim * 0.5; + halfDim *= halfDim; + XYZ diff = MinImage(arr - center, b); + diff = invCav.Transform(diff); + diff *= diff; + if(diff.x > halfDim.x || diff.y > halfDim.y || diff.z > halfDim.z) + return false; + else + return true; +} + //Calculate transform inline XYZ BoxDimensions::TransformSlant(const XYZ &A, const uint b) const { diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index ec323f55e..a4e24e266 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -938,3 +938,66 @@ void CalculateEnergy::ForceCorrection(Virial& virial, virial.tc = vir; } } + +bool CalculateEnergy::FindMolInCavity(std::vector< std::vector > &mol, + const XYZ& center, const XYZ& cavDim, + const XYZArray& invCav, const uint box, + const uint kind, const uint exRatio) +{ + uint k; + mol.clear(); + mol.resize(molLookup.GetNumKind()); + uint maxLength = max(cavDim.x, cavDim.y); + maxLength = max(maxLength, cavDim.z); + + if(maxLength <= rCut) + { + CellList::Neighbors n = cellList.EnumerateLocal(center, box); + while (!n.Done()) + { + if(currentAxes.InCavity(currentCOM.Get(particleMol[*n]), center, cavDim, + invCav, box)) + { + uint molIndex = particleMol[*n]; + //if molecule can be transfer between boxes + if(!molLookup.IsNoSwap(molIndex)) + { + k = mols.GetMolKind(molIndex); + bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != + mol[k].end(); + if(!exist) + mol[k].push_back(molIndex); + } + } + n.Next(); + } + } + else + { + MoleculeLookup::box_iterator n = molLookup.BoxBegin(box); + MoleculeLookup::box_iterator end = molLookup.BoxEnd(box); + while (n != end) + { + if(currentAxes.InCavity(currentCOM.Get(*n), center, cavDim, invCav, box)) + { + uint molIndex = *n; + //if molecule can be transfer between boxes + if(!molLookup.IsNoSwap(molIndex)) + { + k = mols.GetMolKind(molIndex); + bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != + mol[k].end(); + if(!exist) + mol[k].push_back(molIndex); + } + } + n++; + } + } + + //If the is exRate and more molecule kind in cavity, return true. + if(mol[kind].size() >= exRatio) + return true; + else + return false; +} diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 385580828..6e047f028 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -153,6 +153,11 @@ class CalculateEnergy //for Martini forcefield double IntraEnergy_1_4(const double distSq, const uint atom1, const uint atom2, const uint molIndex) const; + + //Finding the molecule inside cavity and store the molecule Index. + bool FindMolInCavity(std::vector< std::vector > &mol, const XYZ& center, + const XYZ& cavDim, const XYZArray& invCav, + const uint box, const uint kind, const uint exRatio); private: diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 1b7db0b6c..6797bbf55 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -168,8 +168,7 @@ inline uint MoleculeExchange1::PickMolInCav() //Use to shift the new insterted molecule center = temp; //Pick random vector anad find two vectors that are perpendicular to V1 - cavA.Set(0, prng.RandomUnitVect()); - cavA.GramSchmidt(); + cavA.SetBasis(prng.RandomUnitVect()); //Calculate inverse matrix for cav here Inv = transpose cavA.TransposeMatrix(invCavA); @@ -181,7 +180,6 @@ inline uint MoleculeExchange1::PickMolInCav() kindIndexA.clear(); molIndexB.clear(); kindIndexB.clear(); - //printf("MolS in cav: %d.\n", molInCav[kindS].size()); //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; totMolInCav = molInCav[kindS].size(); @@ -196,7 +194,7 @@ inline uint MoleculeExchange1::PickMolInCav() //pick a molecule from Large kind in destBox numInCavB = 1; - state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); } else { @@ -221,25 +219,21 @@ inline uint MoleculeExchange1::ReplaceMolecule() numInCavA = 1; numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box - state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); if(state == mv::fail_state::NO_FAIL) { - //Set the V1 to the vector from first to last atom - uint pStart = 0; - uint pLen = 0; - molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); - if(pLen == 1) + //Set the V1 to the backbone of the large molecule + if(molRef.NumAtoms(kindL) == 1) { - cavA.Set(0, prng.RandomUnitVect()); + cavA.SetBasis(prng.RandomUnitVect()); } else { uint pEnd = pStart + pLen -1; - cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); } - cavA.GramSchmidt(); //Calculate inverse matrix for cav. Here Inv = Transpose cavA.TransposeMatrix(invCavA); //Use to shift to the COM of new molecule @@ -249,7 +243,7 @@ inline uint MoleculeExchange1::ReplaceMolecule() kindS, exchangeRatio); totMolInCav = molInCav[kindS].size(); //pick exchangeRatio number of Small molecule from dest box - state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } return state; } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 0c9aabc72..0e502e085 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -178,29 +178,21 @@ inline uint MoleculeExchange2::PickMolInCav() uint state = mv::fail_state::NO_FAIL; //pick a random small kind in dense phase and use the COM as cavity center uint pickedS, pickedKS; - state = prng.PickMol(kindL, pickedKS, pickedS, sourceBox); + state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); if(state == mv::fail_state::NO_FAIL) { center = comCurrRef.Get(pickedS); - ///* //If we want to orient the cavity with backbone of picked small mol - uint pStart = 0; - uint pLen = 0; - molRef.GetRangeStartLength(pStart, pLen, pickedS); - if(pLen == 1) + if(molRef.NumAtoms(kindS) == 1) { - cavA.Set(0, prng.RandomUnitVect()); + cavA.SetBasis(prng.RandomUnitVect()); } else { uint pEnd = pStart + pLen -1; - cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), sourceBox)); } - //*/ - //else Pick random vector and find two vectors that are perpendicular to V1 - //cavA.Set(0, prng.RandomUnitVect()); - cavA.GramSchmidt(); //Calculate inverse matrix for cav here Inv = transpose cavA.TransposeMatrix(invCavA); @@ -234,7 +226,7 @@ inline uint MoleculeExchange2::PickMolInCav() //pick a molecule from Large kind in destBox numInCavB = 1; - state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); } else { @@ -260,25 +252,21 @@ inline uint MoleculeExchange2::ReplaceMolecule() numInCavA = 1; numInCavB = exchangeRate; //pick a random molecule of Large kind in dens box - state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); if(state == mv::fail_state::NO_FAIL) - { - //Set the V1 to the vector from first to last atom - uint pStart = 0; - uint pLen = 0; - molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); - if(pLen == 1) + { + //Set the V1 to the backbone of the large molecule + if(molRef.NumAtoms(kindL) == 1) { - cavA.Set(0, prng.RandomUnitVect()); + cavA.SetBasis(prng.RandomUnitVect()); } else { uint pEnd = pStart + pLen -1; - cavA.Set(0, boxDimRef.MinImage(coordCurrRef.Difference(pStart, pEnd), + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); } - cavA.GramSchmidt(); //Calculate inverse matrix for cav. Here Inv = Transpose cavA.TransposeMatrix(invCavA); //Use to shift to the COM of new molecule @@ -288,7 +276,7 @@ inline uint MoleculeExchange2::ReplaceMolecule() kindS, exchangeRate); totMolInCav = molInCav[kindS].size(); //pick exchangeRate number of Small molecule from dest box - state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } return state; } diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 703f0accc..36b47e55f 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -134,13 +134,12 @@ inline uint MoleculeExchange3::PickMolInCav() uint state = mv::fail_state::NO_FAIL; //pick a random small kind in dense phase and use the COM as cavity center uint pickedS, pickedKS; - state = prng.PickMol(kindL, pickedKS, pickedS, sourceBox); + state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); if(state == mv::fail_state::NO_FAIL) { center = comCurrRef.Get(pickedS); //Pick random vector and find two vectors that are perpendicular to V1 - cavA.Set(0, prng.RandomUnitVect()); - cavA.GramSchmidt(); + cavA.SSetBasis(prng.RandomUnitVect()); //Calculate inverse matrix for cav here Inv = transpose cavA.TransposeMatrix(invCavA); @@ -174,7 +173,7 @@ inline uint MoleculeExchange3::PickMolInCav() //pick a molecule from Large kind in destBox numInCavB = 1; - state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); } else { @@ -200,27 +199,22 @@ inline uint MoleculeExchange3::ReplaceMolecule() numInCavA = 1; numInCavB = exchangeRate; //pick a random molecule of Large kind in dens box - state = prng.PickMol(kindS, kindIndexA, molIndexA, numInCavA, sourceBox); + state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); if(state == mv::fail_state::NO_FAIL) { - //Set the V1 to the vector from first to last atom - uint pStart = 0; - uint pLen = 0; - molRef.GetRangeStartLength(pStart, pLen, molIndexA[0]); - //use random for now - cavA.Set(0, prng.RandomUnitVect()); - cavA.GramSchmidt(); + //Set the V1 to a random vector and calculate two vector perpendicular to V1 + cavA.SetBasis(prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose cavA.TransposeMatrix(invCavA); //use the first atom in molecule as the center - center = coordCurrRef.Get(pStart); + center = coordCurrRef.Get(largeBB[0]); //find how many of KindS exist in this center calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, kindS, exchangeRate); totMolInCav = molInCav[kindS].size(); //pick exchangeRate number of Small molecule from dest box - state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } return state; } diff --git a/src/PRNG.h b/src/PRNG.h index 42202e63f..ad0a7de48 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -279,7 +279,6 @@ class PRNG //Lookup true index in table. m = molLookRef.GetMolNum(mOff, mk, b); } while(molLookRef.IsFix(m)); - } return rejectState; @@ -313,12 +312,38 @@ class PRNG //Lookup true index in table. m = molLookRef.GetMolNum(mOff, mk, b); } while(molLookRef.IsNoSwap(m)); - } return rejectState; } + // In MEMC move pick n molecules of kind mk + uint PickMol(const uint mk, std::vector &mk2, + std::vector &m2, const uint n, const uint b) + { + uint rejectState = mv::fail_state::NO_FAIL; + //Pick molecule with the help of molecule lookup table. + if ((molLookRef.NumKindInBox(mk, b) == 0)) { + rejectState = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } else if (molLookRef.NumKindInBox(mk, b) < n){ + rejectState = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } else { + for(uint i = 0; i < n; i++) { + //Among the ones of that kind in that box, pick one @ random. + //Molecule with a tag (beta == 2 and beta == 1) cannot be selected. + do { + uint mOff = randIntExc(molLookRef.NumKindInBox(mk, b)); + //Lookup true index in table. + m = molLookRef.GetMolNum(mOff, mk, b); + } while(molLookRef.IsNoSwap(m) || std::find(m2.begin(), m2.end(), m) != m2.end()); + m2.push_back(m); + mk2.push_back(mk); + } + } + + return rejectState; + } + // pick a molecule that is not fixed (beta != 1) uint PickMolAndBoxPair(uint &m, uint &mk, uint & bSrc, uint & bDest, double subDraw, const double movPerc) diff --git a/src/XYZArray.h b/src/XYZArray.h index 30fa8d170..b0a7bf4c7 100644 --- a/src/XYZArray.h +++ b/src/XYZArray.h @@ -349,7 +349,21 @@ inline XYZArray::XYZArray(XYZArray const& other) //copy and swap assignment inline XYZArray& XYZArray::operator=(XYZArray other) { - swap(*this, other); + if(allocDone) { + if(count != other.count) { + std::cout << "Error: XYZArray equal operator, size mismatch.\n" + exit(EXIT_FAILURE); + } + count = other.count; + for(uint i = 0; i < count; i++) { + x[i] = other.x[i]; + y[i] = other.y[i]; + z[i] = other.z[i]; + } + } else { + std::cout << "Error: XYZArray equal operator, mempry not allocated.\n" + exit(EXIT_FAILURE); + } return *this; } @@ -539,5 +553,53 @@ inline double XYZArray::AdjointMatrix(XYZArray &Inv) return det; } +//Find two vectors that are perpendicular to V1 using Gram-Schmidt method +inline void XYZArray::SetBasis(XYZ const & v1) +{ + using namespace geom; + v1.Normalize(); + XYZ v2; + if(abs(v1.x) < 0.8) { + //v3 will be v1 x the standard X unit vec + v2 = XYZ(1.0, 0.0, 0.0); + } else { + //v3 will be v1 x the standard Y unit vec + v2 = XYZ(0.0, 1.0, 0.0); + } + XYZ v3 = Cross(v1, v2); + v3.Normalize(); + //v2 is unit vec perpendicular to both v3 and v2 + v2 = Cross(v3, v1); + //set v1 az z axis of cell basis + this->Set(0, v3); + this->Set(1, v2); + this->Set(2, v1); +} + +inline void XYZArray::TransposeMatrix(XYZArray &Inv) +{ + Inv.x[0] = x[0]; + Inv.x[1] = y[0]; + Inv.x[2] = z[0]; + + Inv.y[0] = x[1]; + Inv.y[1] = y[1]; + Inv.y[2] = z[1]; + + Inv.z[0] = x[2]; + Inv.z[1] = y[2]; + Inv.z[2] = z[2]; +} + +//Calculate transform of A using dot product +inline XYZ XYZArray::Transform(const XYZ &A) const +{ + XYZ temp; + temp.x = A.x * x[0] + A.y * x[1] + A.z * x[2]; + temp.y = A.x * y[0] + A.y * y[1] + A.z * y[2]; + temp.z = A.x * z[0] + A.y * z[1] + A.z * z[2]; + return temp; +} + #endif /*XYZ_ARRAY_H*/ From 81f24ac25a99c58dc0a5bf173dad5ffef2a8330e Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 1 Jun 2018 11:15:04 -0400 Subject: [PATCH 008/199] Move Factorial function to Num library. --- lib/NumLib.h | 20 + src/MoleculeExchange1.h | 90 +-- src/MoleculeExchange2.h | 1666 +++++++++++++++++++-------------------- src/MoleculeExchange3.h | 84 +- src/PRNG.h | 3 +- 5 files changed, 900 insertions(+), 963 deletions(-) diff --git a/lib/NumLib.h b/lib/NumLib.h index 107aa9677..e4bddf753 100644 --- a/lib/NumLib.h +++ b/lib/NumLib.h @@ -81,6 +81,26 @@ inline double MeanG(std::vector const& v1, return sqrt(v1[ix1] * v2[ix2]); } +//return n! +inline double Factorial(const uint n) const +{ + double result = 1.0; + for(uint i = 2; i <= n; i++) { + result *= i; + } + return result; +} + +//return (n+count)!/n! +inline double Factorial(const uint n, const uint count) const +{ + double result = 1.0; + for(uint i = 1; i <= count; i++) { + result *= n + i; + } + return result; +} + template inline Type Sq(const Type v) { diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 6797bbf55..8bb271134 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -28,6 +28,12 @@ class MoleculeExchange1 : public MoveBase largeBB[1] = -1; if(enableID) { + if(molLookRef.GetNumCanSwapKind() < 2) { + std::cout << "Error: MEMC move cannot be applied to pure systems or"<< + " systems, where only one molecule type is allowed to be swapped.\n"; + exit(EXIT_FAILURE); + } + if(cavity.x >= cavity.y) cavity.y = cavity.x; else @@ -36,11 +42,11 @@ class MoleculeExchange1 : public MoveBase volCav = cavity.x * cavity.y * cavity.z; exchangeRatio = statV.memcVal.exchangeRatio; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = k; + kindL = molLookRef.GetCanSwapKind(k); } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = k; + kindS = molLookRef.GetCanSwapKind(k); } } @@ -93,10 +99,6 @@ class MoleculeExchange1 : public MoveBase uint ReplaceMolecule(); void CalcTc(); double GetCoeff() const; - //calculate factorial - double Factorial(const uint n) const; - //calculate ratio of factorial - double Factorial(const uint n, const uint count) const; uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool insertL, enableID; @@ -230,9 +232,9 @@ inline uint MoleculeExchange1::ReplaceMolecule() } else { - uint pEnd = pStart + pLen -1; - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), - sourceBox)); + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], + largeBB[1]), + sourceBox)); } //Calculate inverse matrix for cav. Here Inv = Transpose cavA.TransposeMatrix(invCavA); @@ -248,8 +250,8 @@ inline uint MoleculeExchange1::ReplaceMolecule() return state; } -inline uint MoleculeExchange1::GetBoxPairAndMol -(const double subDraw, const double movPerc) +inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, + const double movPerc) { uint state = mv::fail_state::NO_FAIL; //deside to insert or remove the big molecule @@ -292,12 +294,10 @@ inline uint MoleculeExchange1::GetBoxPairAndMol if(insertL) { state = PickMolInCav(); - trial[sourceBox][kindL]++; } else { state = ReplaceMolecule(); - trial[sourceBox][kindS]++; } if(state == mv::fail_state::NO_FAIL) @@ -380,7 +380,7 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); oldMolB[n].SetCoords(molB, 0); - //set coordinate of moleB to newMolB, later it will shift to tempD + //set coordinate of moleB to newMolB, later it will shift newMolB[n].SetCoords(molB, 0); //copy cavA matrix to slant the new trial of molB newMolB[n].SetCavMatrix(cavA); @@ -547,9 +547,9 @@ inline double MoleculeExchange1::GetCoeff() const if(insertL) { //kindA is the small molecule - double ratioF = Factorial(totMolInCav) / - (Factorial(totMolInCav - exchangeRatio) * - Factorial(numTypeADest, exchangeRatio)); + double ratioF = num::Factorial(totMolInCav) / + (num::Factorial(totMolInCav - exchangeRatio) * + num:: Factorial(numTypeADest, exchangeRatio)); double ratioV = (volSource / volDest) * pow(volDest / volCav, exchangeRatio); @@ -558,9 +558,9 @@ inline double MoleculeExchange1::GetCoeff() const else { //kindA is the big molecule - double ratioF = Factorial(totMolInCav) * - Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / - Factorial(totMolInCav + exchangeRatio); + double ratioF = num::Factorial(totMolInCav) * + num::Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / + num::Factorial(totMolInCav + exchangeRatio); double ratioV = (volDest / volSource) * pow(volCav / volDest, exchangeRatio); @@ -574,8 +574,8 @@ inline double MoleculeExchange1::GetCoeff() const if(insertL) { //Insert Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav - exchangeRatio); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav - exchangeRatio); double ratioV = volSource / pow(volCav, exchangeRatio); return (insB / delA) * ratioF * ratioV / (numTypeBSource + 1.0); @@ -583,8 +583,8 @@ inline double MoleculeExchange1::GetCoeff() const else { //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRatio); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRatio); double ratioV = pow(volCav, exchangeRatio) / volSource; return (insB / delA) * ratioF * ratioV * numTypeASource; @@ -597,8 +597,8 @@ inline double MoleculeExchange1::GetCoeff() const if(insertL) { // Insert Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav - exchangeRatio); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav - exchangeRatio); double ratioV = volSource / pow(volCav, exchangeRatio); return exp(delA + insB) * ratioF * ratioV / (numTypeBSource + 1.0); @@ -606,8 +606,8 @@ inline double MoleculeExchange1::GetCoeff() const else { //Delete Large molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRatio); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRatio); double ratioV = pow(volCav, exchangeRatio) / volSource; return exp(delA + insB) * ratioF * ratioV * numTypeASource; @@ -660,35 +660,9 @@ inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, } } -//return n! -inline double MoleculeExchange1::Factorial(const uint n) const -{ - double result = 1.0; - for(uint i = 2; i <= n; i++) - { - result *= i; - } - - return result; -} - -//return (n+count)!/n! -inline double MoleculeExchange1::Factorial(const uint n, const uint count) const -{ - double result = 1.0; - for(uint i = 1; i <= count; i++) - { - result *= n + i; - } - - return result; -} - inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) { - bool result; - //print acceptance information - PrintAcceptance(step); + bool result; //If we didn't skip the move calculation if(rejectState == mv::fail_state::NO_FAIL) @@ -710,9 +684,7 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) if(result) { - //update acceptance - accept[sourceBox][kindIndexB[0]]++; - //Add tail corrections + //Add tail corrections sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 0e502e085..abc436d8d 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -1,848 +1,820 @@ -#ifndef MOLECULEEXCHANGE2_H -#define MOLECULEEXCHANGE2_H - -#if ENSEMBLE==GCMC || ENSEMBLE==GEMC - -#include "MoveBase.h" -#include "cbmc/TrialMol.h" - -using std::vector; - -// MEMC-2 Move: -// -// Swapping one Large molecule with one or more small molecules in dense phase -// and vice versa. -// Sub-Volume location and orientation is based on the COM and backbone of the -// the small molecule. - -class MoleculeExchange2 : public MoveBase -{ - public: - - MoleculeExchange2(System &sys, StaticVals const& statV) : - ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), - perAdjust(statV.GetPerAdjust()) - { - enableID = statV.memcVal.enable; - largeBB[0] = -1; - largeBB[1] = -1; - smallBB[0] = -1; - smallBB[1] = -1; - if(enableID) { - if(cavity.x >= cavity.y) - cavity.y = cavity.x; - else - cavity.x = cavity.y; - - volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.memcVal.exchangeRatio; - - for(uint k = 0; k < molLookRef.GetNumKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = k; - } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = k; - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { - largeBB[0] == i; - } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ - largeBB[1] == i; - } - } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, - statV.memcVal.largeKind); - exit(EXIT_FAILURE); - } - } - - for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom1) { - smallBB[0] == i; - } else if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom2){ - smallBB[1] == i; - } - } - - for(uint i = 0; i < 2; i++) { - if(smallBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom2, - statV.memcVal.smallKind); - exit(EXIT_FAILURE); - } - } - - } - - //checking the acceptance statistic for each kind - counter = 0; - molInCavCount = 0; - lastAccept = 0.0; - exDiff = 1; - } - - virtual uint Prep(const double subDraw, const double movPerc); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint earlyReject, const uint step); - - private: - - void AdjustExRatio(); - void ShiftMol(const bool A, const uint n, const uint from, const uint to); - void RecoverMol(const bool A, const uint n, const uint from, const uint to); - uint PickMolInCav(); - uint ReplaceMolecule(); - void CalcTc(); - double GetCoeff() const; - //calculate factorial - double Factorial(const uint n) const; - //calculate ratio of factorial - double Factorial(const uint n, const uint count) const; - uint GetBoxPairAndMol(const double subDraw, const double movPerc); - - bool insertL, enableID; - uint largeBB[2], smallBB[2]; - uint sourceBox, destBox; - uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; - vector pStartA, pLenA, pStartB, pLenB; - vector molIndexA, kindIndexA, molIndexB, kindIndexB; - vector< vector > molInCav; - vector oldMolA, newMolA, oldMolB, newMolB; - - int exDiff; - double volCav, lastAccept; - double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; - XYZ center, cavity; - XYZArray cavA, invCavA; - double W_tc, W_recip; - double correct_oldA, correct_newA, self_oldA, self_newA; - double correct_oldB, correct_newB, self_oldB, self_newB; - double recipDest, recipSource; - Intermolecular tcNew[BOX_TOTAL]; - MoleculeLookup & molLookRef; - Forcefield const& ffRef; -}; - -inline void MoleculeExchange2::AdjustExRatio() -{ - if(((counter + 1) % perAdjust) == 0) - { - uint exMax = ceil((float)molInCavCount / (float)perAdjust); - uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) - { - if(currAccept >= lastAccept) - { - exchangeRate += exDiff; - } - else - { - exDiff *= -1; - exchangeRate += exDiff; - } - lastAccept = currAccept; - if(exchangeRate < exMin) - exchangeRate = exMin; - if(exchangeRate > exMax) - exchangeRate = exMax; - } - molInCavCount = 0; - counter = 0; - } -} - -inline uint MoleculeExchange2::PickMolInCav() -{ - uint state = mv::fail_state::NO_FAIL; - //pick a random small kind in dense phase and use the COM as cavity center - uint pickedS, pickedKS; - state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); - if(state == mv::fail_state::NO_FAIL) - { - center = comCurrRef.Get(pickedS); - //If we want to orient the cavity with backbone of picked small mol - if(molRef.NumAtoms(kindS) == 1) - { - cavA.SetBasis(prng.RandomUnitVect()); - } - else - { - uint pEnd = pStart + pLen -1; - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), - sourceBox)); - } - //Calculate inverse matrix for cav here Inv = transpose - cavA.TransposeMatrix(invCavA); - - //Find the molecule kind 0 in the cavity - if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate)) - { - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); - //Find the exchangeRate number of molecules kind 0 in cavity - numInCavA = exchangeRate; - //add the random picked small molecule to the list. - molIndexA.push_back(pickedS); - kindIndexA.push_back(pickedKS); - totMolInCav = molInCav[kindS].size(); - for(uint s = 0; s < totMolInCav; s++) - { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); - } - for(uint n = 1; n < numInCavA; n++) - { - //pick random exchangeRate number of kindS in cavity - uint picked = prng.randIntExc(molInCav[kindS].size()); - molIndexA.push_back(molInCav[kindS][picked]); - kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); - molInCav[kindS].erase(molInCav[kindS].begin() + picked); - } - - //pick a molecule from Large kind in destBox - numInCavB = 1; - state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); - } - else - { - //reject the move - state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; - } - - molInCavCount += totMolInCav; - counter++; - } - - return state; -} - - -inline uint MoleculeExchange2::ReplaceMolecule() -{ - uint state = mv::fail_state::NO_FAIL; - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); - numInCavA = 1; - numInCavB = exchangeRate; - //pick a random molecule of Large kind in dens box - state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); - - if(state == mv::fail_state::NO_FAIL) +#ifndef MOLECULEEXCHANGE2_H +#define MOLECULEEXCHANGE2_H + +#if ENSEMBLE==GCMC || ENSEMBLE==GEMC + +#include "MoveBase.h" +#include "cbmc/TrialMol.h" + +using std::vector; + +// MEMC-2 Move: +// +// Swapping one Large molecule with one or more small molecules in dense phase +// and vice versa. +// Sub-Volume location and orientation is based on the COM and backbone of the +// the small molecule. + +class MoleculeExchange2 : public MoveBase +{ + public: + + MoleculeExchange2(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()) + { + enableID = statV.memcVal.enable; + largeBB[0] = -1; + largeBB[1] = -1; + smallBB[0] = -1; + smallBB[1] = -1; + if(enableID) { + if(molLookRef.GetNumCanSwapKind() < 2) { + std::cout << "Error: MEMC move cannot be applied to pure systems or"<< + " systems, where only one molecule type is allowed to be swapped.\n"; + exit(EXIT_FAILURE); + } + + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.memcVal.exchangeRatio; + + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + if(molRef.kinds[k].name == statV.memcVal.largeKind) { + kindL = molLookRef.GetCanSwapKind(k); + } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + kindS = molLookRef.GetCanSwapKind(k); + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { + largeBB[0] == i; + } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ + largeBB[1] == i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, + statV.memcVal.largeKind); + exit(EXIT_FAILURE); + } + } + + for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { + if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom1) { + smallBB[0] == i; + } else if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom2){ + smallBB[1] == i; + } + } + + for(uint i = 0; i < 2; i++) { + if(smallBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom2, + statV.memcVal.smallKind); + exit(EXIT_FAILURE); + } + } + + } + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + void AdjustExRatio(); + void ShiftMol(const bool A, const uint n, const uint from, const uint to); + void RecoverMol(const bool A, const uint n, const uint from, const uint to); + uint PickMolInCav(); + uint ReplaceMolecule(); + void CalcTc(); + double GetCoeff() const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); + + bool insertL, enableID; + uint largeBB[2], smallBB[2]; + uint sourceBox, destBox; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector< vector > molInCav; + vector oldMolA, newMolA, oldMolB, newMolB; + + int exDiff; + double volCav, lastAccept; + double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; + XYZ center, cavity; + XYZArray cavA, invCavA; + double W_tc, W_recip; + double correct_oldA, correct_newA, self_oldA, self_newA; + double correct_oldB, correct_newB, self_oldB, self_newB; + double recipDest, recipSource; + Intermolecular tcNew[BOX_TOTAL]; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void MoleculeExchange2::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) + { + if(currAccept >= lastAccept) + { + exchangeRate += exDiff; + } + else + { + exDiff *= -1; + exchangeRate += exDiff; + } + lastAccept = currAccept; + if(exchangeRate < exMin) + exchangeRate = exMin; + if(exchangeRate > exMax) + exchangeRate = exMax; + } + molInCavCount = 0; + counter = 0; + } +} + +inline uint MoleculeExchange2::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random small kind in dense phase and use the COM as cavity center + uint pickedS, pickedKS; + state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); + if(state == mv::fail_state::NO_FAIL) + { + center = comCurrRef.Get(pickedS); + //If we want to orient the cavity with backbone of picked small mol + if(molRef.NumAtoms(kindS) == 1) + { + cavA.SetBasis(prng.RandomUnitVect()); + } + else + { + uint pEnd = pStart + pLen -1; + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), + sourceBox)); + } + //Calculate inverse matrix for cav here Inv = transpose + cavA.TransposeMatrix(invCavA); + + //Find the molecule kind 0 in the cavity + if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate)) + { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + //Find the exchangeRate number of molecules kind 0 in cavity + numInCavA = exchangeRate; + //add the random picked small molecule to the list. + molIndexA.push_back(pickedS); + kindIndexA.push_back(pickedKS); + totMolInCav = molInCav[kindS].size(); + for(uint s = 0; s < totMolInCav; s++) + { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + for(uint n = 1; n < numInCavA; n++) + { + //pick random exchangeRate number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from Large kind in destBox + numInCavB = 1; + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); + } + else + { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + molInCavCount += totMolInCav; + counter++; + } + + return state; +} + + +inline uint MoleculeExchange2::ReplaceMolecule() +{ + uint state = mv::fail_state::NO_FAIL; + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + numInCavA = 1; + numInCavB = exchangeRate; + //pick a random molecule of Large kind in dens box + state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); + + if(state == mv::fail_state::NO_FAIL) { - //Set the V1 to the backbone of the large molecule - if(molRef.NumAtoms(kindL) == 1) - { - cavA.SetBasis(prng.RandomUnitVect()); - } - else - { - uint pEnd = pStart + pLen -1; - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), - sourceBox)); - } - //Calculate inverse matrix for cav. Here Inv = Transpose - cavA.TransposeMatrix(invCavA); - //Use to shift to the COM of new molecule - center = comCurrRef.Get(molIndexA[0]); - //find how many of KindS exist in this center - calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate); - totMolInCav = molInCav[kindS].size(); - //pick exchangeRate number of Small molecule from dest box - state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); - } - return state; -} - -inline uint MoleculeExchange2::GetBoxPairAndMol(const double subDraw, - const double movPerc) -{ - uint state = mv::fail_state::NO_FAIL; - //deside to insert or remove the big molecule - prng.PickBool(insertL, subDraw, movPerc); - -#if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } - - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; -#endif - - //adjust exchange rate based on number of small kind in cavity - //AdjustExRatio(); - - if(insertL) - { - state = PickMolInCav(); - trial[sourceBox][kindL]++; - } - else - { - state = ReplaceMolecule(); - trial[sourceBox][kindS]++; - } - - if(state == mv::fail_state::NO_FAIL) - { - pStartA.clear(); - pStartB.clear(); - pStartA.resize(numInCavA); - pStartB.resize(numInCavB); - pLenA.clear(); - pLenB.clear(); - pLenA.resize(numInCavA); - pLenB.resize(numInCavB); - - for(uint n = 0; n < numInCavA; n++) - { - pStartA[n] = pLenA[n] = 0; - molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); - } - - for(uint n = 0; n < numInCavB; n++) - { - pStartB[n] = pLenB[n] = 0; - molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); - } - } - - return state; -} - - -inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) -{ - uint state = GetBoxPairAndMol(subDraw, movPerc); - if(state == mv::fail_state::NO_FAIL) - { - newMolA.clear(); - oldMolA.clear(); - newMolB.clear(); - oldMolB.clear(); - - numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); - numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); - numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); - numTypeBDest =(double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); - //transfering type A from source to dest - for(uint n = 0; n < numInCavA; n++) - { - newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, - destBox)); - oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, - sourceBox)); - } - - for(uint n = 0; n < numInCavB; n++) - { - //transfering type B from dest to source - newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, - sourceBox)); - oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, - destBox)); - } - - //set the old coordinate after unwrap them - for(uint n = 0; n < numInCavA; n++) - { - XYZArray molA(pLenA[n]); - coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); - boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); - oldMolA[n].SetCoords(molA, 0); - //set coordinate of moleA to newMolA, later it will shift to center - newMolA[n].SetCoords(molA, 0); - //copy cavA matrix to slant the old trial of molA - oldMolA[n].SetCavMatrix(cavA); - } - - for(uint n = 0; n < numInCavB; n++) - { - XYZArray molB(pLenB[n]); - coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); - boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); - oldMolB[n].SetCoords(molB, 0); - //set coordinate of moleB to newMolB, later it will shift to tempD - newMolB[n].SetCoords(molB, 0); - //copy cavA matrix to slant the new trial of molB - newMolB[n].SetCavMatrix(cavA); - } - - for(uint n = 0; n < numInCavB; n++) - { - //SetSeed(has cavity, COM is fixed, rotate around Backbone) - if(insertL) - { - //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - //perform rotational trial move in destBox for L oldMol - oldMolB[n].SetSeed(false, false, false); - } - else - { - if(n == 0) - { - //Inserting Smol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - } - else - { - //Inserting S mol from destBox to the cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, false, false); - } - //perform trial move in destBox for S oldMol - oldMolB[n].SetSeed(false, false, false); - } - } - - for(uint n = 0; n < numInCavA; n++) - { - if(insertL) - { - //Inserting S mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - if(n == 0) - { - //perform trial move in cavity with fix COM for S oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - } - else - { - //perform trial move in cavity in sourceBox for S oldMol - oldMolA[n].SetSeed(center, cavity, true, false, false); - } - } - else - { - //Inserting L mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - } - } - } - - return state; -} - - -inline uint MoleculeExchange2::Transform() -{ - CalcTc(); - - //Calc Old energy and delete A from source - if(insertL) - { - //Remove the fixed COM small mol at the end because we insert it at fist - for(uint n = numInCavA; n > 0; n--) - { - cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); - molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); - } - } - else - { - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); - molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); - } - } - - //Calc old energy and delete B from destBox - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); - molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); - } - - //Insert A to destBox - for(uint n = 0; n < numInCavA; n++) - { - molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); - ShiftMol(true, n, sourceBox, destBox); - cellList.AddMol(molIndexA[n], destBox, coordCurrRef); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); - } - - //Insert B in sourceBox - for(uint n = 0; n < numInCavB; n++) - { - molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); - ShiftMol(false, n, destBox, sourceBox); - cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); - //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); - } - - return mv::fail_state::NO_FAIL; -} - -inline void MoleculeExchange2::CalcTc() -{ - W_tc = 1.0; - if (ffRef.useLRC) - { - double delTC = 0.0; - for (uint b = 0; b < BOX_TOTAL; ++b) - { - uint kCount[molRef.kindsCount]; - for (uint k = 0; k < molRef.kindsCount; ++k) - { - kCount[k] = molLookRef.NumKindInBox(k, b); - } - - if (b == sourceBox) - { - kCount[kindIndexA[0]] -= numInCavA; - kCount[kindIndexB[0]] += numInCavB; - } - else if (b == destBox) - { - kCount[kindIndexA[0]] += numInCavA; - kCount[kindIndexB[0]] -= numInCavB; - } - tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); - delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; - } - W_tc = exp(-1.0 * ffRef.beta * delTC); - } -} -inline void MoleculeExchange2::CalcEn() -{ - W_recip = 1.0; - correct_oldA = 0.0, correct_newA = 0.0; - self_oldA = 0.0, self_newA = 0.0; - correct_oldB = 0.0, correct_newB = 0.0; - self_oldB = 0.0, self_newB = 0.0; - recipDest = 0.0, recipSource = 0.0; - - for(uint n = 0; n < numInCavA; n++) - { - correct_newA += calcEwald->SwapCorrection(newMolA[n]); - correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); - self_newA += calcEwald->SwapSelf(newMolA[n]); - self_oldA += calcEwald->SwapSelf(oldMolA[n]); - } - recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - - for(uint n = 0; n < numInCavB; n++) - { - correct_newB += calcEwald->SwapCorrection(newMolB[n]); - correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); - self_newB += calcEwald->SwapSelf(newMolB[n]); - self_oldB += calcEwald->SwapSelf(oldMolB[n]); - } - recipSource = calcEwald->SwapRecip(newMolB, oldMolA); - - //need to contribute the self and correction energy - W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + - correct_newA - correct_oldA + - correct_newB - correct_oldB + - self_newA - self_oldA + - self_newB - self_oldB)); - -} - -inline double MoleculeExchange2::GetCoeff() const -{ - double volSource = boxDimRef.volume[sourceBox]; - double volDest = boxDimRef.volume[destBox]; -#if ENSEMBLE == GEMC - if(insertL) - { - //kindA is the small molecule - double ratioF = Factorial(totMolInCav - 1) / - (Factorial(totMolInCav - exchangeRate) * - Factorial(numTypeADest, exchangeRate)); - double ratioV = pow(volDest / volCav, exchangeRate - 1); - double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); - return ratioF * ratioV * ratioM; - } - else - { - //kindA is the big molecule - double ratioF = Factorial(totMolInCav) * - Factorial(numTypeBDest - exchangeRate, exchangeRate) / - Factorial(totMolInCav + exchangeRate - 1); - double ratioV = pow(volCav / volDest, exchangeRate - 1); - double ratioM = numTypeASource / - ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); - return ratioF * ratioV * ratioM; - } -#elif ENSEMBLE == GCMC - if(ffRef.isFugacity) - { - double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; - double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; - if(insertL) - { - //Insert Large molecule - double ratioF = Factorial(totMolInCav - 1) / - Factorial(totMolInCav - exchangeRate); - double ratioM = numTypeASource / (numTypeBSource + 1.0); - return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); - } - else - { - //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); - } - } - else - { - double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); - double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); - if(insertL) - { - //Insert Large molecule - double ratioF = Factorial(totMolInCav - 1) / - Factorial(totMolInCav - exchangeRate); - double ratioM = numTypeASource / (numTypeBSource + 1.0); - return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); - } - else - { - //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); - } - } -#endif -} - -inline void MoleculeExchange2::ShiftMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - //Add type A to dest box - newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - //Add type B to source box - newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -inline void MoleculeExchange2::RecoverMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - XYZArray molA(pLenA[n]); - oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); - boxDimRef.WrapPBC(molA, to); - - molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - XYZArray molB(pLenB[n]); - oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); - boxDimRef.WrapPBC(molB, to); - - molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -//return n! -inline double MoleculeExchange2::Factorial(const uint n) const -{ - double result = 1.0; - for(uint i = 2; i <= n; i++) - { - result *= i; - } - - return result; -} - -//return (n+count)!/n! -inline double MoleculeExchange2::Factorial(const uint n, const uint count) const -{ - double result = 1.0; - for(uint i = 1; i <= count; i++) - { - result *= n + i; - } - - return result; -} - -inline void MoleculeExchange2::Accept(const uint rejectState, const uint step) -{ - bool result; - //print acceptance information - PrintAcceptance(step); - - //If we didn't skip the move calculation - if(rejectState == mv::fail_state::NO_FAIL) - { - double molTransCoeff = GetCoeff(); - double Wrat = W_tc * W_recip; - - for(uint n = 0; n < numInCavA; n++) - { - Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); - } - - for(uint n = 0; n < numInCavB; n++) - { - Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); - } - - result = prng() < molTransCoeff * Wrat; - - if(result) - { - //update acceptance - accept[sourceBox][kindIndexB[0]]++; - //Add tail corrections - sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; - sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; - - //Add rest of energy. - for(uint n = 0; n < numInCavB; n++) - { - sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); - } - - for(uint n = 0; n < numInCavA; n++) - { - sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); - } - - - //Add Reciprocal energy - sysPotRef.boxEnergy[sourceBox].recip += recipSource; - sysPotRef.boxEnergy[destBox].recip += recipDest; - //Add correction energy - sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; - sysPotRef.boxEnergy[sourceBox].correction += correct_newB; - sysPotRef.boxEnergy[destBox].correction += correct_newA; - sysPotRef.boxEnergy[destBox].correction -= correct_oldB; - //Add self energy - sysPotRef.boxEnergy[sourceBox].self -= self_oldA; - sysPotRef.boxEnergy[sourceBox].self += self_newB; - sysPotRef.boxEnergy[destBox].self += self_newA; - sysPotRef.boxEnergy[destBox].self -= self_oldB; - - for (uint b = 0; b < BOX_TOTAL; b++) - { - calcEwald->UpdateRecip(b); - } - - //molA and molB already transfered to destBox and added to cellist - - //Retotal - sysPotRef.Total(); - } - else - { - //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); - RecoverMol(true, n, destBox, sourceBox); - cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); - } - //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); - RecoverMol(false, n, sourceBox, destBox); - cellList.AddMol(molIndexB[n], destBox, coordCurrRef); - } - } - } - else //else we didn't even try because we knew it would fail - result = false; - -#if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); - moveSetRef.Update(result, subPick, step); -#elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::MEMC); - moveSetRef.Update(result, subPick, step); -#endif -} - -#endif - -#endif + //Set the V1 to the backbone of the large molecule + if(molRef.NumAtoms(kindL) == 1) + { + cavA.SetBasis(prng.RandomUnitVect()); + } + else + { + cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], + largeBB[1]), + sourceBox)); + } + //Calculate inverse matrix for cav. Here Inv = Transpose + cavA.TransposeMatrix(invCavA); + //Use to shift to the COM of new molecule + center = comCurrRef.Get(molIndexA[0]); + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRate); + totMolInCav = molInCav[kindS].size(); + //pick exchangeRate number of Small molecule from dest box + state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); + } + return state; +} + +inline uint MoleculeExchange2::GetBoxPairAndMol(const double subDraw, + const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + //deside to insert or remove the big molecule + prng.PickBool(insertL, subDraw, movPerc); + +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif + + //adjust exchange rate based on number of small kind in cavity + //AdjustExRatio(); + + if(insertL) + { + state = PickMolInCav(); + } + else + { + state = ReplaceMolecule(); + } + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) + { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) + { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) + { + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); + numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); + numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); + numTypeBDest =(double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); + //transfering type A from source to dest + for(uint n = 0; n < numInCavA; n++) + { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + destBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) + { + //transfering type B from dest to source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + destBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) + { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //set coordinate of moleA to newMolA, later it will shift to center + newMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //set coordinate of moleB to newMolB, later it will shift + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + for(uint n = 0; n < numInCavB; n++) + { + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + if(insertL) + { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } + else + { + if(n == 0) + { + //Inserting Smol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + } + else + { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + } + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); + } + } + + for(uint n = 0; n < numInCavA; n++) + { + if(insertL) + { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + if(n == 0) + { + //perform trial move in cavity with fix COM for S oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + else + { + //perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + } + else + { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + } + } + } + + return state; +} + + +inline uint MoleculeExchange2::Transform() +{ + CalcTc(); + + //Calc Old energy and delete A from source + if(insertL) + { + //Remove the fixed COM small mol at the end because we insert it at fist + for(uint n = numInCavA; n > 0; n--) + { + cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + } + } + else + { + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + } + } + + //Calc old energy and delete B from destBox + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert A to destBox + for(uint n = 0; n < numInCavA; n++) + { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(true, n, sourceBox, destBox); + cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + //Insert B in sourceBox + for(uint n = 0; n < numInCavB; n++) + { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(false, n, destBox, sourceBox); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void MoleculeExchange2::CalcTc() +{ + W_tc = 1.0; + if (ffRef.useLRC) + { + double delTC = 0.0; + for (uint b = 0; b < BOX_TOTAL; ++b) + { + uint kCount[molRef.kindsCount]; + for (uint k = 0; k < molRef.kindsCount; ++k) + { + kCount[k] = molLookRef.NumKindInBox(k, b); + } + + if (b == sourceBox) + { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } + else if (b == destBox) + { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; + } + tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); + delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + } + W_tc = exp(-1.0 * ffRef.beta * delTC); + } +} +inline void MoleculeExchange2::CalcEn() +{ + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + for(uint n = 0; n < numInCavA; n++) + { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + + for(uint n = 0; n < numInCavB; n++) + { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + +} + +inline double MoleculeExchange2::GetCoeff() const +{ + double volSource = boxDimRef.volume[sourceBox]; + double volDest = boxDimRef.volume[destBox]; +#if ENSEMBLE == GEMC + if(insertL) + { + //kindA is the small molecule + double ratioF = num::Factorial(totMolInCav - 1) / + (num::Factorial(totMolInCav - exchangeRate) * + num::Factorial(numTypeADest, exchangeRate)); + double ratioV = pow(volDest / volCav, exchangeRate - 1); + double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); + return ratioF * ratioV * ratioM; + } + else + { + //kindA is the big molecule + double ratioF = num::Factorial(totMolInCav) * + num::Factorial(numTypeBDest - exchangeRate, exchangeRate) / + num::Factorial(totMolInCav + exchangeRate - 1); + double ratioV = pow(volCav / volDest, exchangeRate - 1); + double ratioM = numTypeASource / + ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); + return ratioF * ratioV * ratioM; + } +#elif ENSEMBLE == GCMC + if(ffRef.isFugacity) + { + double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; + double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; + if(insertL) + { + //Insert Large molecule + double ratioF = num::Factorial(totMolInCav - 1) / + num::Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } + else + { + double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); + double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); + if(insertL) + { + //Insert Large molecule + double ratioF = num::Factorial(totMolInCav - 1) / + num::Factorial(totMolInCav - exchangeRate); + double ratioM = numTypeASource / (numTypeBSource + 1.0); + return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + } + else + { + //Delete Large Molecule + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRate - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRate); + return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + } + } +#endif +} + +inline void MoleculeExchange2::ShiftMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + //Add type A to dest box + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + //Add type B to source box + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange2::RecoverMol(const bool A, const uint n, + const uint from, const uint to) +{ + if(A) + { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, to); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], to); + molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); + } + else + { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, to); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], to); + molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); + } +} + +inline void MoleculeExchange2::Accept(const uint rejectState, const uint step) +{ + bool result; + + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) + { + double molTransCoeff = GetCoeff(); + double Wrat = W_tc * W_recip; + + for(uint n = 0; n < numInCavA; n++) + { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) + { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) + { + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) + { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) + { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } + + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) + { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } + else + { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } + } + } + else //else we didn't even try because we knew it would fail + result = false; + +#if ENSEMBLE == GEMC + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); + moveSetRef.Update(result, subPick, step); +#elif ENSEMBLE == GCMC + subPick = mv::GetMoveSubIndex(mv::MEMC); + moveSetRef.Update(result, subPick, step); +#endif +} + +#endif + +#endif diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 36b47e55f..6d389766d 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -28,6 +28,12 @@ class MoleculeExchange3 : public MoveBase enableID = statV.memcVal.enable; if(enableID) { + if(molLookRef.GetNumCanSwapKind() < 2) { + std::cout << "Error: MEMC move cannot be applied to pure systems or"<< + " systems, where only one molecule type is allowed to be swapped.\n"; + exit(EXIT_FAILURE); + } + if(cavity.x >= cavity.y) cavity.y = cavity.x; else @@ -36,11 +42,11 @@ class MoleculeExchange3 : public MoveBase volCav = cavity.x * cavity.y * cavity.z; exchangeRatio = statV.memcVal.exchangeRatio; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = k; + kindL = molLookRef.GetCanSwapKind(k); } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = k; + kindS = molLookRef.GetCanSwapKind(k); } } @@ -69,10 +75,6 @@ class MoleculeExchange3 : public MoveBase uint ReplaceMolecule(); void CalcTc(); double GetCoeff() const; - //calculate factorial - double Factorial(const uint n) const; - //calculate ratio of factorial - double Factorial(const uint n, const uint count) const; uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool insertL, enableID; @@ -203,7 +205,7 @@ inline uint MoleculeExchange3::ReplaceMolecule() if(state == mv::fail_state::NO_FAIL) { - //Set the V1 to a random vector and calculate two vector perpendicular to V1 + //Set V1 to a random vector and calculate two vector perpendicular to V1 cavA.SetBasis(prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose cavA.TransposeMatrix(invCavA); @@ -220,7 +222,7 @@ inline uint MoleculeExchange3::ReplaceMolecule() } inline uint MoleculeExchange3::GetBoxPairAndMol(const double subDraw, - const double movPerc) + const double movPerc) { uint state = mv::fail_state::NO_FAIL; //deside to insert or remove the big molecule @@ -263,12 +265,10 @@ inline uint MoleculeExchange3::GetBoxPairAndMol(const double subDraw, if(insertL) { state = PickMolInCav(); - trial[sourceBox][kindL]++; } else { state = ReplaceMolecule(); - trial[sourceBox][kindS]++; } if(state == mv::fail_state::NO_FAIL) @@ -350,7 +350,7 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); oldMolB[n].SetCoords(molB, 0); - //set coordinate of moleB to newMolB, later it will shift to tempD + //set coordinate of moleB to newMolB, later it will shift newMolB[n].SetCoords(molB, 0); //copy cavA matrix to slant the new trial of molB newMolB[n].SetCavMatrix(cavA); @@ -569,9 +569,9 @@ inline double MoleculeExchange3::GetCoeff() const if(insertL) { //kindA is the small molecule - double ratioF = Factorial(totMolInCav - 1) / - (Factorial(totMolInCav - exchangeRate) * - Factorial(numTypeADest, exchangeRate)); + double ratioF = num::Factorial(totMolInCav - 1) / + (num::Factorial(totMolInCav - exchangeRate) * + num::Factorial(numTypeADest, exchangeRate)); double ratioV = pow(volDest / volCav, exchangeRate - 1); double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); return ratioF * ratioV * ratioM; @@ -579,9 +579,9 @@ inline double MoleculeExchange3::GetCoeff() const else { //kindA is the big molecule - double ratioF = Factorial(totMolInCav) * - Factorial(numTypeBDest - exchangeRate, exchangeRate) / - Factorial(totMolInCav + exchangeRate - 1); + double ratioF = num::Factorial(totMolInCav) * + num::Factorial(numTypeBDest - exchangeRate, exchangeRate) / + num::Factorial(totMolInCav + exchangeRate - 1); double ratioV = pow(volCav / volDest, exchangeRate - 1); double ratioM = numTypeASource / ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); @@ -595,16 +595,16 @@ inline double MoleculeExchange3::GetCoeff() const if(insertL) { //Insert Large molecule - double ratioF = Factorial(totMolInCav - 1) / - Factorial(totMolInCav - exchangeRate); + double ratioF = num::Factorial(totMolInCav - 1) / + num::Factorial(totMolInCav - exchangeRate); double ratioM = numTypeASource / (numTypeBSource + 1.0); return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); } else { //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRate - 1); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRate - 1); double ratioM = numTypeASource / (numTypeBSource + exchangeRate); return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); } @@ -616,16 +616,16 @@ inline double MoleculeExchange3::GetCoeff() const if(insertL) { //Insert Large molecule - double ratioF = Factorial(totMolInCav - 1) / - Factorial(totMolInCav - exchangeRate); + double ratioF = num::Factorial(totMolInCav - 1) / + num::Factorial(totMolInCav - exchangeRate); double ratioM = numTypeASource / (numTypeBSource + 1.0); return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); } else { //Delete Large Molecule - double ratioF = Factorial(totMolInCav) / - Factorial(totMolInCav + exchangeRate - 1); + double ratioF = num::Factorial(totMolInCav) / + num::Factorial(totMolInCav + exchangeRate - 1); double ratioM = numTypeASource / (numTypeBSource + exchangeRate); return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); } @@ -677,35 +677,9 @@ inline void MoleculeExchange3::RecoverMol(const bool A, const uint n, } } -//return n! -inline double MoleculeExchange3::Factorial(const uint n) const -{ - double result = 1.0; - for(uint i = 2; i <= n; i++) - { - result *= i; - } - - return result; -} - -//return (n+count)!/n! -inline double MoleculeExchange3::Factorial(const uint n, const uint count) const -{ - double result = 1.0; - for(uint i = 1; i <= count; i++) - { - result *= n + i; - } - - return result; -} - inline void MoleculeExchange3::Accept(const uint rejectState, const uint step) { - bool result; - //print acceptance information - PrintAcceptance(step); + bool result; //If we didn't skip the move calculation if(rejectState == mv::fail_state::NO_FAIL) @@ -727,9 +701,7 @@ inline void MoleculeExchange3::Accept(const uint rejectState, const uint step) if(result) { - //update acceptance - accept[sourceBox][kindIndexB[0]]++; - //Add tail corrections + //Add tail corrections sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; diff --git a/src/PRNG.h b/src/PRNG.h index ad0a7de48..dee2434a9 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -335,7 +335,8 @@ class PRNG uint mOff = randIntExc(molLookRef.NumKindInBox(mk, b)); //Lookup true index in table. m = molLookRef.GetMolNum(mOff, mk, b); - } while(molLookRef.IsNoSwap(m) || std::find(m2.begin(), m2.end(), m) != m2.end()); + } while(molLookRef.IsNoSwap(m) || + std::find(m2.begin(), m2.end(), m) != m2.end()); m2.push_back(m); mk2.push_back(mk); } From 38431f92cd1ffedf2712f97e9a32cc4836521892 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 1 Jun 2018 16:03:02 -0400 Subject: [PATCH 009/199] Normalize the Rosenbluth weight. --- src/CalculateEnergy.cpp | 30 ------------------------------ src/CalculateEnergy.h | 8 -------- src/MoleculeExchange3.h | 2 +- src/cbmc/DCFreeHedron.cpp | 4 ++-- src/cbmc/DCFreeHedronSeed.cpp | 4 ++-- src/cbmc/DCLinkedHedron.cpp | 4 ++-- src/cbmc/DCOnSphere.cpp | 4 ++-- src/cbmc/DCSingle.cpp | 17 +++++++++++++---- 8 files changed, 22 insertions(+), 51 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index a4e24e266..0b1116288 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -575,36 +575,6 @@ void CalculateEnergy::ParticleInter(double* en, double *real, } } -//! Calculates Nonbonded inter energy for candidate positions in trialPos -void CalculateEnergy::ParticleInterRange(double* en, double *real, - XYZArray const& trialPos, - const uint partIndex, - const uint molIndex, - const uint box, - const uint start, - const uint end) const -{ - double distSq, qi_qj_Fact; - MoleculeKind const& thisKind = mols.GetKind(molIndex); - uint kindI = thisKind.AtomKind(partIndex); - double kindICharge = thisKind.AtomCharge(partIndex) * num::qqFact; - - for(uint t = start; t < end; ++t) { - CellList::Neighbors n = cellList.EnumerateLocal(trialPos[t], box); - while (!n.Done()) { - distSq = 0.0; - if(currentAxes.InRcut(distSq, trialPos, t, currentCoords, *n, box)) { - en[t] += forcefield.particles->CalcEn(distSq, kindI, particleKind[*n]); - if(electrostatic) { - qi_qj_Fact = particleCharge[*n] * kindICharge ; - real[t] += forcefield.particles->CalcCoulombEn(distSq, qi_qj_Fact); - } - } - n.Next(); - } - } -} - //Calculates the change in the TC from adding numChange atoms of a kind Intermolecular CalculateEnergy::MoleculeTailChange(const uint box, diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 6e047f028..3589b3382 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -120,14 +120,6 @@ class CalculateEnergy const uint box, const uint trials) const; - void ParticleInterRange(double* en, double *real, - XYZArray const& trialPos, - const uint partIndex, - const uint molIndex, - const uint box, - const uint start, - const uint end) const; - //! Calculates the change in the TC from adding numChange atoms of a kind //! @param box Index of box under consideration diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 6d389766d..c4754c974 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -421,7 +421,7 @@ inline uint MoleculeExchange3::Transform() //Deleting A, B from their box if(insertL) { - //Remove the fixed COM small mol at the end because we insert it at fist + //Remove the fixed COM small mol at the end because we insert it at first for(uint n = numInCavA; n > 0; n--) { cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); diff --git a/src/cbmc/DCFreeHedron.cpp b/src/cbmc/DCFreeHedron.cpp index 3797186b6..775763c01 100644 --- a/src/cbmc/DCFreeHedron.cpp +++ b/src/cbmc/DCFreeHedron.cpp @@ -163,7 +163,7 @@ void DCFreeHedron::BuildNew(TrialMol& newMol, uint molIndex) inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.MultWeight(hed.GetWeight()); - newMol.MultWeight(stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); } void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) @@ -239,7 +239,7 @@ void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(hed.GetWeight()); - oldMol.MultWeight(stepWeight); + oldMol.MultWeight(stepWeight / nLJTrials); } } diff --git a/src/cbmc/DCFreeHedronSeed.cpp b/src/cbmc/DCFreeHedronSeed.cpp index b1308996a..7c65278bc 100644 --- a/src/cbmc/DCFreeHedronSeed.cpp +++ b/src/cbmc/DCFreeHedronSeed.cpp @@ -157,7 +157,7 @@ void DCFreeHedronSeed::BuildNew(TrialMol& newMol, uint molIndex) inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.MultWeight(hed.GetWeight()); - newMol.MultWeight(stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); } void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) @@ -233,7 +233,7 @@ void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(hed.GetWeight()); - oldMol.MultWeight(stepWeight); + oldMol.MultWeight(stepWeight / nLJTrials); } } diff --git a/src/cbmc/DCLinkedHedron.cpp b/src/cbmc/DCLinkedHedron.cpp index 8a21ddaa3..e3358daff 100644 --- a/src/cbmc/DCLinkedHedron.cpp +++ b/src/cbmc/DCLinkedHedron.cpp @@ -203,7 +203,7 @@ void DCLinkedHedron::BuildNew(TrialMol& newMol, uint molIndex) oneFour[winner], inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.MultWeight(hed.GetWeight()); - newMol.MultWeight(stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); } void DCLinkedHedron::BuildOld(TrialMol& oldMol, uint molIndex) @@ -320,7 +320,7 @@ void DCLinkedHedron::BuildOld(TrialMol& oldMol, uint molIndex) inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(hed.GetWeight()); - oldMol.MultWeight(stepWeight); + oldMol.MultWeight(stepWeight / nLJTrials); } double DCLinkedHedron::EvalLJ(TrialMol& mol, uint molIndex) diff --git a/src/cbmc/DCOnSphere.cpp b/src/cbmc/DCOnSphere.cpp index 7aa3c637a..c90364b00 100644 --- a/src/cbmc/DCOnSphere.cpp +++ b/src/cbmc/DCOnSphere.cpp @@ -81,7 +81,7 @@ void DCOnSphere::BuildOld(TrialMol& oldMol, uint molIndex) stepWeight += exp(-1 * data->ff.beta * (inter[trial] + real[trial])); } - oldMol.MultWeight(stepWeight); + oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(bondEnergy, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.ConfirmOldAtom(atom); @@ -117,7 +117,7 @@ void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = data->prng.PickWeighted(ljWeights, nLJTrials, stepWeight); - newMol.MultWeight(stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(bondEnergy, 0, inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.AddAtom(atom, positions[winner]); diff --git a/src/cbmc/DCSingle.cpp b/src/cbmc/DCSingle.cpp index 3e88027d1..b4d4a28f3 100644 --- a/src/cbmc/DCSingle.cpp +++ b/src/cbmc/DCSingle.cpp @@ -34,7 +34,11 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); - prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); + if(oldMol.SeedFix()) { + nLJTrials = 1; + } else { + prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); + } positions.Set(0, oldMol.AtomPosition(atom)); data->calc.ParticleInter(inter, real, positions, atom, molIndex, oldMol.GetBox(), nLJTrials); @@ -43,7 +47,7 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) stepWeight += exp(-1 * data->ff.beta * (inter[trial] + real[trial])); } - oldMol.MultWeight(stepWeight); + oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.ConfirmOldAtom(atom); @@ -62,7 +66,12 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); - prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); + if(newMol.SeedFix()) { + nLJTrials = 1; + positions.Set(0, data->axes.WrapPBC(newMol.GetSeed(), newMol.GetBox())); + } else { + prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); + } data->calc.ParticleInter(inter, real, positions, atom, molIndex, newMol.GetBox(), nLJTrials); @@ -73,7 +82,7 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); - newMol.MultWeight(stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.AddAtom(atom, positions[winner]); From 7d462c2703bd776c33ca14ee3d0ed0d7356b5903 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 1 Jun 2018 17:39:27 -0400 Subject: [PATCH 010/199] Add DCRotate class. --- src/cbmc/DCRotateCOM.cpp | 395 +++++++++++++++++++++++++++++++++++++++ src/cbmc/DCRotateCOM.h | 42 +++++ src/cbmc/TrialMol.cpp | 71 ++++++- src/cbmc/TrialMol.h | 21 ++- 4 files changed, 523 insertions(+), 6 deletions(-) create mode 100644 src/cbmc/DCRotateCOM.cpp create mode 100644 src/cbmc/DCRotateCOM.h diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp new file mode 100644 index 000000000..2310c78cf --- /dev/null +++ b/src/cbmc/DCRotateCOM.cpp @@ -0,0 +1,395 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#define _USE_MATH_DEFINES +#include +#include "DCRotateCOM.h" +#include "DCData.h" +#include "TrialMol.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "PRNG.h" +#include "NumLib.h" +/* +This file is only called from MoleculeExchange and IntraMoleculeExchange file. +This file depend on ensemble kind, swap the COM of small molecules with one +large molecule. + + +*/ + +namespace cbmc +{ + + DCRotateCOM::DCRotateCOM(DCData* data) + : data(data) , rotateMatrix(3), invMatrix(3) + { + rotateMatrix.Set(0, 0.0, 0.0, 0.0); + rotateMatrix.Set(1, 0.0, 0.0, 0.0); + rotateMatrix.Set(2, 0.0, 0.0, 1.0); + } + + void DCRotateCOM::RandRotateZ() + { + PRNG& prng = data->prng; + double theta = prng(); + theta *= 2.0 * M_PI; + theta -= M_PI; + double cosTheta = cos(theta); + double sinTheta = sin(theta); + rotateMatrix.Set(0, cosTheta, -sinTheta, 0.0); + rotateMatrix.Set(1, sinTheta, cosTheta, 0.0); + } + + void DCRotateCOM::PrepareNew(TrialMol& newMol, uint molIndex) + { + newMol.SetWeight(1.0); + atomNumber = newMol.GetCoords().Count(); + //old center of mass + oldCOM = newMol.GetCOM(); + } + + void DCRotateCOM::PickTransferCOMNew(TrialMol& newMol, uint molIndex) + { + PRNG& prng = data->prng; + + if(newMol.SeedFix()) + { + if(newMol.HasCav()) + COM = newMol.GetSeed(); + else + prng.FillWithRandom(COM, data->axes.GetAxis(newMol.GetBox())); + } + else + { + //new center of mass that need to be transfered + if(newMol.HasCav()) + { + //Pick molecule in cav dimension + prng.FillWithRandomInCavity(COM, newMol.GetSubVol()); + //rotate using cavity matrix + COM = newMol.Transform(COM); + //add center + COM += newMol.GetSeed(); + } + else + prng.FillWithRandom(COM, data->axes.GetAxis(newMol.GetBox())); + } + + XYZ diff = COM - oldCOM; + + for(uint p = 0; p < atomNumber; p++) + { + newMol.SetAtomCoords(p, newMol.AtomPosition(p) + diff); + } + + oldCOM = COM; + } + + + void DCRotateCOM::PrepareOld(TrialMol& oldMol, uint molIndex) + { + oldMol.SetWeight(1.0); + atomNumber = oldMol.GetCoords().Count(); + //old center of mass + oldCOM = oldMol.GetCOM(); + COM = oldCOM; + } + + void DCRotateCOM::PickTransferCOMOld(TrialMol& oldMol, uint molIndex) + { + PRNG& prng = data->prng; + //new center of mass that need to be transfered + if(oldMol.HasCav()) + { + //Pick molecule in cav dimension + prng.FillWithRandomInCavity(COM, oldMol.GetSubVol()); + //rotate using cavity matrix + COM = oldMol.Transform(COM); + //add center + COM += oldMol.GetSeed(); + } + else + prng.FillWithRandom(COM, data->axes.GetAxis(oldMol.GetBox())); + + XYZ diff = COM - oldCOM; + + for(uint p = 0; p < atomNumber; p++) + { + oldMol.SetAtomCoords(p, oldMol.AtomPosition(p) + diff); + } + + oldCOM = COM; + } + + void DCRotateCOM::BuildNew(TrialMol& newMol, uint molIndex) + { + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const EwaldCached *calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + uint fLJTrials = data->nLJTrialsFirst; + uint totalTrials = data->totalTrials; + double* ljWeights = data->ljWeightsT; + double* inter = data->interT; + double* real = data->realT; + RotationMatrix spin; + + std::fill_n(inter, totalTrials, 0.0); + std::fill_n(real, totalTrials, 0.0); + std::fill_n(ljWeights, totalTrials, 0.0); + + XYZArray *multiPosRotions; + multiPosRotions = new XYZArray[atomNumber]; + for(uint i = 0; i < atomNumber; ++i) + { + multiPosRotions[i] = XYZArray(totalTrials); + } + + if(atomNumber == 1) + { + nLJTrials = 1; + totalTrials = fLJTrials; + } + + if(newMol.SeedFix()) + { + fLJTrials = 1; + totalTrials = nLJTrials; + //if we rotate around backbone we need to calc the rotation matrix + if(newMol.RotateBB()) + { + //find the inverse matrix of molecule that we insert + XYZ backBone; + if(atomNumber != 1) + { + backBone = newMol.GetCoords().Difference(0, atomNumber - 1); + } + else + { + backBone = prng.RandomUnitVect(); + } + XYZArray T(3); + T.SetBasis(backBone); + T.TransposeMatrix(invMatrix); + } + } + + + for (uint p = 0; p < fLJTrials; ++p) + { + //Pick a new position for COM and transfer the molecule + PickTransferCOMNew(newMol, molIndex); + //get info about existing geometry + newMol.ShiftBasis(COM); + const XYZ center = COM; + uint index = p * nLJTrials; + + for (uint a = 0; a < atomNumber; ++a) + { + multiPosRotions[a].Set(index, newMol.AtomPosition(a)); + multiPosRotions[a].Add(index, -center); + } + + //Rotational trial the molecule around COM + for (uint r = nLJTrials; r-- > 0;) + { + if(newMol.RotateBB()) + { + //we only perform rotation around z axis + RandRotateZ(); + } + else + { + //convert chosen torsion to 3D positions + spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); + } + + for (uint a = 0; a < atomNumber; ++a) + { + if(newMol.RotateBB()) + { + XYZ coord = multiPosRotions[a][index]; + //transform backbone to z axis + coord = invMatrix.Transform(coord); + //rotate around z + coord = rotateMatrix.Transform(coord); + //transfer backbone to cavity orientation + coord = newMol.Transform(coord); + multiPosRotions[a].Set(index + r, coord); + } + else + { + //find positions + multiPosRotions[a].Set(index + r, + spin.Apply(multiPosRotions[a][index])); + } + multiPosRotions[a].Add(index + r, center); + } + } + } + + for (uint a = 0; a < atomNumber; ++a) + { + data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); + calc.ParticleInter(inter, real, multiPosRotions[a], a, + molIndex, newMol.GetBox(), totalTrials); + } + + double stepWeight = 0.0; + for (uint lj = 0; lj < totalTrials; ++lj) + { + ljWeights[lj] = exp(-ff.beta * (inter[lj] + real[lj])); + stepWeight += ljWeights[lj]; + } + uint winner = prng.PickWeighted(ljWeights, totalTrials, stepWeight); + + for(uint a = 0; a < atomNumber; ++a) + { + newMol.AddAtom(a, multiPosRotions[a][winner]); + } + + newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, + 0.0)); + newMol.MultWeight(stepWeight / totalTrials); + + delete[] multiPosRotions; + } + + void DCRotateCOM::BuildOld(TrialMol& oldMol, uint molIndex) + { + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const EwaldCached * calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + uint fLJTrials = data->nLJTrialsFirst; + uint totalTrials = data->totalTrials; + double* ljWeights = data->ljWeightsT; + double* inter = data->interT; + double* real = data->realT; + RotationMatrix spin; + + std::fill_n(inter, totalTrials, 0.0); + std::fill_n(real, totalTrials, 0.0); + std::fill_n(ljWeights, totalTrials, 0.0); + + XYZArray *multiPosRotions; + multiPosRotions = new XYZArray[atomNumber]; + for(uint i = 0; i < atomNumber; ++i) + { + multiPosRotions[i] = XYZArray(totalTrials); + } + + if(atomNumber == 1) + { + nLJTrials = 1; + totalTrials = fLJTrials; + } + + if(oldMol.SeedFix()) + { + fLJTrials = 1; + totalTrials = nLJTrials; + //if we rotate around backbone of the molecule + if(oldMol.RotateBB()) + { + //find the inverse matrix of cavity + oldMol.TransposeMatrix(invMatrix); + } + } + + const XYZ orgCenter = COM; + + for (uint p = 0; p < fLJTrials; ++p) + { + //First trial is current configuration + //get info about existing geometry + oldMol.ShiftBasis(COM); + const XYZ center = COM; + uint index = p * nLJTrials; + + for (uint a = 0; a < atomNumber; ++a) + { + //get position and shift to origin + multiPosRotions[a].Set(index, oldMol.AtomPosition(a)); + multiPosRotions[a].Add(index, -center); + } + + //Rotational trial the molecule around COM + for (uint r = nLJTrials; r-- > 0;) + { + if((index + r) == 0) + continue; + + if(oldMol.RotateBB()) + { + //we only perform rotation around z axis + RandRotateZ(); + } + else + { + //convert chosen torsion to 3D positions + spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); + } + + for (uint a = 0; a < atomNumber; ++a) + { + if(oldMol.RotateBB()) + { + XYZ coord = multiPosRotions[a][index]; + //transform backbone to z axis + coord = invMatrix.Transform(coord); + //rotate around z + coord = rotateMatrix.Transform(coord); + //transfer backbone to cavity orientation + coord = oldMol.Transform(coord); + multiPosRotions[a].Set(index + r, coord); + } + else + { + //find positions + multiPosRotions[a].Set(index + r, + spin.Apply(multiPosRotions[a][index])); + } + multiPosRotions[a].Add(index + r, center); + } + } + + //Pick a new position for COM and transfer the molecule + PickTransferCOMOld(oldMol, molIndex); + } + + for (uint a = 0; a < atomNumber; ++a) + { + multiPosRotions[a].Add(0, orgCenter); + data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); + calc.ParticleInter(inter, real, multiPosRotions[a], a, + molIndex, oldMol.GetBox(), totalTrials); + } + + double stepWeight = 0.0; + for (uint lj = 0; lj < totalTrials; ++lj) + { + stepWeight += exp(-ff.beta * (inter[lj] + real[lj])); + } + + for (uint a = 0; a < atomNumber; ++a) + { + oldMol.AddAtom(a, multiPosRotions[a][0]); + } + + oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); + oldMol.MultWeight(stepWeight / totalTrials); + + delete[] multiPosRotions; + } + +} + + + diff --git a/src/cbmc/DCRotateCOM.h b/src/cbmc/DCRotateCOM.h new file mode 100644 index 000000000..de3e8d10b --- /dev/null +++ b/src/cbmc/DCRotateCOM.h @@ -0,0 +1,42 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCROTATECOM_H +#define DCROTATECOM_H +#include "DCComponent.h" +#include "XYZArray.h" +#include "CBMC.h" + +namespace mol_setup { class MolKind; } + +namespace cbmc { + class DCData; + + class DCRotateCOM : public DCComponent + { + public: + DCRotateCOM(DCData* data); + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void PickTransferCOMNew(TrialMol& newMol, uint molIndex); + void PickTransferCOMOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void RandRotateZ(); + DCComponent* Clone() { return new DCRotateCOM(*this); }; + + private: + DCData* data; + XYZ COM, oldCOM; + //rotation matrix around z axis + XYZArray rotateMatrix; + //inverse of matrix + XYZArray invMatrix; + uint atomNumber; + }; +} + +#endif diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 12d3aa355..f93c1bc68 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -25,27 +25,43 @@ namespace cbmc TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, uint box) - : kind(&k), axes(&ax), box(box), tCoords(k.NumAtoms()), + : kind(&k), axes(&ax), box(box), tCoords(k.NumAtoms()), cavMatrix(3), totalWeight(1.0) { atomBuilt = new bool[k.NumAtoms()]; std::fill_n(atomBuilt, k.NumAtoms(), false); growthToWorld.LoadIdentity(); + seedInCav = false; + seedFix = false; + rotateBB = false; + cavMatrix.Set(0, 1.0, 0.0, 0.0); + cavMatrix.Set(1, 0.0, 1.0, 0.0); + cavMatrix.Set(2, 0.0, 0.0, 1.0); } TrialMol::TrialMol() - : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL) + : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL), + seedInCav(false), seedFix(false), rotateBB(false), cavMatrix(3) { + cavMatrix.Set(0, 1.0, 0.0, 0.0); + cavMatrix.Set(1, 0.0, 1.0, 0.0); + cavMatrix.Set(2, 0.0, 0.0, 1.0); } TrialMol::TrialMol(const TrialMol& other) : kind(other.kind), axes(other.axes), box(other.box), - tCoords(other.tCoords), en(other.en), + tCoords(other.tCoords), cavMatrix(other.cavMatrix), en(other.en), totalWeight(other.totalWeight), basisPoint(other.basisPoint) { atomBuilt = new bool[kind->NumAtoms()]; std::copy(other.atomBuilt, other.atomBuilt + kind->NumAtoms(), atomBuilt); + seedInCav = false; + seedFix = false; + rotateBB = false; + cavMatrix.Set(0, 1.0, 0.0, 0.0); + cavMatrix.Set(1, 0.0, 1.0, 0.0); + cavMatrix.Set(2, 0.0, 0.0, 1.0); } TrialMol& TrialMol::operator=(TrialMol other) @@ -66,6 +82,18 @@ void swap(TrialMol& a, TrialMol& b) swap(a.atomBuilt, b.atomBuilt); swap(a.growthToWorld, b.growthToWorld); swap(a.worldToGrowth, b.worldToGrowth); + a.seedInCav = false; + b.seedInCav = false; + a.seedFix = false; + b.seedFix = false; + a.rotateBB = false; + b.rotateBB = false; + a.cavMatrix.Set(0, 1.0, 0.0, 0.0); + a.cavMatrix.Set(1, 0.0, 1.0, 0.0); + a.cavMatrix.Set(2, 0.0, 0.0, 1.0); + b.cavMatrix.Set(0, 1.0, 0.0, 0.0); + b.cavMatrix.Set(1, 0.0, 1.0, 0.0); + b.cavMatrix.Set(2, 0.0, 0.0, 1.0); } TrialMol::~TrialMol() @@ -235,4 +263,41 @@ double TrialMol::DihedDist(const double b1, const double b2, const double b3, } +void TrialMol::SetCavMatrix(const XYZArray& matrix) +{ + matrix.CopyRange(cavMatrix, 0, 0, 3); +} + +void TrialMol::SetSeed(const XYZ& coords, const XYZ& rmax, const bool inCav, + const bool fixCOM, const bool rotBB) +{ + sCoords = coords; + sRmax = rmax; + seedInCav = inCav; + seedFix = fixCOM; + rotateBB = rotBB; +} + +void TrialMol::SetSeed(const bool inCav, const bool fixCOM, const bool rotBB) +{ + seedInCav = inCav; + seedFix = fixCOM; + rotateBB = rotBB; +} + +XYZ TrialMol::GetCOM() +{ + XYZ tcom; + XYZArray temp(tCoords); + //axes->UnwrapPBC(temp, box, tCoords.Get(0)); + tCoords = temp; + + for(uint p = 0; p < tCoords.Count(); p++) { + tcom += tCoords.Get(p); + } + tcom *= (1.0 / tCoords.Count()); + + return tcom; +} + } diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 4c98f5738..52bcced6d 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -159,6 +159,19 @@ class TrialMol return atomBuilt[index]; } + //Used in MEMC move + XYZ Transform(const XYZ& a) {return cavMatrix.Transform(a);} + void TransposeMatrix(XYZArray &invMatrix) + {return cavMatrix.TransposeMatrix(invMatrix);} + bool HasCav() const {return seedInCav;} + bool SeedFix() const {return seedFix;} + bool RotateBB() const {return rotateBB;} + void SetCavMatrix(const XYZArray& matrix); + XYZ GetSeed() const {return sCoords;} + XYZ GetSubVol() const {return cavity;} + //return unwrap com of tcoords so tcoords must be set + XYZ GetCOM(); + ~TrialMol(); private: @@ -167,14 +180,16 @@ class TrialMol const MoleculeKind* kind; const BoxDimensions* axes; uint box; - XYZArray tCoords; + XYZArray tCoords, cavMatrix; Energy en; double totalWeight; - bool* atomBuilt; RotationMatrix growthToWorld; RotationMatrix worldToGrowth; XYZ basisPoint; - //bool oneThree, oneFour; + XYZ sCoords, cavity; //The center and cavity dimensions + bool seedInCav, seedFix, rotateBB; + bool* atomBuilt; + }; } From 148f71bb46aad570eb132d7cc6c94cb31e496b2d Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 5 Jun 2018 12:50:43 -0400 Subject: [PATCH 011/199] Add Build functions in CBMC for MEMC move. --- src/CBMC.h | 9 ++ src/MoleculeKind.h | 31 ++++++ src/PRNG.h | 53 +++++----- src/cbmc/DCGraph.cpp | 214 +++++++++++++++++++++++++++++++++++++++ src/cbmc/DCGraph.h | 7 ++ src/cbmc/DCLinear.cpp | 58 +++++++++++ src/cbmc/DCLinear.h | 7 ++ src/cbmc/DCRotateCOM.cpp | 41 ++++---- src/cbmc/TrialMol.cpp | 14 +-- src/cbmc/TrialMol.h | 15 +-- 10 files changed, 388 insertions(+), 61 deletions(-) diff --git a/src/CBMC.h b/src/CBMC.h index 80079e24e..78960f022 100644 --- a/src/CBMC.h +++ b/src/CBMC.h @@ -33,6 +33,15 @@ class CBMC virtual void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) = 0; //Regrowing the molecule using a CBMC algorithm, oldMol and newMol virtual void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) = 0; + //Rigid insertion of molecule and perform position and rotational trial + virtual void BuildIDNew(TrialMol& newMol, uint molIndex) = 0; + virtual void BuildIDOld(TrialMol& oldMol, uint molIndex) = 0; + //Build the molecule using CD-CBMC + virtual void BuildNew(TrialMol& newMol, uint molIndex) = 0; + virtual void BuildOld(TrialMol& oldMol, uint molIndex) = 0; + //Grow the molecule from predefined atom (node) + virtual void BuildGrowNew(TrialMol& newMol, uint molIndex) = 0; + virtual void BuildGrowOld(TrialMol& oldMol, uint molIndex) = 0; virtual ~CBMC() {} }; diff --git a/src/MoleculeKind.h b/src/MoleculeKind.h index 99ebb6188..917ef5cbd 100644 --- a/src/MoleculeKind.h +++ b/src/MoleculeKind.h @@ -94,6 +94,37 @@ class MoleculeKind builder->Regrowth(oldMol, newMol, molIndex); } + //Used in MEMC move + void BuildIDNew(cbmc::TrialMol& newMol, const uint molIndex) + { + builder->BuildIDNew(newMol, molIndex); + } + + void BuildIDOld(cbmc::TrialMol& oldMol, const uint molIndex) + { + builder->BuildIDOld(oldMol, molIndex); + } + + void BuildNew(cbmc::TrialMol& newMol, const uint molIndex) + { + builder->BuildNew(newMol, molIndex); + } + + void BuildOld(cbmc::TrialMol& oldMol, const uint molIndex) + { + builder->BuildOld(oldMol, molIndex); + } + + void BuildGrowNew(cbmc::TrialMol& newMol, const uint molIndex) + { + builder->BuildGrowNew(newMol, molIndex); + } + + void BuildGrowOld(cbmc::TrialMol& oldMol, const uint molIndex) + { + builder->BuildGrowOld(oldMol, molIndex); + } + double GetMoleculeCharge(); SortedNonbond sortedNB, sortedNB_1_4, sortedNB_1_3, sortedEwaldNB; diff --git a/src/PRNG.h b/src/PRNG.h index dee2434a9..8b5a6d156 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -1,3 +1,4 @@ + /******************************************************************************* GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 Copyright (C) 2018 GOMC Group @@ -106,31 +107,36 @@ class PRNG } } + void FillWithRandom(XYZ & loc, BoxDimensions const& dims, + const uint b) + { + XYZ temp(randExc(dims.axis.x[b]), randExc(dims.axis.y[b]), + randExc(dims.axis.z[b])); + loc = dims.TransformSlant(temp, b); + } + + void FillWithRandomInCavity(XYZ &loc, XYZ const& cavDim) + { + XYZ temp(SymExc(cavDim.x/2.0), SymExc(cavDim.y/2.0), SymExc(cavDim.z/2.0)); + loc = temp; + } + + //using UniformRandom algorithm in TransformMatrix.h + XYZ RandomUnitVect() + { + double u2 = gen->rand(); + double u3 = gen->rand(); + u2 *= 2.0 * M_PI; + u3 *= 2.0; + double r = sqrt(u3); + double root = sqrt(2.0 - u3); + XYZ temp(sin(u2) * r * root, cos(u2) * r * root, 1.0 - u3); + return temp; + } + void FillWithRandomOnSphere(XYZArray & loc, const uint len, const double rAttach, const XYZ& center) { - //Quaternion Method - this was 80% slower in my tests - BGJ - /* - XYZ point; - double x[4], sum; - for (uint i = 0; i < len; ++i) - { - do - { - sum = 0; - for (uint j = 0; j < 4; ++j) - { - x[j]=Sym(1.0); - sum += x[j]*x[j]; - } - } while (sum>=1); - - point.x = 2*(x[1]*x[3]+x[0]*x[2])/sum*rAttach; - point.y = 2*(x[2]*x[3]-x[0]*x[1])/sum*rAttach; - point.z = (x[0]*x[0]+x[3]*x[3]-x[1]*x[1]-x[2]*x[2])/sum*rAttach; - loc.Set(i, point + center); - } - */ //Pick on cos(phi) - this was faster and always uses 2 rand calls for (uint i = 0; i < len; ++i) { loc.Set(i, PickOnUnitSphere() * rAttach + center); @@ -196,8 +202,7 @@ class PRNG } - void PickBox(uint &b, - const double subDraw, const double movPerc) const + void PickBox(uint &b, const double subDraw, const double movPerc) const { //Calculate "chunk" of move for each box. double boxDiv = movPerc / BOX_TOTAL; diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 43eafc8e7..7b40cc4c2 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -8,6 +8,7 @@ along with this program, also can be found at . #include "DCFreeHedron.h" #include "DCLinkedHedron.h" #include "DCFreeHedronSeed.h" +#include "DCRotateCOM.h" #include "MolSetup.h" #include "Setup.h" #include "MoleculeKind.h" @@ -25,6 +26,8 @@ DCGraph::DCGraph(System& sys, const Forcefield& ff, assert(it != set.mol.kindMap.end()); const MolKind setupKind = it->second; + idExchange = new DCRotateCOM(&data); + std::vector atomToNode(setupKind.atoms.size(), 0); std::vector bondCount(setupKind.atoms.size(), 0); //Count the number of bonds for each atom @@ -244,6 +247,216 @@ void DCGraph::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) } } +void DCGraph::BuildIDNew(TrialMol& newMol, uint molIndex) +{ + idExchange->PrepareNew(newMol, molIndex); + idExchange->BuildNew(newMol, molIndex); +} + +void DCGraph::BuildIDOld(TrialMol& oldMol, uint molIndex) +{ + idExchange->PrepareOld(oldMol, molIndex); + idExchange->BuildOld(oldMol, molIndex); +} + +void DCGraph::BuildOld(TrialMol& oldMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCGraph::BuildNew(TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) +{ + //Use node 0 because atom zero is in node zero + uint current = 0; + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + //Copy the current node's focus coordinate + uint seedInx = nodes[current].atomIndex; + if(seedInx != 0) + { + std::cout << "In MEMC-3 move, atom 0 must be a node." + << "atom 0 must be bounded to two or more atoms! \n"; + exit(1); + } + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + + +void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = 0; + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + //Copy the current node's focus coordinate + uint seedInx = nodes[current].atomIndex; + if(seedInx != 0) + { + std::cout << "In MEMC-3 move, atom 0 must be a node." + << "atom 0 must be bounded to two or more atoms! \n"; + exit(1); + } + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + + DCGraph::~DCGraph() { for(uint v = 0; v < nodes.size(); ++v) { @@ -254,6 +467,7 @@ DCGraph::~DCGraph() delete node.edges[e].component; } } + delete idExchange; } diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index 81f22cf39..4c5896e2e 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -32,6 +32,12 @@ class DCGraph : public CBMC void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, const uint current); + void BuildIDNew(TrialMol& newMol, uint molIndex); + void BuildIDOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildGrowNew(TrialMol& newMol, uint molIndex); + void BuildGrowOld(TrialMol& oldMol, uint molIndex); ~DCGraph(); private: @@ -57,6 +63,7 @@ class DCGraph : public CBMC std::vector partnerIndex; }; + DCComponent *idExchange; DCData data; std::vector nodes; std::vector fringe; diff --git a/src/cbmc/DCLinear.cpp b/src/cbmc/DCLinear.cpp index dd3182952..3b982b3ee 100644 --- a/src/cbmc/DCLinear.cpp +++ b/src/cbmc/DCLinear.cpp @@ -8,6 +8,7 @@ along with this program, also can be found at . #include "DCLinear.h" #include "DCSingle.h" #include "DCOnSphere.h" +#include "DCRotateCOM.h" using namespace cbmc; @@ -20,6 +21,8 @@ DCLinear::DCLinear(System& sys, const Forcefield& ff, const mol_setup::MolKind setupKind = it->second; uint size = kind.NumAtoms(); atomSize = size; + + idExchange = new DCRotateCOM(&data); //First atom of the molecule forward.push_back(new DCSingle(&data, 0)); backward.push_back(new DCSingle(&data, size - 1)); @@ -36,6 +39,7 @@ DCLinear::~DCLinear() delete forward[i]; delete backward[i]; } + delete idExchange; } void DCLinear::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) @@ -75,3 +79,57 @@ void DCLinear::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) comps[1]->BuildOld(oldMol, molIndex); } } + +void DCLinear::BuildIDNew(TrialMol& newMol, uint molIndex) +{ + idExchange->PrepareNew(newMol, molIndex); + idExchange->BuildNew(newMol, molIndex); +} + +void DCLinear::BuildIDOld(TrialMol& oldMol, uint molIndex) +{ + idExchange->PrepareOld(oldMol, molIndex); + idExchange->BuildOld(oldMol, molIndex); +} + +void DCLinear::BuildOld(TrialMol& oldMol, uint molIndex) +{ + std::vector& comps =data.prng.randInt(1) ? forward : backward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareOld(oldMol, molIndex); + comps[i]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::BuildNew(TrialMol& newMol, uint molIndex) +{ + std::vector& comps =data.prng.randInt(1) ? forward : backward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareNew(newMol, molIndex); + comps[i]->BuildNew(newMol, molIndex); + } +} + +void DCLinear::BuildGrowOld(TrialMol& oldMol, uint molIndex) +{ + //Need to find the atom to start growing + std::vector& comps = forward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareOld(oldMol, molIndex); + comps[i]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::BuildGrowNew(TrialMol& newMol, uint molIndex) +{ + //Need to find the atom to start growing + std::vector& comps = forward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareNew(newMol, molIndex); + comps[i]->BuildNew(newMol, molIndex); + } +} diff --git a/src/cbmc/DCLinear.h b/src/cbmc/DCLinear.h index 68c4cc239..b582e274f 100644 --- a/src/cbmc/DCLinear.h +++ b/src/cbmc/DCLinear.h @@ -27,12 +27,19 @@ class DCLinear : public CBMC void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void BuildIDNew(TrialMol& newMol, uint molIndex); + void BuildIDOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildGrowNew(TrialMol& newMol, uint molIndex); + void BuildGrowOld(TrialMol& oldMol, uint molIndex); ~DCLinear(); private: uint atomSize; //used for when number of atom < 3 std::vector forward, backward; + DCComponent* idExchange; DCData data; }; } diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 2310c78cf..f893dd522 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -56,28 +56,21 @@ namespace cbmc { PRNG& prng = data->prng; - if(newMol.SeedFix()) - { - if(newMol.HasCav()) - COM = newMol.GetSeed(); - else - prng.FillWithRandom(COM, data->axes.GetAxis(newMol.GetBox())); + if(newMol.COMFix()) { + COM = newMol.GetCavityCenter(); } - else - { + else if(newMol.HasCav()) { //new center of mass that need to be transfered - if(newMol.HasCav()) - { - //Pick molecule in cav dimension - prng.FillWithRandomInCavity(COM, newMol.GetSubVol()); - //rotate using cavity matrix - COM = newMol.Transform(COM); - //add center - COM += newMol.GetSeed(); - } - else - prng.FillWithRandom(COM, data->axes.GetAxis(newMol.GetBox())); + //Pick molecule in cav dimension + prng.FillWithRandomInCavity(COM, newMol.GetCavity()); + //rotate using cavity matrix + COM = newMol.Transform(COM); + //add center + COM += newMol.GetCavityCenter(); + } else { + prng.FillWithRandom(COM, data->axes, newMol.GetBox()); } + XYZ diff = COM - oldCOM; @@ -106,14 +99,14 @@ namespace cbmc if(oldMol.HasCav()) { //Pick molecule in cav dimension - prng.FillWithRandomInCavity(COM, oldMol.GetSubVol()); + prng.FillWithRandomInCavity(COM, oldMol.GetCavity()); //rotate using cavity matrix COM = oldMol.Transform(COM); //add center - COM += oldMol.GetSeed(); + COM += oldMol.GetCavityCenter(); } else - prng.FillWithRandom(COM, data->axes.GetAxis(oldMol.GetBox())); + prng.FillWithRandom(COM, data->axes, oldMol.GetBox()); XYZ diff = COM - oldCOM; @@ -156,7 +149,7 @@ namespace cbmc totalTrials = fLJTrials; } - if(newMol.SeedFix()) + if(newMol.COMFix()) { fLJTrials = 1; totalTrials = nLJTrials; @@ -291,7 +284,7 @@ namespace cbmc totalTrials = fLJTrials; } - if(oldMol.SeedFix()) + if(oldMol.COMFix()) { fLJTrials = 1; totalTrials = nLJTrials; diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index f93c1bc68..5f0cce642 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -268,20 +268,20 @@ void TrialMol::SetCavMatrix(const XYZArray& matrix) matrix.CopyRange(cavMatrix, 0, 0, 3); } -void TrialMol::SetSeed(const XYZ& coords, const XYZ& rmax, const bool inCav, +void TrialMol::SetSeed(const XYZ& coords, const XYZ& cav, const bool inCav, const bool fixCOM, const bool rotBB) { - sCoords = coords; - sRmax = rmax; - seedInCav = inCav; - seedFix = fixCOM; + cavityCenter = coords; + cavity = cav; + comInCav = inCav; + comFix = fixCOM; rotateBB = rotBB; } void TrialMol::SetSeed(const bool inCav, const bool fixCOM, const bool rotBB) { - seedInCav = inCav; - seedFix = fixCOM; + comInCav = inCav; + comFix = fixCOM; rotateBB = rotBB; } diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 52bcced6d..f11833d1c 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -160,15 +160,18 @@ class TrialMol } //Used in MEMC move + void SetSeed(const XYZ& coords, const XYZ& cav, const bool inCav, + const bool fixCOM, const bool rotBB); + void SetSeed(const bool inCav, const bool fixCOM, const bool rotBB); XYZ Transform(const XYZ& a) {return cavMatrix.Transform(a);} void TransposeMatrix(XYZArray &invMatrix) {return cavMatrix.TransposeMatrix(invMatrix);} - bool HasCav() const {return seedInCav;} - bool SeedFix() const {return seedFix;} + bool HasCav() const {return comInCav;} + bool COMFix() const {return comFix;} bool RotateBB() const {return rotateBB;} void SetCavMatrix(const XYZArray& matrix); - XYZ GetSeed() const {return sCoords;} - XYZ GetSubVol() const {return cavity;} + XYZ GetCavityCenter() const {return cavityCenter;} + XYZ GetCavity() const {return cavity;} //return unwrap com of tcoords so tcoords must be set XYZ GetCOM(); @@ -186,8 +189,8 @@ class TrialMol RotationMatrix growthToWorld; RotationMatrix worldToGrowth; XYZ basisPoint; - XYZ sCoords, cavity; //The center and cavity dimensions - bool seedInCav, seedFix, rotateBB; + XYZ cavityCenter, cavity; //The center and cavity dimensions + bool comInCav, comFix, rotateBB; bool* atomBuilt; }; From 3bdbd5bbe6780098cceca5fd38d08acefa5f7f77 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 5 Jun 2018 15:11:42 -0400 Subject: [PATCH 012/199] Working on compiling error1. --- CMake/FileLists.cmake | 3 ++- lib/BasicTypes.h | 9 +++++++++ lib/NumLib.h | 4 ++-- src/CalculateEnergy.cpp | 4 ++-- src/CalculateEnergy.h | 1 + src/ConfigSetup.cpp | 14 +++++++------- src/ConfigSetup.h | 2 +- src/Ewald.cpp | 10 ++++------ src/MoleculeLookup.h | 2 +- src/Molecules.h | 5 +++++ src/PRNG.h | 9 ++++++++- src/StaticVals.h | 3 +-- src/XYZArray.h | 39 +++++++++++++++++++-------------------- src/cbmc/DCRotateCOM.cpp | 4 ++-- src/cbmc/DCSingle.cpp | 6 +++--- src/cbmc/TrialMol.cpp | 24 ++++++++++++++---------- src/cbmc/TrialMol.h | 1 + 17 files changed, 82 insertions(+), 58 deletions(-) diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 01254f431..6ea1f6cfb 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -25,7 +25,6 @@ set(sources src/MoleculeLookup.cpp src/Molecules.cpp src/MolSetup.cpp - src/MoveConst.cpp src/MoveSettings.cpp src/NoEwald.cpp src/OutConst.cpp @@ -45,6 +44,7 @@ set(sources src/cbmc/DCHedron.cpp src/cbmc/DCLinear.cpp src/cbmc/DCOnSphere.cpp + src/cbmc/DCRotateCOM.cpp src/cbmc/DCSingle.cpp src/cbmc/TrialMol.cpp) @@ -129,6 +129,7 @@ set(headers src/cbmc/DCHedron.h src/cbmc/DCLinear.h src/cbmc/DCOnSphere.h + src/cbmc/DCRotateCOM.h src/cbmc/DCSingle.h src/cbmc/TrialMol.h) diff --git a/lib/BasicTypes.h b/lib/BasicTypes.h index c6cebc123..2acd2543a 100644 --- a/lib/BasicTypes.h +++ b/lib/BasicTypes.h @@ -117,6 +117,15 @@ struct XYZ { return *this; } + double Max() const + { + double m = x; + if(y > m) + m = y; + if(z > m) + m = z; + return m; + } }; inline std::ostream& operator << (std::ostream & stream, const XYZ& p) diff --git a/lib/NumLib.h b/lib/NumLib.h index e4bddf753..e4ed5503d 100644 --- a/lib/NumLib.h +++ b/lib/NumLib.h @@ -82,7 +82,7 @@ inline double MeanG(std::vector const& v1, } //return n! -inline double Factorial(const uint n) const +inline double Factorial(const uint n) { double result = 1.0; for(uint i = 2; i <= n; i++) { @@ -92,7 +92,7 @@ inline double Factorial(const uint n) const } //return (n+count)!/n! -inline double Factorial(const uint n, const uint count) const +inline double Factorial(const uint n, const uint count) { double result = 1.0; for(uint i = 1; i <= count; i++) { diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 0b1116288..e64946c84 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -63,6 +63,7 @@ void CalculateEnergy::Init(System & sys) calcEwald = sys.GetEwald(); electrostatic = forcefield.electrostatic; ewald = forcefield.ewald; + rCut = forcefield.rCut; for(uint m = 0; m < mols.count; ++m) { const MoleculeKind& molKind = mols.GetKind(m); if(molKind.NumAtoms() > maxAtomInMol) @@ -917,8 +918,7 @@ bool CalculateEnergy::FindMolInCavity(std::vector< std::vector > &mol, uint k; mol.clear(); mol.resize(molLookup.GetNumKind()); - uint maxLength = max(cavDim.x, cavDim.y); - maxLength = max(maxLength, cavDim.z); + double maxLength = cavDim.Max(); if(maxLength <= rCut) { diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 3589b3382..69cb7eb12 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -224,6 +224,7 @@ class CalculateEnergy const COM& currentCOM; const Ewald *calcEwald; bool electrostatic, ewald; + double rCut; std::vector particleKind; std::vector particleMol; diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 1e6317ff2..2a82c4ff4 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -270,14 +270,14 @@ void ConfigSetup::Init(const char *fileName) std::string resName = line[1]; sys.memcVal.largeKind = resName; sys.memcVal.readLK = true; - printf("%-40s %-s \n", "Info: Exchange Large Kind", resName); + printf("%-40s %-s \n", "Info: Exchange Large Kind", resName.c_str()); } } else if(line[0] == "ExchangeSmallKind") { if(line.size() == 2) { std::string resName = line[1]; sys.memcVal.smallKind = resName; sys.memcVal.readSK = true; - printf("%-40s %-s \n", "Info: Exchange Small Kind", resName); + printf("%-40s %-s \n", "Info: Exchange Small Kind", resName.c_str()); } } else if(line[0] == "SmallKindBackBone") { if(line.size() == 3) { @@ -287,7 +287,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.smallBBAtom2 = atom2; sys.memcVal.readSmallBB = true; printf("%-40s %-s - %-s \n", "Info: Atom Names in Small Kind BackBone", - atom1, atom2); + atom1.c_str(), atom2.c_str()); } } else if(line[0] == "LargeKindBackBone") { if(line.size() == 3) { @@ -297,7 +297,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.largeBBAtom2 = atom2; sys.memcVal.readLargeBB = true; printf("%-40s %-s - %-s \n", "Info: Atom Names in Large Kind BackBone", - atom1, atom2); + atom1.c_str(), atom2.c_str()); } } else if(line[0] == "Rcut") { sys.ff.cutoff = stringtod(line[1]); @@ -422,7 +422,7 @@ void ConfigSetup::Init(const char *fileName) sys.moves.memc); if(sys.moves.memc > 0.0) { sys.memcVal.enable = true; - sys.memcVal.MEMC1 = true + sys.memcVal.MEMC1 = true; } } else if(line[0] == "MEMC-2Freq") { sys.moves.memc = stringtod(line[1]); @@ -430,7 +430,7 @@ void ConfigSetup::Init(const char *fileName) sys.moves.memc); if(sys.moves.memc > 0.0) { sys.memcVal.enable = true; - sys.memcVal.MEMC2 = true + sys.memcVal.MEMC2 = true; } } else if(line[0] == "MEMC-3Freq") { sys.moves.memc = stringtod(line[1]); @@ -438,7 +438,7 @@ void ConfigSetup::Init(const char *fileName) sys.moves.memc); if(sys.moves.memc > 0.0) { sys.memcVal.enable = true; - sys.memcVal.MEMC3 = true + sys.memcVal.MEMC3 = true; } } #endif diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index f97023120..20084f842 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -217,7 +217,7 @@ struct MEMCVal { uint exchangeRatio; std::string smallBBAtom1, smallBBAtom2; std::string largeBBAtom1, largeBBAtom2; - MEMCVal(void) : { + MEMCVal(void) { MEMC1 = MEMC2 = MEMC3 = false; readVol = readRatio = readSmallBB = false; readLargeBB = readSK = readLK = false; diff --git a/src/Ewald.cpp b/src/Ewald.cpp index d5416b4f0..92cbbc596 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -512,9 +512,8 @@ double Ewald::SwapRecip(const std::vector &newMol, { for (p = 0; p < lengthNew; ++p) { - dotProductNew = currentAxes.DotProduct(p, kxRef[box][i], - kyRef[box][i],kzRef[box][i], - newMol[m].GetCoords(), box); + dotProductNew = Dot(p, kxRef[box][i], kyRef[box][i],kzRef[box][i], + newMol[m].GetCoords()); sumRealNew += (thisKindNew.AtomCharge(p) * cos(dotProductNew)); sumImaginaryNew += (thisKindNew.AtomCharge(p) *sin(dotProductNew)); @@ -525,9 +524,8 @@ double Ewald::SwapRecip(const std::vector &newMol, { for (p = 0; p < lengthOld; ++p) { - dotProductNew = currentAxes.DotProduct(p, kxRef[box][i], - kyRef[box][i],kzRef[box][i], - oldMol[m].GetCoords(), box); + dotProductNew = Dot(p, kxRef[box][i], kyRef[box][i],kzRef[box][i], + oldMol[m].GetCoords()); sumRealNew -= (thisKindOld.AtomCharge(p) * cos(dotProductNew)); sumImaginaryNew -= (thisKindOld.AtomCharge(p) *sin(dotProductNew)); diff --git a/src/MoleculeLookup.h b/src/MoleculeLookup.h index 9bf3d2a2d..69799cc42 100644 --- a/src/MoleculeLookup.h +++ b/src/MoleculeLookup.h @@ -77,7 +77,7 @@ class MoleculeLookup return (fixedAtom[m] == 1); } - bool IsNoSwap(const uint m) + bool IsNoSwap(const uint m) const { return (fixedAtom[m] >= 1); } diff --git a/src/Molecules.h b/src/Molecules.h index 01e070043..92f693703 100644 --- a/src/Molecules.h +++ b/src/Molecules.h @@ -34,6 +34,11 @@ class Molecules return kinds[kIndex[molIndex]]; } + uint GetMolKind(const uint molIndex) const + { + return kIndex[molIndex]; + } + void Init(Setup& setup, Forcefield& forcefield, System& sys); diff --git a/src/PRNG.h b/src/PRNG.h index 8b5a6d156..268fd094d 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -95,6 +95,12 @@ class PRNG return XYZ(gen->rand(bound2) - bound, gen->rand(bound2) - bound, gen->rand(bound2) - bound); } + + // return between [-bound, bound] + double SymExc(double bound) + { + return 2 * gen->rand(bound) - bound; + } //Used to pick first position of void FillWithRandom(XYZArray & loc, const uint len, BoxDimensions const& dims, @@ -334,10 +340,11 @@ class PRNG rejectState = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; } else { for(uint i = 0; i < n; i++) { + uint mOff, m; //Among the ones of that kind in that box, pick one @ random. //Molecule with a tag (beta == 2 and beta == 1) cannot be selected. do { - uint mOff = randIntExc(molLookRef.NumKindInBox(mk, b)); + mOff = randIntExc(molLookRef.NumKindInBox(mk, b)); //Lookup true index in table. m = molLookRef.GetMolNum(mOff, mk, b); } while(molLookRef.IsNoSwap(m) || diff --git a/src/StaticVals.h b/src/StaticVals.h index e4be68ec3..36f5bde6f 100644 --- a/src/StaticVals.h +++ b/src/StaticVals.h @@ -24,7 +24,6 @@ along with this program, also can be found at . class Setup; class System; -struct config_setup::MEMCVal; class StaticVals { @@ -64,7 +63,7 @@ class StaticVals MoleculeLookup molLookup; #endif #ifdef VARIABLE_PARTICLE_NUMBER - MEMCVal memcVal + config_setup::MEMCVal memcVal; #endif bool IsEquil(const uint step) diff --git a/src/XYZArray.h b/src/XYZArray.h index b0a7bf4c7..311075487 100644 --- a/src/XYZArray.h +++ b/src/XYZArray.h @@ -7,9 +7,11 @@ along with this program, also can be found at . #ifndef XYZ_ARRAY_H #define XYZ_ARRAY_H +//#include "GeomLib.h" #include "BasicTypes.h" #include //for memset, memcpy, etc. #include //for memset, memcpy, etc. +#include #include //for swap (most modern compilers) #include //for swap pre-c++11 compilers #ifdef _OPENMP @@ -167,7 +169,16 @@ class XYZArray //calculate the adjoint and return the determinant double AdjointMatrix(XYZArray &Inv); - + + //Set basis using V as the z axis + void SetBasis(XYZ const & V); + + // Transpose the matrix + void TransposeMatrix(XYZArray &Inv); + + // transfor the matrix using the basis cell. + XYZ Transform(const XYZ &A) const; + //return the difference of two rows in two XYZ arrays XYZ Difference(const uint i, XYZArray const& other, const uint otherI) const @@ -349,21 +360,7 @@ inline XYZArray::XYZArray(XYZArray const& other) //copy and swap assignment inline XYZArray& XYZArray::operator=(XYZArray other) { - if(allocDone) { - if(count != other.count) { - std::cout << "Error: XYZArray equal operator, size mismatch.\n" - exit(EXIT_FAILURE); - } - count = other.count; - for(uint i = 0; i < count; i++) { - x[i] = other.x[i]; - y[i] = other.y[i]; - z[i] = other.z[i]; - } - } else { - std::cout << "Error: XYZArray equal operator, mempry not allocated.\n" - exit(EXIT_FAILURE); - } + swap(*this, other); return *this; } @@ -554,9 +551,10 @@ inline double XYZArray::AdjointMatrix(XYZArray &Inv) } //Find two vectors that are perpendicular to V1 using Gram-Schmidt method -inline void XYZArray::SetBasis(XYZ const & v1) + void XYZArray::SetBasis(XYZ const & V) { - using namespace geom; + //using namespace geom; + XYZ v1 = V; v1.Normalize(); XYZ v2; if(abs(v1.x) < 0.8) { @@ -566,10 +564,11 @@ inline void XYZArray::SetBasis(XYZ const & v1) //v3 will be v1 x the standard Y unit vec v2 = XYZ(0.0, 1.0, 0.0); } - XYZ v3 = Cross(v1, v2); + //XYZ v3 = Cross(v1, v2); + XYZ v3; v3.Normalize(); //v2 is unit vec perpendicular to both v3 and v2 - v2 = Cross(v3, v1); + //v2 = Cross(v3, v1); //set v1 az z axis of cell basis this->Set(0, v3); this->Set(1, v2); diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index f893dd522..29f980320 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -122,7 +122,7 @@ namespace cbmc { PRNG& prng = data->prng; const CalculateEnergy& calc = data->calc; - const EwaldCached *calcEwald = data->calcEwald; + const Ewald *calcEwald = data->calcEwald; const Forcefield& ff = data->ff; uint nLJTrials = data->nLJTrialsNth; uint fLJTrials = data->nLJTrialsFirst; @@ -257,7 +257,7 @@ namespace cbmc { PRNG& prng = data->prng; const CalculateEnergy& calc = data->calc; - const EwaldCached * calcEwald = data->calcEwald; + const Ewald * calcEwald = data->calcEwald; const Forcefield& ff = data->ff; uint nLJTrials = data->nLJTrialsNth; uint fLJTrials = data->nLJTrialsFirst; diff --git a/src/cbmc/DCSingle.cpp b/src/cbmc/DCSingle.cpp index b4d4a28f3..355765919 100644 --- a/src/cbmc/DCSingle.cpp +++ b/src/cbmc/DCSingle.cpp @@ -34,7 +34,7 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); - if(oldMol.SeedFix()) { + if(oldMol.COMFix()) { nLJTrials = 1; } else { prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); @@ -66,9 +66,9 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); - if(newMol.SeedFix()) { + if(newMol.COMFix()) { nLJTrials = 1; - positions.Set(0, data->axes.WrapPBC(newMol.GetSeed(), newMol.GetBox())); + positions.Set(0, data->axes.WrapPBC(newMol.GetCavityCenter(), newMol.GetBox())); } else { prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); } diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 5f0cce642..68ef63ce6 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -31,8 +31,8 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, atomBuilt = new bool[k.NumAtoms()]; std::fill_n(atomBuilt, k.NumAtoms(), false); growthToWorld.LoadIdentity(); - seedInCav = false; - seedFix = false; + comInCav = false; + comFix = false; rotateBB = false; cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -41,7 +41,7 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, TrialMol::TrialMol() : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL), - seedInCav(false), seedFix(false), rotateBB(false), cavMatrix(3) + comInCav(false), comFix(false), rotateBB(false), cavMatrix(3) { cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -56,8 +56,8 @@ TrialMol::TrialMol(const TrialMol& other) : { atomBuilt = new bool[kind->NumAtoms()]; std::copy(other.atomBuilt, other.atomBuilt + kind->NumAtoms(), atomBuilt); - seedInCav = false; - seedFix = false; + comInCav = false; + comFix = false; rotateBB = false; cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -82,10 +82,10 @@ void swap(TrialMol& a, TrialMol& b) swap(a.atomBuilt, b.atomBuilt); swap(a.growthToWorld, b.growthToWorld); swap(a.worldToGrowth, b.worldToGrowth); - a.seedInCav = false; - b.seedInCav = false; - a.seedFix = false; - b.seedFix = false; + a.comInCav = false; + b.comInCav = false; + a.comFix = false; + b.comFix = false; a.rotateBB = false; b.rotateBB = false; a.cavMatrix.Set(0, 1.0, 0.0, 0.0); @@ -106,7 +106,11 @@ void TrialMol::AddAtom(const uint index, const XYZ& loc) tCoords.Set(index, loc); atomBuilt[index] = true; } - + +void SetAtomCoords(uint index, const XYZ& loc) +{ + tCoords.Set(index, loc); +} void TrialMol::ConfirmOldAtom(uint i) { diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index f11833d1c..0569b46c6 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -41,6 +41,7 @@ class TrialMol } void AddAtom(uint index, const XYZ& position); + void SetAtomCoords(uint index, const XYZ& loc); void AddEnergy(const Energy& energy) { From 14e055e38f648793198496eb8640033314eb924d Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 5 Jun 2018 18:13:11 -0400 Subject: [PATCH 013/199] Fixing compiling error2. --- lib/GeomLib.h | 49 +++++++++++++++++ src/BoxDimensions.h | 3 +- src/CalculateEnergy.cpp | 112 +++++++++++++++++++++------------------ src/CalculateEnergy.h | 3 ++ src/MoleculeExchange1.h | 30 ++++++----- src/MoleculeExchange2.h | 108 +++++++++++++++++++------------------ src/MoleculeExchange3.h | 110 +++++++++++++++++++++++++------------- src/MoveConst.h | 6 --- src/MoveSettings.h | 10 ++++ src/PRNG.h | 35 ++++++++++++ src/StaticVals.h | 4 ++ src/System.cpp | 4 +- src/XYZArray.h | 61 --------------------- src/cbmc/DCData.h | 15 +++++- src/cbmc/DCRotateCOM.cpp | 12 ++--- src/cbmc/DCRotateCOM.h | 1 + src/cbmc/TrialMol.cpp | 7 ++- src/cbmc/TrialMol.h | 8 ++- 18 files changed, 342 insertions(+), 236 deletions(-) diff --git a/lib/GeomLib.h b/lib/GeomLib.h index 553616f53..5c560fb3a 100644 --- a/lib/GeomLib.h +++ b/lib/GeomLib.h @@ -90,6 +90,55 @@ inline double Dot(const uint atom, const double kx, const double ky, return(Coords.x[atom] * kx + Coords.y[atom] * ky + Coords.z[atom] * kz); } + +//Find two vectors that are perpendicular to V +inline void SetBasis(XYZArray &basis, XYZ const &V) +{ + XYZ v1 = V; + v1.Normalize(); + XYZ v2; + if(fabs(v1.x) < 0.8) { + //v3 will be v1 x the standard X unit vec + v2 = XYZ(1.0, 0.0, 0.0); + } else { + //v3 will be v1 x the standard Y unit vec + v2 = XYZ(0.0, 1.0, 0.0); + } + XYZ v3 = Cross(v1, v2); + v3.Normalize(); + //v2 is unit vec perpendicular to both v3 and v2 + v2 = Cross(v3, v1); + //set v1 az z axis of cell basis + basis.Set(0, v3); + basis.Set(1, v2); + basis.Set(2, v1); +} + +inline void TransposeMatrix(XYZArray &Inv, XYZArray const &matrix) +{ + Inv.x[0] = matrix.x[0]; + Inv.x[1] = matrix.y[0]; + Inv.x[2] = matrix.z[0]; + + Inv.y[0] = matrix.x[1]; + Inv.y[1] = matrix.y[1]; + Inv.y[2] = matrix.z[1]; + + Inv.z[0] = matrix.x[2]; + Inv.z[1] = matrix.y[2]; + Inv.z[2] = matrix.z[2]; +} + +//Calculate transform of A using dot product +inline XYZ Transform(const XYZArray &basis, const XYZ &A) +{ + XYZ temp; + temp.x = A.x * basis.x[0] + A.y * basis.x[1] + A.z * basis.x[2]; + temp.y = A.x * basis.y[0] + A.y * basis.y[1] + A.z * basis.y[2]; + temp.z = A.x * basis.z[0] + A.y * basis.z[1] + A.z * basis.z[2]; + return temp; +} + //Generates angle between two vectors sharing a common vertex. //NOTE: //Vectors must be pre-shifted to the origin. diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index bac7d2f6b..ce7ccbee9 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -12,6 +12,7 @@ along with this program, also can be found at . #include "PDBSetup.h" //Primary source of volume. #include "ConfigSetup.h" //Other potential source of volume (new sys only) #include "XYZArray.h" //For axes +#include "GeomLib.h" #include #include @@ -267,7 +268,7 @@ inline bool BoxDimensions::InCavity(XYZ const& arr, XYZ const& center, XYZ halfDim = cavDim * 0.5; halfDim *= halfDim; XYZ diff = MinImage(arr - center, b); - diff = invCav.Transform(diff); + diff = geom::Transform(invCav, diff); diff *= diff; if(diff.x > halfDim.x || diff.y > halfDim.y || diff.z > halfDim.z) return false; diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index e64946c84..868670476 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -891,6 +891,24 @@ void CalculateEnergy::EnergyCorrection(SystemPotential& pot, } } +//!Calculates energy corrections for the box +double CalculateEnergy::EnergyCorrection(const uint box, + const uint *kCount) const +{ + if (box >= BOXES_WITH_U_NB) { + return 0.0; + } + + double tc = 0.0; + for (uint i = 0; i < mols.kindsCount; ++i) { + for (uint j = 0; j < mols.kindsCount; ++j) { + tc += mols.pairEnCorrections[i * mols.kindsCount + j] * + kCount[i] * kCount[j] * currentAxes.volInv[box]; + } + } + return tc; +} + void CalculateEnergy::ForceCorrection(Virial& virial, BoxDimensions const& boxAxes, const uint box) const @@ -915,59 +933,51 @@ bool CalculateEnergy::FindMolInCavity(std::vector< std::vector > &mol, const XYZArray& invCav, const uint box, const uint kind, const uint exRatio) { - uint k; - mol.clear(); - mol.resize(molLookup.GetNumKind()); - double maxLength = cavDim.Max(); + uint k; + mol.clear(); + mol.resize(molLookup.GetNumKind()); + double maxLength = cavDim.Max(); - if(maxLength <= rCut) - { - CellList::Neighbors n = cellList.EnumerateLocal(center, box); - while (!n.Done()) - { - if(currentAxes.InCavity(currentCOM.Get(particleMol[*n]), center, cavDim, - invCav, box)) - { - uint molIndex = particleMol[*n]; - //if molecule can be transfer between boxes - if(!molLookup.IsNoSwap(molIndex)) - { - k = mols.GetMolKind(molIndex); - bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != - mol[k].end(); - if(!exist) - mol[k].push_back(molIndex); - } - } - n.Next(); - } + if(maxLength <= rCut) + { + CellList::Neighbors n = cellList.EnumerateLocal(center, box); + while (!n.Done()) { + if(currentAxes.InCavity(currentCOM.Get(particleMol[*n]), center, cavDim, + invCav, box)) { + uint molIndex = particleMol[*n]; + //if molecule can be transfer between boxes + if(!molLookup.IsNoSwap(molIndex)) { + k = mols.GetMolKind(molIndex); + bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != + mol[k].end(); + if(!exist) + mol[k].push_back(molIndex); + } + } + n.Next(); } - else - { - MoleculeLookup::box_iterator n = molLookup.BoxBegin(box); - MoleculeLookup::box_iterator end = molLookup.BoxEnd(box); - while (n != end) - { - if(currentAxes.InCavity(currentCOM.Get(*n), center, cavDim, invCav, box)) - { - uint molIndex = *n; - //if molecule can be transfer between boxes - if(!molLookup.IsNoSwap(molIndex)) - { - k = mols.GetMolKind(molIndex); - bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != - mol[k].end(); - if(!exist) - mol[k].push_back(molIndex); - } - } - n++; - } + } else { + MoleculeLookup::box_iterator n = molLookup.BoxBegin(box); + MoleculeLookup::box_iterator end = molLookup.BoxEnd(box); + while (n != end) { + if(currentAxes.InCavity(currentCOM.Get(*n), center, cavDim, invCav, box)){ + uint molIndex = *n; + //if molecule can be transfer between boxes + if(!molLookup.IsNoSwap(molIndex)) { + k = mols.GetMolKind(molIndex); + bool exist = std::find(mol[k].begin(), mol[k].end(), molIndex) != + mol[k].end(); + if(!exist) + mol[k].push_back(molIndex); + } + } + n++; } + } - //If the is exRate and more molecule kind in cavity, return true. - if(mol[kind].size() >= exRatio) - return true; - else - return false; + //If the is exRate and more molecule kind in cavity, return true. + if(mol[kind].size() >= exRatio) + return true; + else + return false; } diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 69cb7eb12..255e57916 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -151,6 +151,9 @@ class CalculateEnergy const XYZ& cavDim, const XYZArray& invCav, const uint box, const uint kind, const uint exRatio); + //!Calculates energy corrections for the box + double EnergyCorrection(const uint box, const uint *kCount) const; + private: //! Calculates full TC energy for one box in current system diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 8bb271134..577c763e7 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -4,9 +4,11 @@ #if ENSEMBLE==GCMC || ENSEMBLE==GEMC #include "MoveBase.h" -#include "cbmc/TrialMol.h" +#include "TrialMol.h" +#include "GeomLib.h" using std::vector; +using namespace geom; // MEMC-1 Move: // @@ -51,19 +53,20 @@ class MoleculeExchange1 : public MoveBase } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] == i; - } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ + } + else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ largeBB[1] == i; } } @@ -71,8 +74,9 @@ class MoleculeExchange1 : public MoveBase for(uint i = 0; i < 2; i++) { if(largeBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, - statV.memcVal.largeKind); + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } } @@ -170,9 +174,9 @@ inline uint MoleculeExchange1::PickMolInCav() //Use to shift the new insterted molecule center = temp; //Pick random vector anad find two vectors that are perpendicular to V1 - cavA.SetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav here Inv = transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, @@ -228,16 +232,14 @@ inline uint MoleculeExchange1::ReplaceMolecule() //Set the V1 to the backbone of the large molecule if(molRef.NumAtoms(kindL) == 1) { - cavA.SetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); } else { - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], - largeBB[1]), - sourceBox)); + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); } //Calculate inverse matrix for cav. Here Inv = Transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //Use to shift to the COM of new molecule center = comCurrRef.Get(molIndexA[0]); //find how many of KindS exist in this center diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index abc436d8d..41d9c6fce 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -4,9 +4,11 @@ #if ENSEMBLE==GCMC || ENSEMBLE==GEMC #include "MoveBase.h" -#include "cbmc/TrialMol.h" - +#include "TrialMol.h" +#include "GeomLib.h" + using std::vector; +using namespace geom; // MEMC-2 Move: // @@ -53,19 +55,20 @@ class MoleculeExchange2 : public MoveBase } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom1) { + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] == i; - } else if(molRef.kinds[kindL].atomNames == statV.memcVal.largeBBAtom2){ + } + else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ largeBB[1] == i; } } @@ -73,16 +76,18 @@ class MoleculeExchange2 : public MoveBase for(uint i = 0; i < 2; i++) { if(largeBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1, statV.memcVal.largeBBAtom2, - statV.memcVal.largeKind); + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } } for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom1) { + if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { smallBB[0] == i; - } else if(molRef.kinds[kindS].atomNames == statV.memcVal.smallBBAtom2){ + } + else if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ smallBB[1] == i; } } @@ -90,8 +95,9 @@ class MoleculeExchange2 : public MoveBase for(uint i = 0; i < 2; i++) { if(smallBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.smallBBAtom1, statV.memcVal.smallBBAtom2, - statV.memcVal.smallKind); + statV.memcVal.smallBBAtom1.c_str(), + statV.memcVal.smallBBAtom2.c_str(), + statV.memcVal.smallKind.c_str()); exit(EXIT_FAILURE); } } @@ -125,7 +131,7 @@ class MoleculeExchange2 : public MoveBase uint largeBB[2], smallBB[2]; uint sourceBox, destBox; uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; + uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; vector pStartA, pLenA, pStartB, pLenB; vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; @@ -157,18 +163,18 @@ inline void MoleculeExchange2::AdjustExRatio() { if(currAccept >= lastAccept) { - exchangeRate += exDiff; + exchangeRatio += exDiff; } else { exDiff *= -1; - exchangeRate += exDiff; + exchangeRatio += exDiff; } lastAccept = currAccept; - if(exchangeRate < exMin) - exchangeRate = exMin; - if(exchangeRate > exMax) - exchangeRate = exMax; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; } molInCavCount = 0; counter = 0; @@ -187,27 +193,25 @@ inline uint MoleculeExchange2::PickMolInCav() //If we want to orient the cavity with backbone of picked small mol if(molRef.NumAtoms(kindS) == 1) { - cavA.SetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); } else { - uint pEnd = pStart + pLen -1; - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), - sourceBox)); + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), sourceBox)); } //Calculate inverse matrix for cav here Inv = transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate)) + kindS, exchangeRatio)) { molIndexA.clear(); kindIndexA.clear(); molIndexB.clear(); kindIndexB.clear(); - //Find the exchangeRate number of molecules kind 0 in cavity - numInCavA = exchangeRate; + //Find the exchangeRatio number of molecules kind 0 in cavity + numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); @@ -219,7 +223,7 @@ inline uint MoleculeExchange2::PickMolInCav() } for(uint n = 1; n < numInCavA; n++) { - //pick random exchangeRate number of kindS in cavity + //pick random exchangeRatio number of kindS in cavity uint picked = prng.randIntExc(molInCav[kindS].size()); molIndexA.push_back(molInCav[kindS][picked]); kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); @@ -252,7 +256,7 @@ inline uint MoleculeExchange2::ReplaceMolecule() molIndexB.clear(); kindIndexB.clear(); numInCavA = 1; - numInCavB = exchangeRate; + numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); @@ -261,23 +265,21 @@ inline uint MoleculeExchange2::ReplaceMolecule() //Set the V1 to the backbone of the large molecule if(molRef.NumAtoms(kindL) == 1) { - cavA.SetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); } else { - cavA.SetBasis(boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], - largeBB[1]), - sourceBox)); + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); } //Calculate inverse matrix for cav. Here Inv = Transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //Use to shift to the COM of new molecule center = comCurrRef.Get(molIndexA[0]); //find how many of KindS exist in this center calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate); + kindS, exchangeRatio); totMolInCav = molInCav[kindS].size(); - //pick exchangeRate number of Small molecule from dest box + //pick exchangeRatio number of Small molecule from dest box state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } return state; @@ -610,9 +612,9 @@ inline double MoleculeExchange2::GetCoeff() const { //kindA is the small molecule double ratioF = num::Factorial(totMolInCav - 1) / - (num::Factorial(totMolInCav - exchangeRate) * - num::Factorial(numTypeADest, exchangeRate)); - double ratioV = pow(volDest / volCav, exchangeRate - 1); + (num::Factorial(totMolInCav - exchangeRatio) * + num::Factorial(numTypeADest, exchangeRatio)); + double ratioV = pow(volDest / volCav, exchangeRatio - 1); double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); return ratioF * ratioV * ratioM; } @@ -620,11 +622,11 @@ inline double MoleculeExchange2::GetCoeff() const { //kindA is the big molecule double ratioF = num::Factorial(totMolInCav) * - num::Factorial(numTypeBDest - exchangeRate, exchangeRate) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioV = pow(volCav / volDest, exchangeRate - 1); + num::Factorial(numTypeBDest - exchangeRatio, exchangeRatio) / + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioV = pow(volCav / volDest, exchangeRatio - 1); double ratioM = numTypeASource / - ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); + ((numTypeADest + 1.0) * (numTypeBSource + exchangeRatio)); return ratioF * ratioV * ratioM; } #elif ENSEMBLE == GCMC @@ -636,17 +638,17 @@ inline double MoleculeExchange2::GetCoeff() const { //Insert Large molecule double ratioF = num::Factorial(totMolInCav - 1) / - num::Factorial(totMolInCav - exchangeRate); + num::Factorial(totMolInCav - exchangeRatio); double ratioM = numTypeASource / (numTypeBSource + 1.0); - return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRatio - 1); } else { //Delete Large Molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRatio); + return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRatio - 1); } } else @@ -657,17 +659,17 @@ inline double MoleculeExchange2::GetCoeff() const { //Insert Large molecule double ratioF = num::Factorial(totMolInCav - 1) / - num::Factorial(totMolInCav - exchangeRate); + num::Factorial(totMolInCav - exchangeRatio); double ratioM = numTypeASource / (numTypeBSource + 1.0); - return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRatio-1); } else { //Delete Large Molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRatio); + return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRatio-1); } } #endif diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index c4754c974..e0c7144e9 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -4,9 +4,11 @@ #if ENSEMBLE==GCMC || ENSEMBLE==GEMC #include "MoveBase.h" -#include "cbmc/TrialMol.h" +#include "TrialMol.h" +#include "GeomLib.h" using std::vector; +using namespace geom; // MEMC-3 Move: // @@ -26,6 +28,8 @@ class MoleculeExchange3 : public MoveBase perAdjust(statV.GetPerAdjust()) { enableID = statV.memcVal.enable; + largeBB[0] = -1; + largeBB[1] = -1; if(enableID) { if(molLookRef.GetNumCanSwapKind() < 2) { @@ -51,15 +55,44 @@ class MoleculeExchange3 : public MoveBase } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { + largeBB[0] == i; + } + else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + largeBB[1] == i; + } + } + + if(largeBB[0] != largeBB[1]) { + printf("Error: In ME-3 move, atom name of backbone should be same.\n"); + printf("Atom names in backbone was set to %s or %s in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -78,9 +111,10 @@ class MoleculeExchange3 : public MoveBase uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool insertL, enableID; + uint largeBB[2]; uint sourceBox, destBox; uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRate, kindS, kindL, totMolInCav; + uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; vector pStartA, pLenA, pStartB, pLenB; vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; @@ -112,18 +146,18 @@ inline void MoleculeExchange3::AdjustExRatio() { if(currAccept > lastAccept) { - exchangeRate += exDiff; + exchangeRatio += exDiff; } else { exDiff *= -1; - exchangeRate += exDiff; + exchangeRatio += exDiff; } lastAccept = currAccept; - if(exchangeRate < exMin) - exchangeRate = exMin; - if(exchangeRate > exMax) - exchangeRate = exMax; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; } molInCavCount = 0; counter = 0; @@ -141,20 +175,20 @@ inline uint MoleculeExchange3::PickMolInCav() { center = comCurrRef.Get(pickedS); //Pick random vector and find two vectors that are perpendicular to V1 - cavA.SSetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav here Inv = transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate)) + kindS, exchangeRatio)) { molIndexA.clear(); kindIndexA.clear(); molIndexB.clear(); kindIndexB.clear(); - //Find the exchangeRate number of molecules kind 0 in cavity - numInCavA = exchangeRate; + //Find the exchangeRatio number of molecules kind 0 in cavity + numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); @@ -166,7 +200,7 @@ inline uint MoleculeExchange3::PickMolInCav() } for(uint n = 1; n < numInCavA; n++) { - //pick random exchangeRate number of kindS in cavity + //pick random exchangeRatio number of kindS in cavity uint picked = prng.randIntExc(molInCav[kindS].size()); molIndexA.push_back(molInCav[kindS][picked]); kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); @@ -199,23 +233,23 @@ inline uint MoleculeExchange3::ReplaceMolecule() molIndexB.clear(); kindIndexB.clear(); numInCavA = 1; - numInCavB = exchangeRate; + numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); if(state == mv::fail_state::NO_FAIL) { //Set V1 to a random vector and calculate two vector perpendicular to V1 - cavA.SetBasis(prng.RandomUnitVect()); + SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose - cavA.TransposeMatrix(invCavA); + TransposeMatrix(invCavA, cavA); //use the first atom in molecule as the center center = coordCurrRef.Get(largeBB[0]); //find how many of KindS exist in this center calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRate); + kindS, exchangeRatio); totMolInCav = molInCav[kindS].size(); - //pick exchangeRate number of Small molecule from dest box + //pick exchangeRatio number of Small molecule from dest box state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } return state; @@ -570,9 +604,9 @@ inline double MoleculeExchange3::GetCoeff() const { //kindA is the small molecule double ratioF = num::Factorial(totMolInCav - 1) / - (num::Factorial(totMolInCav - exchangeRate) * - num::Factorial(numTypeADest, exchangeRate)); - double ratioV = pow(volDest / volCav, exchangeRate - 1); + (num::Factorial(totMolInCav - exchangeRatio) * + num::Factorial(numTypeADest, exchangeRatio)); + double ratioV = pow(volDest / volCav, exchangeRatio - 1); double ratioM = numTypeASource * numTypeBDest / (numTypeBSource + 1.0); return ratioF * ratioV * ratioM; } @@ -580,11 +614,11 @@ inline double MoleculeExchange3::GetCoeff() const { //kindA is the big molecule double ratioF = num::Factorial(totMolInCav) * - num::Factorial(numTypeBDest - exchangeRate, exchangeRate) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioV = pow(volCav / volDest, exchangeRate - 1); + num::Factorial(numTypeBDest - exchangeRatio, exchangeRatio) / + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioV = pow(volCav / volDest, exchangeRatio - 1); double ratioM = numTypeASource / - ((numTypeADest + 1.0) * (numTypeBSource + exchangeRate)); + ((numTypeADest + 1.0) * (numTypeBSource + exchangeRatio)); return ratioF * ratioV * ratioM; } #elif ENSEMBLE == GCMC @@ -596,17 +630,17 @@ inline double MoleculeExchange3::GetCoeff() const { //Insert Large molecule double ratioF = num::Factorial(totMolInCav - 1) / - num::Factorial(totMolInCav - exchangeRate); + num::Factorial(totMolInCav - exchangeRatio); double ratioM = numTypeASource / (numTypeBSource + 1.0); - return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + return (insB / delA) * ratioF * ratioM / pow(volCav, exchangeRatio - 1); } else { //Delete Large Molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRatio); + return (insB / delA) * ratioF * ratioM * pow(volCav, exchangeRatio - 1); } } else @@ -617,17 +651,17 @@ inline double MoleculeExchange3::GetCoeff() const { //Insert Large molecule double ratioF = num::Factorial(totMolInCav - 1) / - num::Factorial(totMolInCav - exchangeRate); + num::Factorial(totMolInCav - exchangeRatio); double ratioM = numTypeASource / (numTypeBSource + 1.0); - return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRate - 1); + return exp(delA + insB) * ratioF * ratioM / pow(volCav, exchangeRatio -1); } else { //Delete Large Molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRate - 1); - double ratioM = numTypeASource / (numTypeBSource + exchangeRate); - return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRate - 1); + num::Factorial(totMolInCav + exchangeRatio - 1); + double ratioM = numTypeASource / (numTypeBSource + exchangeRatio); + return exp(delA + insB) * ratioF * ratioM * pow(volCav, exchangeRatio-1); } } #endif diff --git a/src/MoveConst.h b/src/MoveConst.h index 51c9c9b82..62661d928 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -167,12 +167,6 @@ inline uint GetMoveSubIndex(const uint maj, const uint b = 0) #endif } -//Names of above moves as strings for output. -std::vector MoveNames(); -const std::vector MOVE_NAME(MoveNames()); -std::vector ScaleMoveNames(); -const std::vector SCALE_MOVE_NAME(ScaleMoveNames()); -//Used enums -- immutable and take no space } diff --git a/src/MoveSettings.h b/src/MoveSettings.h index fc68de90c..be6c489fc 100644 --- a/src/MoveSettings.h +++ b/src/MoveSettings.h @@ -40,6 +40,16 @@ class MoveSettings return scale[move]; } + double GetAccept(const uint move) const + { + return acceptPercent[move]; + } + + double GetTrial(const uint move) const + { + return tries[move]; + } + private: double scale[mv::SCALEABLE]; double acceptPercent[mv::COUNT]; diff --git a/src/PRNG.h b/src/PRNG.h index 268fd094d..90565a392 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -219,6 +219,18 @@ class PRNG b = mv::BOX1; } + void PickBool(bool &b, const double subDraw, const double movPerc) const + { + //Calculate "chunk" of move for each box. + double boxDiv = movPerc / 2; + //Which chunk was our draw in... + b = (uint)(subDraw/boxDiv); + //FIXME: Hack to prevent picking invalid boxes, may violate balance + if (b != mv::BOX0) + b = mv::BOX1; + b = (b > 0 ? true : false); + } + void PickBox(uint &b, double &subDraw, double &boxDiv, const double movPerc) const { @@ -328,6 +340,29 @@ class PRNG return rejectState; } + // In MEMC move pick n molecules of kind mk + uint PickMol(const uint mk, uint &mk2, uint &m2, const uint b) + { + uint rejectState = mv::fail_state::NO_FAIL; + //Pick molecule with the help of molecule lookup table. + if ((molLookRef.NumKindInBox(mk, b) == 0)) { + rejectState = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } else { + uint mOff, m; + //Among the ones of that kind in that box, pick one @ random. + //Molecule with a tag (beta == 2 and beta == 1) cannot be selected. + do { + mOff = randIntExc(molLookRef.NumKindInBox(mk, b)); + //Lookup true index in table. + m = molLookRef.GetMolNum(mOff, mk, b); + } while(molLookRef.IsNoSwap(m)); + m2 = m; + mk2 = mk; + } + + return rejectState; + } + // In MEMC move pick n molecules of kind mk uint PickMol(const uint mk, std::vector &mk2, std::vector &m2, const uint n, const uint b) diff --git a/src/StaticVals.h b/src/StaticVals.h index 36f5bde6f..7de26ef43 100644 --- a/src/StaticVals.h +++ b/src/StaticVals.h @@ -74,6 +74,10 @@ class StaticVals { return move % simEventFreq.perAdjust == 0; } + uint GetPerAdjust() const + { + return simEventFreq.perAdjust; + } double AcceptPercent(const uint tempAccept) { return (double)(tempAccept) / (double)(simEventFreq.perAdjust); diff --git a/src/System.cpp b/src/System.cpp index 85b5ac352..55da65858 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -125,9 +125,9 @@ void System::InitMoves(Setup const& set) #endif #if ENSEMBLE == GEMC || ENSEMBLE == GCMC moves[mv::MOL_TRANSFER] = new MoleculeTransfer(*this, statV); - if(set.config.sys.memcVal.MEME1) { + if(set.config.sys.memcVal.MEMC1) { moves[mv::MEMC] = new MoleculeExchange1(*this, statV); - } else if (set.config.sys.memcVal.MEME2) { + } else if (set.config.sys.memcVal.MEMC2) { moves[mv::MEMC] = new MoleculeExchange2(*this, statV); } else { moves[mv::MEMC] = new MoleculeExchange3(*this, statV); diff --git a/src/XYZArray.h b/src/XYZArray.h index 311075487..9ec907a09 100644 --- a/src/XYZArray.h +++ b/src/XYZArray.h @@ -7,7 +7,6 @@ along with this program, also can be found at . #ifndef XYZ_ARRAY_H #define XYZ_ARRAY_H -//#include "GeomLib.h" #include "BasicTypes.h" #include //for memset, memcpy, etc. #include //for memset, memcpy, etc. @@ -169,15 +168,6 @@ class XYZArray //calculate the adjoint and return the determinant double AdjointMatrix(XYZArray &Inv); - - //Set basis using V as the z axis - void SetBasis(XYZ const & V); - - // Transpose the matrix - void TransposeMatrix(XYZArray &Inv); - - // transfor the matrix using the basis cell. - XYZ Transform(const XYZ &A) const; //return the difference of two rows in two XYZ arrays XYZ Difference(const uint i, XYZArray const& other, @@ -550,55 +540,4 @@ inline double XYZArray::AdjointMatrix(XYZArray &Inv) return det; } -//Find two vectors that are perpendicular to V1 using Gram-Schmidt method - void XYZArray::SetBasis(XYZ const & V) -{ - //using namespace geom; - XYZ v1 = V; - v1.Normalize(); - XYZ v2; - if(abs(v1.x) < 0.8) { - //v3 will be v1 x the standard X unit vec - v2 = XYZ(1.0, 0.0, 0.0); - } else { - //v3 will be v1 x the standard Y unit vec - v2 = XYZ(0.0, 1.0, 0.0); - } - //XYZ v3 = Cross(v1, v2); - XYZ v3; - v3.Normalize(); - //v2 is unit vec perpendicular to both v3 and v2 - //v2 = Cross(v3, v1); - //set v1 az z axis of cell basis - this->Set(0, v3); - this->Set(1, v2); - this->Set(2, v1); -} - -inline void XYZArray::TransposeMatrix(XYZArray &Inv) -{ - Inv.x[0] = x[0]; - Inv.x[1] = y[0]; - Inv.x[2] = z[0]; - - Inv.y[0] = x[1]; - Inv.y[1] = y[1]; - Inv.y[2] = z[1]; - - Inv.z[0] = x[2]; - Inv.z[1] = y[2]; - Inv.z[2] = z[2]; -} - -//Calculate transform of A using dot product -inline XYZ XYZArray::Transform(const XYZ &A) const -{ - XYZ temp; - temp.x = A.x * x[0] + A.y * x[1] + A.z * x[2]; - temp.y = A.x * y[0] + A.y * y[1] + A.z * y[2]; - temp.z = A.x * z[0] + A.y * z[1] + A.z * z[2]; - return temp; -} - - #endif /*XYZ_ARRAY_H*/ diff --git a/src/cbmc/DCData.h b/src/cbmc/DCData.h index e762f8065..a22de18d9 100644 --- a/src/cbmc/DCData.h +++ b/src/cbmc/DCData.h @@ -40,6 +40,7 @@ class DCData const uint nDihTrials; const uint nLJTrialsFirst; const uint nLJTrialsNth; + const uint totalTrials; //used for both angles and dihedrals double* angles; @@ -55,6 +56,11 @@ class DCData double* nonbonded; //calculated nonbonded 1_N LJ and coulomb energie double* nonbonded_1_4; //calculated nonbonded 1_4 LJ and coulomb energie double* nonbonded_1_3; //calculated nonbonded 1_3 LJ and coulomb energie + + double* interT; //For DCRotateCOM, we have combined first and Nth trial + double* realT; //For DCRotateCOM, we have combined first and Nth trial + double* ljWeightsT; //For DCRotateCOM, we have combined first and Nth trial + XYZArray multiPositions[MAX_BONDS]; }; @@ -66,7 +72,7 @@ inline DCData::DCData(System& sys, const Forcefield& forcefield, const Setup& se nDihTrials(set.config.sys.cbmcTrials.bonded.dih), nLJTrialsFirst(set.config.sys.cbmcTrials.nonbonded.first), nLJTrialsNth(set.config.sys.cbmcTrials.nonbonded.nth), - positions(*multiPositions) + positions(*multiPositions), totalTrials(nLJTrialsFirst * nLJTrialsNth) { calcEwald = sys.GetEwald(); uint maxLJTrials = nLJTrialsFirst; @@ -82,6 +88,10 @@ inline DCData::DCData(System& sys, const Forcefield& forcefield, const Setup& se nonbonded = new double[maxLJTrials]; ljWeights = new double[maxLJTrials]; + interT = new double[totalTrials]; + realT = new double[totalTrials]; + ljWeightsT = new double[totalTrials]; + uint trialMax = std::max(nAngleTrials, nDihTrials); angleEnergy = new double[trialMax]; angleWeights = new double[trialMax]; @@ -103,6 +113,9 @@ inline DCData::~DCData() delete[] angles; delete[] angleWeights; delete[] angleEnergy; + delete[] interT; + delete[] realT; + delete[] ljWeightsT; } } diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 29f980320..1b9859641 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -167,8 +167,8 @@ namespace cbmc backBone = prng.RandomUnitVect(); } XYZArray T(3); - T.SetBasis(backBone); - T.TransposeMatrix(invMatrix); + geom::SetBasis(T, backBone); + geom::TransposeMatrix(invMatrix, T); } } @@ -208,9 +208,9 @@ namespace cbmc { XYZ coord = multiPosRotions[a][index]; //transform backbone to z axis - coord = invMatrix.Transform(coord); + coord = geom::Transform(invMatrix, coord); //rotate around z - coord = rotateMatrix.Transform(coord); + coord = geom::Transform(rotateMatrix, coord); //transfer backbone to cavity orientation coord = newMol.Transform(coord); multiPosRotions[a].Set(index + r, coord); @@ -336,9 +336,9 @@ namespace cbmc { XYZ coord = multiPosRotions[a][index]; //transform backbone to z axis - coord = invMatrix.Transform(coord); + coord = geom::Transform(invMatrix, coord); //rotate around z - coord = rotateMatrix.Transform(coord); + coord = geom::Transform(rotateMatrix, coord); //transfer backbone to cavity orientation coord = oldMol.Transform(coord); multiPosRotions[a].Set(index + r, coord); diff --git a/src/cbmc/DCRotateCOM.h b/src/cbmc/DCRotateCOM.h index de3e8d10b..259ac1354 100644 --- a/src/cbmc/DCRotateCOM.h +++ b/src/cbmc/DCRotateCOM.h @@ -9,6 +9,7 @@ along with this program, also can be found at . #include "DCComponent.h" #include "XYZArray.h" #include "CBMC.h" +#include "GeomLib.h" namespace mol_setup { class MolKind; } diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 68ef63ce6..8e39f639c 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -107,7 +107,7 @@ void TrialMol::AddAtom(const uint index, const XYZ& loc) atomBuilt[index] = true; } -void SetAtomCoords(uint index, const XYZ& loc) +void TrialMol::SetAtomCoords(uint index, const XYZ& loc) { tCoords.Set(index, loc); } @@ -220,6 +220,11 @@ void TrialMol::ShiftBasis(const uint p1) basisPoint = tCoords.Get(p1); } +void TrialMol::ShiftBasis(const XYZ cent) +{ + basisPoint = cent; +} + void TrialMol::ResetBasis() { growthToWorld.LoadIdentity(); diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 0569b46c6..bc99565e0 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -12,6 +12,7 @@ along with this program, also can be found at . #include "TransformMatrix.h" #include "BasicTypes.h" #include "MoleculeKind.h" +#include "GeomLib.h" class MoleculeKind; class BoxDimensions; @@ -67,6 +68,9 @@ class TrialMol //!Shifts the current basis to the position of p1, but does not rotate it. void ShiftBasis(uint p1); + //!Shifts the current basis to the XYZ coordinate. + void ShiftBasis(XYZ cent); + //!Resets basis to box coordinate system void ResetBasis(); @@ -164,9 +168,9 @@ class TrialMol void SetSeed(const XYZ& coords, const XYZ& cav, const bool inCav, const bool fixCOM, const bool rotBB); void SetSeed(const bool inCav, const bool fixCOM, const bool rotBB); - XYZ Transform(const XYZ& a) {return cavMatrix.Transform(a);} + XYZ Transform(const XYZ& a) {return geom::Transform(cavMatrix, a);} void TransposeMatrix(XYZArray &invMatrix) - {return cavMatrix.TransposeMatrix(invMatrix);} + {return geom::TransposeMatrix(invMatrix, cavMatrix);} bool HasCav() const {return comInCav;} bool COMFix() const {return comFix;} bool RotateBB() const {return rotateBB;} From d99320e111f1d70fa6887270e0a6a3a2fe34c83e Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 11:47:22 -0400 Subject: [PATCH 014/199] Fix Compiling error3. --- src/MoleculeExchange1.h | 9 +++++---- src/MoleculeExchange2.h | 13 +++++++------ src/MoleculeExchange3.h | 11 ++++++----- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 577c763e7..fa3faa3d5 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -6,6 +6,7 @@ #include "MoveBase.h" #include "TrialMol.h" #include "GeomLib.h" +#include using std::vector; using namespace geom; @@ -64,10 +65,10 @@ class MoleculeExchange1 : public MoveBase for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] == i; + largeBB[0] = i; } else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] == i; + largeBB[1] = i; } } @@ -109,13 +110,13 @@ class MoleculeExchange1 : public MoveBase uint largeBB[2]; uint sourceBox, destBox; uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; + uint numInCavA, numInCavB, kindS, kindL, totMolInCav; vector pStartA, pLenA, pStartB, pLenB; vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; vector oldMolA, newMolA, oldMolB, newMolB; - int exDiff; + int exDiff, exchangeRatio; double volCav, lastAccept; double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; XYZ center, cavity; diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 41d9c6fce..c50216673 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -6,6 +6,7 @@ #include "MoveBase.h" #include "TrialMol.h" #include "GeomLib.h" +#include using std::vector; using namespace geom; @@ -66,10 +67,10 @@ class MoleculeExchange2 : public MoveBase for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] == i; + largeBB[0] = i; } else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] == i; + largeBB[1] = i; } } @@ -85,10 +86,10 @@ class MoleculeExchange2 : public MoveBase for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { - smallBB[0] == i; + smallBB[0] = i; } else if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ - smallBB[1] == i; + smallBB[1] = i; } } @@ -131,13 +132,13 @@ class MoleculeExchange2 : public MoveBase uint largeBB[2], smallBB[2]; uint sourceBox, destBox; uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; + uint numInCavA, numInCavB, kindS, kindL, totMolInCav; vector pStartA, pLenA, pStartB, pLenB; vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; vector oldMolA, newMolA, oldMolB, newMolB; - int exDiff; + int exDiff, exchangeRatio; double volCav, lastAccept; double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; XYZ center, cavity; diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index e0c7144e9..8527b4948 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -5,7 +5,8 @@ #include "MoveBase.h" #include "TrialMol.h" -#include "GeomLib.h" +#include "GeomLib.h" +#include using std::vector; using namespace geom; @@ -66,10 +67,10 @@ class MoleculeExchange3 : public MoveBase for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] == i; + largeBB[0] = i; } else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] == i; + largeBB[1] = i; } } @@ -114,13 +115,13 @@ class MoleculeExchange3 : public MoveBase uint largeBB[2]; uint sourceBox, destBox; uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, exchangeRatio, kindS, kindL, totMolInCav; + uint numInCavA, numInCavB, kindS, kindL, totMolInCav; vector pStartA, pLenA, pStartB, pLenB; vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; vector oldMolA, newMolA, oldMolB, newMolB; - int exDiff; + int exDiff, exchangeRatio; double volCav, lastAccept; double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; XYZ center, cavity; From d78c9e7ad2a1d2f68040a29afe0202052bbed9bb Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 11:50:20 -0400 Subject: [PATCH 015/199] Add example file for testing. --- example_file/methane_butane/in.conf | 155 + example_file/methane_butane/par_mie.inp | 166 + example_file/methane_butane/setup_box_0.pdb | 372 +++ example_file/methane_butane/setup_box_0.psf | 621 ++++ example_file/methane_butane/setup_box_1.pdb | 962 ++++++ example_file/methane_butane/setup_box_1.psf | 1457 +++++++++ example_file/methane_pentane/GOMC_CPU_GCMC | Bin 0 -> 2409892 bytes example_file/methane_pentane/in.conf | 161 + example_file/methane_pentane/par_mie.inp | 166 + example_file/methane_pentane/setup_box_0.pdb | 754 +++++ example_file/methane_pentane/setup_box_0.psf | 1328 ++++++++ example_file/methane_pentane/setup_box_1.pdb | 750 +++++ example_file/methane_pentane/setup_box_1.psf | 1173 ++++++++ example_file/perfluorobutane_butane/in.conf | 154 + .../perfluorobutane_butane/par_mie.inp | 166 + .../perfluorobutane_butane/setup_box_0.pdb | 602 ++++ .../perfluorobutane_butane/setup_box_0.psf | 994 ++++++ .../perfluorobutane_butane/setup_box_1.pdb | 1650 ++++++++++ .../perfluorobutane_butane/setup_box_1.psf | 2676 +++++++++++++++++ 19 files changed, 14307 insertions(+) create mode 100644 example_file/methane_butane/in.conf create mode 100644 example_file/methane_butane/par_mie.inp create mode 100644 example_file/methane_butane/setup_box_0.pdb create mode 100644 example_file/methane_butane/setup_box_0.psf create mode 100644 example_file/methane_butane/setup_box_1.pdb create mode 100644 example_file/methane_butane/setup_box_1.psf create mode 100755 example_file/methane_pentane/GOMC_CPU_GCMC create mode 100644 example_file/methane_pentane/in.conf create mode 100644 example_file/methane_pentane/par_mie.inp create mode 100644 example_file/methane_pentane/setup_box_0.pdb create mode 100644 example_file/methane_pentane/setup_box_0.psf create mode 100644 example_file/methane_pentane/setup_box_1.pdb create mode 100644 example_file/methane_pentane/setup_box_1.psf create mode 100644 example_file/perfluorobutane_butane/in.conf create mode 100644 example_file/perfluorobutane_butane/par_mie.inp create mode 100644 example_file/perfluorobutane_butane/setup_box_0.pdb create mode 100644 example_file/perfluorobutane_butane/setup_box_0.psf create mode 100644 example_file/perfluorobutane_butane/setup_box_1.pdb create mode 100644 example_file/perfluorobutane_butane/setup_box_1.psf diff --git a/example_file/methane_butane/in.conf b/example_file/methane_butane/in.conf new file mode 100644 index 000000000..5b3136e0c --- /dev/null +++ b/example_file/methane_butane/in.conf @@ -0,0 +1,155 @@ +######################## +## Init File +## +## IMPROVEMENTS +## - Compacts inputs into one line +## - Suggestion: edit inline with (insert key) +## +## To-Do +## (make editor + XML version) +######################## + +############################################################################ +# ========-------------------- INPUT --------------------------=========== +############################################################################ + +######################### +# enable, step +######################### +Restart false + +#################################### +# kind {RESTART, RANDOM, INTSEED} +#################################### +PRNG RANDOM + +#################################### +# FORCE FIELD +#################################### +ParaTypeEXOTIC true +Parameters ./par_mie.inp + +#################################### +# INPUT PDB FILES +#################################### +Coordinates 0 ./setup_box_0.pdb +Coordinates 1 ./setup_box_1.pdb + + +#################################### +# INPUT PSF FILES +#################################### +Structure 0 ./setup_box_0.psf +Structure 1 ./setup_box_1.psf + + +############################################################################ +# =======--------------------- SYSTEM --------------------------=========== +############################################################################ + +################################## +# GEMC TYPE (DEFULT IS NVT_GEMC) +################################## + + +############################# +# SIMULATION CONDITION +############################# +Temperature 255.00 +Potential VDW +LRC true +Rcut 10 +Exclude 1-4 + +############################# +# ELECTROSTATIC +############################# +Ewald false +ElectroStatic false + +############################### +# PRESSURE CALCULATION +################################ +PressureCalc false + +################################ +# STEPS +################################ +RunSteps 20000000 +EqSteps 1000 +AdjSteps 1000 + +################################ +# MOVE FREQUENCY +################################ +DisFreq 0.20 +RotFreq 0.10 +SwapFreq 0.30 +RegrowthFreq 0.10 +IDSwitchFreq 0.30 + +############################### +# MEMC PARAMETER +############################### +CavityLength 8.8 8.8 11.8 +Exchange C1A 2 +Exchange C4A 1 + + +################################ +# BOX DIMENSION #, X, Y, Z +################################ +BoxDim 0 25.00 25.00 25.00 +BoxDim 1 35.00 35.00 35.00 + + +############################## +# CBMC TRIALS +############################## +CBMC_First 10 +CBMC_Nth 8 +CBMC_Ang 100 +CBMC_Dih 100 + +#################################### +# Mol. Name Chem. Pot. +#################################### +ChemPot C4A -2845 +ChemPot C1A -1720 + +############################################################################ +# =======-------------------- OUTPUT --------------------------=========== +############################################################################ + +########################## +# statistics filename add +########################## +OutputName C4A_C1A + +##################################### +# enable, frequency +##################################### +CoordinatesFreq true 10000000 +RestartFreq true 1000000 +ConsoleFreq true 100000 +BlockAverageFreq true 100000 +HistogramFreq true 100000 + + +################################ +# OutHistSettings +################################ +DistName dis +HistName his +RunNumber 1 +RunLetter a +SampleFreq 200 + +################################## +# enable: blk avg., fluct. +################################## +OutEnergy true true +OutPressure false false +OutMolNum true true +OutDensity true true + diff --git a/example_file/methane_butane/par_mie.inp b/example_file/methane_butane/par_mie.inp new file mode 100644 index 000000000..7d1324bec --- /dev/null +++ b/example_file/methane_butane/par_mie.inp @@ -0,0 +1,166 @@ +* +* Topology File for Mie General model (Mick, Soroush Barhaghi, and Potoff) United Atom Force Field +* +* Parameters From: +* +* "Mie potentials for phase equilibria calculations: Application to alkanes and perfluoroalkanes." +* Potoff, Jeffrey J., and Damien A. Bernard-Brunel. +* The Journal of Physical Chemistry B 113.44 (2009): 14725-14731. +* +* +* "Optimized Mie Potentials for Phase Equilibria: Understanding the limits of transferability in branched alkanes" +* Jason R. Mick, Mohammad Soroush Barhaghi, Jeffrey J. Potoff. +* +* + + +BONDS +! +!V(bond) = Kb(b - b0)**2 +! +!Kb: kcal/mole/A**2 +!b0: A +! +! Kb (kcal/mol) = Kb (K) * Boltz. const.; (9999999999 if no stretching) +! +!atom type Kb b0 description +CH3 CH3 9999999999 1.540 ! (ethane) +CH3 CH2 9999999999 1.540 ! (ex. propane) +CH2 CH2 9999999999 1.540 ! (ex. n-butane) +CH3 CHS 9999999999 1.540 ! (ex. 2-methylpropane) +CH3 CHL 9999999999 1.540 ! (ex. 2-methylpentane) +CH3 CTS 9999999999 1.540 ! (ex. 2,2-dimethylpropane) +CH3 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) +CH2 CHS 9999999999 1.540 ! (ex. 2-methylbutane) +CH2 CHL 9999999999 1.540 ! (ex. 2-methylpentane) +CH2 CTS 9999999999 1.540 ! (ex. 2,2-dimethylbutane) +CH2 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) +CHS CHS 9999999999 1.540 ! (ex. 2,3-dimethylbutane) +CHL CHL 9999999999 1.540 ! (ex. 2,3-dimethylpentane) +CHS CTS 9999999999 1.540 ! (ex. 2,2,3-trimethylbutane) +CHL CTL 9999999999 1.540 ! (ex. 2,2,3-trimethylpentane) +CTT CTT 9999999999 1.580 ! (2,2,3,3-tetramethylbutane) +CF3 CF3 9999999999 1.540 ! +CF3 CF2 9999999999 1.540 ! +CF2 CF2 9999999999 1.540 ! + + + +ANGLES +! +!V(angle) = Ktheta(Theta - Theta0)**2 +! +!Ktheta: kcal/mole/rad**2 +!Theta0: degrees +! +! Ktheta (kcal/mol) = Ktheta (K) * Boltz. const. +! +!atom types Ktheta Theta0 +CH3 CH2 CH3 31250 114.00 ! (propane only) +CH3 CH2 CH2 31250 114.00 ! (ex. n-butane) +CH3 CH2 CHS 31250 114.00 ! (ex. 2-methylbutane) +CH3 CH2 CHL 31250 114.00 ! (ex. 3-methylpentane) +CH3 CH2 CTS 31250 114.00 ! (ex. 2,2-dimethylbutane) +CH3 CH2 CTL 31250 114.00 ! (ex. 3,3-dimethylhexane) +CH2 CH2 CH2 31250 114.00 ! (ex. n-pentane) +CH2 CH2 CHL 31250 114.00 ! (ex. 2-methylpentane) +CH2 CH2 CTL 31250 114.00 ! (ex. 2,2-dimethylpentane) +CHL CH2 CHL 31250 114.00 ! (ex. 2,4-dimethylpentane) +CHL CH2 CTL 31250 114.00 ! (ex. 2,2,4-trimethylpentane) +CH3 CHS CH3 31250 112.00 ! (ex. isobutane) +CH3 CHL CH3 31250 112.00 ! (ex. 2-methylpentane) +CH3 CHS CH2 31250 112.00 ! (ex. 2-methylbutane) +CH3 CHL CH2 31250 112.00 ! (ex. 2-methylpentane) +CH3 CHS CHS 31250 112.00 ! (2,3-dimethylbutane only) +CH3 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) +CH3 CHS CTS 31250 112.00 ! (2,2,3-trimethylbutane only) +CH3 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) +CH2 CHL CH2 31250 112.00 ! (ex. 3-methylpentane) +CH2 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) +CH2 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) +CHL CHL CHL 31250 112.00 ! (ex. 2,3,4-trimethylpentane) +CH3 CTS CH3 31250 109.47 ! (ex. 2,2-dimethylpropane) +CH3 CTL CH3 31250 109.47 ! (ex. 2,2-dimethylpentane) +CH3 CTS CH2 31250 109.47 ! (ex. 2,2-dimethylbutane) +CH3 CTL CH2 31250 109.47 ! (ex. 2,2-dimethylpentane) +CH3 CTS CHS 31250 109.47 ! (ex. 2,2,3-trimethylbutane) +CH3 CTL CHL 31250 109.47 ! (ex. 2,2,3-trimethylpentane) +CH2 CTL CH2 31250 109.47 ! (ex. 3,3-dimethylpentane) +CH3 CTT CTT 31250 111.00 ! (2,2,3,3-tetramethylbutane) +CH3 CTT CH3 31250 107.00 ! (2,2,3,3-tetramethylbutane) +CF3 CF2 CF3 31250 114.00 ! perfluorocarbons +CF2 CF2 CF3 31250 114.00 ! +CF2 CF2 CF2 31250 114.00 ! + + +DIHEDRALS +! +!V(dihedral) = Kchi(1 + cos(n(chi) - delta)) +! +!Kchi: kcal/mole +!n: multiplicity +!delta: degrees +! +! Kchi (kcal/mol) = Kchi (K) * Boltz. const. +! Boltzmann = 0.0019872041 kcal / (mol * K) +! +! TraPPE Inherits most of its dihedrals from OPLS UA +! X-CT-CH1-X fitted to QM data in this work +! +!atom types Kchi n delta description +X CH2 CH2 X 0.000000 0 0.0 ! OPLS (ex. n-butane) +X CH2 CH2 X 355.029964 1 0.0 ! "" +X CH2 CH2 X -68.189775 2 180.0 ! "" +X CH2 CH2 X 791.317812 3 0.0 ! "" +X CH2 CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2-methylbutane) +X CH2 CHS X 428.729993 1 0.0 ! "" +X CH2 CHS X -111.850111 2 180.0 ! "" +X CH2 CHS X 441.270224 3 0.0 ! "" +X CH2 CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) +X CH2 CHL X 428.729993 1 0.0 ! "" +X CH2 CHL X -111.850111 2 180.0 ! "" +X CH2 CHL X 441.270224 3 0.0 ! "" +X CHS CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2,3-dimethylbutane) +X CHS CHS X 428.729993 1 0.0 ! "" +X CHS CHS X -111.850111 2 180.0 ! "" +X CHS CHS X 441.270224 3 0.0 ! "" +X CHL CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) +X CHL CHL X 428.729993 1 0.0 ! "" +X CHL CHL X -111.850111 2 180.0 ! "" +X CHL CHL X 441.270224 3 0.0 ! "" +X CTS CH2 X 461.289809 3 0.0 ! OPLS -- short backbone (ex. 2,2-DMBut) +X CTL CH2 X 461.289809 3 0.0 ! (same as prev., but for long backbone) +X CTS CHS X 1369.00000 3 0.0 ! this work -- short backbone (ex. 2,2,3-TriMBut) +X CTL CHL X 1369.00000 3 0.0 ! this work -- long backbone (ex. 2,2,3-TriMPen) +X CTS CTS X 2950.910000 0 0.0 ! this work -- from QM +X CTS CTS X -2047.060000 3 0.0 ! (ex. 2,2,3,3-tetramethylbutane) +X CTS CTS X 529.250000 6 180.0 ! "" +X CTS CTS X 150.160000 12 0.0 ! "" +! perfluorocarbons: use wacky seven term torsion +X CF2 CF2 X -1577.68 0 0.0 ! Fit to MP2/6-31+g(d,p) data for perfluorobutane +X CF2 CF2 X 791.61 1 0.0 ! +X CF2 CF2 X 333.65 2 0.0 ! +X CF2 CF2 X 854.01 3 0.0 ! +X CF2 CF2 X 349.25 4 0.0 ! +X CF2 CF2 X 211.51 5 0.0 ! +X CF2 CF2 X 117.66 6 0.0 ! +X CF2 CF2 X -83.44 7 0.0 ! + + +NONBONDED_MIE +! +!V(mie) = 4*eps*((sig_ij/r_ij)^n-(sig_ij/r_ij)^6) +! +!atom eps sig_ij n description +CH4 161.00 3.740 14 ! Potoff, 2009 +CH3 121.25 3.783 16 ! Potoff, 2009 +CH2 61.00 3.990 16 ! Potoff, 2009 +CHS 15.00 4.700 16 ! alkanes w/ 4 or less carbons in backbone +CHL 14.00 4.700 16 ! alkanes w/ 5 or more carbons in backbone +CTS 1.45 6.100 16 ! alkanes w/ 4 or less carbons in backbone +CTL 1.20 6.200 16 ! alkanes w/ 5 or more carbons in backbone +CTT 1.45 6.100 16 ! 2,2,3,3-tetramethylbutane (same as CTS) +CF4 269.00 4.355 36 ! Potoff, 2009 +CF3 155.75 4.475 36 ! Potoff, 2009 +CF2 72.20 4.75 44 ! Potoff, 2009; modified for new torsion + diff --git a/example_file/methane_butane/setup_box_0.pdb b/example_file/methane_butane/setup_box_0.pdb new file mode 100644 index 000000000..ad3731f45 --- /dev/null +++ b/example_file/methane_butane/setup_box_0.pdb @@ -0,0 +1,372 @@ +REMARK 25.000 25.000 25.000 STEP: 2000000 +ATOM 1 C1 C4A A 1 19.250 5.219 20.802 0.00 0.00 +ATOM 2 C2 C4A A 1 19.295 6.591 21.500 0.00 0.00 +ATOM 3 C3 C4A A 1 17.900 4.495 20.648 0.00 0.00 +ATOM 4 C4 C4A A 1 17.311 4.163 22.031 0.00 0.00 +ATOM 5 C1 C4A A 2 8.955 14.143 14.860 0.00 0.00 +ATOM 6 C2 C4A A 2 9.871 12.906 14.837 0.00 0.00 +ATOM 7 C3 C4A A 2 7.938 14.204 16.015 0.00 0.00 +ATOM 8 C4 C4A A 2 7.014 15.433 15.920 0.00 0.00 +ATOM 9 C1 C4A A 3 1.840 9.776 1.079 0.00 0.00 +ATOM 10 C2 C4A A 3 1.917 8.312 1.550 0.00 0.00 +ATOM 11 C3 C4A A 3 1.959 9.992 -0.441 0.00 0.00 +ATOM 12 C4 C4A A 3 1.742 11.468 -0.822 0.00 0.00 +ATOM 13 C1 C4A A 4 1.829 10.541 18.683 0.00 0.00 +ATOM 14 C2 C4A A 4 1.397 10.502 20.160 0.00 0.00 +ATOM 15 C3 C4A A 4 0.744 10.188 17.647 0.00 0.00 +ATOM 16 C4 C4A A 4 1.002 10.358 16.139 0.00 0.00 +ATOM 17 C1 C4A A 5 6.282 4.333 2.665 0.00 0.00 +ATOM 18 C2 C4A A 5 6.517 2.901 2.151 0.00 0.00 +ATOM 19 C3 C4A A 5 7.518 5.184 2.318 0.00 0.00 +ATOM 20 C4 C4A A 5 7.368 6.679 2.656 0.00 0.00 +ATOM 21 C1 C4A A 6 12.874 16.157 4.100 0.00 0.00 +ATOM 22 C2 C4A A 6 11.585 16.416 3.298 0.00 0.00 +ATOM 23 C3 C4A A 6 13.803 15.072 3.524 0.00 0.00 +ATOM 24 C4 C4A A 6 15.280 15.267 3.912 0.00 0.00 +ATOM 25 C1 C4A A 7 1.968 19.247 16.592 0.00 0.00 +ATOM 26 C2 C4A A 7 1.167 19.667 17.838 0.00 0.00 +ATOM 27 C3 C4A A 7 1.762 19.947 15.236 0.00 0.00 +ATOM 28 C4 C4A A 7 2.385 19.279 13.997 0.00 0.00 +ATOM 29 C1 C4A A 8 23.469 0.446 11.320 0.00 0.00 +ATOM 30 C2 C4A A 8 24.275 -0.044 12.538 0.00 0.00 +ATOM 31 C3 C4A A 8 23.774 1.834 10.726 0.00 0.00 +ATOM 32 C4 C4A A 8 22.704 2.352 9.747 0.00 0.00 +ATOM 33 C1 C4A A 9 2.924 9.180 12.683 0.00 0.00 +ATOM 34 C2 C4A A 9 4.210 8.647 13.341 0.00 0.00 +ATOM 35 C3 C4A A 9 3.008 9.270 11.148 0.00 0.00 +ATOM 36 C4 C4A A 9 1.870 10.121 10.553 0.00 0.00 +ATOM 37 C1 C4A A 10 15.220 7.850 0.082 0.00 0.00 +ATOM 38 C2 C4A A 10 16.738 7.790 -0.170 0.00 0.00 +ATOM 39 C3 C4A A 10 14.685 7.714 1.520 0.00 0.00 +ATOM 40 C4 C4A A 10 13.155 7.592 1.643 0.00 0.00 +ATOM 41 C1 C4A A 11 21.300 9.475 19.139 0.00 0.00 +ATOM 42 C2 C4A A 11 22.431 8.851 19.978 0.00 0.00 +ATOM 43 C3 C4A A 11 21.146 11.005 19.232 0.00 0.00 +ATOM 44 C4 C4A A 11 20.043 11.659 18.380 0.00 0.00 +ATOM 45 C1 C4A A 12 1.421 24.225 17.229 0.00 0.00 +ATOM 46 C2 C4A A 12 0.392 23.574 16.286 0.00 0.00 +ATOM 47 C3 C4A A 12 1.537 23.375 18.508 0.00 0.00 +ATOM 48 C4 C4A A 12 2.607 23.898 19.484 0.00 0.00 +ATOM 49 C1 C4A A 13 16.273 6.731 13.921 0.00 0.00 +ATOM 50 C2 C4A A 13 16.469 8.147 14.494 0.00 0.00 +ATOM 51 C3 C4A A 13 17.462 6.431 12.990 0.00 0.00 +ATOM 52 C4 C4A A 13 17.370 5.000 12.428 0.00 0.00 +ATOM 53 C1 C4A A 14 13.991 11.085 7.730 0.00 0.00 +ATOM 54 C2 C4A A 14 14.611 10.391 6.503 0.00 0.00 +ATOM 55 C3 C4A A 14 12.787 11.965 7.344 0.00 0.00 +ATOM 56 C4 C4A A 14 11.521 11.203 6.912 0.00 0.00 +ATOM 57 C1 C4A A 15 7.354 4.902 16.217 0.00 0.00 +ATOM 58 C2 C4A A 15 8.463 4.517 15.221 0.00 0.00 +ATOM 59 C3 C4A A 15 6.548 6.190 15.964 0.00 0.00 +ATOM 60 C4 C4A A 15 5.766 6.590 17.229 0.00 0.00 +ATOM 61 C1 C4A A 16 17.952 12.403 1.629 0.00 0.00 +ATOM 62 C2 C4A A 16 17.466 11.277 0.697 0.00 0.00 +ATOM 63 C3 C4A A 16 17.439 12.056 3.039 0.00 0.00 +ATOM 64 C4 C4A A 16 18.063 12.992 4.091 0.00 0.00 +ATOM 65 C1 C4A A 17 7.471 24.556 5.377 0.00 0.00 +ATOM 66 C2 C4A A 17 6.234 25.414 5.702 0.00 0.00 +ATOM 67 C3 C4A A 17 7.227 23.076 5.725 0.00 0.00 +ATOM 68 C4 C4A A 17 8.507 22.357 6.189 0.00 0.00 +ATOM 69 C1 C4A A 18 11.468 8.900 22.159 0.00 0.00 +ATOM 70 C2 C4A A 18 12.642 7.960 21.828 0.00 0.00 +ATOM 71 C3 C4A A 18 11.754 10.369 22.524 0.00 0.00 +ATOM 72 C4 C4A A 18 10.478 11.230 22.515 0.00 0.00 +ATOM 73 C1 C4A A 19 21.405 21.784 17.826 0.00 0.00 +ATOM 74 C2 C4A A 19 22.829 21.483 18.328 0.00 0.00 +ATOM 75 C3 C4A A 19 21.060 23.186 18.363 0.00 0.00 +ATOM 76 C4 C4A A 19 19.643 23.672 18.005 0.00 0.00 +ATOM 77 C1 C4A A 20 15.062 18.943 9.949 0.00 0.00 +ATOM 78 C2 C4A A 20 14.098 19.045 11.146 0.00 0.00 +ATOM 79 C3 C4A A 20 15.928 17.681 10.119 0.00 0.00 +ATOM 80 C4 C4A A 20 16.857 17.451 8.912 0.00 0.00 +ATOM 81 C1 C4A A 21 19.785 11.679 13.029 0.00 0.00 +ATOM 82 C2 C4A A 21 19.027 11.077 14.227 0.00 0.00 +ATOM 83 C3 C4A A 21 18.826 12.246 11.965 0.00 0.00 +ATOM 84 C4 C4A A 21 17.865 11.169 11.427 0.00 0.00 +ATOM 85 C1 C4A A 22 22.404 20.323 12.945 0.00 0.00 +ATOM 86 C2 C4A A 22 23.146 21.304 13.871 0.00 0.00 +ATOM 87 C3 C4A A 22 21.011 19.994 13.513 0.00 0.00 +ATOM 88 C4 C4A A 22 21.035 19.325 14.900 0.00 0.00 +ATOM 89 C1 C4A A 23 14.710 13.494 11.479 0.00 0.00 +ATOM 90 C2 C4A A 23 14.008 14.094 10.247 0.00 0.00 +ATOM 91 C3 C4A A 23 13.723 12.921 12.513 0.00 0.00 +ATOM 92 C4 C4A A 23 14.436 12.249 13.701 0.00 0.00 +ATOM 93 C1 C4A A 24 15.434 1.058 4.198 0.00 0.00 +ATOM 94 C2 C4A A 24 15.293 -0.325 4.861 0.00 0.00 +ATOM 95 C3 C4A A 24 15.108 0.977 2.695 0.00 0.00 +ATOM 96 C4 C4A A 24 16.149 0.187 1.881 0.00 0.00 +ATOM 97 C1 C4A A 25 1.864 9.566 4.982 0.00 0.00 +ATOM 98 C2 C4A A 25 0.653 9.325 5.902 0.00 0.00 +ATOM 99 C3 C4A A 25 2.987 10.354 5.681 0.00 0.00 +ATOM 100 C4 C4A A 25 2.685 11.786 6.161 0.00 0.00 +ATOM 101 C1 C4A A 26 21.672 4.124 25.119 0.00 0.00 +ATOM 102 C2 C4A A 26 21.764 5.303 26.105 0.00 0.00 +ATOM 103 C3 C4A A 26 20.310 3.535 24.709 0.00 0.00 +ATOM 104 C4 C4A A 26 20.431 2.225 23.908 0.00 0.00 +ATOM 105 C1 C4A A 27 24.687 5.555 5.883 0.00 0.00 +ATOM 106 C2 C4A A 27 23.876 5.545 4.575 0.00 0.00 +ATOM 107 C3 C4A A 27 24.449 4.298 6.740 0.00 0.00 +ATOM 108 C4 C4A A 27 24.695 2.941 6.053 0.00 0.00 +ATOM 109 C1 C4A A 28 17.964 14.077 20.959 0.00 0.00 +ATOM 110 C2 C4A A 28 19.015 14.892 21.735 0.00 0.00 +ATOM 111 C3 C4A A 28 17.157 13.207 21.940 0.00 0.00 +ATOM 112 C4 C4A A 28 16.047 12.438 21.199 0.00 0.00 +ATOM 113 C1 C4A A 29 20.484 5.361 7.419 0.00 0.00 +ATOM 114 C2 C4A A 29 19.649 4.398 6.555 0.00 0.00 +ATOM 115 C3 C4A A 29 19.731 5.614 8.738 0.00 0.00 +ATOM 116 C4 C4A A 29 20.448 6.739 9.510 0.00 0.00 +ATOM 117 C1 C4A A 30 9.192 9.943 1.216 0.00 0.00 +ATOM 118 C2 C4A A 30 10.616 10.514 1.345 0.00 0.00 +ATOM 119 C3 C4A A 30 8.013 10.917 1.029 0.00 0.00 +ATOM 120 C4 C4A A 30 6.600 10.325 0.874 0.00 0.00 +ATOM 121 C1 C4A A 31 1.237 4.621 10.429 0.00 0.00 +ATOM 122 C2 C4A A 31 0.628 5.499 11.538 0.00 0.00 +ATOM 123 C3 C4A A 31 2.607 3.979 10.718 0.00 0.00 +ATOM 124 C4 C4A A 31 3.258 3.052 9.674 0.00 0.00 +ATOM 125 C1 C4A A 32 18.099 24.560 10.963 0.00 0.00 +ATOM 126 C2 C4A A 32 16.862 25.276 11.536 0.00 0.00 +ATOM 127 C3 C4A A 32 19.122 24.085 12.012 0.00 0.00 +ATOM 128 C4 C4A A 32 19.692 25.161 12.954 0.00 0.00 +ATOM 129 C1 C4A A 33 18.707 17.867 1.235 0.00 0.00 +ATOM 130 C2 C4A A 33 17.170 17.801 1.168 0.00 0.00 +ATOM 131 C3 C4A A 33 19.388 17.427 -0.075 0.00 0.00 +ATOM 132 C4 C4A A 33 20.923 17.304 -0.038 0.00 0.00 +ATOM 133 C1 C4A A 34 23.073 13.256 4.702 0.00 0.00 +ATOM 134 C2 C4A A 34 24.513 13.086 4.185 0.00 0.00 +ATOM 135 C3 C4A A 34 22.977 13.932 6.083 0.00 0.00 +ATOM 136 C4 C4A A 34 23.664 13.177 7.236 0.00 0.00 +ATOM 137 C1 C4A A 35 21.516 0.634 3.466 0.00 0.00 +ATOM 138 C2 C4A A 35 22.932 1.175 3.194 0.00 0.00 +ATOM 139 C3 C4A A 35 20.887 1.146 4.776 0.00 0.00 +ATOM 140 C4 C4A A 35 19.432 0.644 4.809 0.00 0.00 +ATOM 141 C1 C4A A 36 18.081 15.994 14.016 0.00 0.00 +ATOM 142 C2 C4A A 36 18.402 16.498 12.596 0.00 0.00 +ATOM 143 C3 C4A A 36 19.277 15.778 14.962 0.00 0.00 +ATOM 144 C4 C4A A 36 18.958 15.338 16.403 0.00 0.00 +ATOM 145 C1 C4A A 37 17.698 20.497 4.366 0.00 0.00 +ATOM 146 C2 C4A A 37 16.191 20.482 4.048 0.00 0.00 +ATOM 147 C3 C4A A 37 18.566 21.432 3.504 0.00 0.00 +ATOM 148 C4 C4A A 37 20.053 21.567 3.879 0.00 0.00 +ATOM 149 C1 C4A A 38 11.151 7.134 6.241 0.00 0.00 +ATOM 150 C2 C4A A 38 10.384 7.895 5.143 0.00 0.00 +ATOM 151 C3 C4A A 38 10.639 7.395 7.669 0.00 0.00 +ATOM 152 C4 C4A A 38 11.393 6.715 8.827 0.00 0.00 +ATOM 153 C1 C4A A 39 21.883 21.911 23.059 0.00 0.00 +ATOM 154 C2 C4A A 39 21.915 20.458 22.549 0.00 0.00 +ATOM 155 C3 C4A A 39 20.913 22.255 24.205 0.00 0.00 +ATOM 156 C4 C4A A 39 21.214 23.657 24.766 0.00 0.00 +ATOM 157 C1 C4A A 40 22.780 2.842 17.930 0.00 0.00 +ATOM 158 C2 C4A A 40 23.557 3.164 16.640 0.00 0.00 +ATOM 159 C3 C4A A 40 23.614 2.036 18.943 0.00 0.00 +ATOM 160 C4 C4A A 40 22.720 1.423 20.038 0.00 0.00 +ATOM 161 C1 C4A A 41 22.383 6.391 13.489 0.00 0.00 +ATOM 162 C2 C4A A 41 21.035 5.670 13.308 0.00 0.00 +ATOM 163 C3 C4A A 41 22.325 7.663 14.355 0.00 0.00 +ATOM 164 C4 C4A A 41 23.573 8.563 14.283 0.00 0.00 +ATOM 165 C1 C4A A 42 7.396 24.231 21.425 0.00 0.00 +ATOM 166 C2 C4A A 42 6.102 24.331 20.596 0.00 0.00 +ATOM 167 C3 C4A A 42 7.508 25.172 22.639 0.00 0.00 +ATOM 168 C4 C4A A 42 8.868 25.069 23.355 0.00 0.00 +ATOM 169 C1 C4A A 43 6.784 7.798 22.745 0.00 0.00 +ATOM 170 C2 C4A A 43 7.336 6.816 23.795 0.00 0.00 +ATOM 171 C3 C4A A 43 5.255 7.927 22.873 0.00 0.00 +ATOM 172 C4 C4A A 43 4.494 8.429 21.631 0.00 0.00 +ATOM 173 C1 C4A A 44 18.068 21.332 8.078 0.00 0.00 +ATOM 174 C2 C4A A 44 16.744 22.118 8.053 0.00 0.00 +ATOM 175 C3 C4A A 44 18.543 20.999 9.505 0.00 0.00 +ATOM 176 C4 C4A A 44 19.789 20.095 9.501 0.00 0.00 +ATOM 177 C1 C4A A 45 1.282 23.537 24.363 0.00 0.00 +ATOM 178 C2 C4A A 45 0.112 24.030 25.235 0.00 0.00 +ATOM 179 C3 C4A A 45 2.630 24.220 24.661 0.00 0.00 +ATOM 180 C4 C4A A 45 3.559 23.917 23.471 0.00 0.00 +ATOM 181 C1 C4A A 46 5.396 24.193 11.699 0.00 0.00 +ATOM 182 C2 C4A A 46 6.403 23.208 11.076 0.00 0.00 +ATOM 183 C3 C4A A 46 4.119 23.469 12.163 0.00 0.00 +ATOM 184 C4 C4A A 46 3.231 22.960 11.012 0.00 0.00 +ATOM 185 C1 C4A A 47 21.176 9.820 7.327 0.00 0.00 +ATOM 186 C2 C4A A 47 22.495 9.181 7.800 0.00 0.00 +ATOM 187 C3 C4A A 47 20.506 10.855 8.249 0.00 0.00 +ATOM 188 C4 C4A A 47 19.350 11.583 7.537 0.00 0.00 +ATOM 189 C1 C4A A 48 13.009 1.026 15.974 0.00 0.00 +ATOM 190 C2 C4A A 48 13.535 1.071 14.528 0.00 0.00 +ATOM 191 C3 C4A A 48 11.519 0.700 16.187 0.00 0.00 +ATOM 192 C4 C4A A 48 10.662 1.498 15.186 0.00 0.00 +ATOM 193 C1 C4A A 49 3.859 15.607 1.616 0.00 0.00 +ATOM 194 C2 C4A A 49 3.675 14.317 0.795 0.00 0.00 +ATOM 195 C3 C4A A 49 4.037 15.477 3.140 0.00 0.00 +ATOM 196 C4 C4A A 49 2.692 14.913 3.632 0.00 0.00 +ATOM 197 C1 C4A A 50 8.531 19.113 12.784 0.00 0.00 +ATOM 198 C2 C4A A 50 8.548 20.314 11.821 0.00 0.00 +ATOM 199 C3 C4A A 50 7.168 18.589 13.274 0.00 0.00 +ATOM 200 C4 C4A A 50 6.463 19.384 14.389 0.00 0.00 +ATOM 201 C1 C4A A 51 23.080 12.930 23.431 0.00 0.00 +ATOM 202 C2 C4A A 51 22.944 12.958 24.965 0.00 0.00 +ATOM 203 C3 C4A A 51 22.302 11.774 22.776 0.00 0.00 +ATOM 204 C4 C4A A 51 20.806 11.665 23.127 0.00 0.00 +ATOM 205 C1 C4A A 52 0.823 16.985 21.761 0.00 0.00 +ATOM 206 C2 C4A A 52 1.628 15.672 21.745 0.00 0.00 +ATOM 207 C3 C4A A 52 1.316 18.047 22.760 0.00 0.00 +ATOM 208 C4 C4A A 52 0.609 19.414 22.704 0.00 0.00 +ATOM 209 C1 C4A A 53 17.558 18.955 19.494 0.00 0.00 +ATOM 210 C2 C4A A 53 18.013 18.587 18.069 0.00 0.00 +ATOM 211 C3 C4A A 53 18.210 20.225 20.071 0.00 0.00 +ATOM 212 C4 C4A A 53 17.852 20.596 21.522 0.00 0.00 +ATOM 213 C1 C4A A 54 12.986 16.769 19.852 0.00 0.00 +ATOM 214 C2 C4A A 54 14.192 17.137 20.736 0.00 0.00 +ATOM 215 C3 C4A A 54 12.331 15.437 20.261 0.00 0.00 +ATOM 216 C4 C4A A 54 11.002 15.292 19.496 0.00 0.00 +ATOM 217 C1 C4A A 55 13.880 9.468 17.916 0.00 0.00 +ATOM 218 C2 C4A A 55 14.696 8.621 18.909 0.00 0.00 +ATOM 219 C3 C4A A 55 13.417 10.860 18.385 0.00 0.00 +ATOM 220 C4 C4A A 55 12.593 11.714 17.404 0.00 0.00 +ATOM 221 C1 C4A A 56 24.380 20.540 9.000 0.00 0.00 +ATOM 222 C2 C4A A 56 25.691 20.014 9.614 0.00 0.00 +ATOM 223 C3 C4A A 56 24.375 22.016 8.562 0.00 0.00 +ATOM 224 C4 C4A A 56 22.967 22.598 8.339 0.00 0.00 +ATOM 225 C1 C4A A 57 2.396 20.062 5.442 0.00 0.00 +ATOM 226 C2 C4A A 57 2.027 18.879 6.357 0.00 0.00 +ATOM 227 C3 C4A A 57 3.147 21.229 6.108 0.00 0.00 +ATOM 228 C4 C4A A 57 3.506 22.346 5.111 0.00 0.00 +ATOM 229 C1 C4A A 58 6.632 11.292 5.298 0.00 0.00 +ATOM 230 C2 C4A A 58 7.200 9.899 4.966 0.00 0.00 +ATOM 231 C3 C4A A 58 7.693 12.388 5.087 0.00 0.00 +ATOM 232 C4 C4A A 58 7.329 13.861 5.345 0.00 0.00 +ATOM 233 C1 C4A A 59 5.955 21.413 -0.258 0.00 0.00 +ATOM 234 C2 C4A A 59 7.423 21.538 -0.706 0.00 0.00 +ATOM 235 C3 C4A A 59 5.609 20.483 0.919 0.00 0.00 +ATOM 236 C4 C4A A 59 4.178 19.916 0.955 0.00 0.00 +ATOM 237 C1 C4A A 60 11.456 20.398 16.545 0.00 0.00 +ATOM 238 C2 C4A A 60 10.572 21.356 15.725 0.00 0.00 +ATOM 239 C3 C4A A 60 12.945 20.767 16.405 0.00 0.00 +ATOM 240 C4 C4A A 60 13.746 19.814 17.311 0.00 0.00 +ATOM 241 C1 C4A A 61 10.640 1.401 4.306 0.00 0.00 +ATOM 242 C2 C4A A 61 11.126 2.857 4.175 0.00 0.00 +ATOM 243 C3 C4A A 61 11.408 0.628 5.394 0.00 0.00 +ATOM 244 C4 C4A A 61 10.892 0.911 6.817 0.00 0.00 +ATOM 245 C1 C4A A 62 9.096 15.789 10.695 0.00 0.00 +ATOM 246 C2 C4A A 62 7.904 14.871 11.026 0.00 0.00 +ATOM 247 C3 C4A A 62 9.808 15.589 9.345 0.00 0.00 +ATOM 248 C4 C4A A 62 11.098 16.406 9.146 0.00 0.00 +ATOM 249 C1 C4A A 63 8.155 5.967 10.983 0.00 0.00 +ATOM 250 C2 C4A A 63 9.128 4.955 11.617 0.00 0.00 +ATOM 251 C3 C4A A 63 6.912 6.315 11.822 0.00 0.00 +ATOM 252 C4 C4A A 63 6.018 5.081 12.052 0.00 0.00 +ATOM 253 C1 C4A A 64 5.881 19.127 8.815 0.00 0.00 +ATOM 254 C2 C4A A 64 7.350 19.272 8.378 0.00 0.00 +ATOM 255 C3 C4A A 64 5.679 17.849 9.651 0.00 0.00 +ATOM 256 C4 C4A A 64 4.212 17.600 10.049 0.00 0.00 +ATOM 257 C1 C4A A 65 1.383 5.089 21.124 0.00 0.00 +ATOM 258 C2 C4A A 65 0.521 4.784 22.363 0.00 0.00 +ATOM 259 C3 C4A A 65 0.916 6.295 20.287 0.00 0.00 +ATOM 260 C4 C4A A 65 1.974 6.691 19.240 0.00 0.00 +ATOM 261 C1 C4A A 66 23.982 19.229 1.268 0.00 0.00 +ATOM 262 C2 C4A A 66 24.074 20.414 2.248 0.00 0.00 +ATOM 263 C3 C4A A 66 24.690 17.925 1.678 0.00 0.00 +ATOM 264 C4 C4A A 66 24.011 16.923 2.630 0.00 0.00 +ATOM 265 C1 C4A A 67 17.603 6.416 3.521 0.00 0.00 +ATOM 266 C2 C4A A 67 16.890 7.341 4.525 0.00 0.00 +ATOM 267 C3 C4A A 67 17.182 4.943 3.677 0.00 0.00 +ATOM 268 C4 C4A A 67 17.819 3.976 2.661 0.00 0.00 +ATOM 269 C1 C4A A 68 8.405 11.238 10.144 0.00 0.00 +ATOM 270 C2 C4A A 68 9.918 11.397 10.380 0.00 0.00 +ATOM 271 C3 C4A A 68 8.055 9.981 9.327 0.00 0.00 +ATOM 272 C4 C4A A 68 6.536 9.837 9.117 0.00 0.00 +ATOM 273 C1 C4A A 69 9.317 14.873 0.070 0.00 0.00 +ATOM 274 C2 C4A A 69 10.102 15.102 -1.235 0.00 0.00 +ATOM 275 C3 C4A A 69 8.646 16.190 0.504 0.00 0.00 +ATOM 276 C4 C4A A 69 8.155 16.035 1.955 0.00 0.00 +ATOM 277 C1 C4A A 70 22.168 15.134 10.432 0.00 0.00 +ATOM 278 C2 C4A A 70 20.853 15.397 9.674 0.00 0.00 +ATOM 279 C3 C4A A 70 23.279 16.094 9.969 0.00 0.00 +ATOM 280 C4 C4A A 70 24.617 16.050 10.731 0.00 0.00 +ATOM 281 C1 C4A A 71 21.920 17.523 5.751 0.00 0.00 +ATOM 282 C2 C4A A 71 22.741 18.814 5.583 0.00 0.00 +ATOM 283 C3 C4A A 71 20.702 17.422 4.814 0.00 0.00 +ATOM 284 C4 C4A A 71 19.626 16.363 5.114 0.00 0.00 +ATOM 285 C1 C4A A 72 6.176 23.570 16.781 0.00 0.00 +ATOM 286 C2 C4A A 72 6.845 22.428 17.569 0.00 0.00 +ATOM 287 C3 C4A A 72 6.954 24.818 16.324 0.00 0.00 +ATOM 288 C4 C4A A 72 6.125 25.885 15.584 0.00 0.00 +ATOM 289 C1 C4A A 73 12.935 21.753 8.664 0.00 0.00 +ATOM 290 C2 C4A A 73 12.779 22.747 9.830 0.00 0.00 +ATOM 291 C3 C4A A 73 12.180 22.101 7.367 0.00 0.00 +ATOM 292 C4 C4A A 73 12.379 21.143 6.178 0.00 0.00 +ATOM 293 C1 C4A A 74 10.887 4.967 19.011 0.00 0.00 +ATOM 294 C2 C4A A 74 10.967 3.432 18.921 0.00 0.00 +ATOM 295 C3 C4A A 74 9.485 5.497 19.363 0.00 0.00 +ATOM 296 C4 C4A A 74 9.401 7.034 19.384 0.00 0.00 +ATOM 297 C1 C4A A 75 5.720 5.293 6.187 0.00 0.00 +ATOM 298 C2 C4A A 75 4.937 6.601 5.966 0.00 0.00 +ATOM 299 C3 C4A A 75 6.842 5.459 7.228 0.00 0.00 +ATOM 300 C4 C4A A 75 7.982 4.437 7.063 0.00 0.00 +ATOM 301 C1 C4A A 76 14.245 15.674 15.450 0.00 0.00 +ATOM 302 C2 C4A A 76 14.983 15.495 16.790 0.00 0.00 +ATOM 303 C3 C4A A 76 12.798 16.201 15.443 0.00 0.00 +ATOM 304 C4 C4A A 76 12.244 16.875 14.173 0.00 0.00 +ATOM 305 C1 C4A A 77 4.955 3.040 18.942 0.00 0.00 +ATOM 306 C2 C4A A 77 3.764 2.232 18.394 0.00 0.00 +ATOM 307 C3 C4A A 77 4.895 3.202 20.472 0.00 0.00 +ATOM 308 C4 C4A A 77 6.136 4.003 20.909 0.00 0.00 +ATOM 309 C1 C4A A 78 10.777 21.669 2.584 0.00 0.00 +ATOM 310 C2 C4A A 78 10.450 20.250 2.081 0.00 0.00 +ATOM 311 C3 C4A A 78 11.486 22.741 1.735 0.00 0.00 +ATOM 312 C4 C4A A 78 13.011 22.544 1.661 0.00 0.00 +ATOM 313 C1 C4A A 79 2.775 3.745 14.621 0.00 0.00 +ATOM 314 C2 C4A A 79 2.118 4.922 15.367 0.00 0.00 +ATOM 315 C3 C4A A 79 2.130 2.351 14.734 0.00 0.00 +ATOM 316 C4 C4A A 79 2.610 1.368 13.650 0.00 0.00 +ATOM 317 C1 C4A A 80 10.832 8.756 14.281 0.00 0.00 +ATOM 318 C2 C4A A 80 10.524 8.906 15.782 0.00 0.00 +ATOM 319 C3 C4A A 80 12.156 8.015 14.013 0.00 0.00 +ATOM 320 C4 C4A A 80 12.377 7.822 12.502 0.00 0.00 +ATOM 321 C1 C4A A 81 16.377 25.084 20.799 0.00 0.00 +ATOM 322 C2 C4A A 81 17.875 25.222 21.132 0.00 0.00 +ATOM 323 C3 C4A A 81 15.805 23.711 20.399 0.00 0.00 +ATOM 324 C4 C4A A 81 14.803 23.766 19.231 0.00 0.00 +ATOM 325 C1 C4A A 82 17.307 3.036 16.108 0.00 0.00 +ATOM 326 C2 C4A A 82 18.689 2.366 16.233 0.00 0.00 +ATOM 327 C3 C4A A 82 16.923 3.973 17.268 0.00 0.00 +ATOM 328 C4 C4A A 82 15.425 4.328 17.273 0.00 0.00 +ATOM 329 C1 C4A A 83 22.474 16.480 19.635 0.00 0.00 +ATOM 330 C2 C4A A 83 21.136 17.233 19.750 0.00 0.00 +ATOM 331 C3 C4A A 83 22.472 15.424 18.514 0.00 0.00 +ATOM 332 C4 C4A A 83 23.883 14.809 18.474 0.00 0.00 +ATOM 333 C1 C4A A 84 10.896 4.240 24.148 0.00 0.00 +ATOM 334 C2 C4A A 84 10.019 3.982 22.908 0.00 0.00 +ATOM 335 C3 C4A A 84 12.409 4.179 23.869 0.00 0.00 +ATOM 336 C4 C4A A 84 13.172 3.982 25.193 0.00 0.00 +ATOM 337 C1 C4A A 85 5.485 12.728 19.963 0.00 0.00 +ATOM 338 C2 C4A A 85 5.218 12.039 21.313 0.00 0.00 +ATOM 339 C3 C4A A 85 6.418 13.954 19.973 0.00 0.00 +ATOM 340 C4 C4A A 85 7.732 13.565 20.676 0.00 0.00 +ATOM 341 C1 C4A A 86 2.946 15.019 17.457 0.00 0.00 +ATOM 342 C2 C4A A 86 3.739 16.202 18.041 0.00 0.00 +ATOM 343 C3 C4A A 86 1.836 15.267 16.418 0.00 0.00 +ATOM 344 C4 C4A A 86 2.340 15.483 14.979 0.00 0.00 +ATOM 345 C1 C4A A 87 6.399 19.214 20.032 0.00 0.00 +ATOM 346 C2 C4A A 87 5.119 20.066 20.104 0.00 0.00 +ATOM 347 C3 C4A A 87 7.094 19.031 21.394 0.00 0.00 +ATOM 348 C4 C4A A 87 8.406 18.249 21.198 0.00 0.00 +ATOM 349 C1 C4A A 88 16.838 22.671 14.418 0.00 0.00 +ATOM 350 C2 C4A A 88 16.641 23.754 15.496 0.00 0.00 +ATOM 351 C3 C4A A 88 17.087 21.378 15.216 0.00 0.00 +ATOM 352 C4 C4A A 88 17.204 20.072 14.409 0.00 0.00 +ATOM 353 C1 C4A A 89 11.041 20.604 22.064 0.00 0.00 +ATOM 354 C2 C4A A 89 12.565 20.387 22.094 0.00 0.00 +ATOM 355 C3 C4A A 89 10.819 22.114 21.860 0.00 0.00 +ATOM 356 C4 C4A A 89 11.661 22.818 20.780 0.00 0.00 +ATOM 357 C1 C4A A 90 1.915 3.043 2.798 0.00 0.00 +ATOM 358 C2 C4A A 90 2.244 4.512 3.121 0.00 0.00 +ATOM 359 C3 C4A A 90 2.683 2.166 3.805 0.00 0.00 +ATOM 360 C4 C4A A 90 2.307 0.673 3.831 0.00 0.00 +ATOM 361 C1 C1A B 1 14.152 13.247 0.006 0.00 0.00 +ATOM 362 C1 C1A B 2 15.353 6.782 9.635 0.00 0.00 +ATOM 363 C1 C1A B 3 4.521 13.443 10.051 0.00 0.00 +ATOM 364 C1 C1A B 4 1.775 0.007 7.771 0.00 0.00 +ATOM 365 C1 C1A B 5 24.724 23.099 4.902 0.00 0.00 +ATOM 366 C1 C1A B 6 16.166 21.644 24.594 0.00 0.00 +ATOM 367 C1 C1A B 7 22.864 8.674 2.739 0.00 0.00 +ATOM 368 C1 C1A B 8 22.892 15.995 14.187 0.00 0.00 +ATOM 369 C1 C1A B 9 9.687 24.822 10.024 0.00 0.00 +ATOM 370 C1 C1A B 10 3.748 3.433 24.333 0.00 0.00 +END diff --git a/example_file/methane_butane/setup_box_0.psf b/example_file/methane_butane/setup_box_0.psf new file mode 100644 index 000000000..f74ec7598 --- /dev/null +++ b/example_file/methane_butane/setup_box_0.psf @@ -0,0 +1,621 @@ +PSF + + 4 !NTITLE + REMARKS original generated structure x-plor psf file + REMARKS topology ./top_mie.inp + REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } + REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } + + 370 !NATOM + 1 C4A 1 C4A C1 CH2 0.000000 14.0270 0 + 2 C4A 1 C4A C2 CH3 0.000000 15.0350 0 + 3 C4A 1 C4A C3 CH2 0.000000 14.0270 0 + 4 C4A 1 C4A C4 CH3 0.000000 15.0350 0 + 5 C4A 2 C4A C1 CH2 0.000000 14.0270 0 + 6 C4A 2 C4A C2 CH3 0.000000 15.0350 0 + 7 C4A 2 C4A C3 CH2 0.000000 14.0270 0 + 8 C4A 2 C4A C4 CH3 0.000000 15.0350 0 + 9 C4A 3 C4A C1 CH2 0.000000 14.0270 0 + 10 C4A 3 C4A C2 CH3 0.000000 15.0350 0 + 11 C4A 3 C4A C3 CH2 0.000000 14.0270 0 + 12 C4A 3 C4A C4 CH3 0.000000 15.0350 0 + 13 C4A 4 C4A C1 CH2 0.000000 14.0270 0 + 14 C4A 4 C4A C2 CH3 0.000000 15.0350 0 + 15 C4A 4 C4A C3 CH2 0.000000 14.0270 0 + 16 C4A 4 C4A C4 CH3 0.000000 15.0350 0 + 17 C4A 5 C4A C1 CH2 0.000000 14.0270 0 + 18 C4A 5 C4A C2 CH3 0.000000 15.0350 0 + 19 C4A 5 C4A C3 CH2 0.000000 14.0270 0 + 20 C4A 5 C4A C4 CH3 0.000000 15.0350 0 + 21 C4A 6 C4A C1 CH2 0.000000 14.0270 0 + 22 C4A 6 C4A C2 CH3 0.000000 15.0350 0 + 23 C4A 6 C4A C3 CH2 0.000000 14.0270 0 + 24 C4A 6 C4A C4 CH3 0.000000 15.0350 0 + 25 C4A 7 C4A C1 CH2 0.000000 14.0270 0 + 26 C4A 7 C4A C2 CH3 0.000000 15.0350 0 + 27 C4A 7 C4A C3 CH2 0.000000 14.0270 0 + 28 C4A 7 C4A C4 CH3 0.000000 15.0350 0 + 29 C4A 8 C4A C1 CH2 0.000000 14.0270 0 + 30 C4A 8 C4A C2 CH3 0.000000 15.0350 0 + 31 C4A 8 C4A C3 CH2 0.000000 14.0270 0 + 32 C4A 8 C4A C4 CH3 0.000000 15.0350 0 + 33 C4A 9 C4A C1 CH2 0.000000 14.0270 0 + 34 C4A 9 C4A C2 CH3 0.000000 15.0350 0 + 35 C4A 9 C4A C3 CH2 0.000000 14.0270 0 + 36 C4A 9 C4A C4 CH3 0.000000 15.0350 0 + 37 C4A 10 C4A C1 CH2 0.000000 14.0270 0 + 38 C4A 10 C4A C2 CH3 0.000000 15.0350 0 + 39 C4A 10 C4A C3 CH2 0.000000 14.0270 0 + 40 C4A 10 C4A C4 CH3 0.000000 15.0350 0 + 41 C4A 11 C4A C1 CH2 0.000000 14.0270 0 + 42 C4A 11 C4A C2 CH3 0.000000 15.0350 0 + 43 C4A 11 C4A C3 CH2 0.000000 14.0270 0 + 44 C4A 11 C4A C4 CH3 0.000000 15.0350 0 + 45 C4A 12 C4A C1 CH2 0.000000 14.0270 0 + 46 C4A 12 C4A C2 CH3 0.000000 15.0350 0 + 47 C4A 12 C4A C3 CH2 0.000000 14.0270 0 + 48 C4A 12 C4A C4 CH3 0.000000 15.0350 0 + 49 C4A 13 C4A C1 CH2 0.000000 14.0270 0 + 50 C4A 13 C4A C2 CH3 0.000000 15.0350 0 + 51 C4A 13 C4A C3 CH2 0.000000 14.0270 0 + 52 C4A 13 C4A C4 CH3 0.000000 15.0350 0 + 53 C4A 14 C4A C1 CH2 0.000000 14.0270 0 + 54 C4A 14 C4A C2 CH3 0.000000 15.0350 0 + 55 C4A 14 C4A C3 CH2 0.000000 14.0270 0 + 56 C4A 14 C4A C4 CH3 0.000000 15.0350 0 + 57 C4A 15 C4A C1 CH2 0.000000 14.0270 0 + 58 C4A 15 C4A C2 CH3 0.000000 15.0350 0 + 59 C4A 15 C4A C3 CH2 0.000000 14.0270 0 + 60 C4A 15 C4A C4 CH3 0.000000 15.0350 0 + 61 C4A 16 C4A C1 CH2 0.000000 14.0270 0 + 62 C4A 16 C4A C2 CH3 0.000000 15.0350 0 + 63 C4A 16 C4A C3 CH2 0.000000 14.0270 0 + 64 C4A 16 C4A C4 CH3 0.000000 15.0350 0 + 65 C4A 17 C4A C1 CH2 0.000000 14.0270 0 + 66 C4A 17 C4A C2 CH3 0.000000 15.0350 0 + 67 C4A 17 C4A C3 CH2 0.000000 14.0270 0 + 68 C4A 17 C4A C4 CH3 0.000000 15.0350 0 + 69 C4A 18 C4A C1 CH2 0.000000 14.0270 0 + 70 C4A 18 C4A C2 CH3 0.000000 15.0350 0 + 71 C4A 18 C4A C3 CH2 0.000000 14.0270 0 + 72 C4A 18 C4A C4 CH3 0.000000 15.0350 0 + 73 C4A 19 C4A C1 CH2 0.000000 14.0270 0 + 74 C4A 19 C4A C2 CH3 0.000000 15.0350 0 + 75 C4A 19 C4A C3 CH2 0.000000 14.0270 0 + 76 C4A 19 C4A C4 CH3 0.000000 15.0350 0 + 77 C4A 20 C4A C1 CH2 0.000000 14.0270 0 + 78 C4A 20 C4A C2 CH3 0.000000 15.0350 0 + 79 C4A 20 C4A C3 CH2 0.000000 14.0270 0 + 80 C4A 20 C4A C4 CH3 0.000000 15.0350 0 + 81 C4A 21 C4A C1 CH2 0.000000 14.0270 0 + 82 C4A 21 C4A C2 CH3 0.000000 15.0350 0 + 83 C4A 21 C4A C3 CH2 0.000000 14.0270 0 + 84 C4A 21 C4A C4 CH3 0.000000 15.0350 0 + 85 C4A 22 C4A C1 CH2 0.000000 14.0270 0 + 86 C4A 22 C4A C2 CH3 0.000000 15.0350 0 + 87 C4A 22 C4A C3 CH2 0.000000 14.0270 0 + 88 C4A 22 C4A C4 CH3 0.000000 15.0350 0 + 89 C4A 23 C4A C1 CH2 0.000000 14.0270 0 + 90 C4A 23 C4A C2 CH3 0.000000 15.0350 0 + 91 C4A 23 C4A C3 CH2 0.000000 14.0270 0 + 92 C4A 23 C4A C4 CH3 0.000000 15.0350 0 + 93 C4A 24 C4A C1 CH2 0.000000 14.0270 0 + 94 C4A 24 C4A C2 CH3 0.000000 15.0350 0 + 95 C4A 24 C4A C3 CH2 0.000000 14.0270 0 + 96 C4A 24 C4A C4 CH3 0.000000 15.0350 0 + 97 C4A 25 C4A C1 CH2 0.000000 14.0270 0 + 98 C4A 25 C4A C2 CH3 0.000000 15.0350 0 + 99 C4A 25 C4A C3 CH2 0.000000 14.0270 0 + 100 C4A 25 C4A C4 CH3 0.000000 15.0350 0 + 101 C4A 26 C4A C1 CH2 0.000000 14.0270 0 + 102 C4A 26 C4A C2 CH3 0.000000 15.0350 0 + 103 C4A 26 C4A C3 CH2 0.000000 14.0270 0 + 104 C4A 26 C4A C4 CH3 0.000000 15.0350 0 + 105 C4A 27 C4A C1 CH2 0.000000 14.0270 0 + 106 C4A 27 C4A C2 CH3 0.000000 15.0350 0 + 107 C4A 27 C4A C3 CH2 0.000000 14.0270 0 + 108 C4A 27 C4A C4 CH3 0.000000 15.0350 0 + 109 C4A 28 C4A C1 CH2 0.000000 14.0270 0 + 110 C4A 28 C4A C2 CH3 0.000000 15.0350 0 + 111 C4A 28 C4A C3 CH2 0.000000 14.0270 0 + 112 C4A 28 C4A C4 CH3 0.000000 15.0350 0 + 113 C4A 29 C4A C1 CH2 0.000000 14.0270 0 + 114 C4A 29 C4A C2 CH3 0.000000 15.0350 0 + 115 C4A 29 C4A C3 CH2 0.000000 14.0270 0 + 116 C4A 29 C4A C4 CH3 0.000000 15.0350 0 + 117 C4A 30 C4A C1 CH2 0.000000 14.0270 0 + 118 C4A 30 C4A C2 CH3 0.000000 15.0350 0 + 119 C4A 30 C4A C3 CH2 0.000000 14.0270 0 + 120 C4A 30 C4A C4 CH3 0.000000 15.0350 0 + 121 C4A 31 C4A C1 CH2 0.000000 14.0270 0 + 122 C4A 31 C4A C2 CH3 0.000000 15.0350 0 + 123 C4A 31 C4A C3 CH2 0.000000 14.0270 0 + 124 C4A 31 C4A C4 CH3 0.000000 15.0350 0 + 125 C4A 32 C4A C1 CH2 0.000000 14.0270 0 + 126 C4A 32 C4A C2 CH3 0.000000 15.0350 0 + 127 C4A 32 C4A C3 CH2 0.000000 14.0270 0 + 128 C4A 32 C4A C4 CH3 0.000000 15.0350 0 + 129 C4A 33 C4A C1 CH2 0.000000 14.0270 0 + 130 C4A 33 C4A C2 CH3 0.000000 15.0350 0 + 131 C4A 33 C4A C3 CH2 0.000000 14.0270 0 + 132 C4A 33 C4A C4 CH3 0.000000 15.0350 0 + 133 C4A 34 C4A C1 CH2 0.000000 14.0270 0 + 134 C4A 34 C4A C2 CH3 0.000000 15.0350 0 + 135 C4A 34 C4A C3 CH2 0.000000 14.0270 0 + 136 C4A 34 C4A C4 CH3 0.000000 15.0350 0 + 137 C4A 35 C4A C1 CH2 0.000000 14.0270 0 + 138 C4A 35 C4A C2 CH3 0.000000 15.0350 0 + 139 C4A 35 C4A C3 CH2 0.000000 14.0270 0 + 140 C4A 35 C4A C4 CH3 0.000000 15.0350 0 + 141 C4A 36 C4A C1 CH2 0.000000 14.0270 0 + 142 C4A 36 C4A C2 CH3 0.000000 15.0350 0 + 143 C4A 36 C4A C3 CH2 0.000000 14.0270 0 + 144 C4A 36 C4A C4 CH3 0.000000 15.0350 0 + 145 C4A 37 C4A C1 CH2 0.000000 14.0270 0 + 146 C4A 37 C4A C2 CH3 0.000000 15.0350 0 + 147 C4A 37 C4A C3 CH2 0.000000 14.0270 0 + 148 C4A 37 C4A C4 CH3 0.000000 15.0350 0 + 149 C4A 38 C4A C1 CH2 0.000000 14.0270 0 + 150 C4A 38 C4A C2 CH3 0.000000 15.0350 0 + 151 C4A 38 C4A C3 CH2 0.000000 14.0270 0 + 152 C4A 38 C4A C4 CH3 0.000000 15.0350 0 + 153 C4A 39 C4A C1 CH2 0.000000 14.0270 0 + 154 C4A 39 C4A C2 CH3 0.000000 15.0350 0 + 155 C4A 39 C4A C3 CH2 0.000000 14.0270 0 + 156 C4A 39 C4A C4 CH3 0.000000 15.0350 0 + 157 C4A 40 C4A C1 CH2 0.000000 14.0270 0 + 158 C4A 40 C4A C2 CH3 0.000000 15.0350 0 + 159 C4A 40 C4A C3 CH2 0.000000 14.0270 0 + 160 C4A 40 C4A C4 CH3 0.000000 15.0350 0 + 161 C4A 41 C4A C1 CH2 0.000000 14.0270 0 + 162 C4A 41 C4A C2 CH3 0.000000 15.0350 0 + 163 C4A 41 C4A C3 CH2 0.000000 14.0270 0 + 164 C4A 41 C4A C4 CH3 0.000000 15.0350 0 + 165 C4A 42 C4A C1 CH2 0.000000 14.0270 0 + 166 C4A 42 C4A C2 CH3 0.000000 15.0350 0 + 167 C4A 42 C4A C3 CH2 0.000000 14.0270 0 + 168 C4A 42 C4A C4 CH3 0.000000 15.0350 0 + 169 C4A 43 C4A C1 CH2 0.000000 14.0270 0 + 170 C4A 43 C4A C2 CH3 0.000000 15.0350 0 + 171 C4A 43 C4A C3 CH2 0.000000 14.0270 0 + 172 C4A 43 C4A C4 CH3 0.000000 15.0350 0 + 173 C4A 44 C4A C1 CH2 0.000000 14.0270 0 + 174 C4A 44 C4A C2 CH3 0.000000 15.0350 0 + 175 C4A 44 C4A C3 CH2 0.000000 14.0270 0 + 176 C4A 44 C4A C4 CH3 0.000000 15.0350 0 + 177 C4A 45 C4A C1 CH2 0.000000 14.0270 0 + 178 C4A 45 C4A C2 CH3 0.000000 15.0350 0 + 179 C4A 45 C4A C3 CH2 0.000000 14.0270 0 + 180 C4A 45 C4A C4 CH3 0.000000 15.0350 0 + 181 C4A 46 C4A C1 CH2 0.000000 14.0270 0 + 182 C4A 46 C4A C2 CH3 0.000000 15.0350 0 + 183 C4A 46 C4A C3 CH2 0.000000 14.0270 0 + 184 C4A 46 C4A C4 CH3 0.000000 15.0350 0 + 185 C4A 47 C4A C1 CH2 0.000000 14.0270 0 + 186 C4A 47 C4A C2 CH3 0.000000 15.0350 0 + 187 C4A 47 C4A C3 CH2 0.000000 14.0270 0 + 188 C4A 47 C4A C4 CH3 0.000000 15.0350 0 + 189 C4A 48 C4A C1 CH2 0.000000 14.0270 0 + 190 C4A 48 C4A C2 CH3 0.000000 15.0350 0 + 191 C4A 48 C4A C3 CH2 0.000000 14.0270 0 + 192 C4A 48 C4A C4 CH3 0.000000 15.0350 0 + 193 C4A 49 C4A C1 CH2 0.000000 14.0270 0 + 194 C4A 49 C4A C2 CH3 0.000000 15.0350 0 + 195 C4A 49 C4A C3 CH2 0.000000 14.0270 0 + 196 C4A 49 C4A C4 CH3 0.000000 15.0350 0 + 197 C4A 50 C4A C1 CH2 0.000000 14.0270 0 + 198 C4A 50 C4A C2 CH3 0.000000 15.0350 0 + 199 C4A 50 C4A C3 CH2 0.000000 14.0270 0 + 200 C4A 50 C4A C4 CH3 0.000000 15.0350 0 + 201 C4A 51 C4A C1 CH2 0.000000 14.0270 0 + 202 C4A 51 C4A C2 CH3 0.000000 15.0350 0 + 203 C4A 51 C4A C3 CH2 0.000000 14.0270 0 + 204 C4A 51 C4A C4 CH3 0.000000 15.0350 0 + 205 C4A 52 C4A C1 CH2 0.000000 14.0270 0 + 206 C4A 52 C4A C2 CH3 0.000000 15.0350 0 + 207 C4A 52 C4A C3 CH2 0.000000 14.0270 0 + 208 C4A 52 C4A C4 CH3 0.000000 15.0350 0 + 209 C4A 53 C4A C1 CH2 0.000000 14.0270 0 + 210 C4A 53 C4A C2 CH3 0.000000 15.0350 0 + 211 C4A 53 C4A C3 CH2 0.000000 14.0270 0 + 212 C4A 53 C4A C4 CH3 0.000000 15.0350 0 + 213 C4A 54 C4A C1 CH2 0.000000 14.0270 0 + 214 C4A 54 C4A C2 CH3 0.000000 15.0350 0 + 215 C4A 54 C4A C3 CH2 0.000000 14.0270 0 + 216 C4A 54 C4A C4 CH3 0.000000 15.0350 0 + 217 C4A 55 C4A C1 CH2 0.000000 14.0270 0 + 218 C4A 55 C4A C2 CH3 0.000000 15.0350 0 + 219 C4A 55 C4A C3 CH2 0.000000 14.0270 0 + 220 C4A 55 C4A C4 CH3 0.000000 15.0350 0 + 221 C4A 56 C4A C1 CH2 0.000000 14.0270 0 + 222 C4A 56 C4A C2 CH3 0.000000 15.0350 0 + 223 C4A 56 C4A C3 CH2 0.000000 14.0270 0 + 224 C4A 56 C4A C4 CH3 0.000000 15.0350 0 + 225 C4A 57 C4A C1 CH2 0.000000 14.0270 0 + 226 C4A 57 C4A C2 CH3 0.000000 15.0350 0 + 227 C4A 57 C4A C3 CH2 0.000000 14.0270 0 + 228 C4A 57 C4A C4 CH3 0.000000 15.0350 0 + 229 C4A 58 C4A C1 CH2 0.000000 14.0270 0 + 230 C4A 58 C4A C2 CH3 0.000000 15.0350 0 + 231 C4A 58 C4A C3 CH2 0.000000 14.0270 0 + 232 C4A 58 C4A C4 CH3 0.000000 15.0350 0 + 233 C4A 59 C4A C1 CH2 0.000000 14.0270 0 + 234 C4A 59 C4A C2 CH3 0.000000 15.0350 0 + 235 C4A 59 C4A C3 CH2 0.000000 14.0270 0 + 236 C4A 59 C4A C4 CH3 0.000000 15.0350 0 + 237 C4A 60 C4A C1 CH2 0.000000 14.0270 0 + 238 C4A 60 C4A C2 CH3 0.000000 15.0350 0 + 239 C4A 60 C4A C3 CH2 0.000000 14.0270 0 + 240 C4A 60 C4A C4 CH3 0.000000 15.0350 0 + 241 C4A 61 C4A C1 CH2 0.000000 14.0270 0 + 242 C4A 61 C4A C2 CH3 0.000000 15.0350 0 + 243 C4A 61 C4A C3 CH2 0.000000 14.0270 0 + 244 C4A 61 C4A C4 CH3 0.000000 15.0350 0 + 245 C4A 62 C4A C1 CH2 0.000000 14.0270 0 + 246 C4A 62 C4A C2 CH3 0.000000 15.0350 0 + 247 C4A 62 C4A C3 CH2 0.000000 14.0270 0 + 248 C4A 62 C4A C4 CH3 0.000000 15.0350 0 + 249 C4A 63 C4A C1 CH2 0.000000 14.0270 0 + 250 C4A 63 C4A C2 CH3 0.000000 15.0350 0 + 251 C4A 63 C4A C3 CH2 0.000000 14.0270 0 + 252 C4A 63 C4A C4 CH3 0.000000 15.0350 0 + 253 C4A 64 C4A C1 CH2 0.000000 14.0270 0 + 254 C4A 64 C4A C2 CH3 0.000000 15.0350 0 + 255 C4A 64 C4A C3 CH2 0.000000 14.0270 0 + 256 C4A 64 C4A C4 CH3 0.000000 15.0350 0 + 257 C4A 65 C4A C1 CH2 0.000000 14.0270 0 + 258 C4A 65 C4A C2 CH3 0.000000 15.0350 0 + 259 C4A 65 C4A C3 CH2 0.000000 14.0270 0 + 260 C4A 65 C4A C4 CH3 0.000000 15.0350 0 + 261 C4A 66 C4A C1 CH2 0.000000 14.0270 0 + 262 C4A 66 C4A C2 CH3 0.000000 15.0350 0 + 263 C4A 66 C4A C3 CH2 0.000000 14.0270 0 + 264 C4A 66 C4A C4 CH3 0.000000 15.0350 0 + 265 C4A 67 C4A C1 CH2 0.000000 14.0270 0 + 266 C4A 67 C4A C2 CH3 0.000000 15.0350 0 + 267 C4A 67 C4A C3 CH2 0.000000 14.0270 0 + 268 C4A 67 C4A C4 CH3 0.000000 15.0350 0 + 269 C4A 68 C4A C1 CH2 0.000000 14.0270 0 + 270 C4A 68 C4A C2 CH3 0.000000 15.0350 0 + 271 C4A 68 C4A C3 CH2 0.000000 14.0270 0 + 272 C4A 68 C4A C4 CH3 0.000000 15.0350 0 + 273 C4A 69 C4A C1 CH2 0.000000 14.0270 0 + 274 C4A 69 C4A C2 CH3 0.000000 15.0350 0 + 275 C4A 69 C4A C3 CH2 0.000000 14.0270 0 + 276 C4A 69 C4A C4 CH3 0.000000 15.0350 0 + 277 C4A 70 C4A C1 CH2 0.000000 14.0270 0 + 278 C4A 70 C4A C2 CH3 0.000000 15.0350 0 + 279 C4A 70 C4A C3 CH2 0.000000 14.0270 0 + 280 C4A 70 C4A C4 CH3 0.000000 15.0350 0 + 281 C4A 71 C4A C1 CH2 0.000000 14.0270 0 + 282 C4A 71 C4A C2 CH3 0.000000 15.0350 0 + 283 C4A 71 C4A C3 CH2 0.000000 14.0270 0 + 284 C4A 71 C4A C4 CH3 0.000000 15.0350 0 + 285 C4A 72 C4A C1 CH2 0.000000 14.0270 0 + 286 C4A 72 C4A C2 CH3 0.000000 15.0350 0 + 287 C4A 72 C4A C3 CH2 0.000000 14.0270 0 + 288 C4A 72 C4A C4 CH3 0.000000 15.0350 0 + 289 C4A 73 C4A C1 CH2 0.000000 14.0270 0 + 290 C4A 73 C4A C2 CH3 0.000000 15.0350 0 + 291 C4A 73 C4A C3 CH2 0.000000 14.0270 0 + 292 C4A 73 C4A C4 CH3 0.000000 15.0350 0 + 293 C4A 74 C4A C1 CH2 0.000000 14.0270 0 + 294 C4A 74 C4A C2 CH3 0.000000 15.0350 0 + 295 C4A 74 C4A C3 CH2 0.000000 14.0270 0 + 296 C4A 74 C4A C4 CH3 0.000000 15.0350 0 + 297 C4A 75 C4A C1 CH2 0.000000 14.0270 0 + 298 C4A 75 C4A C2 CH3 0.000000 15.0350 0 + 299 C4A 75 C4A C3 CH2 0.000000 14.0270 0 + 300 C4A 75 C4A C4 CH3 0.000000 15.0350 0 + 301 C4A 76 C4A C1 CH2 0.000000 14.0270 0 + 302 C4A 76 C4A C2 CH3 0.000000 15.0350 0 + 303 C4A 76 C4A C3 CH2 0.000000 14.0270 0 + 304 C4A 76 C4A C4 CH3 0.000000 15.0350 0 + 305 C4A 77 C4A C1 CH2 0.000000 14.0270 0 + 306 C4A 77 C4A C2 CH3 0.000000 15.0350 0 + 307 C4A 77 C4A C3 CH2 0.000000 14.0270 0 + 308 C4A 77 C4A C4 CH3 0.000000 15.0350 0 + 309 C4A 78 C4A C1 CH2 0.000000 14.0270 0 + 310 C4A 78 C4A C2 CH3 0.000000 15.0350 0 + 311 C4A 78 C4A C3 CH2 0.000000 14.0270 0 + 312 C4A 78 C4A C4 CH3 0.000000 15.0350 0 + 313 C4A 79 C4A C1 CH2 0.000000 14.0270 0 + 314 C4A 79 C4A C2 CH3 0.000000 15.0350 0 + 315 C4A 79 C4A C3 CH2 0.000000 14.0270 0 + 316 C4A 79 C4A C4 CH3 0.000000 15.0350 0 + 317 C4A 80 C4A C1 CH2 0.000000 14.0270 0 + 318 C4A 80 C4A C2 CH3 0.000000 15.0350 0 + 319 C4A 80 C4A C3 CH2 0.000000 14.0270 0 + 320 C4A 80 C4A C4 CH3 0.000000 15.0350 0 + 321 C4A 81 C4A C1 CH2 0.000000 14.0270 0 + 322 C4A 81 C4A C2 CH3 0.000000 15.0350 0 + 323 C4A 81 C4A C3 CH2 0.000000 14.0270 0 + 324 C4A 81 C4A C4 CH3 0.000000 15.0350 0 + 325 C4A 82 C4A C1 CH2 0.000000 14.0270 0 + 326 C4A 82 C4A C2 CH3 0.000000 15.0350 0 + 327 C4A 82 C4A C3 CH2 0.000000 14.0270 0 + 328 C4A 82 C4A C4 CH3 0.000000 15.0350 0 + 329 C4A 83 C4A C1 CH2 0.000000 14.0270 0 + 330 C4A 83 C4A C2 CH3 0.000000 15.0350 0 + 331 C4A 83 C4A C3 CH2 0.000000 14.0270 0 + 332 C4A 83 C4A C4 CH3 0.000000 15.0350 0 + 333 C4A 84 C4A C1 CH2 0.000000 14.0270 0 + 334 C4A 84 C4A C2 CH3 0.000000 15.0350 0 + 335 C4A 84 C4A C3 CH2 0.000000 14.0270 0 + 336 C4A 84 C4A C4 CH3 0.000000 15.0350 0 + 337 C4A 85 C4A C1 CH2 0.000000 14.0270 0 + 338 C4A 85 C4A C2 CH3 0.000000 15.0350 0 + 339 C4A 85 C4A C3 CH2 0.000000 14.0270 0 + 340 C4A 85 C4A C4 CH3 0.000000 15.0350 0 + 341 C4A 86 C4A C1 CH2 0.000000 14.0270 0 + 342 C4A 86 C4A C2 CH3 0.000000 15.0350 0 + 343 C4A 86 C4A C3 CH2 0.000000 14.0270 0 + 344 C4A 86 C4A C4 CH3 0.000000 15.0350 0 + 345 C4A 87 C4A C1 CH2 0.000000 14.0270 0 + 346 C4A 87 C4A C2 CH3 0.000000 15.0350 0 + 347 C4A 87 C4A C3 CH2 0.000000 14.0270 0 + 348 C4A 87 C4A C4 CH3 0.000000 15.0350 0 + 349 C4A 88 C4A C1 CH2 0.000000 14.0270 0 + 350 C4A 88 C4A C2 CH3 0.000000 15.0350 0 + 351 C4A 88 C4A C3 CH2 0.000000 14.0270 0 + 352 C4A 88 C4A C4 CH3 0.000000 15.0350 0 + 353 C4A 89 C4A C1 CH2 0.000000 14.0270 0 + 354 C4A 89 C4A C2 CH3 0.000000 15.0350 0 + 355 C4A 89 C4A C3 CH2 0.000000 14.0270 0 + 356 C4A 89 C4A C4 CH3 0.000000 15.0350 0 + 357 C4A 90 C4A C1 CH2 0.000000 14.0270 0 + 358 C4A 90 C4A C2 CH3 0.000000 15.0350 0 + 359 C4A 90 C4A C3 CH2 0.000000 14.0270 0 + 360 C4A 90 C4A C4 CH3 0.000000 15.0350 0 + 361 C1A 1 C1A C1 CH4 0.000000 16.0430 0 + 362 C1A 2 C1A C1 CH4 0.000000 16.0430 0 + 363 C1A 3 C1A C1 CH4 0.000000 16.0430 0 + 364 C1A 4 C1A C1 CH4 0.000000 16.0430 0 + 365 C1A 5 C1A C1 CH4 0.000000 16.0430 0 + 366 C1A 6 C1A C1 CH4 0.000000 16.0430 0 + 367 C1A 7 C1A C1 CH4 0.000000 16.0430 0 + 368 C1A 8 C1A C1 CH4 0.000000 16.0430 0 + 369 C1A 9 C1A C1 CH4 0.000000 16.0430 0 + 370 C1A 10 C1A C1 CH4 0.000000 16.0430 0 + + 270 !NBOND: bonds + 1 3 2 1 3 4 5 7 + 6 5 7 8 9 11 10 9 + 11 12 13 15 14 13 15 16 + 17 19 18 17 19 20 21 23 + 22 21 23 24 25 27 26 25 + 27 28 29 31 30 29 31 32 + 33 35 34 33 35 36 37 39 + 38 37 39 40 41 43 42 41 + 43 44 45 47 46 45 47 48 + 49 51 50 49 51 52 53 55 + 54 53 55 56 57 59 58 57 + 59 60 61 63 62 61 63 64 + 65 67 66 65 67 68 69 71 + 70 69 71 72 73 75 74 73 + 75 76 77 79 78 77 79 80 + 81 83 82 81 83 84 85 87 + 86 85 87 88 89 91 90 89 + 91 92 93 95 94 93 95 96 + 97 99 98 97 99 100 101 103 + 102 101 103 104 105 107 106 105 + 107 108 109 111 110 109 111 112 + 113 115 114 113 115 116 117 119 + 118 117 119 120 121 123 122 121 + 123 124 125 127 126 125 127 128 + 129 131 130 129 131 132 133 135 + 134 133 135 136 137 139 138 137 + 139 140 141 143 142 141 143 144 + 145 147 146 145 147 148 149 151 + 150 149 151 152 153 155 154 153 + 155 156 157 159 158 157 159 160 + 161 163 162 161 163 164 165 167 + 166 165 167 168 169 171 170 169 + 171 172 173 175 174 173 175 176 + 177 179 178 177 179 180 181 183 + 182 181 183 184 185 187 186 185 + 187 188 189 191 190 189 191 192 + 193 195 194 193 195 196 197 199 + 198 197 199 200 201 203 202 201 + 203 204 205 207 206 205 207 208 + 209 211 210 209 211 212 213 215 + 214 213 215 216 217 219 218 217 + 219 220 221 223 222 221 223 224 + 225 227 226 225 227 228 229 231 + 230 229 231 232 233 235 234 233 + 235 236 237 239 238 237 239 240 + 241 243 242 241 243 244 245 247 + 246 245 247 248 249 251 250 249 + 251 252 253 255 254 253 255 256 + 257 259 258 257 259 260 261 263 + 262 261 263 264 265 267 266 265 + 267 268 269 271 270 269 271 272 + 273 275 274 273 275 276 277 279 + 278 277 279 280 281 283 282 281 + 283 284 285 287 286 285 287 288 + 289 291 290 289 291 292 293 295 + 294 293 295 296 297 299 298 297 + 299 300 301 303 302 301 303 304 + 305 307 306 305 307 308 309 311 + 310 309 311 312 313 315 314 313 + 315 316 317 319 318 317 319 320 + 321 323 322 321 323 324 325 327 + 326 325 327 328 329 331 330 329 + 331 332 333 335 334 333 335 336 + 337 339 338 337 339 340 341 343 + 342 341 343 344 345 347 346 345 + 347 348 349 351 350 349 351 352 + 353 355 354 353 355 356 357 359 + 358 357 359 360 + + 180 !NTHETA: angles + 1 3 4 2 1 3 5 7 8 + 6 5 7 9 11 12 10 9 11 + 13 15 16 14 13 15 17 19 20 + 18 17 19 21 23 24 22 21 23 + 25 27 28 26 25 27 29 31 32 + 30 29 31 33 35 36 34 33 35 + 37 39 40 38 37 39 41 43 44 + 42 41 43 45 47 48 46 45 47 + 49 51 52 50 49 51 53 55 56 + 54 53 55 57 59 60 58 57 59 + 61 63 64 62 61 63 65 67 68 + 66 65 67 69 71 72 70 69 71 + 73 75 76 74 73 75 77 79 80 + 78 77 79 81 83 84 82 81 83 + 85 87 88 86 85 87 89 91 92 + 90 89 91 93 95 96 94 93 95 + 97 99 100 98 97 99 101 103 104 + 102 101 103 105 107 108 106 105 107 + 109 111 112 110 109 111 113 115 116 + 114 113 115 117 119 120 118 117 119 + 121 123 124 122 121 123 125 127 128 + 126 125 127 129 131 132 130 129 131 + 133 135 136 134 133 135 137 139 140 + 138 137 139 141 143 144 142 141 143 + 145 147 148 146 145 147 149 151 152 + 150 149 151 153 155 156 154 153 155 + 157 159 160 158 157 159 161 163 164 + 162 161 163 165 167 168 166 165 167 + 169 171 172 170 169 171 173 175 176 + 174 173 175 177 179 180 178 177 179 + 181 183 184 182 181 183 185 187 188 + 186 185 187 189 191 192 190 189 191 + 193 195 196 194 193 195 197 199 200 + 198 197 199 201 203 204 202 201 203 + 205 207 208 206 205 207 209 211 212 + 210 209 211 213 215 216 214 213 215 + 217 219 220 218 217 219 221 223 224 + 222 221 223 225 227 228 226 225 227 + 229 231 232 230 229 231 233 235 236 + 234 233 235 237 239 240 238 237 239 + 241 243 244 242 241 243 245 247 248 + 246 245 247 249 251 252 250 249 251 + 253 255 256 254 253 255 257 259 260 + 258 257 259 261 263 264 262 261 263 + 265 267 268 266 265 267 269 271 272 + 270 269 271 273 275 276 274 273 275 + 277 279 280 278 277 279 281 283 284 + 282 281 283 285 287 288 286 285 287 + 289 291 292 290 289 291 293 295 296 + 294 293 295 297 299 300 298 297 299 + 301 303 304 302 301 303 305 307 308 + 306 305 307 309 311 312 310 309 311 + 313 315 316 314 313 315 317 319 320 + 318 317 319 321 323 324 322 321 323 + 325 327 328 326 325 327 329 331 332 + 330 329 331 333 335 336 334 333 335 + 337 339 340 338 337 339 341 343 344 + 342 341 343 345 347 348 346 345 347 + 349 351 352 350 349 351 353 355 356 + 354 353 355 357 359 360 358 357 359 + + 90 !NPHI: dihedrals + 2 1 3 4 6 5 7 8 + 10 9 11 12 14 13 15 16 + 18 17 19 20 22 21 23 24 + 26 25 27 28 30 29 31 32 + 34 33 35 36 38 37 39 40 + 42 41 43 44 46 45 47 48 + 50 49 51 52 54 53 55 56 + 58 57 59 60 62 61 63 64 + 66 65 67 68 70 69 71 72 + 74 73 75 76 78 77 79 80 + 82 81 83 84 86 85 87 88 + 90 89 91 92 94 93 95 96 + 98 97 99 100 102 101 103 104 + 106 105 107 108 110 109 111 112 + 114 113 115 116 118 117 119 120 + 122 121 123 124 126 125 127 128 + 130 129 131 132 134 133 135 136 + 138 137 139 140 142 141 143 144 + 146 145 147 148 150 149 151 152 + 154 153 155 156 158 157 159 160 + 162 161 163 164 166 165 167 168 + 170 169 171 172 174 173 175 176 + 178 177 179 180 182 181 183 184 + 186 185 187 188 190 189 191 192 + 194 193 195 196 198 197 199 200 + 202 201 203 204 206 205 207 208 + 210 209 211 212 214 213 215 216 + 218 217 219 220 222 221 223 224 + 226 225 227 228 230 229 231 232 + 234 233 235 236 238 237 239 240 + 242 241 243 244 246 245 247 248 + 250 249 251 252 254 253 255 256 + 258 257 259 260 262 261 263 264 + 266 265 267 268 270 269 271 272 + 274 273 275 276 278 277 279 280 + 282 281 283 284 286 285 287 288 + 290 289 291 292 294 293 295 296 + 298 297 299 300 302 301 303 304 + 306 305 307 308 310 309 311 312 + 314 313 315 316 318 317 319 320 + 322 321 323 324 326 325 327 328 + 330 329 331 332 334 333 335 336 + 338 337 339 340 342 341 343 344 + 346 345 347 348 350 349 351 352 + 354 353 355 356 358 357 359 360 + + 0 !NIMPHI: impropers + + + 0 !NDON: donors + + + 0 !NACC: acceptors + + + 0 !NNB + + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 + + 1 0 !NGRP + 0 0 0 + diff --git a/example_file/methane_butane/setup_box_1.pdb b/example_file/methane_butane/setup_box_1.pdb new file mode 100644 index 000000000..31575ded7 --- /dev/null +++ b/example_file/methane_butane/setup_box_1.pdb @@ -0,0 +1,962 @@ +REMARK original generated coordinate pdb file +ATOM 1 C1 C4A A 1 7.266 21.883 18.738 1.00 0.00 C4A C +ATOM 2 C2 C4A A 1 6.313 22.281 17.596 1.00 0.00 C4A C +ATOM 3 C3 C4A A 1 8.712 22.244 18.349 1.00 0.00 C4A C +ATOM 4 C4 C4A A 1 9.666 21.846 19.490 1.00 0.00 C4A C +ATOM 5 C1 C4A A 2 13.979 6.979 19.307 1.00 0.00 C4A C +ATOM 6 C2 C4A A 2 12.454 7.093 19.138 1.00 0.00 C4A C +ATOM 7 C3 C4A A 2 14.465 8.040 20.312 1.00 0.00 C4A C +ATOM 8 C4 C4A A 2 15.991 7.926 20.483 1.00 0.00 C4A C +ATOM 9 C1 C4A A 3 12.218 3.000 17.007 1.00 0.00 C4A C +ATOM 10 C2 C4A A 3 12.250 3.177 18.536 1.00 0.00 C4A C +ATOM 11 C3 C4A A 3 13.639 3.177 16.440 1.00 0.00 C4A C +ATOM 12 C4 C4A A 3 13.608 3.000 14.910 1.00 0.00 C4A C +ATOM 13 C1 C4A A 4 11.310 19.746 4.510 1.00 0.00 C4A C +ATOM 14 C2 C4A A 4 10.997 20.103 3.045 1.00 0.00 C4A C +ATOM 15 C3 C4A A 4 11.509 18.224 4.637 1.00 0.00 C4A C +ATOM 16 C4 C4A A 4 11.823 17.867 6.101 1.00 0.00 C4A C +ATOM 17 C1 C4A A 5 17.161 14.968 10.578 1.00 0.00 C4A C +ATOM 18 C2 C4A A 5 18.221 15.631 9.681 1.00 0.00 C4A C +ATOM 19 C3 C4A A 5 17.851 14.302 11.783 1.00 0.00 C4A C +ATOM 20 C4 C4A A 5 16.791 13.639 12.682 1.00 0.00 C4A C +ATOM 21 C1 C4A A 6 8.380 23.567 21.251 1.00 0.00 C4A C +ATOM 22 C2 C4A A 6 7.888 24.241 19.957 1.00 0.00 C4A C +ATOM 23 C3 C4A A 6 7.672 22.210 21.424 1.00 0.00 C4A C +ATOM 24 C4 C4A A 6 8.164 21.535 22.718 1.00 0.00 C4A C +ATOM 25 C1 C4A A 7 4.374 6.675 16.732 1.00 0.00 C4A C +ATOM 26 C2 C4A A 7 4.310 8.156 17.148 1.00 0.00 C4A C +ATOM 27 C3 C4A A 7 3.000 6.232 16.196 1.00 0.00 C4A C +ATOM 28 C4 C4A A 7 3.063 4.751 15.779 1.00 0.00 C4A C +ATOM 29 C1 C4A A 8 4.024 19.092 22.803 1.00 0.00 C4A C +ATOM 30 C2 C4A A 8 3.645 18.800 24.266 1.00 0.00 C4A C +ATOM 31 C3 C4A A 8 3.000 20.067 22.192 1.00 0.00 C4A C +ATOM 32 C4 C4A A 8 3.378 20.359 20.728 1.00 0.00 C4A C +ATOM 33 C1 C4A A 9 19.438 22.848 3.603 1.00 0.00 C4A C +ATOM 34 C2 C4A A 9 19.861 21.496 3.000 1.00 0.00 C4A C +ATOM 35 C3 C4A A 9 20.693 23.648 4.000 1.00 0.00 C4A C +ATOM 36 C4 C4A A 9 20.271 25.001 4.604 1.00 0.00 C4A C +ATOM 37 C1 C4A A 10 25.000 24.256 8.741 1.00 0.00 C4A C +ATOM 38 C2 C4A A 10 24.265 25.000 7.611 1.00 0.00 C4A C +ATOM 39 C3 C4A A 10 24.265 24.492 10.074 1.00 0.00 C4A C +ATOM 40 C4 C4A A 10 25.000 23.748 11.204 1.00 0.00 C4A C +ATOM 41 C1 C4A A 11 10.238 24.331 4.021 1.00 0.00 C4A C +ATOM 42 C2 C4A A 11 11.176 25.000 3.000 1.00 0.00 C4A C +ATOM 43 C3 C4A A 11 8.853 25.000 3.961 1.00 0.00 C4A C +ATOM 44 C4 C4A A 11 7.914 24.331 4.983 1.00 0.00 C4A C +ATOM 45 C1 C4A A 12 21.401 4.658 23.790 1.00 0.00 C4A C +ATOM 46 C2 C4A A 12 20.059 5.336 24.121 1.00 0.00 C4A C +ATOM 47 C3 C4A A 12 21.205 3.679 22.617 1.00 0.00 C4A C +ATOM 48 C4 C4A A 12 22.547 3.000 22.285 1.00 0.00 C4A C +ATOM 49 C1 C4A A 13 17.831 11.280 21.387 1.00 0.00 C4A C +ATOM 50 C2 C4A A 13 18.195 12.101 22.638 1.00 0.00 C4A C +ATOM 51 C3 C4A A 13 18.623 9.959 21.391 1.00 0.00 C4A C +ATOM 52 C4 C4A A 13 18.259 9.138 20.141 1.00 0.00 C4A C +ATOM 53 C1 C4A A 14 8.322 22.036 5.886 1.00 0.00 C4A C +ATOM 54 C2 C4A A 14 7.841 21.045 4.811 1.00 0.00 C4A C +ATOM 55 C3 C4A A 14 9.779 22.443 5.595 1.00 0.00 C4A C +ATOM 56 C4 C4A A 14 10.261 23.434 6.670 1.00 0.00 C4A C +ATOM 57 C1 C4A A 15 12.974 8.168 7.034 1.00 0.00 C4A C +ATOM 58 C2 C4A A 15 12.693 6.952 6.133 1.00 0.00 C4A C +ATOM 59 C3 C4A A 15 14.255 8.877 6.556 1.00 0.00 C4A C +ATOM 60 C4 C4A A 15 14.537 10.094 7.456 1.00 0.00 C4A C +ATOM 61 C1 C4A A 16 21.453 3.200 17.547 1.00 0.00 C4A C +ATOM 62 C2 C4A A 16 22.673 4.103 17.292 1.00 0.00 C4A C +ATOM 63 C3 C4A A 16 20.487 3.904 18.519 1.00 0.00 C4A C +ATOM 64 C4 C4A A 16 19.266 3.001 18.774 1.00 0.00 C4A C +ATOM 65 C1 C4A A 17 9.453 3.767 4.752 1.00 0.00 C4A C +ATOM 66 C2 C4A A 17 10.196 3.035 5.884 1.00 0.00 C4A C +ATOM 67 C3 C4A A 17 8.163 3.000 4.405 1.00 0.00 C4A C +ATOM 68 C4 C4A A 17 7.419 3.731 3.272 1.00 0.00 C4A C +ATOM 69 C1 C4A A 18 10.945 10.113 25.000 1.00 0.00 C4A C +ATOM 70 C2 C4A A 18 12.315 9.645 24.474 1.00 0.00 C4A C +ATOM 71 C3 C4A A 18 10.574 11.456 24.344 1.00 0.00 C4A C +ATOM 72 C4 C4A A 18 9.205 11.924 24.869 1.00 0.00 C4A C +ATOM 73 C1 C4A A 19 25.000 25.000 19.956 1.00 0.00 C4A C +ATOM 74 C2 C4A A 19 24.999 24.982 18.417 1.00 0.00 C4A C +ATOM 75 C3 C4A A 19 24.999 23.554 20.486 1.00 0.00 C4A C +ATOM 76 C4 C4A A 19 25.000 23.571 22.026 1.00 0.00 C4A C +ATOM 77 C1 C4A A 20 20.581 11.589 22.093 1.00 0.00 C4A C +ATOM 78 C2 C4A A 20 21.878 10.806 22.365 1.00 0.00 C4A C +ATOM 79 C3 C4A A 20 20.863 12.713 21.079 1.00 0.00 C4A C +ATOM 80 C4 C4A A 20 19.566 13.498 20.806 1.00 0.00 C4A C +ATOM 81 C1 C4A A 21 19.184 18.164 12.487 1.00 0.00 C4A C +ATOM 82 C2 C4A A 21 18.438 17.170 13.395 1.00 0.00 C4A C +ATOM 83 C3 C4A A 21 20.692 18.111 12.798 1.00 0.00 C4A C +ATOM 84 C4 C4A A 21 21.439 19.105 11.890 1.00 0.00 C4A C +ATOM 85 C1 C4A A 22 23.888 23.307 16.930 1.00 0.00 C4A C +ATOM 86 C2 C4A A 22 23.105 23.358 18.255 1.00 0.00 C4A C +ATOM 87 C3 C4A A 22 23.151 22.394 15.933 1.00 0.00 C4A C +ATOM 88 C4 C4A A 22 23.933 22.342 14.608 1.00 0.00 C4A C +ATOM 89 C1 C4A A 23 23.617 5.367 2.998 1.00 0.00 C4A C +ATOM 90 C2 C4A A 23 22.358 6.253 2.999 1.00 0.00 C4A C +ATOM 91 C3 C4A A 23 23.203 3.887 3.098 1.00 0.00 C4A C +ATOM 92 C4 C4A A 23 24.461 3.000 3.097 1.00 0.00 C4A C +ATOM 93 C1 C4A A 24 12.698 15.191 24.773 1.00 0.00 C4A C +ATOM 94 C2 C4A A 24 14.211 15.019 25.000 1.00 0.00 C4A C +ATOM 95 C3 C4A A 24 12.049 13.808 24.572 1.00 0.00 C4A C +ATOM 96 C4 C4A A 24 10.536 13.979 24.345 1.00 0.00 C4A C +ATOM 97 C1 C4A A 25 16.029 8.415 14.692 1.00 0.00 C4A C +ATOM 98 C2 C4A A 25 16.861 9.314 15.624 1.00 0.00 C4A C +ATOM 99 C3 C4A A 25 16.103 6.957 15.183 1.00 0.00 C4A C +ATOM 100 C4 C4A A 25 15.271 6.058 14.251 1.00 0.00 C4A C +ATOM 101 C1 C4A A 26 17.366 5.968 21.207 1.00 0.00 C4A C +ATOM 102 C2 C4A A 26 16.415 5.289 20.203 1.00 0.00 C4A C +ATOM 103 C3 C4A A 26 18.824 5.638 20.836 1.00 0.00 C4A C +ATOM 104 C4 C4A A 26 19.775 6.316 21.839 1.00 0.00 C4A C +ATOM 105 C1 C4A A 27 3.000 5.295 6.791 1.00 0.00 C4A C +ATOM 106 C2 C4A A 27 3.279 5.131 8.296 1.00 0.00 C4A C +ATOM 107 C3 C4A A 27 3.616 4.111 6.023 1.00 0.00 C4A C +ATOM 108 C4 C4A A 27 3.337 4.275 4.517 1.00 0.00 C4A C +ATOM 109 C1 C4A A 28 21.971 3.062 13.597 1.00 0.00 C4A C +ATOM 110 C2 C4A A 28 22.068 2.999 15.132 1.00 0.00 C4A C +ATOM 111 C3 C4A A 28 20.511 3.325 13.185 1.00 0.00 C4A C +ATOM 112 C4 C4A A 28 20.414 3.388 11.649 1.00 0.00 C4A C +ATOM 113 C1 C4A A 29 6.931 7.313 3.028 1.00 0.00 C4A C +ATOM 114 C2 C4A A 29 5.741 6.336 3.055 1.00 0.00 C4A C +ATOM 115 C3 C4A A 29 8.249 6.516 3.027 1.00 0.00 C4A C +ATOM 116 C4 C4A A 29 9.440 7.493 3.000 1.00 0.00 C4A C +ATOM 117 C1 C4A A 30 16.031 3.000 19.276 1.00 0.00 C4A C +ATOM 118 C2 C4A A 30 16.668 3.505 17.968 1.00 0.00 C4A C +ATOM 119 C3 C4A A 30 14.582 3.513 19.372 1.00 0.00 C4A C +ATOM 120 C4 C4A A 30 13.944 3.009 20.679 1.00 0.00 C4A C +ATOM 121 C1 C4A A 31 5.087 18.634 19.552 1.00 0.00 C4A C +ATOM 122 C2 C4A A 31 5.375 20.098 19.173 1.00 0.00 C4A C +ATOM 123 C3 C4A A 31 5.580 17.706 18.427 1.00 0.00 C4A C +ATOM 124 C4 C4A A 31 5.292 16.241 18.805 1.00 0.00 C4A C +ATOM 125 C1 C4A A 32 16.232 13.845 8.278 1.00 0.00 C4A C +ATOM 126 C2 C4A A 32 16.602 14.573 6.973 1.00 0.00 C4A C +ATOM 127 C3 C4A A 32 17.432 13.007 8.757 1.00 0.00 C4A C +ATOM 128 C4 C4A A 32 17.063 12.279 10.062 1.00 0.00 C4A C +ATOM 129 C1 C4A A 33 12.285 7.592 21.887 1.00 0.00 C4A C +ATOM 130 C2 C4A A 33 13.116 7.557 23.182 1.00 0.00 C4A C +ATOM 131 C3 C4A A 33 10.985 6.792 22.090 1.00 0.00 C4A C +ATOM 132 C4 C4A A 33 10.153 6.826 20.794 1.00 0.00 C4A C +ATOM 133 C1 C4A A 34 10.705 21.638 10.218 1.00 0.00 C4A C +ATOM 134 C2 C4A A 34 9.461 20.936 10.792 1.00 0.00 C4A C +ATOM 135 C3 C4A A 34 10.797 21.365 8.705 1.00 0.00 C4A C +ATOM 136 C4 C4A A 34 12.041 22.067 8.130 1.00 0.00 C4A C +ATOM 137 C1 C4A A 35 21.121 24.776 23.480 1.00 0.00 C4A C +ATOM 138 C2 C4A A 35 21.021 25.000 25.000 1.00 0.00 C4A C +ATOM 139 C3 C4A A 35 22.574 25.000 23.022 1.00 0.00 C4A C +ATOM 140 C4 C4A A 35 22.674 24.776 21.502 1.00 0.00 C4A C +ATOM 141 C1 C4A A 36 23.220 6.566 14.143 1.00 0.00 C4A C +ATOM 142 C2 C4A A 36 23.311 5.064 14.469 1.00 0.00 C4A C +ATOM 143 C3 C4A A 36 22.278 7.253 15.149 1.00 0.00 C4A C +ATOM 144 C4 C4A A 36 22.186 8.756 14.823 1.00 0.00 C4A C +ATOM 145 C1 C4A A 37 17.646 20.114 13.755 1.00 0.00 C4A C +ATOM 146 C2 C4A A 37 18.862 19.668 14.587 1.00 0.00 C4A C +ATOM 147 C3 C4A A 37 17.301 21.576 14.092 1.00 0.00 C4A C +ATOM 148 C4 C4A A 37 16.084 22.022 13.260 1.00 0.00 C4A C +ATOM 149 C1 C4A A 38 4.003 22.864 3.797 1.00 0.00 C4A C +ATOM 150 C2 C4A A 38 3.806 21.561 3.000 1.00 0.00 C4A C +ATOM 151 C3 C4A A 38 4.981 22.612 4.959 1.00 0.00 C4A C +ATOM 152 C4 C4A A 38 5.179 23.914 5.756 1.00 0.00 C4A C +ATOM 153 C1 C4A A 39 20.700 14.223 7.901 1.00 0.00 C4A C +ATOM 154 C2 C4A A 39 19.190 14.424 7.677 1.00 0.00 C4A C +ATOM 155 C3 C4A A 39 21.470 14.681 6.648 1.00 0.00 C4A C +ATOM 156 C4 C4A A 39 22.980 14.480 6.871 1.00 0.00 C4A C +ATOM 157 C1 C4A A 40 10.636 25.000 13.519 1.00 0.00 C4A C +ATOM 158 C2 C4A A 40 10.863 24.529 14.967 1.00 0.00 C4A C +ATOM 159 C3 C4A A 40 9.297 24.443 13.002 1.00 0.00 C4A C +ATOM 160 C4 C4A A 40 9.069 24.914 11.553 1.00 0.00 C4A C +ATOM 161 C1 C4A A 41 23.734 19.437 10.956 1.00 0.00 C4A C +ATOM 162 C2 C4A A 41 24.135 18.257 10.052 1.00 0.00 C4A C +ATOM 163 C3 C4A A 41 25.000 20.083 11.549 1.00 0.00 C4A C +ATOM 164 C4 C4A A 41 24.600 21.263 12.453 1.00 0.00 C4A C +ATOM 165 C1 C4A A 42 16.948 18.279 25.000 1.00 0.00 C4A C +ATOM 166 C2 C4A A 42 15.412 18.357 24.946 1.00 0.00 C4A C +ATOM 167 C3 C4A A 42 17.537 19.701 24.941 1.00 0.00 C4A C +ATOM 168 C4 C4A A 42 19.074 19.623 24.995 1.00 0.00 C4A C +ATOM 169 C1 C4A A 43 12.362 23.133 22.470 1.00 0.00 C4A C +ATOM 170 C2 C4A A 43 12.682 24.613 22.196 1.00 0.00 C4A C +ATOM 171 C3 C4A A 43 11.156 22.700 21.615 1.00 0.00 C4A C +ATOM 172 C4 C4A A 43 10.836 21.219 21.889 1.00 0.00 C4A C +ATOM 173 C1 C4A A 44 4.939 25.000 14.331 1.00 0.00 C4A C +ATOM 174 C2 C4A A 44 3.634 24.391 14.875 1.00 0.00 C4A C +ATOM 175 C3 C4A A 44 5.255 24.391 12.952 1.00 0.00 C4A C +ATOM 176 C4 C4A A 44 6.560 25.000 12.408 1.00 0.00 C4A C +ATOM 177 C1 C4A A 45 11.404 9.241 14.139 1.00 0.00 C4A C +ATOM 178 C2 C4A A 45 10.144 9.912 14.716 1.00 0.00 C4A C +ATOM 179 C3 C4A A 45 12.285 10.305 13.458 1.00 0.00 C4A C +ATOM 180 C4 C4A A 45 13.546 9.635 12.881 1.00 0.00 C4A C +ATOM 181 C1 C4A A 46 7.154 12.174 10.831 1.00 0.00 C4A C +ATOM 182 C2 C4A A 46 8.215 13.196 11.278 1.00 0.00 C4A C +ATOM 183 C3 C4A A 46 6.693 12.505 9.399 1.00 0.00 C4A C +ATOM 184 C4 C4A A 46 5.632 11.484 8.951 1.00 0.00 C4A C +ATOM 185 C1 C4A A 47 3.815 19.502 7.630 1.00 0.00 C4A C +ATOM 186 C2 C4A A 47 4.314 19.191 6.207 1.00 0.00 C4A C +ATOM 187 C3 C4A A 47 3.550 21.013 7.762 1.00 0.00 C4A C +ATOM 188 C4 C4A A 47 3.052 21.325 9.185 1.00 0.00 C4A C +ATOM 189 C1 C4A A 48 14.585 19.351 6.629 1.00 0.00 C4A C +ATOM 190 C2 C4A A 48 13.235 19.798 7.221 1.00 0.00 C4A C +ATOM 191 C3 C4A A 48 14.545 19.490 5.096 1.00 0.00 C4A C +ATOM 192 C4 C4A A 48 15.894 19.044 4.504 1.00 0.00 C4A C +ATOM 193 C1 C4A A 49 14.623 23.739 14.683 1.00 0.00 C4A C +ATOM 194 C2 C4A A 49 15.279 25.000 14.091 1.00 0.00 C4A C +ATOM 195 C3 C4A A 49 13.130 23.711 14.304 1.00 0.00 C4A C +ATOM 196 C4 C4A A 49 12.474 22.450 14.896 1.00 0.00 C4A C +ATOM 197 C1 C4A A 50 10.018 10.735 4.522 1.00 0.00 C4A C +ATOM 198 C2 C4A A 50 9.858 10.900 3.000 1.00 0.00 C4A C +ATOM 199 C3 C4A A 50 9.607 9.308 4.929 1.00 0.00 C4A C +ATOM 200 C4 C4A A 50 9.767 9.141 6.452 1.00 0.00 C4A C +ATOM 201 C1 C4A A 51 21.237 19.409 3.000 1.00 0.00 C4A C +ATOM 202 C2 C4A A 51 22.528 19.298 3.831 1.00 0.00 C4A C +ATOM 203 C3 C4A A 51 20.036 18.966 3.856 1.00 0.00 C4A C +ATOM 204 C4 C4A A 51 18.744 19.077 3.025 1.00 0.00 C4A C +ATOM 205 C1 C4A A 52 23.539 17.590 17.330 1.00 0.00 C4A C +ATOM 206 C2 C4A A 52 23.321 18.478 18.569 1.00 0.00 C4A C +ATOM 207 C3 C4A A 52 24.771 18.088 16.552 1.00 0.00 C4A C +ATOM 208 C4 C4A A 52 24.990 17.201 15.312 1.00 0.00 C4A C +ATOM 209 C1 C4A A 53 20.045 12.889 15.683 1.00 0.00 C4A C +ATOM 210 C2 C4A A 53 19.223 13.233 16.938 1.00 0.00 C4A C +ATOM 211 C3 C4A A 53 20.476 11.412 15.739 1.00 0.00 C4A C +ATOM 212 C4 C4A A 53 21.299 11.068 14.484 1.00 0.00 C4A C +ATOM 213 C1 C4A A 54 5.335 13.656 7.583 1.00 0.00 C4A C +ATOM 214 C2 C4A A 54 5.507 12.690 6.397 1.00 0.00 C4A C +ATOM 215 C3 C4A A 54 6.446 14.722 7.542 1.00 0.00 C4A C +ATOM 216 C4 C4A A 54 6.275 15.689 8.729 1.00 0.00 C4A C +ATOM 217 C1 C4A A 55 4.883 10.276 3.000 1.00 0.00 C4A C +ATOM 218 C2 C4A A 55 4.728 8.745 3.005 1.00 0.00 C4A C +ATOM 219 C3 C4A A 55 3.495 10.933 3.105 1.00 0.00 C4A C +ATOM 220 C4 C4A A 55 3.649 12.466 3.101 1.00 0.00 C4A C +ATOM 221 C1 C4A A 56 24.668 10.251 11.597 1.00 0.00 C4A C +ATOM 222 C2 C4A A 56 23.899 9.633 10.415 1.00 0.00 C4A C +ATOM 223 C3 C4A A 56 24.232 11.716 11.783 1.00 0.00 C4A C +ATOM 224 C4 C4A A 56 25.000 12.335 12.965 1.00 0.00 C4A C +ATOM 225 C1 C4A A 57 3.000 10.045 12.598 1.00 0.00 C4A C +ATOM 226 C2 C4A A 57 3.125 8.785 11.723 1.00 0.00 C4A C +ATOM 227 C3 C4A A 57 3.125 11.300 11.713 1.00 0.00 C4A C +ATOM 228 C4 C4A A 57 3.000 12.561 12.588 1.00 0.00 C4A C +ATOM 229 C1 C4A A 58 4.807 13.074 10.938 1.00 0.00 C4A C +ATOM 230 C2 C4A A 58 5.478 14.260 11.654 1.00 0.00 C4A C +ATOM 231 C3 C4A A 58 3.725 13.600 9.976 1.00 0.00 C4A C +ATOM 232 C4 C4A A 58 3.054 12.414 9.260 1.00 0.00 C4A C +ATOM 233 C1 C4A A 59 19.703 10.886 24.326 1.00 0.00 C4A C +ATOM 234 C2 C4A A 59 18.242 10.863 24.809 1.00 0.00 C4A C +ATOM 235 C3 C4A A 59 20.448 12.053 25.000 1.00 0.00 C4A C +ATOM 236 C4 C4A A 59 21.910 12.078 24.517 1.00 0.00 C4A C +ATOM 237 C1 C4A A 60 7.001 23.367 10.057 1.00 0.00 C4A C +ATOM 238 C2 C4A A 60 7.651 22.861 11.357 1.00 0.00 C4A C +ATOM 239 C3 C4A A 60 5.783 22.488 9.715 1.00 0.00 C4A C +ATOM 240 C4 C4A A 60 5.132 22.994 8.415 1.00 0.00 C4A C +ATOM 241 C1 C4A A 61 10.767 18.672 10.030 1.00 0.00 C4A C +ATOM 242 C2 C4A A 61 10.881 18.462 8.509 1.00 0.00 C4A C +ATOM 243 C3 C4A A 61 11.881 17.884 10.743 1.00 0.00 C4A C +ATOM 244 C4 C4A A 61 11.767 18.094 12.264 1.00 0.00 C4A C +ATOM 245 C1 C4A A 62 14.802 13.869 14.546 1.00 0.00 C4A C +ATOM 246 C2 C4A A 62 13.912 13.314 15.673 1.00 0.00 C4A C +ATOM 247 C3 C4A A 62 14.463 15.352 14.308 1.00 0.00 C4A C +ATOM 248 C4 C4A A 62 15.353 15.908 13.181 1.00 0.00 C4A C +ATOM 249 C1 C4A A 63 24.944 7.873 16.774 1.00 0.00 C4A C +ATOM 250 C2 C4A A 63 25.000 9.071 15.809 1.00 0.00 C4A C +ATOM 251 C3 C4A A 63 25.000 6.561 15.969 1.00 0.00 C4A C +ATOM 252 C4 C4A A 63 24.944 5.363 16.934 1.00 0.00 C4A C +ATOM 253 C1 C4A A 64 3.000 16.446 19.796 1.00 0.00 C4A C +ATOM 254 C2 C4A A 64 3.102 17.433 18.620 1.00 0.00 C4A C +ATOM 255 C3 C4A A 64 3.201 17.203 21.122 1.00 0.00 C4A C +ATOM 256 C4 C4A A 64 3.099 16.215 22.299 1.00 0.00 C4A C +ATOM 257 C1 C4A A 65 12.536 23.853 4.883 1.00 0.00 C4A C +ATOM 258 C2 C4A A 65 12.867 24.053 6.373 1.00 0.00 C4A C +ATOM 259 C3 C4A A 65 12.795 22.386 4.492 1.00 0.00 C4A C +ATOM 260 C4 C4A A 65 12.465 22.185 3.002 1.00 0.00 C4A C +ATOM 261 C1 C4A A 66 10.398 3.227 8.443 1.00 0.00 C4A C +ATOM 262 C2 C4A A 66 9.305 3.000 9.503 1.00 0.00 C4A C +ATOM 263 C3 C4A A 66 10.370 4.696 7.982 1.00 0.00 C4A C +ATOM 264 C4 C4A A 66 11.463 4.923 6.922 1.00 0.00 C4A C +ATOM 265 C1 C4A A 67 24.425 14.389 8.912 1.00 0.00 C4A C +ATOM 266 C2 C4A A 67 25.000 15.733 9.396 1.00 0.00 C4A C +ATOM 267 C3 C4A A 67 25.000 13.246 9.769 1.00 0.00 C4A C +ATOM 268 C4 C4A A 67 24.426 11.902 9.286 1.00 0.00 C4A C +ATOM 269 C1 C4A A 68 19.322 6.042 10.365 1.00 0.00 C4A C +ATOM 270 C2 C4A A 68 18.532 4.936 11.089 1.00 0.00 C4A C +ATOM 271 C3 C4A A 68 18.398 7.247 10.108 1.00 0.00 C4A C +ATOM 272 C4 C4A A 68 19.187 8.354 9.384 1.00 0.00 C4A C +ATOM 273 C1 C4A A 69 5.575 4.693 18.576 1.00 0.00 C4A C +ATOM 274 C2 C4A A 69 5.389 5.182 20.024 1.00 0.00 C4A C +ATOM 275 C3 C4A A 69 7.076 4.512 18.284 1.00 0.00 C4A C +ATOM 276 C4 C4A A 69 7.263 4.023 16.836 1.00 0.00 C4A C +ATOM 277 C1 C4A A 70 14.630 16.568 7.169 1.00 0.00 C4A C +ATOM 278 C2 C4A A 70 13.499 17.255 7.956 1.00 0.00 C4A C +ATOM 279 C3 C4A A 70 14.081 16.055 5.824 1.00 0.00 C4A C +ATOM 280 C4 C4A A 70 15.211 15.367 5.036 1.00 0.00 C4A C +ATOM 281 C1 C4A A 71 9.312 12.470 15.334 1.00 0.00 C4A C +ATOM 282 C2 C4A A 71 10.170 13.599 14.734 1.00 0.00 C4A C +ATOM 283 C3 C4A A 71 8.272 13.072 16.297 1.00 0.00 C4A C +ATOM 284 C4 C4A A 71 7.414 11.943 16.897 1.00 0.00 C4A C +ATOM 285 C1 C4A A 72 7.528 13.298 4.193 1.00 0.00 C4A C +ATOM 286 C2 C4A A 72 6.267 12.430 4.029 1.00 0.00 C4A C +ATOM 287 C3 C4A A 72 8.508 13.004 3.043 1.00 0.00 C4A C +ATOM 288 C4 C4A A 72 9.769 13.872 3.206 1.00 0.00 C4A C +ATOM 289 C1 C4A A 73 7.640 16.959 15.334 1.00 0.00 C4A C +ATOM 290 C2 C4A A 73 6.474 17.691 16.024 1.00 0.00 C4A C +ATOM 291 C3 C4A A 73 8.851 17.904 15.232 1.00 0.00 C4A C +ATOM 292 C4 C4A A 73 10.017 17.173 14.541 1.00 0.00 C4A C +ATOM 293 C1 C4A A 74 13.698 3.000 6.316 1.00 0.00 C4A C +ATOM 294 C2 C4A A 74 12.610 3.167 5.239 1.00 0.00 C4A C +ATOM 295 C3 C4A A 74 13.071 3.179 7.711 1.00 0.00 C4A C +ATOM 296 C4 C4A A 74 14.158 3.012 8.789 1.00 0.00 C4A C +ATOM 297 C1 C4A A 75 15.268 3.669 13.165 1.00 0.00 C4A C +ATOM 298 C2 C4A A 75 15.545 3.000 11.807 1.00 0.00 C4A C +ATOM 299 C3 C4A A 75 16.200 3.067 14.233 1.00 0.00 C4A C +ATOM 300 C4 C4A A 75 15.924 3.735 15.593 1.00 0.00 C4A C +ATOM 301 C1 C4A A 76 17.248 14.918 23.229 1.00 0.00 C4A C +ATOM 302 C2 C4A A 76 16.069 14.240 22.506 1.00 0.00 C4A C +ATOM 303 C3 C4A A 76 17.832 13.953 24.277 1.00 0.00 C4A C +ATOM 304 C4 C4A A 76 19.010 14.631 25.000 1.00 0.00 C4A C +ATOM 305 C1 C4A A 77 8.032 16.717 22.707 1.00 0.00 C4A C +ATOM 306 C2 C4A A 77 9.366 16.008 22.408 1.00 0.00 C4A C +ATOM 307 C3 C4A A 77 6.869 15.725 22.517 1.00 0.00 C4A C +ATOM 308 C4 C4A A 77 5.535 16.434 22.816 1.00 0.00 C4A C +ATOM 309 C1 C4A A 78 6.077 9.508 12.576 1.00 0.00 C4A C +ATOM 310 C2 C4A A 78 5.351 10.202 11.409 1.00 0.00 C4A C +ATOM 311 C3 C4A A 78 5.041 9.006 13.599 1.00 0.00 C4A C +ATOM 312 C4 C4A A 78 5.767 8.312 14.767 1.00 0.00 C4A C +ATOM 313 C1 C4A A 79 14.592 12.815 6.357 1.00 0.00 C4A C +ATOM 314 C2 C4A A 79 14.428 11.596 5.432 1.00 0.00 C4A C +ATOM 315 C3 C4A A 79 13.316 12.997 7.199 1.00 0.00 C4A C +ATOM 316 C4 C4A A 79 13.479 14.216 8.125 1.00 0.00 C4A C +ATOM 317 C1 C4A A 80 5.882 17.400 5.440 1.00 0.00 C4A C +ATOM 318 C2 C4A A 80 6.876 18.568 5.298 1.00 0.00 C4A C +ATOM 319 C3 C4A A 80 6.581 16.082 5.060 1.00 0.00 C4A C +ATOM 320 C4 C4A A 80 5.587 14.914 5.202 1.00 0.00 C4A C +ATOM 321 C1 C4A A 81 3.519 8.147 5.879 1.00 0.00 C4A C +ATOM 322 C2 C4A A 81 3.028 9.127 4.797 1.00 0.00 C4A C +ATOM 323 C3 C4A A 81 3.000 8.601 7.256 1.00 0.00 C4A C +ATOM 324 C4 C4A A 81 3.490 7.622 8.339 1.00 0.00 C4A C +ATOM 325 C1 C4A A 82 15.672 19.018 9.109 1.00 0.00 C4A C +ATOM 326 C2 C4A A 82 16.612 18.287 8.134 1.00 0.00 C4A C +ATOM 327 C3 C4A A 82 16.470 20.070 9.902 1.00 0.00 C4A C +ATOM 328 C4 C4A A 82 15.529 20.801 10.877 1.00 0.00 C4A C +ATOM 329 C1 C4A A 83 24.839 13.332 4.470 1.00 0.00 C4A C +ATOM 330 C2 C4A A 83 25.000 14.172 3.190 1.00 0.00 C4A C +ATOM 331 C3 C4A A 83 25.002 11.839 4.127 1.00 0.00 C4A C +ATOM 332 C4 C4A A 83 24.841 10.998 5.407 1.00 0.00 C4A C +ATOM 333 C1 C4A A 84 20.725 21.975 15.314 1.00 0.00 C4A C +ATOM 334 C2 C4A A 84 21.313 22.627 14.049 1.00 0.00 C4A C +ATOM 335 C3 C4A A 84 21.422 20.626 15.567 1.00 0.00 C4A C +ATOM 336 C4 C4A A 84 20.835 19.973 16.832 1.00 0.00 C4A C +ATOM 337 C1 C4A A 85 5.424 23.970 22.430 1.00 0.00 C4A C +ATOM 338 C2 C4A A 85 6.437 25.000 21.897 1.00 0.00 C4A C +ATOM 339 C3 C4A A 85 4.014 24.588 22.429 1.00 0.00 C4A C +ATOM 340 C4 C4A A 85 3.000 23.559 22.961 1.00 0.00 C4A C +ATOM 341 C1 C4A A 86 3.000 17.501 4.915 1.00 0.00 C4A C +ATOM 342 C2 C4A A 86 3.627 16.366 5.744 1.00 0.00 C4A C +ATOM 343 C3 C4A A 86 3.996 17.955 3.831 1.00 0.00 C4A C +ATOM 344 C4 C4A A 86 3.370 19.091 3.001 1.00 0.00 C4A C +ATOM 345 C1 C4A A 87 7.247 11.909 21.720 1.00 0.00 C4A C +ATOM 346 C2 C4A A 87 8.579 12.138 22.457 1.00 0.00 C4A C +ATOM 347 C3 C4A A 87 6.169 11.475 22.730 1.00 0.00 C4A C +ATOM 348 C4 C4A A 87 4.836 11.247 21.994 1.00 0.00 C4A C +ATOM 349 C1 C4A A 88 7.137 9.025 6.020 1.00 0.00 C4A C +ATOM 350 C2 C4A A 88 7.853 7.685 5.767 1.00 0.00 C4A C +ATOM 351 C3 C4A A 88 5.813 9.055 5.236 1.00 0.00 C4A C +ATOM 352 C4 C4A A 88 5.096 10.394 5.488 1.00 0.00 C4A C +ATOM 353 C1 C4A A 89 22.719 15.893 10.406 1.00 0.00 C4A C +ATOM 354 C2 C4A A 89 22.733 14.428 10.879 1.00 0.00 C4A C +ATOM 355 C3 C4A A 89 22.465 15.940 8.888 1.00 0.00 C4A C +ATOM 356 C4 C4A A 89 22.450 17.405 8.414 1.00 0.00 C4A C +ATOM 357 C1 C4A A 90 19.080 4.120 16.047 1.00 0.00 C4A C +ATOM 358 C2 C4A A 90 18.843 3.000 15.018 1.00 0.00 C4A C +ATOM 359 C3 C4A A 90 20.442 4.785 15.778 1.00 0.00 C4A C +ATOM 360 C4 C4A A 90 20.680 5.906 16.807 1.00 0.00 C4A C +ATOM 361 C1 C4A A 91 17.645 17.143 21.183 1.00 0.00 C4A C +ATOM 362 C2 C4A A 91 16.989 17.315 22.565 1.00 0.00 C4A C +ATOM 363 C3 C4A A 91 17.990 15.659 20.959 1.00 0.00 C4A C +ATOM 364 C4 C4A A 91 18.647 15.486 19.577 1.00 0.00 C4A C +ATOM 365 C1 C4A A 92 7.044 5.985 14.946 1.00 0.00 C4A C +ATOM 366 C2 C4A A 92 7.034 6.719 16.299 1.00 0.00 C4A C +ATOM 367 C3 C4A A 92 8.436 5.370 14.706 1.00 0.00 C4A C +ATOM 368 C4 C4A A 92 8.447 4.636 13.353 1.00 0.00 C4A C +ATOM 369 C1 C4A A 93 4.437 13.022 23.708 1.00 0.00 C4A C +ATOM 370 C2 C4A A 93 4.508 12.187 25.000 1.00 0.00 C4A C +ATOM 371 C3 C4A A 93 3.071 12.806 23.031 1.00 0.00 C4A C +ATOM 372 C4 C4A A 93 3.000 13.641 21.739 1.00 0.00 C4A C +ATOM 373 C1 C4A A 94 15.218 3.743 23.853 1.00 0.00 C4A C +ATOM 374 C2 C4A A 94 13.957 3.034 23.328 1.00 0.00 C4A C +ATOM 375 C3 C4A A 94 16.471 3.009 23.340 1.00 0.00 C4A C +ATOM 376 C4 C4A A 94 17.734 3.718 23.864 1.00 0.00 C4A C +ATOM 377 C1 C4A A 95 24.968 20.332 18.051 1.00 0.00 C4A C +ATOM 378 C2 C4A A 95 24.999 20.822 16.592 1.00 0.00 C4A C +ATOM 379 C3 C4A A 95 24.998 21.544 19.000 1.00 0.00 C4A C +ATOM 380 C4 C4A A 95 24.967 21.055 20.460 1.00 0.00 C4A C +ATOM 381 C1 C4A A 96 14.928 22.932 21.645 1.00 0.00 C4A C +ATOM 382 C2 C4A A 96 14.261 22.570 20.305 1.00 0.00 C4A C +ATOM 383 C3 C4A A 96 15.939 21.835 22.028 1.00 0.00 C4A C +ATOM 384 C4 C4A A 96 16.607 22.197 23.367 1.00 0.00 C4A C +ATOM 385 C1 C4A A 97 22.014 3.610 8.892 1.00 0.00 C4A C +ATOM 386 C2 C4A A 97 20.633 2.998 9.189 1.00 0.00 C4A C +ATOM 387 C3 C4A A 97 22.106 5.007 9.533 1.00 0.00 C4A C +ATOM 388 C4 C4A A 97 23.487 5.620 9.236 1.00 0.00 C4A C +ATOM 389 C1 C4A A 98 18.599 11.755 3.403 1.00 0.00 C4A C +ATOM 390 C2 C4A A 98 20.025 12.171 3.000 1.00 0.00 C4A C +ATOM 391 C3 C4A A 98 18.639 11.034 4.763 1.00 0.00 C4A C +ATOM 392 C4 C4A A 98 17.213 10.617 5.167 1.00 0.00 C4A C +ATOM 393 C1 C4A A 99 21.436 9.102 19.097 1.00 0.00 C4A C +ATOM 394 C2 C4A A 99 21.028 9.288 20.570 1.00 0.00 C4A C +ATOM 395 C3 C4A A 99 20.179 9.138 18.207 1.00 0.00 C4A C +ATOM 396 C4 C4A A 99 20.586 8.952 16.734 1.00 0.00 C4A C +ATOM 397 C1 C4A A 100 9.022 11.304 9.262 1.00 0.00 C4A C +ATOM 398 C2 C4A A 100 9.089 9.854 8.750 1.00 0.00 C4A C +ATOM 399 C3 C4A A 100 9.851 12.214 8.336 1.00 0.00 C4A C +ATOM 400 C4 C4A A 100 9.785 13.665 8.847 1.00 0.00 C4A C +ATOM 401 C1 C4A A 101 21.897 13.528 14.130 1.00 0.00 C4A C +ATOM 402 C2 C4A A 101 20.752 13.130 13.181 1.00 0.00 C4A C +ATOM 403 C3 C4A A 101 23.125 13.953 13.303 1.00 0.00 C4A C +ATOM 404 C4 C4A A 101 24.271 14.351 14.251 1.00 0.00 C4A C +ATOM 405 C1 C4A A 102 22.340 11.228 3.040 1.00 0.00 C4A C +ATOM 406 C2 C4A A 102 22.924 12.652 3.000 1.00 0.00 C4A C +ATOM 407 C3 C4A A 102 23.488 10.202 2.998 1.00 0.00 C4A C +ATOM 408 C4 C4A A 102 22.905 8.777 3.038 1.00 0.00 C4A C +ATOM 409 C1 C4A A 103 10.015 19.112 19.386 1.00 0.00 C4A C +ATOM 410 C2 C4A A 103 8.606 19.262 19.988 1.00 0.00 C4A C +ATOM 411 C3 C4A A 103 10.946 18.449 20.418 1.00 0.00 C4A C +ATOM 412 C4 C4A A 103 12.356 18.299 19.817 1.00 0.00 C4A C +ATOM 413 C1 C4A A 104 16.397 24.645 22.906 1.00 0.00 C4A C +ATOM 414 C2 C4A A 104 16.313 25.000 21.410 1.00 0.00 C4A C +ATOM 415 C3 C4A A 104 14.979 24.602 23.504 1.00 0.00 C4A C +ATOM 416 C4 C4A A 104 15.062 24.247 25.000 1.00 0.00 C4A C +ATOM 417 C1 C4A A 105 8.154 15.542 24.917 1.00 0.00 C4A C +ATOM 418 C2 C4A A 105 6.668 15.937 25.000 1.00 0.00 C4A C +ATOM 419 C3 C4A A 105 9.028 16.807 24.999 1.00 0.00 C4A C +ATOM 420 C4 C4A A 105 10.514 16.413 24.916 1.00 0.00 C4A C +ATOM 421 C1 C4A A 106 21.624 9.213 12.103 1.00 0.00 C4A C +ATOM 422 C2 C4A A 106 21.171 10.660 11.833 1.00 0.00 C4A C +ATOM 423 C3 C4A A 106 21.328 8.343 10.868 1.00 0.00 C4A C +ATOM 424 C4 C4A A 106 21.780 6.896 11.138 1.00 0.00 C4A C +ATOM 425 C1 C4A A 107 12.133 18.899 14.861 1.00 0.00 C4A C +ATOM 426 C2 C4A A 107 11.518 20.093 14.107 1.00 0.00 C4A C +ATOM 427 C3 C4A A 107 12.924 19.413 16.078 1.00 0.00 C4A C +ATOM 428 C4 C4A A 107 13.539 18.219 16.832 1.00 0.00 C4A C +ATOM 429 C1 C4A A 108 8.637 14.113 18.815 1.00 0.00 C4A C +ATOM 430 C2 C4A A 108 7.779 12.994 19.433 1.00 0.00 C4A C +ATOM 431 C3 C4A A 108 8.767 15.274 19.818 1.00 0.00 C4A C +ATOM 432 C4 C4A A 108 9.625 16.394 19.201 1.00 0.00 C4A C +ATOM 433 C1 C4A A 109 12.725 14.552 18.977 1.00 0.00 C4A C +ATOM 434 C2 C4A A 109 12.198 15.912 18.483 1.00 0.00 C4A C +ATOM 435 C3 C4A A 109 11.935 13.418 18.297 1.00 0.00 C4A C +ATOM 436 C4 C4A A 109 12.462 12.057 18.791 1.00 0.00 C4A C +ATOM 437 C1 C4A A 110 12.426 7.833 3.808 1.00 0.00 C4A C +ATOM 438 C2 C4A A 110 11.560 8.817 3.000 1.00 0.00 C4A C +ATOM 439 C3 C4A A 110 12.100 6.391 3.379 1.00 0.00 C4A C +ATOM 440 C4 C4A A 110 12.965 5.406 4.187 1.00 0.00 C4A C +ATOM 441 C1 C4A A 111 16.774 10.597 13.226 1.00 0.00 C4A C +ATOM 442 C2 C4A A 111 15.521 11.387 13.644 1.00 0.00 C4A C +ATOM 443 C3 C4A A 111 16.657 10.193 11.744 1.00 0.00 C4A C +ATOM 444 C4 C4A A 111 17.910 9.403 11.325 1.00 0.00 C4A C +ATOM 445 C1 C4A A 112 21.863 22.249 10.476 1.00 0.00 C4A C +ATOM 446 C2 C4A A 112 22.211 21.731 11.883 1.00 0.00 C4A C +ATOM 447 C3 C4A A 112 20.597 21.536 9.965 1.00 0.00 C4A C +ATOM 448 C4 C4A A 112 20.248 22.054 8.557 1.00 0.00 C4A C +ATOM 449 C1 C4A A 113 20.309 5.479 6.034 1.00 0.00 C4A C +ATOM 450 C2 C4A A 113 21.409 5.125 5.017 1.00 0.00 C4A C +ATOM 451 C3 C4A A 113 20.316 4.449 7.178 1.00 0.00 C4A C +ATOM 452 C4 C4A A 113 19.217 4.803 8.196 1.00 0.00 C4A C +ATOM 453 C1 C4A A 114 25.000 14.261 22.223 1.00 0.00 C4A C +ATOM 454 C2 C4A A 114 24.415 15.599 21.736 1.00 0.00 C4A C +ATOM 455 C3 C4A A 114 23.897 13.186 22.219 1.00 0.00 C4A C +ATOM 456 C4 C4A A 114 24.481 11.847 22.706 1.00 0.00 C4A C +ATOM 457 C1 C4A A 115 18.068 21.235 7.644 1.00 0.00 C4A C +ATOM 458 C2 C4A A 115 17.164 22.314 8.269 1.00 0.00 C4A C +ATOM 459 C3 C4A A 115 17.216 20.294 6.771 1.00 0.00 C4A C +ATOM 460 C4 C4A A 115 18.119 19.215 6.146 1.00 0.00 C4A C +ATOM 461 C1 C4A A 116 23.275 6.665 21.822 1.00 0.00 C4A C +ATOM 462 C2 C4A A 116 23.056 7.413 20.494 1.00 0.00 C4A C +ATOM 463 C3 C4A A 116 24.780 6.626 22.147 1.00 0.00 C4A C +ATOM 464 C4 C4A A 116 25.000 5.878 23.475 1.00 0.00 C4A C +ATOM 465 C1 C4A A 117 16.588 5.805 24.641 1.00 0.00 C4A C +ATOM 466 C2 C4A A 117 17.755 6.224 23.729 1.00 0.00 C4A C +ATOM 467 C3 C4A A 117 15.272 6.382 24.088 1.00 0.00 C4A C +ATOM 468 C4 C4A A 117 14.103 5.963 25.000 1.00 0.00 C4A C +ATOM 469 C1 C4A A 118 11.522 15.469 13.007 1.00 0.00 C4A C +ATOM 470 C2 C4A A 118 12.818 15.563 12.181 1.00 0.00 C4A C +ATOM 471 C3 C4A A 118 10.314 15.363 12.057 1.00 0.00 C4A C +ATOM 472 C4 C4A A 118 9.018 15.269 12.883 1.00 0.00 C4A C +ATOM 473 C1 C4A A 119 16.372 21.869 17.326 1.00 0.00 C4A C +ATOM 474 C2 C4A A 119 15.794 23.283 17.133 1.00 0.00 C4A C +ATOM 475 C3 C4A A 119 17.793 21.811 16.735 1.00 0.00 C4A C +ATOM 476 C4 C4A A 119 18.373 20.398 16.928 1.00 0.00 C4A C +ATOM 477 C1 C4A A 120 16.429 10.856 18.037 1.00 0.00 C4A C +ATOM 478 C2 C4A A 120 17.919 10.538 17.816 1.00 0.00 C4A C +ATOM 479 C3 C4A A 120 15.620 9.546 18.049 1.00 0.00 C4A C +ATOM 480 C4 C4A A 120 14.130 9.863 18.270 1.00 0.00 C4A C +ATOM 481 C1 C4A A 121 11.131 4.610 14.583 1.00 0.00 C4A C +ATOM 482 C2 C4A A 121 12.371 5.132 15.331 1.00 0.00 C4A C +ATOM 483 C3 C4A A 121 11.558 3.523 13.578 1.00 0.00 C4A C +ATOM 484 C4 C4A A 121 10.318 3.000 12.829 1.00 0.00 C4A C +ATOM 485 C1 C4A A 122 10.024 21.418 25.000 1.00 0.00 C4A C +ATOM 486 C2 C4A A 122 11.203 20.440 24.840 1.00 0.00 C4A C +ATOM 487 C3 C4A A 122 10.280 22.674 24.147 1.00 0.00 C4A C +ATOM 488 C4 C4A A 122 9.102 23.653 24.306 1.00 0.00 C4A C +ATOM 489 C1 C4A A 123 14.680 12.300 3.040 1.00 0.00 C4A C +ATOM 490 C2 C4A A 123 15.915 11.383 3.110 1.00 0.00 C4A C +ATOM 491 C3 C4A A 123 13.401 11.443 3.070 1.00 0.00 C4A C +ATOM 492 C4 C4A A 123 12.166 12.359 3.000 1.00 0.00 C4A C +ATOM 493 C1 C4A A 124 17.505 3.587 6.840 1.00 0.00 C4A C +ATOM 494 C2 C4A A 124 16.040 3.237 7.158 1.00 0.00 C4A C +ATOM 495 C3 C4A A 124 17.889 2.994 5.472 1.00 0.00 C4A C +ATOM 496 C4 C4A A 124 19.354 3.344 5.153 1.00 0.00 C4A C +ATOM 497 C1 C4A A 125 17.691 21.734 19.656 1.00 0.00 C4A C +ATOM 498 C2 C4A A 125 16.784 22.943 19.951 1.00 0.00 C4A C +ATOM 499 C3 C4A A 125 16.884 20.433 19.821 1.00 0.00 C4A C +ATOM 500 C4 C4A A 125 17.790 19.224 19.526 1.00 0.00 C4A C +ATOM 501 C1 C4A A 126 21.070 17.291 16.312 1.00 0.00 C4A C +ATOM 502 C2 C4A A 126 21.854 18.126 15.283 1.00 0.00 C4A C +ATOM 503 C3 C4A A 126 19.561 17.533 16.126 1.00 0.00 C4A C +ATOM 504 C4 C4A A 126 18.776 16.697 17.155 1.00 0.00 C4A C +ATOM 505 C1 C4A A 127 15.796 10.894 23.757 1.00 0.00 C4A C +ATOM 506 C2 C4A A 127 15.199 11.911 22.767 1.00 0.00 C4A C +ATOM 507 C3 C4A A 127 14.780 9.766 24.010 1.00 0.00 C4A C +ATOM 508 C4 C4A A 127 15.376 8.748 25.000 1.00 0.00 C4A C +ATOM 509 C1 C4A A 128 6.194 8.573 21.894 1.00 0.00 C4A C +ATOM 510 C2 C4A A 128 5.382 9.028 20.667 1.00 0.00 C4A C +ATOM 511 C3 C4A A 128 7.374 7.697 21.432 1.00 0.00 C4A C +ATOM 512 C4 C4A A 128 8.187 7.242 22.658 1.00 0.00 C4A C +ATOM 513 C1 C4A A 129 24.990 5.951 11.206 1.00 0.00 C4A C +ATOM 514 C2 C4A A 129 24.999 7.485 11.067 1.00 0.00 C4A C +ATOM 515 C3 C4A A 129 25.002 5.571 12.698 1.00 0.00 C4A C +ATOM 516 C4 C4A A 129 24.992 4.038 12.839 1.00 0.00 C4A C +ATOM 517 C1 C4A A 130 3.013 9.159 21.703 1.00 0.00 C4A C +ATOM 518 C2 C4A A 130 3.000 9.914 23.045 1.00 0.00 C4A C +ATOM 519 C3 C4A A 130 3.000 10.173 20.544 1.00 0.00 C4A C +ATOM 520 C4 C4A A 130 3.013 9.418 19.201 1.00 0.00 C4A C +ATOM 521 C1 C4A A 131 9.666 10.298 20.557 1.00 0.00 C4A C +ATOM 522 C2 C4A A 131 8.459 10.284 19.600 1.00 0.00 C4A C +ATOM 523 C3 C4A A 131 9.428 9.291 21.698 1.00 0.00 C4A C +ATOM 524 C4 C4A A 131 10.634 9.304 22.655 1.00 0.00 C4A C +ATOM 525 C1 C4A A 132 10.433 4.542 23.862 1.00 0.00 C4A C +ATOM 526 C2 C4A A 132 10.689 3.321 22.960 1.00 0.00 C4A C +ATOM 527 C3 C4A A 132 11.754 5.301 24.086 1.00 0.00 C4A C +ATOM 528 C4 C4A A 132 11.499 6.523 24.989 1.00 0.00 C4A C +ATOM 529 C1 C4A A 133 11.722 16.347 3.000 1.00 0.00 C4A C +ATOM 530 C2 C4A A 133 10.189 16.363 3.138 1.00 0.00 C4A C +ATOM 531 C3 C4A A 133 12.238 14.906 3.173 1.00 0.00 C4A C +ATOM 532 C4 C4A A 133 13.771 14.888 3.035 1.00 0.00 C4A C +ATOM 533 C1 C4A A 134 10.495 18.412 23.415 1.00 0.00 C4A C +ATOM 534 C2 C4A A 134 9.458 19.114 22.520 1.00 0.00 C4A C +ATOM 535 C3 C4A A 134 11.914 18.776 22.941 1.00 0.00 C4A C +ATOM 536 C4 C4A A 134 12.952 18.075 23.836 1.00 0.00 C4A C +ATOM 537 C1 C4A A 135 12.260 7.665 9.555 1.00 0.00 C4A C +ATOM 538 C2 C4A A 135 12.521 8.028 11.028 1.00 0.00 C4A C +ATOM 539 C3 C4A A 135 10.743 7.552 9.315 1.00 0.00 C4A C +ATOM 540 C4 C4A A 135 10.481 7.189 7.841 1.00 0.00 C4A C +ATOM 541 C1 C4A A 136 3.151 17.132 8.317 1.00 0.00 C4A C +ATOM 542 C2 C4A A 136 3.071 18.067 9.537 1.00 0.00 C4A C +ATOM 543 C3 C4A A 136 3.000 15.671 8.779 1.00 0.00 C4A C +ATOM 544 C4 C4A A 136 3.080 14.735 7.559 1.00 0.00 C4A C +ATOM 545 C1 C4A A 137 23.159 12.882 18.025 1.00 0.00 C4A C +ATOM 546 C2 C4A A 137 22.546 12.999 16.618 1.00 0.00 C4A C +ATOM 547 C3 C4A A 137 24.384 13.810 18.130 1.00 0.00 C4A C +ATOM 548 C4 C4A A 137 24.997 13.694 19.538 1.00 0.00 C4A C +ATOM 549 C1 C4A A 138 18.700 24.929 19.125 1.00 0.00 C4A C +ATOM 550 C2 C4A A 138 17.252 24.998 18.607 1.00 0.00 C4A C +ATOM 551 C3 C4A A 138 18.699 25.000 20.663 1.00 0.00 C4A C +ATOM 552 C4 C4A A 138 20.147 24.932 21.183 1.00 0.00 C4A C +ATOM 553 C1 C4A A 139 16.258 5.801 5.868 1.00 0.00 C4A C +ATOM 554 C2 C4A A 139 15.079 4.900 5.457 1.00 0.00 C4A C +ATOM 555 C3 C4A A 139 16.419 5.768 7.399 1.00 0.00 C4A C +ATOM 556 C4 C4A A 139 17.599 6.669 7.811 1.00 0.00 C4A C +ATOM 557 C1 C4A A 140 9.278 3.157 20.343 1.00 0.00 C4A C +ATOM 558 C2 C4A A 140 9.368 3.000 18.814 1.00 0.00 C4A C +ATOM 559 C3 C4A A 140 8.558 4.475 20.683 1.00 0.00 C4A C +ATOM 560 C4 C4A A 140 8.468 4.633 22.212 1.00 0.00 C4A C +ATOM 561 C1 C4A A 141 4.528 3.066 8.948 1.00 0.00 C4A C +ATOM 562 C2 C4A A 141 5.996 3.000 8.489 1.00 0.00 C4A C +ATOM 563 C3 C4A A 141 4.468 3.000 10.486 1.00 0.00 C4A C +ATOM 564 C4 C4A A 141 3.000 3.066 10.946 1.00 0.00 C4A C +ATOM 565 C1 C4A A 142 6.114 13.777 14.888 1.00 0.00 C4A C +ATOM 566 C2 C4A A 142 5.518 15.097 14.366 1.00 0.00 C4A C +ATOM 567 C3 C4A A 142 5.553 12.600 14.068 1.00 0.00 C4A C +ATOM 568 C4 C4A A 142 6.149 11.280 14.590 1.00 0.00 C4A C +ATOM 569 C1 C4A A 143 11.390 15.595 21.000 1.00 0.00 C4A C +ATOM 570 C2 C4A A 143 12.617 16.300 21.606 1.00 0.00 C4A C +ATOM 571 C3 C4A A 143 11.442 14.093 21.336 1.00 0.00 C4A C +ATOM 572 C4 C4A A 143 10.215 13.387 20.730 1.00 0.00 C4A C +ATOM 573 C1 C4A A 144 25.002 5.886 7.265 1.00 0.00 C4A C +ATOM 574 C2 C4A A 144 24.909 7.247 7.979 1.00 0.00 C4A C +ATOM 575 C3 C4A A 144 24.130 5.911 5.996 1.00 0.00 C4A C +ATOM 576 C4 C4A A 144 24.222 4.550 5.282 1.00 0.00 C4A C +ATOM 577 C1 C4A A 145 20.249 24.493 15.879 1.00 0.00 C4A C +ATOM 578 C2 C4A A 145 19.314 23.884 16.939 1.00 0.00 C4A C +ATOM 579 C3 C4A A 145 21.708 24.390 16.361 1.00 0.00 C4A C +ATOM 580 C4 C4A A 145 22.644 25.000 15.302 1.00 0.00 C4A C +ATOM 581 C1 C4A A 146 24.999 11.150 17.708 1.00 0.00 C4A C +ATOM 582 C2 C4A A 146 24.820 11.951 16.405 1.00 0.00 C4A C +ATOM 583 C3 C4A A 146 23.893 10.083 17.810 1.00 0.00 C4A C +ATOM 584 C4 C4A A 146 24.071 9.281 19.112 1.00 0.00 C4A C +ATOM 585 C1 C4A A 147 16.455 18.086 16.028 1.00 0.00 C4A C +ATOM 586 C2 C4A A 147 16.565 16.635 15.527 1.00 0.00 C4A C +ATOM 587 C3 C4A A 147 15.567 18.896 15.065 1.00 0.00 C4A C +ATOM 588 C4 C4A A 147 15.457 20.348 15.565 1.00 0.00 C4A C +ATOM 589 C1 C4A A 148 5.318 17.896 12.713 1.00 0.00 C4A C +ATOM 590 C2 C4A A 148 5.052 18.672 14.016 1.00 0.00 C4A C +ATOM 591 C3 C4A A 148 6.626 17.094 12.851 1.00 0.00 C4A C +ATOM 592 C4 C4A A 148 6.893 16.318 11.548 1.00 0.00 C4A C +ATOM 593 C1 C4A A 149 5.324 19.790 9.602 1.00 0.00 C4A C +ATOM 594 C2 C4A A 149 4.492 19.744 10.897 1.00 0.00 C4A C +ATOM 595 C3 C4A A 149 5.515 18.360 9.064 1.00 0.00 C4A C +ATOM 596 C4 C4A A 149 6.347 18.404 7.769 1.00 0.00 C4A C +ATOM 597 C1 C4A A 150 5.300 7.283 10.775 1.00 0.00 C4A C +ATOM 598 C2 C4A A 150 6.581 7.250 11.630 1.00 0.00 C4A C +ATOM 599 C3 C4A A 150 4.281 6.275 11.339 1.00 0.00 C4A C +ATOM 600 C4 C4A A 150 3.000 6.307 10.485 1.00 0.00 C4A C +ATOM 601 C1 C4A A 151 25.001 3.121 20.263 1.00 0.00 C4A C +ATOM 602 C2 C4A A 151 24.733 4.029 21.477 1.00 0.00 C4A C +ATOM 603 C3 C4A A 151 24.732 3.907 18.965 1.00 0.00 C4A C +ATOM 604 C4 C4A A 151 25.000 3.000 17.750 1.00 0.00 C4A C +ATOM 605 C1 C4A A 152 16.227 23.025 4.202 1.00 0.00 C4A C +ATOM 606 C2 C4A A 152 16.833 23.433 5.558 1.00 0.00 C4A C +ATOM 607 C3 C4A A 152 15.483 21.685 4.355 1.00 0.00 C4A C +ATOM 608 C4 C4A A 152 14.877 21.276 3.000 1.00 0.00 C4A C +ATOM 609 C1 C4A A 153 21.450 19.819 22.746 1.00 0.00 C4A C +ATOM 610 C2 C4A A 153 22.370 20.220 21.579 1.00 0.00 C4A C +ATOM 611 C3 C4A A 153 22.204 18.864 23.691 1.00 0.00 C4A C +ATOM 612 C4 C4A A 153 21.284 18.463 24.859 1.00 0.00 C4A C +ATOM 613 C1 C4A A 154 13.780 22.780 10.200 1.00 0.00 C4A C +ATOM 614 C2 C4A A 154 15.150 23.313 9.744 1.00 0.00 C4A C +ATOM 615 C3 C4A A 154 13.761 22.659 11.735 1.00 0.00 C4A C +ATOM 616 C4 C4A A 154 12.390 22.126 12.192 1.00 0.00 C4A C +ATOM 617 C1 C4A A 155 20.866 24.102 7.264 1.00 0.00 C4A C +ATOM 618 C2 C4A A 155 22.013 24.543 6.337 1.00 0.00 C4A C +ATOM 619 C3 C4A A 155 19.637 24.999 7.022 1.00 0.00 C4A C +ATOM 620 C4 C4A A 155 18.489 24.559 7.949 1.00 0.00 C4A C +ATOM 621 C1 C4A A 156 22.970 9.808 6.717 1.00 0.00 C4A C +ATOM 622 C2 C4A A 156 22.486 10.106 5.286 1.00 0.00 C4A C +ATOM 623 C3 C4A A 156 22.250 8.556 7.252 1.00 0.00 C4A C +ATOM 624 C4 C4A A 156 22.733 8.257 8.683 1.00 0.00 C4A C +ATOM 625 C1 C4A A 157 19.930 7.914 14.151 1.00 0.00 C4A C +ATOM 626 C2 C4A A 157 19.025 9.109 13.803 1.00 0.00 C4A C +ATOM 627 C3 C4A A 157 20.041 6.981 12.931 1.00 0.00 C4A C +ATOM 628 C4 C4A A 157 20.946 5.785 13.278 1.00 0.00 C4A C +ATOM 629 C1 C4A A 158 3.508 15.584 16.769 1.00 0.00 C4A C +ATOM 630 C2 C4A A 158 4.584 14.483 16.790 1.00 0.00 C4A C +ATOM 631 C3 C4A A 158 4.076 16.844 16.091 1.00 0.00 C4A C +ATOM 632 C4 C4A A 158 3.000 17.946 16.070 1.00 0.00 C4A C +ATOM 633 C1 C4A A 159 19.321 22.939 23.498 1.00 0.00 C4A C +ATOM 634 C2 C4A A 159 19.658 21.442 23.381 1.00 0.00 C4A C +ATOM 635 C3 C4A A 159 18.706 23.221 24.882 1.00 0.00 C4A C +ATOM 636 C4 C4A A 159 18.369 24.719 25.000 1.00 0.00 C4A C +ATOM 637 C1 C4A A 160 20.186 18.215 20.125 1.00 0.00 C4A C +ATOM 638 C2 C4A A 160 20.846 17.223 19.150 1.00 0.00 C4A C +ATOM 639 C3 C4A A 160 20.649 19.646 19.794 1.00 0.00 C4A C +ATOM 640 C4 C4A A 160 19.989 20.639 20.769 1.00 0.00 C4A C +ATOM 641 C1 C4A A 161 11.078 5.352 10.453 1.00 0.00 C4A C +ATOM 642 C2 C4A A 161 12.150 4.514 9.732 1.00 0.00 C4A C +ATOM 643 C3 C4A A 161 11.404 5.419 11.956 1.00 0.00 C4A C +ATOM 644 C4 C4A A 161 10.331 6.257 12.678 1.00 0.00 C4A C +ATOM 645 C1 C4A A 162 11.161 10.029 10.380 1.00 0.00 C4A C +ATOM 646 C2 C4A A 162 12.331 10.937 10.802 1.00 0.00 C4A C +ATOM 647 C3 C4A A 162 10.353 9.621 11.626 1.00 0.00 C4A C +ATOM 648 C4 C4A A 162 9.183 8.713 11.205 1.00 0.00 C4A C +ATOM 649 C1 C4A A 163 18.075 16.098 5.436 1.00 0.00 C4A C +ATOM 650 C2 C4A A 163 16.920 17.047 5.803 1.00 0.00 C4A C +ATOM 651 C3 C4A A 163 19.335 16.922 5.113 1.00 0.00 C4A C +ATOM 652 C4 C4A A 163 20.491 15.973 4.745 1.00 0.00 C4A C +ATOM 653 C1 C4A A 164 17.674 4.986 3.976 1.00 0.00 C4A C +ATOM 654 C2 C4A A 164 17.359 3.839 2.998 1.00 0.00 C4A C +ATOM 655 C3 C4A A 164 18.713 5.930 3.342 1.00 0.00 C4A C +ATOM 656 C4 C4A A 164 19.028 7.077 4.320 1.00 0.00 C4A C +ATOM 657 C1 C4A A 165 16.048 16.604 19.005 1.00 0.00 C4A C +ATOM 658 C2 C4A A 165 15.545 18.032 18.727 1.00 0.00 C4A C +ATOM 659 C3 C4A A 165 14.981 15.830 19.803 1.00 0.00 C4A C +ATOM 660 C4 C4A A 165 15.483 14.401 20.081 1.00 0.00 C4A C +ATOM 661 C1 C4A A 166 18.404 24.552 12.525 1.00 0.00 C4A C +ATOM 662 C2 C4A A 166 17.739 24.021 13.808 1.00 0.00 C4A C +ATOM 663 C3 C4A A 166 19.412 23.512 12.001 1.00 0.00 C4A C +ATOM 664 C4 C4A A 166 20.077 24.042 10.717 1.00 0.00 C4A C +ATOM 665 C1 C4A A 167 5.259 6.298 7.168 1.00 0.00 C4A C +ATOM 666 C2 C4A A 167 5.227 6.273 5.629 1.00 0.00 C4A C +ATOM 667 C3 C4A A 167 6.350 5.337 7.674 1.00 0.00 C4A C +ATOM 668 C4 C4A A 167 6.383 5.361 9.214 1.00 0.00 C4A C +ATOM 669 C1 C4A A 168 7.878 21.303 14.480 1.00 0.00 C4A C +ATOM 670 C2 C4A A 168 6.939 20.122 14.785 1.00 0.00 C4A C +ATOM 671 C3 C4A A 168 8.974 20.847 13.500 1.00 0.00 C4A C +ATOM 672 C4 C4A A 168 9.914 22.028 13.194 1.00 0.00 C4A C +ATOM 673 C1 C4A A 169 11.686 23.885 17.355 1.00 0.00 C4A C +ATOM 674 C2 C4A A 169 12.832 22.901 17.653 1.00 0.00 C4A C +ATOM 675 C3 C4A A 169 10.785 24.015 18.597 1.00 0.00 C4A C +ATOM 676 C4 C4A A 169 9.639 25.000 18.300 1.00 0.00 C4A C +ATOM 677 C1 C4A A 170 10.034 7.410 17.875 1.00 0.00 C4A C +ATOM 678 C2 C4A A 170 8.849 6.581 18.404 1.00 0.00 C4A C +ATOM 679 C3 C4A A 170 10.243 8.640 18.777 1.00 0.00 C4A C +ATOM 680 C4 C4A A 170 11.428 9.470 18.249 1.00 0.00 C4A C +ATOM 681 C1 C4A A 171 7.371 20.871 25.000 1.00 0.00 C4A C +ATOM 682 C2 C4A A 171 6.830 22.311 24.944 1.00 0.00 C4A C +ATOM 683 C3 C4A A 171 6.196 19.877 24.920 1.00 0.00 C4A C +ATOM 684 C4 C4A A 171 6.737 18.437 24.976 1.00 0.00 C4A C +ATOM 685 C1 C4A A 172 3.370 15.549 12.843 1.00 0.00 C4A C +ATOM 686 C2 C4A A 172 3.000 16.994 12.462 1.00 0.00 C4A C +ATOM 687 C3 C4A A 172 3.000 15.296 14.316 1.00 0.00 C4A C +ATOM 688 C4 C4A A 172 3.369 13.851 14.699 1.00 0.00 C4A C +ATOM 689 C1 C4A A 173 21.848 15.843 22.323 1.00 0.00 C4A C +ATOM 690 C2 C4A A 173 22.010 17.027 21.353 1.00 0.00 C4A C +ATOM 691 C3 C4A A 173 22.756 16.055 23.549 1.00 0.00 C4A C +ATOM 692 C4 C4A A 173 22.593 14.871 24.520 1.00 0.00 C4A C +ATOM 693 C1 C4A A 174 25.000 17.814 23.087 1.00 0.00 C4A C +ATOM 694 C2 C4A A 174 24.318 17.778 24.466 1.00 0.00 C4A C +ATOM 695 C3 C4A A 174 24.012 18.359 22.039 1.00 0.00 C4A C +ATOM 696 C4 C4A A 174 24.693 18.395 20.659 1.00 0.00 C4A C +ATOM 697 C1 C4A A 175 16.597 8.475 2.998 1.00 0.00 C4A C +ATOM 698 C2 C4A A 175 17.963 9.106 3.322 1.00 0.00 C4A C +ATOM 699 C3 C4A A 175 16.445 7.153 3.774 1.00 0.00 C4A C +ATOM 700 C4 C4A A 175 15.078 6.521 3.451 1.00 0.00 C4A C +ATOM 701 C1 C4A A 176 4.610 11.328 18.973 1.00 0.00 C4A C +ATOM 702 C2 C4A A 176 4.264 12.501 19.908 1.00 0.00 C4A C +ATOM 703 C3 C4A A 176 6.095 10.956 19.145 1.00 0.00 C4A C +ATOM 704 C4 C4A A 176 6.442 9.782 18.210 1.00 0.00 C4A C +ATOM 705 C1 C4A A 177 4.213 4.241 22.476 1.00 0.00 C4A C +ATOM 706 C2 C4A A 177 3.712 3.000 21.714 1.00 0.00 C4A C +ATOM 707 C3 C4A A 177 5.719 4.095 22.761 1.00 0.00 C4A C +ATOM 708 C4 C4A A 177 6.221 5.335 23.523 1.00 0.00 C4A C +ATOM 709 C1 C4A A 178 23.877 21.117 23.829 1.00 0.00 C4A C +ATOM 710 C2 C4A A 178 25.000 20.430 23.030 1.00 0.00 C4A C +ATOM 711 C3 C4A A 178 24.312 22.547 24.201 1.00 0.00 C4A C +ATOM 712 C4 C4A A 178 23.190 23.234 25.000 1.00 0.00 C4A C +ATOM 713 C1 C4A A 179 19.825 9.634 6.488 1.00 0.00 C4A C +ATOM 714 C2 C4A A 179 19.563 8.119 6.577 1.00 0.00 C4A C +ATOM 715 C3 C4A A 179 18.678 10.395 7.180 1.00 0.00 C4A C +ATOM 716 C4 C4A A 179 18.939 11.910 7.091 1.00 0.00 C4A C +ATOM 717 C1 C4A A 180 10.659 15.821 7.572 1.00 0.00 C4A C +ATOM 718 C2 C4A A 180 11.406 15.844 8.918 1.00 0.00 C4A C +ATOM 719 C3 C4A A 180 11.503 15.065 6.530 1.00 0.00 C4A C +ATOM 720 C4 C4A A 180 10.757 15.041 5.183 1.00 0.00 C4A C +ATOM 721 C1 C1A B 1 22.367 3.000 5.920 1.00 0.00 C1A C +ATOM 722 C1 C1A B 2 9.083 7.569 25.000 1.00 0.00 C1A C +ATOM 723 C1 C1A B 3 20.619 3.857 3.012 1.00 0.00 C1A C +ATOM 724 C1 C1A B 4 24.407 24.117 4.727 1.00 0.00 C1A C +ATOM 725 C1 C1A B 5 6.112 3.312 14.414 1.00 0.00 C1A C +ATOM 726 C1 C1A B 6 25.000 9.738 8.173 1.00 0.00 C1A C +ATOM 727 C1 C1A B 7 25.000 8.186 13.470 1.00 0.00 C1A C +ATOM 728 C1 C1A B 8 3.000 6.952 24.545 1.00 0.00 C1A C +ATOM 729 C1 C1A B 9 18.913 11.833 12.055 1.00 0.00 C1A C +ATOM 730 C1 C1A B 10 14.499 15.660 17.036 1.00 0.00 C1A C +ATOM 731 C1 C1A B 11 3.000 23.967 9.284 1.00 0.00 C1A C +ATOM 732 C1 C1A B 12 24.957 3.522 9.670 1.00 0.00 C1A C +ATOM 733 C1 C1A B 13 22.799 24.120 12.330 1.00 0.00 C1A C +ATOM 734 C1 C1A B 14 8.770 16.196 9.571 1.00 0.00 C1A C +ATOM 735 C1 C1A B 15 3.048 11.063 6.825 1.00 0.00 C1A C +ATOM 736 C1 C1A B 16 14.199 13.114 11.977 1.00 0.00 C1A C +ATOM 737 C1 C1A B 17 14.818 22.141 6.722 1.00 0.00 C1A C +ATOM 738 C1 C1A B 18 14.751 6.342 11.495 1.00 0.00 C1A C +ATOM 739 C1 C1A B 19 22.752 7.252 17.804 1.00 0.00 C1A C +ATOM 740 C1 C1A B 20 8.065 21.413 8.482 1.00 0.00 C1A C +ATOM 741 C1 C1A B 21 25.000 16.328 18.918 1.00 0.00 C1A C +ATOM 742 C1 C1A B 22 21.725 22.732 20.391 1.00 0.00 C1A C +ATOM 743 C1 C1A B 23 14.608 25.000 11.507 1.00 0.00 C1A C +ATOM 744 C1 C1A B 24 12.028 13.628 10.398 1.00 0.00 C1A C +ATOM 745 C1 C1A B 25 10.525 12.249 12.391 1.00 0.00 C1A C +ATOM 746 C1 C1A B 26 22.909 22.778 7.864 1.00 0.00 C1A C +ATOM 747 C1 C1A B 27 17.987 21.993 10.617 1.00 0.00 C1A C +ATOM 748 C1 C1A B 28 24.940 18.946 4.390 1.00 0.00 C1A C +ATOM 749 C1 C1A B 29 22.913 20.182 8.715 1.00 0.00 C1A C +ATOM 750 C1 C1A B 30 3.001 9.899 9.393 1.00 0.00 C1A C +ATOM 751 C1 C1A B 31 9.157 19.393 6.585 1.00 0.00 C1A C +ATOM 752 C1 C1A B 32 6.687 19.020 22.524 1.00 0.00 C1A C +ATOM 753 C1 C1A B 33 20.864 6.683 8.156 1.00 0.00 C1A C +ATOM 754 C1 C1A B 34 8.064 18.854 9.704 1.00 0.00 C1A C +ATOM 755 C1 C1A B 35 9.497 3.000 15.937 1.00 0.00 C1A C +ATOM 756 C1 C1A B 36 25.000 17.647 12.604 1.00 0.00 C1A C +ATOM 757 C1 C1A B 37 5.110 25.000 10.140 1.00 0.00 C1A C +ATOM 758 C1 C1A B 38 13.663 5.732 8.112 1.00 0.00 C1A C +ATOM 759 C1 C1A B 39 14.716 25.000 4.456 1.00 0.00 C1A C +ATOM 760 C1 C1A B 40 21.359 14.928 17.742 1.00 0.00 C1A C +ATOM 761 C1 C1A B 41 25.000 3.000 23.886 1.00 0.00 C1A C +ATOM 762 C1 C1A B 42 17.027 14.626 17.310 1.00 0.00 C1A C +ATOM 763 C1 C1A B 43 18.428 5.277 18.165 1.00 0.00 C1A C +ATOM 764 C1 C1A B 44 8.460 5.500 10.601 1.00 0.00 C1A C +ATOM 765 C1 C1A B 45 14.873 3.733 3.243 1.00 0.00 C1A C +ATOM 766 C1 C1A B 46 12.927 7.070 13.586 1.00 0.00 C1A C +ATOM 767 C1 C1A B 47 5.096 22.450 20.321 1.00 0.00 C1A C +ATOM 768 C1 C1A B 48 18.011 16.687 3.000 1.00 0.00 C1A C +ATOM 769 C1 C1A B 49 13.542 20.717 21.977 1.00 0.00 C1A C +ATOM 770 C1 C1A B 50 15.640 24.659 7.381 1.00 0.00 C1A C +ATOM 771 C1 C1A B 51 19.177 17.125 25.000 1.00 0.00 C1A C +ATOM 772 C1 C1A B 52 19.135 19.498 9.978 1.00 0.00 C1A C +ATOM 773 C1 C1A B 53 11.590 4.475 20.741 1.00 0.00 C1A C +ATOM 774 C1 C1A B 54 24.629 12.829 25.000 1.00 0.00 C1A C +ATOM 775 C1 C1A B 55 9.632 22.572 15.918 1.00 0.00 C1A C +ATOM 776 C1 C1A B 56 21.381 11.570 7.505 1.00 0.00 C1A C +ATOM 777 C1 C1A B 57 25.000 14.942 11.926 1.00 0.00 C1A C +ATOM 778 C1 C1A B 58 17.371 25.000 3.113 1.00 0.00 C1A C +ATOM 779 C1 C1A B 59 8.266 10.805 12.931 1.00 0.00 C1A C +ATOM 780 C1 C1A B 60 21.332 25.000 18.909 1.00 0.00 C1A C +ATOM 781 C1 C1A B 61 21.677 20.928 25.000 1.00 0.00 C1A C +ATOM 782 C1 C1A B 62 13.308 25.000 8.751 1.00 0.00 C1A C +ATOM 783 C1 C1A B 63 9.053 17.900 12.081 1.00 0.00 C1A C +ATOM 784 C1 C1A B 64 3.000 4.122 19.591 1.00 0.00 C1A C +ATOM 785 C1 C1A B 65 22.001 11.995 9.889 1.00 0.00 C1A C +ATOM 786 C1 C1A B 66 22.021 22.516 22.907 1.00 0.00 C1A C +ATOM 787 C1 C1A B 67 4.189 4.571 25.000 1.00 0.00 C1A C +ATOM 788 C1 C1A B 68 7.858 15.470 3.000 1.00 0.00 C1A C +ATOM 789 C1 C1A B 69 24.861 21.856 9.576 1.00 0.00 C1A C +ATOM 790 C1 C1A B 70 22.652 22.100 4.115 1.00 0.00 C1A C +ATOM 791 C1 C1A B 71 20.206 22.046 18.380 1.00 0.00 C1A C +ATOM 792 C1 C1A B 72 3.017 25.000 4.642 1.00 0.00 C1A C +ATOM 793 C1 C1A B 73 3.000 21.126 5.326 1.00 0.00 C1A C +ATOM 794 C1 C1A B 74 13.987 25.000 16.940 1.00 0.00 C1A C +ATOM 795 C1 C1A B 75 7.613 11.423 6.854 1.00 0.00 C1A C +ATOM 796 C1 C1A B 76 15.051 18.396 21.227 1.00 0.00 C1A C +ATOM 797 C1 C1A B 77 5.843 3.000 5.401 1.00 0.00 C1A C +ATOM 798 C1 C1A B 78 17.644 19.802 22.354 1.00 0.00 C1A C +ATOM 799 C1 C1A B 79 6.897 17.184 20.487 1.00 0.00 C1A C +ATOM 800 C1 C1A B 80 9.513 15.468 16.630 1.00 0.00 C1A C +ATOM 801 C1 C1A B 81 4.000 11.566 15.855 1.00 0.00 C1A C +ATOM 802 C1 C1A B 82 17.372 12.009 15.513 1.00 0.00 C1A C +ATOM 803 C1 C1A B 83 14.584 15.730 10.089 1.00 0.00 C1A C +ATOM 804 C1 C1A B 84 11.904 24.759 11.362 1.00 0.00 C1A C +ATOM 805 C1 C1A B 85 14.032 10.089 15.548 1.00 0.00 C1A C +ATOM 806 C1 C1A B 86 4.862 3.000 3.000 1.00 0.00 C1A C +ATOM 807 C1 C1A B 87 5.458 21.456 22.845 1.00 0.00 C1A C +ATOM 808 C1 C1A B 88 11.800 11.620 16.116 1.00 0.00 C1A C +ATOM 809 C1 C1A B 89 18.144 5.144 13.896 1.00 0.00 C1A C +ATOM 810 C1 C1A B 90 3.000 13.322 5.359 1.00 0.00 C1A C +ATOM 811 C1 C1A B 91 11.321 12.562 5.632 1.00 0.00 C1A C +ATOM 812 C1 C1A B 92 22.539 20.927 18.394 1.00 0.00 C1A C +ATOM 813 C1 C1A B 93 18.576 7.345 16.420 1.00 0.00 C1A C +ATOM 814 C1 C1A B 94 8.242 8.179 13.733 1.00 0.00 C1A C +ATOM 815 C1 C1A B 95 8.727 13.902 6.447 1.00 0.00 C1A C +ATOM 816 C1 C1A B 96 23.754 10.633 14.306 1.00 0.00 C1A C +ATOM 817 C1 C1A B 97 7.513 5.264 5.245 1.00 0.00 C1A C +ATOM 818 C1 C1A B 98 4.460 6.014 14.042 1.00 0.00 C1A C +ATOM 819 C1 C1A B 99 14.506 9.365 10.265 1.00 0.00 C1A C +ATOM 820 C1 C1A B 100 6.594 3.000 20.216 1.00 0.00 C1A C +ATOM 821 C1 C1A B 101 3.000 21.001 15.009 1.00 0.00 C1A C +ATOM 822 C1 C1A B 102 8.501 9.425 16.836 1.00 0.00 C1A C +ATOM 823 C1 C1A B 103 25.004 7.433 3.235 1.00 0.00 C1A C +ATOM 824 C1 C1A B 104 15.623 7.302 9.205 1.00 0.00 C1A C +ATOM 825 C1 C1A B 105 8.298 19.601 17.295 1.00 0.00 C1A C +ATOM 826 C1 C1A B 106 14.473 11.998 9.473 1.00 0.00 C1A C +ATOM 827 C1 C1A B 107 17.479 25.000 10.241 1.00 0.00 C1A C +ATOM 828 C1 C1A B 108 16.869 9.783 8.810 1.00 0.00 C1A C +ATOM 829 C1 C1A B 109 15.951 4.609 9.795 1.00 0.00 C1A C +ATOM 830 C1 C1A B 110 4.316 24.934 19.450 1.00 0.00 C1A C +ATOM 831 C1 C1A B 111 23.827 20.972 6.012 1.00 0.00 C1A C +ATOM 832 C1 C1A B 112 5.124 14.745 21.019 1.00 0.00 C1A C +ATOM 833 C1 C1A B 113 12.725 10.308 20.867 1.00 0.00 C1A C +ATOM 834 C1 C1A B 114 22.871 16.431 13.093 1.00 0.00 C1A C +ATOM 835 C1 C1A B 115 7.692 9.598 23.970 1.00 0.00 C1A C +ATOM 836 C1 C1A B 116 20.347 21.966 5.939 1.00 0.00 C1A C +ATOM 837 C1 C1A B 117 22.584 14.671 20.188 1.00 0.00 C1A C +ATOM 838 C1 C1A B 118 22.773 4.742 11.928 1.00 0.00 C1A C +ATOM 839 C1 C1A B 119 14.103 20.292 13.167 1.00 0.00 C1A C +ATOM 840 C1 C1A B 120 4.108 6.820 22.046 1.00 0.00 C1A C +ATOM 841 C1 C1A B 121 13.188 25.000 19.543 1.00 0.00 C1A C +ATOM 842 C1 C1A B 122 3.578 6.770 19.353 1.00 0.00 C1A C +ATOM 843 C1 C1A B 123 25.000 10.241 24.868 1.00 0.00 C1A C +ATOM 844 C1 C1A B 124 10.716 4.989 17.200 1.00 0.00 C1A C +ATOM 845 C1 C1A B 125 7.408 24.096 7.442 1.00 0.00 C1A C +ATOM 846 C1 C1A B 126 14.634 20.303 18.206 1.00 0.00 C1A C +ATOM 847 C1 C1A B 127 18.100 3.000 12.610 1.00 0.00 C1A C +ATOM 848 C1 C1A B 128 6.028 20.416 3.000 1.00 0.00 C1A C +ATOM 849 C1 C1A B 129 18.194 14.528 14.844 1.00 0.00 C1A C +ATOM 850 C1 C1A B 130 24.087 19.699 14.471 1.00 0.00 C1A C +ATOM 851 C1 C1A B 131 8.428 19.112 3.000 1.00 0.00 C1A C +ATOM 852 C1 C1A B 132 16.725 8.419 6.253 1.00 0.00 C1A C +ATOM 853 C1 C1A B 133 7.985 7.091 8.382 1.00 0.00 C1A C +ATOM 854 C1 C1A B 134 6.342 17.720 3.000 1.00 0.00 C1A C +ATOM 855 C1 C1A B 135 14.415 5.350 17.401 1.00 0.00 C1A C +ATOM 856 C1 C1A B 136 5.052 9.776 24.627 1.00 0.00 C1A C +ATOM 857 C1 C1A B 137 23.934 8.200 23.895 1.00 0.00 C1A C +ATOM 858 C1 C1A B 138 20.407 8.691 2.999 1.00 0.00 C1A C +ATOM 859 C1 C1A B 139 22.320 6.643 25.000 1.00 0.00 C1A C +ATOM 860 C1 C1A B 140 11.207 4.085 3.000 1.00 0.00 C1A C +ATOM 861 C1 C1A B 141 8.026 3.375 7.079 1.00 0.00 C1A C +ATOM 862 C1 C1A B 142 10.238 24.169 9.259 1.00 0.00 C1A C +ATOM 863 C1 C1A B 143 16.873 13.086 4.968 1.00 0.00 C1A C +ATOM 864 C1 C1A B 144 13.573 14.233 22.636 1.00 0.00 C1A C +ATOM 865 C1 C1A B 145 17.907 21.090 4.504 1.00 0.00 C1A C +ATOM 866 C1 C1A B 146 21.652 5.164 20.655 1.00 0.00 C1A C +ATOM 867 C1 C1A B 147 20.551 15.699 14.099 1.00 0.00 C1A C +ATOM 868 C1 C1A B 148 16.766 8.621 22.760 1.00 0.00 C1A C +ATOM 869 C1 C1A B 149 3.000 9.327 15.221 1.00 0.00 C1A C +ATOM 870 C1 C1A B 150 17.056 17.670 11.046 1.00 0.00 C1A C +ATOM 871 C1 C1A B 151 7.361 23.965 14.709 1.00 0.00 C1A C +ATOM 872 C1 C1A B 152 22.086 12.633 5.355 1.00 0.00 C1A C +ATOM 873 C1 C1A B 153 24.117 9.341 21.679 1.00 0.00 C1A C +ATOM 874 C1 C1A B 154 3.438 3.000 13.902 1.00 0.00 C1A C +ATOM 875 C1 C1A B 155 12.350 10.030 5.083 1.00 0.00 C1A C +ATOM 876 C1 C1A B 156 14.051 17.525 3.338 1.00 0.00 C1A C +ATOM 877 C1 C1A B 157 11.714 10.436 7.515 1.00 0.00 C1A C +ATOM 878 C1 C1A B 158 9.364 22.223 3.000 1.00 0.00 C1A C +ATOM 879 C1 C1A B 159 7.872 3.000 11.551 1.00 0.00 C1A C +ATOM 880 C1 C1A B 160 22.550 2.999 19.785 1.00 0.00 C1A C +ATOM 881 C1 C1A B 161 14.436 17.997 11.743 1.00 0.00 C1A C +ATOM 882 C1 C1A B 162 5.367 9.218 7.774 1.00 0.00 C1A C +ATOM 883 C1 C1A B 163 18.984 14.375 3.551 1.00 0.00 C1A C +ATOM 884 C1 C1A B 164 10.791 20.659 17.293 1.00 0.00 C1A C +ATOM 885 C1 C1A B 165 10.835 17.868 17.126 1.00 0.00 C1A C +ATOM 886 C1 C1A B 166 14.833 21.082 25.000 1.00 0.00 C1A C +ATOM 887 C1 C1A B 167 14.148 12.329 24.996 1.00 0.00 C1A C +ATOM 888 C1 C1A B 168 25.000 12.967 6.938 1.00 0.00 C1A C +ATOM 889 C1 C1A B 169 3.000 12.818 17.774 1.00 0.00 C1A C +ATOM 890 C1 C1A B 170 17.848 8.375 25.000 1.00 0.00 C1A C +ATOM 891 C1 C1A B 171 12.079 15.328 15.682 1.00 0.00 C1A C +ATOM 892 C1 C1A B 172 7.378 10.092 3.085 1.00 0.00 C1A C +ATOM 893 C1 C1A B 173 17.258 25.000 16.057 1.00 0.00 C1A C +ATOM 894 C1 C1A B 174 16.413 14.557 3.000 1.00 0.00 C1A C +ATOM 895 C1 C1A B 175 20.664 13.864 23.290 1.00 0.00 C1A C +ATOM 896 C1 C1A B 176 6.933 15.225 17.215 1.00 0.00 C1A C +ATOM 897 C1 C1A B 177 21.384 8.960 25.000 1.00 0.00 C1A C +ATOM 898 C1 C1A B 178 19.604 11.134 9.381 1.00 0.00 C1A C +ATOM 899 C1 C1A B 179 19.927 3.000 25.000 1.00 0.00 C1A C +ATOM 900 C1 C1A B 180 14.875 13.036 18.077 1.00 0.00 C1A C +ATOM 901 C1 C1A B 181 14.464 5.717 21.750 1.00 0.00 C1A C +ATOM 902 C1 C1A B 182 13.027 20.210 9.895 1.00 0.00 C1A C +ATOM 903 C1 C1A B 183 19.905 21.065 12.583 1.00 0.00 C1A C +ATOM 904 C1 C1A B 184 22.526 11.202 19.983 1.00 0.00 C1A C +ATOM 905 C1 C1A B 185 22.670 17.825 5.846 1.00 0.00 C1A C +ATOM 906 C1 C1A B 186 13.440 7.560 16.376 1.00 0.00 C1A C +ATOM 907 C1 C1A B 187 22.903 15.643 15.898 1.00 0.00 C1A C +ATOM 908 C1 C1A B 188 6.912 9.120 9.737 1.00 0.00 C1A C +ATOM 909 C1 C1A B 189 9.860 11.765 18.153 1.00 0.00 C1A C +ATOM 910 C1 C1A B 190 12.274 21.023 19.563 1.00 0.00 C1A C +ATOM 911 C1 C1A B 191 20.202 13.886 10.423 1.00 0.00 C1A C +ATOM 912 C1 C1A B 192 10.270 6.406 5.093 1.00 0.00 C1A C +ATOM 913 C1 C1A B 193 18.102 3.000 21.204 1.00 0.00 C1A C +ATOM 914 C1 C1A B 194 12.728 11.658 23.050 1.00 0.00 C1A C +ATOM 915 C1 C1A B 195 5.991 20.982 6.745 1.00 0.00 C1A C +ATOM 916 C1 C1A B 196 25.000 3.365 15.246 1.00 0.00 C1A C +ATOM 917 C1 C1A B 197 6.980 19.696 12.047 1.00 0.00 C1A C +ATOM 918 C1 C1A B 198 20.499 6.785 19.140 1.00 0.00 C1A C +ATOM 919 C1 C1A B 199 15.426 10.593 20.577 1.00 0.00 C1A C +ATOM 920 C1 C1A B 200 12.986 3.002 11.540 1.00 0.00 C1A C +ATOM 921 C1 C1A B 201 24.880 16.559 6.662 1.00 0.00 C1A C +ATOM 922 C1 C1A B 202 17.790 12.833 19.177 1.00 0.00 C1A C +ATOM 923 C1 C1A B 203 23.372 15.519 4.566 1.00 0.00 C1A C +ATOM 924 C1 C1A B 204 25.000 3.000 7.082 1.00 0.00 C1A C +ATOM 925 C1 C1A B 205 5.877 4.452 11.954 1.00 0.00 C1A C +ATOM 926 C1 C1A B 206 6.705 23.057 3.203 1.00 0.00 C1A C +ATOM 927 C1 C1A B 207 21.930 25.000 9.340 1.00 0.00 C1A C +ATOM 928 C1 C1A B 208 12.099 3.000 25.000 1.00 0.00 C1A C +ATOM 929 C1 C1A B 209 19.241 17.312 7.760 1.00 0.00 C1A C +ATOM 930 C1 C1A B 210 21.948 17.012 3.000 1.00 0.00 C1A C +ATOM 931 C1 C1A B 211 8.834 16.847 5.826 1.00 0.00 C1A C +ATOM 932 C1 C1A B 212 5.324 21.871 12.367 1.00 0.00 C1A C +ATOM 933 C1 C1A B 213 19.887 17.699 22.673 1.00 0.00 C1A C +ATOM 934 C1 C1A B 214 4.025 22.188 25.000 1.00 0.00 C1A C +ATOM 935 C1 C1A B 215 24.932 25.000 24.683 1.00 0.00 C1A C +ATOM 936 C1 C1A B 216 20.571 11.998 18.643 1.00 0.00 C1A C +ATOM 937 C1 C1A B 217 14.560 9.461 4.061 1.00 0.00 C1A C +ATOM 938 C1 C1A B 218 6.233 7.228 18.815 1.00 0.00 C1A C +ATOM 939 C1 C1A B 219 4.556 16.340 10.618 1.00 0.00 C1A C +ATOM 940 C1 C1A B 220 3.000 15.073 3.221 1.00 0.00 C1A C +ATOM 941 C1 C1A B 221 7.173 24.839 17.301 1.00 0.00 C1A C +ATOM 942 C1 C1A B 222 4.194 3.000 17.160 1.00 0.00 C1A C +ATOM 943 C1 C1A B 223 25.000 8.381 5.740 1.00 0.00 C1A C +ATOM 944 C1 C1A B 224 20.474 19.751 7.549 1.00 0.00 C1A C +ATOM 945 C1 C1A B 225 12.838 22.951 25.000 1.00 0.00 C1A C +ATOM 946 C1 C1A B 226 25.000 19.166 7.483 1.00 0.00 C1A C +ATOM 947 C1 C1A B 227 21.609 7.621 4.953 1.00 0.00 C1A C +ATOM 948 C1 C1A B 228 6.771 25.000 24.840 1.00 0.00 C1A C +ATOM 949 C1 C1A B 229 5.205 22.223 15.086 1.00 0.00 C1A C +ATOM 950 C1 C1A B 230 17.852 3.001 9.572 1.00 0.00 C1A C +ATOM 951 C1 C1A B 231 10.499 6.935 15.247 1.00 0.00 C1A C +ATOM 952 C1 C1A B 232 17.155 7.100 12.560 1.00 0.00 C1A C +ATOM 953 C1 C1A B 233 4.790 19.816 16.430 1.00 0.00 C1A C +ATOM 954 C1 C1A B 234 6.930 13.235 24.626 1.00 0.00 C1A C +ATOM 955 C1 C1A B 235 25.001 11.254 20.333 1.00 0.00 C1A C +ATOM 956 C1 C1A B 236 20.765 25.000 13.486 1.00 0.00 C1A C +ATOM 957 C1 C1A B 237 16.374 6.909 17.973 1.00 0.00 C1A C +ATOM 958 C1 C1A B 238 25.000 6.367 19.321 1.00 0.00 C1A C +ATOM 959 C1 C1A B 239 20.464 17.116 10.205 1.00 0.00 C1A C +ATOM 960 C1 C1A B 240 19.668 8.352 23.286 1.00 0.00 C1A C +END diff --git a/example_file/methane_butane/setup_box_1.psf b/example_file/methane_butane/setup_box_1.psf new file mode 100644 index 000000000..ffde0eb66 --- /dev/null +++ b/example_file/methane_butane/setup_box_1.psf @@ -0,0 +1,1457 @@ +PSF + + 4 !NTITLE + REMARKS original generated structure x-plor psf file + REMARKS topology top_mie.inp + REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } + REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } + + 960 !NATOM + 1 C4A 1 C4A C1 CH2 0.000000 14.0270 0 + 2 C4A 1 C4A C2 CH3 0.000000 15.0350 0 + 3 C4A 1 C4A C3 CH2 0.000000 14.0270 0 + 4 C4A 1 C4A C4 CH3 0.000000 15.0350 0 + 5 C4A 2 C4A C1 CH2 0.000000 14.0270 0 + 6 C4A 2 C4A C2 CH3 0.000000 15.0350 0 + 7 C4A 2 C4A C3 CH2 0.000000 14.0270 0 + 8 C4A 2 C4A C4 CH3 0.000000 15.0350 0 + 9 C4A 3 C4A C1 CH2 0.000000 14.0270 0 + 10 C4A 3 C4A C2 CH3 0.000000 15.0350 0 + 11 C4A 3 C4A C3 CH2 0.000000 14.0270 0 + 12 C4A 3 C4A C4 CH3 0.000000 15.0350 0 + 13 C4A 4 C4A C1 CH2 0.000000 14.0270 0 + 14 C4A 4 C4A C2 CH3 0.000000 15.0350 0 + 15 C4A 4 C4A C3 CH2 0.000000 14.0270 0 + 16 C4A 4 C4A C4 CH3 0.000000 15.0350 0 + 17 C4A 5 C4A C1 CH2 0.000000 14.0270 0 + 18 C4A 5 C4A C2 CH3 0.000000 15.0350 0 + 19 C4A 5 C4A C3 CH2 0.000000 14.0270 0 + 20 C4A 5 C4A C4 CH3 0.000000 15.0350 0 + 21 C4A 6 C4A C1 CH2 0.000000 14.0270 0 + 22 C4A 6 C4A C2 CH3 0.000000 15.0350 0 + 23 C4A 6 C4A C3 CH2 0.000000 14.0270 0 + 24 C4A 6 C4A C4 CH3 0.000000 15.0350 0 + 25 C4A 7 C4A C1 CH2 0.000000 14.0270 0 + 26 C4A 7 C4A C2 CH3 0.000000 15.0350 0 + 27 C4A 7 C4A C3 CH2 0.000000 14.0270 0 + 28 C4A 7 C4A C4 CH3 0.000000 15.0350 0 + 29 C4A 8 C4A C1 CH2 0.000000 14.0270 0 + 30 C4A 8 C4A C2 CH3 0.000000 15.0350 0 + 31 C4A 8 C4A C3 CH2 0.000000 14.0270 0 + 32 C4A 8 C4A C4 CH3 0.000000 15.0350 0 + 33 C4A 9 C4A C1 CH2 0.000000 14.0270 0 + 34 C4A 9 C4A C2 CH3 0.000000 15.0350 0 + 35 C4A 9 C4A C3 CH2 0.000000 14.0270 0 + 36 C4A 9 C4A C4 CH3 0.000000 15.0350 0 + 37 C4A 10 C4A C1 CH2 0.000000 14.0270 0 + 38 C4A 10 C4A C2 CH3 0.000000 15.0350 0 + 39 C4A 10 C4A C3 CH2 0.000000 14.0270 0 + 40 C4A 10 C4A C4 CH3 0.000000 15.0350 0 + 41 C4A 11 C4A C1 CH2 0.000000 14.0270 0 + 42 C4A 11 C4A C2 CH3 0.000000 15.0350 0 + 43 C4A 11 C4A C3 CH2 0.000000 14.0270 0 + 44 C4A 11 C4A C4 CH3 0.000000 15.0350 0 + 45 C4A 12 C4A C1 CH2 0.000000 14.0270 0 + 46 C4A 12 C4A C2 CH3 0.000000 15.0350 0 + 47 C4A 12 C4A C3 CH2 0.000000 14.0270 0 + 48 C4A 12 C4A C4 CH3 0.000000 15.0350 0 + 49 C4A 13 C4A C1 CH2 0.000000 14.0270 0 + 50 C4A 13 C4A C2 CH3 0.000000 15.0350 0 + 51 C4A 13 C4A C3 CH2 0.000000 14.0270 0 + 52 C4A 13 C4A C4 CH3 0.000000 15.0350 0 + 53 C4A 14 C4A C1 CH2 0.000000 14.0270 0 + 54 C4A 14 C4A C2 CH3 0.000000 15.0350 0 + 55 C4A 14 C4A C3 CH2 0.000000 14.0270 0 + 56 C4A 14 C4A C4 CH3 0.000000 15.0350 0 + 57 C4A 15 C4A C1 CH2 0.000000 14.0270 0 + 58 C4A 15 C4A C2 CH3 0.000000 15.0350 0 + 59 C4A 15 C4A C3 CH2 0.000000 14.0270 0 + 60 C4A 15 C4A C4 CH3 0.000000 15.0350 0 + 61 C4A 16 C4A C1 CH2 0.000000 14.0270 0 + 62 C4A 16 C4A C2 CH3 0.000000 15.0350 0 + 63 C4A 16 C4A C3 CH2 0.000000 14.0270 0 + 64 C4A 16 C4A C4 CH3 0.000000 15.0350 0 + 65 C4A 17 C4A C1 CH2 0.000000 14.0270 0 + 66 C4A 17 C4A C2 CH3 0.000000 15.0350 0 + 67 C4A 17 C4A C3 CH2 0.000000 14.0270 0 + 68 C4A 17 C4A C4 CH3 0.000000 15.0350 0 + 69 C4A 18 C4A C1 CH2 0.000000 14.0270 0 + 70 C4A 18 C4A C2 CH3 0.000000 15.0350 0 + 71 C4A 18 C4A C3 CH2 0.000000 14.0270 0 + 72 C4A 18 C4A C4 CH3 0.000000 15.0350 0 + 73 C4A 19 C4A C1 CH2 0.000000 14.0270 0 + 74 C4A 19 C4A C2 CH3 0.000000 15.0350 0 + 75 C4A 19 C4A C3 CH2 0.000000 14.0270 0 + 76 C4A 19 C4A C4 CH3 0.000000 15.0350 0 + 77 C4A 20 C4A C1 CH2 0.000000 14.0270 0 + 78 C4A 20 C4A C2 CH3 0.000000 15.0350 0 + 79 C4A 20 C4A C3 CH2 0.000000 14.0270 0 + 80 C4A 20 C4A C4 CH3 0.000000 15.0350 0 + 81 C4A 21 C4A C1 CH2 0.000000 14.0270 0 + 82 C4A 21 C4A C2 CH3 0.000000 15.0350 0 + 83 C4A 21 C4A C3 CH2 0.000000 14.0270 0 + 84 C4A 21 C4A C4 CH3 0.000000 15.0350 0 + 85 C4A 22 C4A C1 CH2 0.000000 14.0270 0 + 86 C4A 22 C4A C2 CH3 0.000000 15.0350 0 + 87 C4A 22 C4A C3 CH2 0.000000 14.0270 0 + 88 C4A 22 C4A C4 CH3 0.000000 15.0350 0 + 89 C4A 23 C4A C1 CH2 0.000000 14.0270 0 + 90 C4A 23 C4A C2 CH3 0.000000 15.0350 0 + 91 C4A 23 C4A C3 CH2 0.000000 14.0270 0 + 92 C4A 23 C4A C4 CH3 0.000000 15.0350 0 + 93 C4A 24 C4A C1 CH2 0.000000 14.0270 0 + 94 C4A 24 C4A C2 CH3 0.000000 15.0350 0 + 95 C4A 24 C4A C3 CH2 0.000000 14.0270 0 + 96 C4A 24 C4A C4 CH3 0.000000 15.0350 0 + 97 C4A 25 C4A C1 CH2 0.000000 14.0270 0 + 98 C4A 25 C4A C2 CH3 0.000000 15.0350 0 + 99 C4A 25 C4A C3 CH2 0.000000 14.0270 0 + 100 C4A 25 C4A C4 CH3 0.000000 15.0350 0 + 101 C4A 26 C4A C1 CH2 0.000000 14.0270 0 + 102 C4A 26 C4A C2 CH3 0.000000 15.0350 0 + 103 C4A 26 C4A C3 CH2 0.000000 14.0270 0 + 104 C4A 26 C4A C4 CH3 0.000000 15.0350 0 + 105 C4A 27 C4A C1 CH2 0.000000 14.0270 0 + 106 C4A 27 C4A C2 CH3 0.000000 15.0350 0 + 107 C4A 27 C4A C3 CH2 0.000000 14.0270 0 + 108 C4A 27 C4A C4 CH3 0.000000 15.0350 0 + 109 C4A 28 C4A C1 CH2 0.000000 14.0270 0 + 110 C4A 28 C4A C2 CH3 0.000000 15.0350 0 + 111 C4A 28 C4A C3 CH2 0.000000 14.0270 0 + 112 C4A 28 C4A C4 CH3 0.000000 15.0350 0 + 113 C4A 29 C4A C1 CH2 0.000000 14.0270 0 + 114 C4A 29 C4A C2 CH3 0.000000 15.0350 0 + 115 C4A 29 C4A C3 CH2 0.000000 14.0270 0 + 116 C4A 29 C4A C4 CH3 0.000000 15.0350 0 + 117 C4A 30 C4A C1 CH2 0.000000 14.0270 0 + 118 C4A 30 C4A C2 CH3 0.000000 15.0350 0 + 119 C4A 30 C4A C3 CH2 0.000000 14.0270 0 + 120 C4A 30 C4A C4 CH3 0.000000 15.0350 0 + 121 C4A 31 C4A C1 CH2 0.000000 14.0270 0 + 122 C4A 31 C4A C2 CH3 0.000000 15.0350 0 + 123 C4A 31 C4A C3 CH2 0.000000 14.0270 0 + 124 C4A 31 C4A C4 CH3 0.000000 15.0350 0 + 125 C4A 32 C4A C1 CH2 0.000000 14.0270 0 + 126 C4A 32 C4A C2 CH3 0.000000 15.0350 0 + 127 C4A 32 C4A C3 CH2 0.000000 14.0270 0 + 128 C4A 32 C4A C4 CH3 0.000000 15.0350 0 + 129 C4A 33 C4A C1 CH2 0.000000 14.0270 0 + 130 C4A 33 C4A C2 CH3 0.000000 15.0350 0 + 131 C4A 33 C4A C3 CH2 0.000000 14.0270 0 + 132 C4A 33 C4A C4 CH3 0.000000 15.0350 0 + 133 C4A 34 C4A C1 CH2 0.000000 14.0270 0 + 134 C4A 34 C4A C2 CH3 0.000000 15.0350 0 + 135 C4A 34 C4A C3 CH2 0.000000 14.0270 0 + 136 C4A 34 C4A C4 CH3 0.000000 15.0350 0 + 137 C4A 35 C4A C1 CH2 0.000000 14.0270 0 + 138 C4A 35 C4A C2 CH3 0.000000 15.0350 0 + 139 C4A 35 C4A C3 CH2 0.000000 14.0270 0 + 140 C4A 35 C4A C4 CH3 0.000000 15.0350 0 + 141 C4A 36 C4A C1 CH2 0.000000 14.0270 0 + 142 C4A 36 C4A C2 CH3 0.000000 15.0350 0 + 143 C4A 36 C4A C3 CH2 0.000000 14.0270 0 + 144 C4A 36 C4A C4 CH3 0.000000 15.0350 0 + 145 C4A 37 C4A C1 CH2 0.000000 14.0270 0 + 146 C4A 37 C4A C2 CH3 0.000000 15.0350 0 + 147 C4A 37 C4A C3 CH2 0.000000 14.0270 0 + 148 C4A 37 C4A C4 CH3 0.000000 15.0350 0 + 149 C4A 38 C4A C1 CH2 0.000000 14.0270 0 + 150 C4A 38 C4A C2 CH3 0.000000 15.0350 0 + 151 C4A 38 C4A C3 CH2 0.000000 14.0270 0 + 152 C4A 38 C4A C4 CH3 0.000000 15.0350 0 + 153 C4A 39 C4A C1 CH2 0.000000 14.0270 0 + 154 C4A 39 C4A C2 CH3 0.000000 15.0350 0 + 155 C4A 39 C4A C3 CH2 0.000000 14.0270 0 + 156 C4A 39 C4A C4 CH3 0.000000 15.0350 0 + 157 C4A 40 C4A C1 CH2 0.000000 14.0270 0 + 158 C4A 40 C4A C2 CH3 0.000000 15.0350 0 + 159 C4A 40 C4A C3 CH2 0.000000 14.0270 0 + 160 C4A 40 C4A C4 CH3 0.000000 15.0350 0 + 161 C4A 41 C4A C1 CH2 0.000000 14.0270 0 + 162 C4A 41 C4A C2 CH3 0.000000 15.0350 0 + 163 C4A 41 C4A C3 CH2 0.000000 14.0270 0 + 164 C4A 41 C4A C4 CH3 0.000000 15.0350 0 + 165 C4A 42 C4A C1 CH2 0.000000 14.0270 0 + 166 C4A 42 C4A C2 CH3 0.000000 15.0350 0 + 167 C4A 42 C4A C3 CH2 0.000000 14.0270 0 + 168 C4A 42 C4A C4 CH3 0.000000 15.0350 0 + 169 C4A 43 C4A C1 CH2 0.000000 14.0270 0 + 170 C4A 43 C4A C2 CH3 0.000000 15.0350 0 + 171 C4A 43 C4A C3 CH2 0.000000 14.0270 0 + 172 C4A 43 C4A C4 CH3 0.000000 15.0350 0 + 173 C4A 44 C4A C1 CH2 0.000000 14.0270 0 + 174 C4A 44 C4A C2 CH3 0.000000 15.0350 0 + 175 C4A 44 C4A C3 CH2 0.000000 14.0270 0 + 176 C4A 44 C4A C4 CH3 0.000000 15.0350 0 + 177 C4A 45 C4A C1 CH2 0.000000 14.0270 0 + 178 C4A 45 C4A C2 CH3 0.000000 15.0350 0 + 179 C4A 45 C4A C3 CH2 0.000000 14.0270 0 + 180 C4A 45 C4A C4 CH3 0.000000 15.0350 0 + 181 C4A 46 C4A C1 CH2 0.000000 14.0270 0 + 182 C4A 46 C4A C2 CH3 0.000000 15.0350 0 + 183 C4A 46 C4A C3 CH2 0.000000 14.0270 0 + 184 C4A 46 C4A C4 CH3 0.000000 15.0350 0 + 185 C4A 47 C4A C1 CH2 0.000000 14.0270 0 + 186 C4A 47 C4A C2 CH3 0.000000 15.0350 0 + 187 C4A 47 C4A C3 CH2 0.000000 14.0270 0 + 188 C4A 47 C4A C4 CH3 0.000000 15.0350 0 + 189 C4A 48 C4A C1 CH2 0.000000 14.0270 0 + 190 C4A 48 C4A C2 CH3 0.000000 15.0350 0 + 191 C4A 48 C4A C3 CH2 0.000000 14.0270 0 + 192 C4A 48 C4A C4 CH3 0.000000 15.0350 0 + 193 C4A 49 C4A C1 CH2 0.000000 14.0270 0 + 194 C4A 49 C4A C2 CH3 0.000000 15.0350 0 + 195 C4A 49 C4A C3 CH2 0.000000 14.0270 0 + 196 C4A 49 C4A C4 CH3 0.000000 15.0350 0 + 197 C4A 50 C4A C1 CH2 0.000000 14.0270 0 + 198 C4A 50 C4A C2 CH3 0.000000 15.0350 0 + 199 C4A 50 C4A C3 CH2 0.000000 14.0270 0 + 200 C4A 50 C4A C4 CH3 0.000000 15.0350 0 + 201 C4A 51 C4A C1 CH2 0.000000 14.0270 0 + 202 C4A 51 C4A C2 CH3 0.000000 15.0350 0 + 203 C4A 51 C4A C3 CH2 0.000000 14.0270 0 + 204 C4A 51 C4A C4 CH3 0.000000 15.0350 0 + 205 C4A 52 C4A C1 CH2 0.000000 14.0270 0 + 206 C4A 52 C4A C2 CH3 0.000000 15.0350 0 + 207 C4A 52 C4A C3 CH2 0.000000 14.0270 0 + 208 C4A 52 C4A C4 CH3 0.000000 15.0350 0 + 209 C4A 53 C4A C1 CH2 0.000000 14.0270 0 + 210 C4A 53 C4A C2 CH3 0.000000 15.0350 0 + 211 C4A 53 C4A C3 CH2 0.000000 14.0270 0 + 212 C4A 53 C4A C4 CH3 0.000000 15.0350 0 + 213 C4A 54 C4A C1 CH2 0.000000 14.0270 0 + 214 C4A 54 C4A C2 CH3 0.000000 15.0350 0 + 215 C4A 54 C4A C3 CH2 0.000000 14.0270 0 + 216 C4A 54 C4A C4 CH3 0.000000 15.0350 0 + 217 C4A 55 C4A C1 CH2 0.000000 14.0270 0 + 218 C4A 55 C4A C2 CH3 0.000000 15.0350 0 + 219 C4A 55 C4A C3 CH2 0.000000 14.0270 0 + 220 C4A 55 C4A C4 CH3 0.000000 15.0350 0 + 221 C4A 56 C4A C1 CH2 0.000000 14.0270 0 + 222 C4A 56 C4A C2 CH3 0.000000 15.0350 0 + 223 C4A 56 C4A C3 CH2 0.000000 14.0270 0 + 224 C4A 56 C4A C4 CH3 0.000000 15.0350 0 + 225 C4A 57 C4A C1 CH2 0.000000 14.0270 0 + 226 C4A 57 C4A C2 CH3 0.000000 15.0350 0 + 227 C4A 57 C4A C3 CH2 0.000000 14.0270 0 + 228 C4A 57 C4A C4 CH3 0.000000 15.0350 0 + 229 C4A 58 C4A C1 CH2 0.000000 14.0270 0 + 230 C4A 58 C4A C2 CH3 0.000000 15.0350 0 + 231 C4A 58 C4A C3 CH2 0.000000 14.0270 0 + 232 C4A 58 C4A C4 CH3 0.000000 15.0350 0 + 233 C4A 59 C4A C1 CH2 0.000000 14.0270 0 + 234 C4A 59 C4A C2 CH3 0.000000 15.0350 0 + 235 C4A 59 C4A C3 CH2 0.000000 14.0270 0 + 236 C4A 59 C4A C4 CH3 0.000000 15.0350 0 + 237 C4A 60 C4A C1 CH2 0.000000 14.0270 0 + 238 C4A 60 C4A C2 CH3 0.000000 15.0350 0 + 239 C4A 60 C4A C3 CH2 0.000000 14.0270 0 + 240 C4A 60 C4A C4 CH3 0.000000 15.0350 0 + 241 C4A 61 C4A C1 CH2 0.000000 14.0270 0 + 242 C4A 61 C4A C2 CH3 0.000000 15.0350 0 + 243 C4A 61 C4A C3 CH2 0.000000 14.0270 0 + 244 C4A 61 C4A C4 CH3 0.000000 15.0350 0 + 245 C4A 62 C4A C1 CH2 0.000000 14.0270 0 + 246 C4A 62 C4A C2 CH3 0.000000 15.0350 0 + 247 C4A 62 C4A C3 CH2 0.000000 14.0270 0 + 248 C4A 62 C4A C4 CH3 0.000000 15.0350 0 + 249 C4A 63 C4A C1 CH2 0.000000 14.0270 0 + 250 C4A 63 C4A C2 CH3 0.000000 15.0350 0 + 251 C4A 63 C4A C3 CH2 0.000000 14.0270 0 + 252 C4A 63 C4A C4 CH3 0.000000 15.0350 0 + 253 C4A 64 C4A C1 CH2 0.000000 14.0270 0 + 254 C4A 64 C4A C2 CH3 0.000000 15.0350 0 + 255 C4A 64 C4A C3 CH2 0.000000 14.0270 0 + 256 C4A 64 C4A C4 CH3 0.000000 15.0350 0 + 257 C4A 65 C4A C1 CH2 0.000000 14.0270 0 + 258 C4A 65 C4A C2 CH3 0.000000 15.0350 0 + 259 C4A 65 C4A C3 CH2 0.000000 14.0270 0 + 260 C4A 65 C4A C4 CH3 0.000000 15.0350 0 + 261 C4A 66 C4A C1 CH2 0.000000 14.0270 0 + 262 C4A 66 C4A C2 CH3 0.000000 15.0350 0 + 263 C4A 66 C4A C3 CH2 0.000000 14.0270 0 + 264 C4A 66 C4A C4 CH3 0.000000 15.0350 0 + 265 C4A 67 C4A C1 CH2 0.000000 14.0270 0 + 266 C4A 67 C4A C2 CH3 0.000000 15.0350 0 + 267 C4A 67 C4A C3 CH2 0.000000 14.0270 0 + 268 C4A 67 C4A C4 CH3 0.000000 15.0350 0 + 269 C4A 68 C4A C1 CH2 0.000000 14.0270 0 + 270 C4A 68 C4A C2 CH3 0.000000 15.0350 0 + 271 C4A 68 C4A C3 CH2 0.000000 14.0270 0 + 272 C4A 68 C4A C4 CH3 0.000000 15.0350 0 + 273 C4A 69 C4A C1 CH2 0.000000 14.0270 0 + 274 C4A 69 C4A C2 CH3 0.000000 15.0350 0 + 275 C4A 69 C4A C3 CH2 0.000000 14.0270 0 + 276 C4A 69 C4A C4 CH3 0.000000 15.0350 0 + 277 C4A 70 C4A C1 CH2 0.000000 14.0270 0 + 278 C4A 70 C4A C2 CH3 0.000000 15.0350 0 + 279 C4A 70 C4A C3 CH2 0.000000 14.0270 0 + 280 C4A 70 C4A C4 CH3 0.000000 15.0350 0 + 281 C4A 71 C4A C1 CH2 0.000000 14.0270 0 + 282 C4A 71 C4A C2 CH3 0.000000 15.0350 0 + 283 C4A 71 C4A C3 CH2 0.000000 14.0270 0 + 284 C4A 71 C4A C4 CH3 0.000000 15.0350 0 + 285 C4A 72 C4A C1 CH2 0.000000 14.0270 0 + 286 C4A 72 C4A C2 CH3 0.000000 15.0350 0 + 287 C4A 72 C4A C3 CH2 0.000000 14.0270 0 + 288 C4A 72 C4A C4 CH3 0.000000 15.0350 0 + 289 C4A 73 C4A C1 CH2 0.000000 14.0270 0 + 290 C4A 73 C4A C2 CH3 0.000000 15.0350 0 + 291 C4A 73 C4A C3 CH2 0.000000 14.0270 0 + 292 C4A 73 C4A C4 CH3 0.000000 15.0350 0 + 293 C4A 74 C4A C1 CH2 0.000000 14.0270 0 + 294 C4A 74 C4A C2 CH3 0.000000 15.0350 0 + 295 C4A 74 C4A C3 CH2 0.000000 14.0270 0 + 296 C4A 74 C4A C4 CH3 0.000000 15.0350 0 + 297 C4A 75 C4A C1 CH2 0.000000 14.0270 0 + 298 C4A 75 C4A C2 CH3 0.000000 15.0350 0 + 299 C4A 75 C4A C3 CH2 0.000000 14.0270 0 + 300 C4A 75 C4A C4 CH3 0.000000 15.0350 0 + 301 C4A 76 C4A C1 CH2 0.000000 14.0270 0 + 302 C4A 76 C4A C2 CH3 0.000000 15.0350 0 + 303 C4A 76 C4A C3 CH2 0.000000 14.0270 0 + 304 C4A 76 C4A C4 CH3 0.000000 15.0350 0 + 305 C4A 77 C4A C1 CH2 0.000000 14.0270 0 + 306 C4A 77 C4A C2 CH3 0.000000 15.0350 0 + 307 C4A 77 C4A C3 CH2 0.000000 14.0270 0 + 308 C4A 77 C4A C4 CH3 0.000000 15.0350 0 + 309 C4A 78 C4A C1 CH2 0.000000 14.0270 0 + 310 C4A 78 C4A C2 CH3 0.000000 15.0350 0 + 311 C4A 78 C4A C3 CH2 0.000000 14.0270 0 + 312 C4A 78 C4A C4 CH3 0.000000 15.0350 0 + 313 C4A 79 C4A C1 CH2 0.000000 14.0270 0 + 314 C4A 79 C4A C2 CH3 0.000000 15.0350 0 + 315 C4A 79 C4A C3 CH2 0.000000 14.0270 0 + 316 C4A 79 C4A C4 CH3 0.000000 15.0350 0 + 317 C4A 80 C4A C1 CH2 0.000000 14.0270 0 + 318 C4A 80 C4A C2 CH3 0.000000 15.0350 0 + 319 C4A 80 C4A C3 CH2 0.000000 14.0270 0 + 320 C4A 80 C4A C4 CH3 0.000000 15.0350 0 + 321 C4A 81 C4A C1 CH2 0.000000 14.0270 0 + 322 C4A 81 C4A C2 CH3 0.000000 15.0350 0 + 323 C4A 81 C4A C3 CH2 0.000000 14.0270 0 + 324 C4A 81 C4A C4 CH3 0.000000 15.0350 0 + 325 C4A 82 C4A C1 CH2 0.000000 14.0270 0 + 326 C4A 82 C4A C2 CH3 0.000000 15.0350 0 + 327 C4A 82 C4A C3 CH2 0.000000 14.0270 0 + 328 C4A 82 C4A C4 CH3 0.000000 15.0350 0 + 329 C4A 83 C4A C1 CH2 0.000000 14.0270 0 + 330 C4A 83 C4A C2 CH3 0.000000 15.0350 0 + 331 C4A 83 C4A C3 CH2 0.000000 14.0270 0 + 332 C4A 83 C4A C4 CH3 0.000000 15.0350 0 + 333 C4A 84 C4A C1 CH2 0.000000 14.0270 0 + 334 C4A 84 C4A C2 CH3 0.000000 15.0350 0 + 335 C4A 84 C4A C3 CH2 0.000000 14.0270 0 + 336 C4A 84 C4A C4 CH3 0.000000 15.0350 0 + 337 C4A 85 C4A C1 CH2 0.000000 14.0270 0 + 338 C4A 85 C4A C2 CH3 0.000000 15.0350 0 + 339 C4A 85 C4A C3 CH2 0.000000 14.0270 0 + 340 C4A 85 C4A C4 CH3 0.000000 15.0350 0 + 341 C4A 86 C4A C1 CH2 0.000000 14.0270 0 + 342 C4A 86 C4A C2 CH3 0.000000 15.0350 0 + 343 C4A 86 C4A C3 CH2 0.000000 14.0270 0 + 344 C4A 86 C4A C4 CH3 0.000000 15.0350 0 + 345 C4A 87 C4A C1 CH2 0.000000 14.0270 0 + 346 C4A 87 C4A C2 CH3 0.000000 15.0350 0 + 347 C4A 87 C4A C3 CH2 0.000000 14.0270 0 + 348 C4A 87 C4A C4 CH3 0.000000 15.0350 0 + 349 C4A 88 C4A C1 CH2 0.000000 14.0270 0 + 350 C4A 88 C4A C2 CH3 0.000000 15.0350 0 + 351 C4A 88 C4A C3 CH2 0.000000 14.0270 0 + 352 C4A 88 C4A C4 CH3 0.000000 15.0350 0 + 353 C4A 89 C4A C1 CH2 0.000000 14.0270 0 + 354 C4A 89 C4A C2 CH3 0.000000 15.0350 0 + 355 C4A 89 C4A C3 CH2 0.000000 14.0270 0 + 356 C4A 89 C4A C4 CH3 0.000000 15.0350 0 + 357 C4A 90 C4A C1 CH2 0.000000 14.0270 0 + 358 C4A 90 C4A C2 CH3 0.000000 15.0350 0 + 359 C4A 90 C4A C3 CH2 0.000000 14.0270 0 + 360 C4A 90 C4A C4 CH3 0.000000 15.0350 0 + 361 C4A 91 C4A C1 CH2 0.000000 14.0270 0 + 362 C4A 91 C4A C2 CH3 0.000000 15.0350 0 + 363 C4A 91 C4A C3 CH2 0.000000 14.0270 0 + 364 C4A 91 C4A C4 CH3 0.000000 15.0350 0 + 365 C4A 92 C4A C1 CH2 0.000000 14.0270 0 + 366 C4A 92 C4A C2 CH3 0.000000 15.0350 0 + 367 C4A 92 C4A C3 CH2 0.000000 14.0270 0 + 368 C4A 92 C4A C4 CH3 0.000000 15.0350 0 + 369 C4A 93 C4A C1 CH2 0.000000 14.0270 0 + 370 C4A 93 C4A C2 CH3 0.000000 15.0350 0 + 371 C4A 93 C4A C3 CH2 0.000000 14.0270 0 + 372 C4A 93 C4A C4 CH3 0.000000 15.0350 0 + 373 C4A 94 C4A C1 CH2 0.000000 14.0270 0 + 374 C4A 94 C4A C2 CH3 0.000000 15.0350 0 + 375 C4A 94 C4A C3 CH2 0.000000 14.0270 0 + 376 C4A 94 C4A C4 CH3 0.000000 15.0350 0 + 377 C4A 95 C4A C1 CH2 0.000000 14.0270 0 + 378 C4A 95 C4A C2 CH3 0.000000 15.0350 0 + 379 C4A 95 C4A C3 CH2 0.000000 14.0270 0 + 380 C4A 95 C4A C4 CH3 0.000000 15.0350 0 + 381 C4A 96 C4A C1 CH2 0.000000 14.0270 0 + 382 C4A 96 C4A C2 CH3 0.000000 15.0350 0 + 383 C4A 96 C4A C3 CH2 0.000000 14.0270 0 + 384 C4A 96 C4A C4 CH3 0.000000 15.0350 0 + 385 C4A 97 C4A C1 CH2 0.000000 14.0270 0 + 386 C4A 97 C4A C2 CH3 0.000000 15.0350 0 + 387 C4A 97 C4A C3 CH2 0.000000 14.0270 0 + 388 C4A 97 C4A C4 CH3 0.000000 15.0350 0 + 389 C4A 98 C4A C1 CH2 0.000000 14.0270 0 + 390 C4A 98 C4A C2 CH3 0.000000 15.0350 0 + 391 C4A 98 C4A C3 CH2 0.000000 14.0270 0 + 392 C4A 98 C4A C4 CH3 0.000000 15.0350 0 + 393 C4A 99 C4A C1 CH2 0.000000 14.0270 0 + 394 C4A 99 C4A C2 CH3 0.000000 15.0350 0 + 395 C4A 99 C4A C3 CH2 0.000000 14.0270 0 + 396 C4A 99 C4A C4 CH3 0.000000 15.0350 0 + 397 C4A 100 C4A C1 CH2 0.000000 14.0270 0 + 398 C4A 100 C4A C2 CH3 0.000000 15.0350 0 + 399 C4A 100 C4A C3 CH2 0.000000 14.0270 0 + 400 C4A 100 C4A C4 CH3 0.000000 15.0350 0 + 401 C4A 101 C4A C1 CH2 0.000000 14.0270 0 + 402 C4A 101 C4A C2 CH3 0.000000 15.0350 0 + 403 C4A 101 C4A C3 CH2 0.000000 14.0270 0 + 404 C4A 101 C4A C4 CH3 0.000000 15.0350 0 + 405 C4A 102 C4A C1 CH2 0.000000 14.0270 0 + 406 C4A 102 C4A C2 CH3 0.000000 15.0350 0 + 407 C4A 102 C4A C3 CH2 0.000000 14.0270 0 + 408 C4A 102 C4A C4 CH3 0.000000 15.0350 0 + 409 C4A 103 C4A C1 CH2 0.000000 14.0270 0 + 410 C4A 103 C4A C2 CH3 0.000000 15.0350 0 + 411 C4A 103 C4A C3 CH2 0.000000 14.0270 0 + 412 C4A 103 C4A C4 CH3 0.000000 15.0350 0 + 413 C4A 104 C4A C1 CH2 0.000000 14.0270 0 + 414 C4A 104 C4A C2 CH3 0.000000 15.0350 0 + 415 C4A 104 C4A C3 CH2 0.000000 14.0270 0 + 416 C4A 104 C4A C4 CH3 0.000000 15.0350 0 + 417 C4A 105 C4A C1 CH2 0.000000 14.0270 0 + 418 C4A 105 C4A C2 CH3 0.000000 15.0350 0 + 419 C4A 105 C4A C3 CH2 0.000000 14.0270 0 + 420 C4A 105 C4A C4 CH3 0.000000 15.0350 0 + 421 C4A 106 C4A C1 CH2 0.000000 14.0270 0 + 422 C4A 106 C4A C2 CH3 0.000000 15.0350 0 + 423 C4A 106 C4A C3 CH2 0.000000 14.0270 0 + 424 C4A 106 C4A C4 CH3 0.000000 15.0350 0 + 425 C4A 107 C4A C1 CH2 0.000000 14.0270 0 + 426 C4A 107 C4A C2 CH3 0.000000 15.0350 0 + 427 C4A 107 C4A C3 CH2 0.000000 14.0270 0 + 428 C4A 107 C4A C4 CH3 0.000000 15.0350 0 + 429 C4A 108 C4A C1 CH2 0.000000 14.0270 0 + 430 C4A 108 C4A C2 CH3 0.000000 15.0350 0 + 431 C4A 108 C4A C3 CH2 0.000000 14.0270 0 + 432 C4A 108 C4A C4 CH3 0.000000 15.0350 0 + 433 C4A 109 C4A C1 CH2 0.000000 14.0270 0 + 434 C4A 109 C4A C2 CH3 0.000000 15.0350 0 + 435 C4A 109 C4A C3 CH2 0.000000 14.0270 0 + 436 C4A 109 C4A C4 CH3 0.000000 15.0350 0 + 437 C4A 110 C4A C1 CH2 0.000000 14.0270 0 + 438 C4A 110 C4A C2 CH3 0.000000 15.0350 0 + 439 C4A 110 C4A C3 CH2 0.000000 14.0270 0 + 440 C4A 110 C4A C4 CH3 0.000000 15.0350 0 + 441 C4A 111 C4A C1 CH2 0.000000 14.0270 0 + 442 C4A 111 C4A C2 CH3 0.000000 15.0350 0 + 443 C4A 111 C4A C3 CH2 0.000000 14.0270 0 + 444 C4A 111 C4A C4 CH3 0.000000 15.0350 0 + 445 C4A 112 C4A C1 CH2 0.000000 14.0270 0 + 446 C4A 112 C4A C2 CH3 0.000000 15.0350 0 + 447 C4A 112 C4A C3 CH2 0.000000 14.0270 0 + 448 C4A 112 C4A C4 CH3 0.000000 15.0350 0 + 449 C4A 113 C4A C1 CH2 0.000000 14.0270 0 + 450 C4A 113 C4A C2 CH3 0.000000 15.0350 0 + 451 C4A 113 C4A C3 CH2 0.000000 14.0270 0 + 452 C4A 113 C4A C4 CH3 0.000000 15.0350 0 + 453 C4A 114 C4A C1 CH2 0.000000 14.0270 0 + 454 C4A 114 C4A C2 CH3 0.000000 15.0350 0 + 455 C4A 114 C4A C3 CH2 0.000000 14.0270 0 + 456 C4A 114 C4A C4 CH3 0.000000 15.0350 0 + 457 C4A 115 C4A C1 CH2 0.000000 14.0270 0 + 458 C4A 115 C4A C2 CH3 0.000000 15.0350 0 + 459 C4A 115 C4A C3 CH2 0.000000 14.0270 0 + 460 C4A 115 C4A C4 CH3 0.000000 15.0350 0 + 461 C4A 116 C4A C1 CH2 0.000000 14.0270 0 + 462 C4A 116 C4A C2 CH3 0.000000 15.0350 0 + 463 C4A 116 C4A C3 CH2 0.000000 14.0270 0 + 464 C4A 116 C4A C4 CH3 0.000000 15.0350 0 + 465 C4A 117 C4A C1 CH2 0.000000 14.0270 0 + 466 C4A 117 C4A C2 CH3 0.000000 15.0350 0 + 467 C4A 117 C4A C3 CH2 0.000000 14.0270 0 + 468 C4A 117 C4A C4 CH3 0.000000 15.0350 0 + 469 C4A 118 C4A C1 CH2 0.000000 14.0270 0 + 470 C4A 118 C4A C2 CH3 0.000000 15.0350 0 + 471 C4A 118 C4A C3 CH2 0.000000 14.0270 0 + 472 C4A 118 C4A C4 CH3 0.000000 15.0350 0 + 473 C4A 119 C4A C1 CH2 0.000000 14.0270 0 + 474 C4A 119 C4A C2 CH3 0.000000 15.0350 0 + 475 C4A 119 C4A C3 CH2 0.000000 14.0270 0 + 476 C4A 119 C4A C4 CH3 0.000000 15.0350 0 + 477 C4A 120 C4A C1 CH2 0.000000 14.0270 0 + 478 C4A 120 C4A C2 CH3 0.000000 15.0350 0 + 479 C4A 120 C4A C3 CH2 0.000000 14.0270 0 + 480 C4A 120 C4A C4 CH3 0.000000 15.0350 0 + 481 C4A 121 C4A C1 CH2 0.000000 14.0270 0 + 482 C4A 121 C4A C2 CH3 0.000000 15.0350 0 + 483 C4A 121 C4A C3 CH2 0.000000 14.0270 0 + 484 C4A 121 C4A C4 CH3 0.000000 15.0350 0 + 485 C4A 122 C4A C1 CH2 0.000000 14.0270 0 + 486 C4A 122 C4A C2 CH3 0.000000 15.0350 0 + 487 C4A 122 C4A C3 CH2 0.000000 14.0270 0 + 488 C4A 122 C4A C4 CH3 0.000000 15.0350 0 + 489 C4A 123 C4A C1 CH2 0.000000 14.0270 0 + 490 C4A 123 C4A C2 CH3 0.000000 15.0350 0 + 491 C4A 123 C4A C3 CH2 0.000000 14.0270 0 + 492 C4A 123 C4A C4 CH3 0.000000 15.0350 0 + 493 C4A 124 C4A C1 CH2 0.000000 14.0270 0 + 494 C4A 124 C4A C2 CH3 0.000000 15.0350 0 + 495 C4A 124 C4A C3 CH2 0.000000 14.0270 0 + 496 C4A 124 C4A C4 CH3 0.000000 15.0350 0 + 497 C4A 125 C4A C1 CH2 0.000000 14.0270 0 + 498 C4A 125 C4A C2 CH3 0.000000 15.0350 0 + 499 C4A 125 C4A C3 CH2 0.000000 14.0270 0 + 500 C4A 125 C4A C4 CH3 0.000000 15.0350 0 + 501 C4A 126 C4A C1 CH2 0.000000 14.0270 0 + 502 C4A 126 C4A C2 CH3 0.000000 15.0350 0 + 503 C4A 126 C4A C3 CH2 0.000000 14.0270 0 + 504 C4A 126 C4A C4 CH3 0.000000 15.0350 0 + 505 C4A 127 C4A C1 CH2 0.000000 14.0270 0 + 506 C4A 127 C4A C2 CH3 0.000000 15.0350 0 + 507 C4A 127 C4A C3 CH2 0.000000 14.0270 0 + 508 C4A 127 C4A C4 CH3 0.000000 15.0350 0 + 509 C4A 128 C4A C1 CH2 0.000000 14.0270 0 + 510 C4A 128 C4A C2 CH3 0.000000 15.0350 0 + 511 C4A 128 C4A C3 CH2 0.000000 14.0270 0 + 512 C4A 128 C4A C4 CH3 0.000000 15.0350 0 + 513 C4A 129 C4A C1 CH2 0.000000 14.0270 0 + 514 C4A 129 C4A C2 CH3 0.000000 15.0350 0 + 515 C4A 129 C4A C3 CH2 0.000000 14.0270 0 + 516 C4A 129 C4A C4 CH3 0.000000 15.0350 0 + 517 C4A 130 C4A C1 CH2 0.000000 14.0270 0 + 518 C4A 130 C4A C2 CH3 0.000000 15.0350 0 + 519 C4A 130 C4A C3 CH2 0.000000 14.0270 0 + 520 C4A 130 C4A C4 CH3 0.000000 15.0350 0 + 521 C4A 131 C4A C1 CH2 0.000000 14.0270 0 + 522 C4A 131 C4A C2 CH3 0.000000 15.0350 0 + 523 C4A 131 C4A C3 CH2 0.000000 14.0270 0 + 524 C4A 131 C4A C4 CH3 0.000000 15.0350 0 + 525 C4A 132 C4A C1 CH2 0.000000 14.0270 0 + 526 C4A 132 C4A C2 CH3 0.000000 15.0350 0 + 527 C4A 132 C4A C3 CH2 0.000000 14.0270 0 + 528 C4A 132 C4A C4 CH3 0.000000 15.0350 0 + 529 C4A 133 C4A C1 CH2 0.000000 14.0270 0 + 530 C4A 133 C4A C2 CH3 0.000000 15.0350 0 + 531 C4A 133 C4A C3 CH2 0.000000 14.0270 0 + 532 C4A 133 C4A C4 CH3 0.000000 15.0350 0 + 533 C4A 134 C4A C1 CH2 0.000000 14.0270 0 + 534 C4A 134 C4A C2 CH3 0.000000 15.0350 0 + 535 C4A 134 C4A C3 CH2 0.000000 14.0270 0 + 536 C4A 134 C4A C4 CH3 0.000000 15.0350 0 + 537 C4A 135 C4A C1 CH2 0.000000 14.0270 0 + 538 C4A 135 C4A C2 CH3 0.000000 15.0350 0 + 539 C4A 135 C4A C3 CH2 0.000000 14.0270 0 + 540 C4A 135 C4A C4 CH3 0.000000 15.0350 0 + 541 C4A 136 C4A C1 CH2 0.000000 14.0270 0 + 542 C4A 136 C4A C2 CH3 0.000000 15.0350 0 + 543 C4A 136 C4A C3 CH2 0.000000 14.0270 0 + 544 C4A 136 C4A C4 CH3 0.000000 15.0350 0 + 545 C4A 137 C4A C1 CH2 0.000000 14.0270 0 + 546 C4A 137 C4A C2 CH3 0.000000 15.0350 0 + 547 C4A 137 C4A C3 CH2 0.000000 14.0270 0 + 548 C4A 137 C4A C4 CH3 0.000000 15.0350 0 + 549 C4A 138 C4A C1 CH2 0.000000 14.0270 0 + 550 C4A 138 C4A C2 CH3 0.000000 15.0350 0 + 551 C4A 138 C4A C3 CH2 0.000000 14.0270 0 + 552 C4A 138 C4A C4 CH3 0.000000 15.0350 0 + 553 C4A 139 C4A C1 CH2 0.000000 14.0270 0 + 554 C4A 139 C4A C2 CH3 0.000000 15.0350 0 + 555 C4A 139 C4A C3 CH2 0.000000 14.0270 0 + 556 C4A 139 C4A C4 CH3 0.000000 15.0350 0 + 557 C4A 140 C4A C1 CH2 0.000000 14.0270 0 + 558 C4A 140 C4A C2 CH3 0.000000 15.0350 0 + 559 C4A 140 C4A C3 CH2 0.000000 14.0270 0 + 560 C4A 140 C4A C4 CH3 0.000000 15.0350 0 + 561 C4A 141 C4A C1 CH2 0.000000 14.0270 0 + 562 C4A 141 C4A C2 CH3 0.000000 15.0350 0 + 563 C4A 141 C4A C3 CH2 0.000000 14.0270 0 + 564 C4A 141 C4A C4 CH3 0.000000 15.0350 0 + 565 C4A 142 C4A C1 CH2 0.000000 14.0270 0 + 566 C4A 142 C4A C2 CH3 0.000000 15.0350 0 + 567 C4A 142 C4A C3 CH2 0.000000 14.0270 0 + 568 C4A 142 C4A C4 CH3 0.000000 15.0350 0 + 569 C4A 143 C4A C1 CH2 0.000000 14.0270 0 + 570 C4A 143 C4A C2 CH3 0.000000 15.0350 0 + 571 C4A 143 C4A C3 CH2 0.000000 14.0270 0 + 572 C4A 143 C4A C4 CH3 0.000000 15.0350 0 + 573 C4A 144 C4A C1 CH2 0.000000 14.0270 0 + 574 C4A 144 C4A C2 CH3 0.000000 15.0350 0 + 575 C4A 144 C4A C3 CH2 0.000000 14.0270 0 + 576 C4A 144 C4A C4 CH3 0.000000 15.0350 0 + 577 C4A 145 C4A C1 CH2 0.000000 14.0270 0 + 578 C4A 145 C4A C2 CH3 0.000000 15.0350 0 + 579 C4A 145 C4A C3 CH2 0.000000 14.0270 0 + 580 C4A 145 C4A C4 CH3 0.000000 15.0350 0 + 581 C4A 146 C4A C1 CH2 0.000000 14.0270 0 + 582 C4A 146 C4A C2 CH3 0.000000 15.0350 0 + 583 C4A 146 C4A C3 CH2 0.000000 14.0270 0 + 584 C4A 146 C4A C4 CH3 0.000000 15.0350 0 + 585 C4A 147 C4A C1 CH2 0.000000 14.0270 0 + 586 C4A 147 C4A C2 CH3 0.000000 15.0350 0 + 587 C4A 147 C4A C3 CH2 0.000000 14.0270 0 + 588 C4A 147 C4A C4 CH3 0.000000 15.0350 0 + 589 C4A 148 C4A C1 CH2 0.000000 14.0270 0 + 590 C4A 148 C4A C2 CH3 0.000000 15.0350 0 + 591 C4A 148 C4A C3 CH2 0.000000 14.0270 0 + 592 C4A 148 C4A C4 CH3 0.000000 15.0350 0 + 593 C4A 149 C4A C1 CH2 0.000000 14.0270 0 + 594 C4A 149 C4A C2 CH3 0.000000 15.0350 0 + 595 C4A 149 C4A C3 CH2 0.000000 14.0270 0 + 596 C4A 149 C4A C4 CH3 0.000000 15.0350 0 + 597 C4A 150 C4A C1 CH2 0.000000 14.0270 0 + 598 C4A 150 C4A C2 CH3 0.000000 15.0350 0 + 599 C4A 150 C4A C3 CH2 0.000000 14.0270 0 + 600 C4A 150 C4A C4 CH3 0.000000 15.0350 0 + 601 C4A 151 C4A C1 CH2 0.000000 14.0270 0 + 602 C4A 151 C4A C2 CH3 0.000000 15.0350 0 + 603 C4A 151 C4A C3 CH2 0.000000 14.0270 0 + 604 C4A 151 C4A C4 CH3 0.000000 15.0350 0 + 605 C4A 152 C4A C1 CH2 0.000000 14.0270 0 + 606 C4A 152 C4A C2 CH3 0.000000 15.0350 0 + 607 C4A 152 C4A C3 CH2 0.000000 14.0270 0 + 608 C4A 152 C4A C4 CH3 0.000000 15.0350 0 + 609 C4A 153 C4A C1 CH2 0.000000 14.0270 0 + 610 C4A 153 C4A C2 CH3 0.000000 15.0350 0 + 611 C4A 153 C4A C3 CH2 0.000000 14.0270 0 + 612 C4A 153 C4A C4 CH3 0.000000 15.0350 0 + 613 C4A 154 C4A C1 CH2 0.000000 14.0270 0 + 614 C4A 154 C4A C2 CH3 0.000000 15.0350 0 + 615 C4A 154 C4A C3 CH2 0.000000 14.0270 0 + 616 C4A 154 C4A C4 CH3 0.000000 15.0350 0 + 617 C4A 155 C4A C1 CH2 0.000000 14.0270 0 + 618 C4A 155 C4A C2 CH3 0.000000 15.0350 0 + 619 C4A 155 C4A C3 CH2 0.000000 14.0270 0 + 620 C4A 155 C4A C4 CH3 0.000000 15.0350 0 + 621 C4A 156 C4A C1 CH2 0.000000 14.0270 0 + 622 C4A 156 C4A C2 CH3 0.000000 15.0350 0 + 623 C4A 156 C4A C3 CH2 0.000000 14.0270 0 + 624 C4A 156 C4A C4 CH3 0.000000 15.0350 0 + 625 C4A 157 C4A C1 CH2 0.000000 14.0270 0 + 626 C4A 157 C4A C2 CH3 0.000000 15.0350 0 + 627 C4A 157 C4A C3 CH2 0.000000 14.0270 0 + 628 C4A 157 C4A C4 CH3 0.000000 15.0350 0 + 629 C4A 158 C4A C1 CH2 0.000000 14.0270 0 + 630 C4A 158 C4A C2 CH3 0.000000 15.0350 0 + 631 C4A 158 C4A C3 CH2 0.000000 14.0270 0 + 632 C4A 158 C4A C4 CH3 0.000000 15.0350 0 + 633 C4A 159 C4A C1 CH2 0.000000 14.0270 0 + 634 C4A 159 C4A C2 CH3 0.000000 15.0350 0 + 635 C4A 159 C4A C3 CH2 0.000000 14.0270 0 + 636 C4A 159 C4A C4 CH3 0.000000 15.0350 0 + 637 C4A 160 C4A C1 CH2 0.000000 14.0270 0 + 638 C4A 160 C4A C2 CH3 0.000000 15.0350 0 + 639 C4A 160 C4A C3 CH2 0.000000 14.0270 0 + 640 C4A 160 C4A C4 CH3 0.000000 15.0350 0 + 641 C4A 161 C4A C1 CH2 0.000000 14.0270 0 + 642 C4A 161 C4A C2 CH3 0.000000 15.0350 0 + 643 C4A 161 C4A C3 CH2 0.000000 14.0270 0 + 644 C4A 161 C4A C4 CH3 0.000000 15.0350 0 + 645 C4A 162 C4A C1 CH2 0.000000 14.0270 0 + 646 C4A 162 C4A C2 CH3 0.000000 15.0350 0 + 647 C4A 162 C4A C3 CH2 0.000000 14.0270 0 + 648 C4A 162 C4A C4 CH3 0.000000 15.0350 0 + 649 C4A 163 C4A C1 CH2 0.000000 14.0270 0 + 650 C4A 163 C4A C2 CH3 0.000000 15.0350 0 + 651 C4A 163 C4A C3 CH2 0.000000 14.0270 0 + 652 C4A 163 C4A C4 CH3 0.000000 15.0350 0 + 653 C4A 164 C4A C1 CH2 0.000000 14.0270 0 + 654 C4A 164 C4A C2 CH3 0.000000 15.0350 0 + 655 C4A 164 C4A C3 CH2 0.000000 14.0270 0 + 656 C4A 164 C4A C4 CH3 0.000000 15.0350 0 + 657 C4A 165 C4A C1 CH2 0.000000 14.0270 0 + 658 C4A 165 C4A C2 CH3 0.000000 15.0350 0 + 659 C4A 165 C4A C3 CH2 0.000000 14.0270 0 + 660 C4A 165 C4A C4 CH3 0.000000 15.0350 0 + 661 C4A 166 C4A C1 CH2 0.000000 14.0270 0 + 662 C4A 166 C4A C2 CH3 0.000000 15.0350 0 + 663 C4A 166 C4A C3 CH2 0.000000 14.0270 0 + 664 C4A 166 C4A C4 CH3 0.000000 15.0350 0 + 665 C4A 167 C4A C1 CH2 0.000000 14.0270 0 + 666 C4A 167 C4A C2 CH3 0.000000 15.0350 0 + 667 C4A 167 C4A C3 CH2 0.000000 14.0270 0 + 668 C4A 167 C4A C4 CH3 0.000000 15.0350 0 + 669 C4A 168 C4A C1 CH2 0.000000 14.0270 0 + 670 C4A 168 C4A C2 CH3 0.000000 15.0350 0 + 671 C4A 168 C4A C3 CH2 0.000000 14.0270 0 + 672 C4A 168 C4A C4 CH3 0.000000 15.0350 0 + 673 C4A 169 C4A C1 CH2 0.000000 14.0270 0 + 674 C4A 169 C4A C2 CH3 0.000000 15.0350 0 + 675 C4A 169 C4A C3 CH2 0.000000 14.0270 0 + 676 C4A 169 C4A C4 CH3 0.000000 15.0350 0 + 677 C4A 170 C4A C1 CH2 0.000000 14.0270 0 + 678 C4A 170 C4A C2 CH3 0.000000 15.0350 0 + 679 C4A 170 C4A C3 CH2 0.000000 14.0270 0 + 680 C4A 170 C4A C4 CH3 0.000000 15.0350 0 + 681 C4A 171 C4A C1 CH2 0.000000 14.0270 0 + 682 C4A 171 C4A C2 CH3 0.000000 15.0350 0 + 683 C4A 171 C4A C3 CH2 0.000000 14.0270 0 + 684 C4A 171 C4A C4 CH3 0.000000 15.0350 0 + 685 C4A 172 C4A C1 CH2 0.000000 14.0270 0 + 686 C4A 172 C4A C2 CH3 0.000000 15.0350 0 + 687 C4A 172 C4A C3 CH2 0.000000 14.0270 0 + 688 C4A 172 C4A C4 CH3 0.000000 15.0350 0 + 689 C4A 173 C4A C1 CH2 0.000000 14.0270 0 + 690 C4A 173 C4A C2 CH3 0.000000 15.0350 0 + 691 C4A 173 C4A C3 CH2 0.000000 14.0270 0 + 692 C4A 173 C4A C4 CH3 0.000000 15.0350 0 + 693 C4A 174 C4A C1 CH2 0.000000 14.0270 0 + 694 C4A 174 C4A C2 CH3 0.000000 15.0350 0 + 695 C4A 174 C4A C3 CH2 0.000000 14.0270 0 + 696 C4A 174 C4A C4 CH3 0.000000 15.0350 0 + 697 C4A 175 C4A C1 CH2 0.000000 14.0270 0 + 698 C4A 175 C4A C2 CH3 0.000000 15.0350 0 + 699 C4A 175 C4A C3 CH2 0.000000 14.0270 0 + 700 C4A 175 C4A C4 CH3 0.000000 15.0350 0 + 701 C4A 176 C4A C1 CH2 0.000000 14.0270 0 + 702 C4A 176 C4A C2 CH3 0.000000 15.0350 0 + 703 C4A 176 C4A C3 CH2 0.000000 14.0270 0 + 704 C4A 176 C4A C4 CH3 0.000000 15.0350 0 + 705 C4A 177 C4A C1 CH2 0.000000 14.0270 0 + 706 C4A 177 C4A C2 CH3 0.000000 15.0350 0 + 707 C4A 177 C4A C3 CH2 0.000000 14.0270 0 + 708 C4A 177 C4A C4 CH3 0.000000 15.0350 0 + 709 C4A 178 C4A C1 CH2 0.000000 14.0270 0 + 710 C4A 178 C4A C2 CH3 0.000000 15.0350 0 + 711 C4A 178 C4A C3 CH2 0.000000 14.0270 0 + 712 C4A 178 C4A C4 CH3 0.000000 15.0350 0 + 713 C4A 179 C4A C1 CH2 0.000000 14.0270 0 + 714 C4A 179 C4A C2 CH3 0.000000 15.0350 0 + 715 C4A 179 C4A C3 CH2 0.000000 14.0270 0 + 716 C4A 179 C4A C4 CH3 0.000000 15.0350 0 + 717 C4A 180 C4A C1 CH2 0.000000 14.0270 0 + 718 C4A 180 C4A C2 CH3 0.000000 15.0350 0 + 719 C4A 180 C4A C3 CH2 0.000000 14.0270 0 + 720 C4A 180 C4A C4 CH3 0.000000 15.0350 0 + 721 C1A 1 C1A C1 CH4 0.000000 16.0430 0 + 722 C1A 2 C1A C1 CH4 0.000000 16.0430 0 + 723 C1A 3 C1A C1 CH4 0.000000 16.0430 0 + 724 C1A 4 C1A C1 CH4 0.000000 16.0430 0 + 725 C1A 5 C1A C1 CH4 0.000000 16.0430 0 + 726 C1A 6 C1A C1 CH4 0.000000 16.0430 0 + 727 C1A 7 C1A C1 CH4 0.000000 16.0430 0 + 728 C1A 8 C1A C1 CH4 0.000000 16.0430 0 + 729 C1A 9 C1A C1 CH4 0.000000 16.0430 0 + 730 C1A 10 C1A C1 CH4 0.000000 16.0430 0 + 731 C1A 11 C1A C1 CH4 0.000000 16.0430 0 + 732 C1A 12 C1A C1 CH4 0.000000 16.0430 0 + 733 C1A 13 C1A C1 CH4 0.000000 16.0430 0 + 734 C1A 14 C1A C1 CH4 0.000000 16.0430 0 + 735 C1A 15 C1A C1 CH4 0.000000 16.0430 0 + 736 C1A 16 C1A C1 CH4 0.000000 16.0430 0 + 737 C1A 17 C1A C1 CH4 0.000000 16.0430 0 + 738 C1A 18 C1A C1 CH4 0.000000 16.0430 0 + 739 C1A 19 C1A C1 CH4 0.000000 16.0430 0 + 740 C1A 20 C1A C1 CH4 0.000000 16.0430 0 + 741 C1A 21 C1A C1 CH4 0.000000 16.0430 0 + 742 C1A 22 C1A C1 CH4 0.000000 16.0430 0 + 743 C1A 23 C1A C1 CH4 0.000000 16.0430 0 + 744 C1A 24 C1A C1 CH4 0.000000 16.0430 0 + 745 C1A 25 C1A C1 CH4 0.000000 16.0430 0 + 746 C1A 26 C1A C1 CH4 0.000000 16.0430 0 + 747 C1A 27 C1A C1 CH4 0.000000 16.0430 0 + 748 C1A 28 C1A C1 CH4 0.000000 16.0430 0 + 749 C1A 29 C1A C1 CH4 0.000000 16.0430 0 + 750 C1A 30 C1A C1 CH4 0.000000 16.0430 0 + 751 C1A 31 C1A C1 CH4 0.000000 16.0430 0 + 752 C1A 32 C1A C1 CH4 0.000000 16.0430 0 + 753 C1A 33 C1A C1 CH4 0.000000 16.0430 0 + 754 C1A 34 C1A C1 CH4 0.000000 16.0430 0 + 755 C1A 35 C1A C1 CH4 0.000000 16.0430 0 + 756 C1A 36 C1A C1 CH4 0.000000 16.0430 0 + 757 C1A 37 C1A C1 CH4 0.000000 16.0430 0 + 758 C1A 38 C1A C1 CH4 0.000000 16.0430 0 + 759 C1A 39 C1A C1 CH4 0.000000 16.0430 0 + 760 C1A 40 C1A C1 CH4 0.000000 16.0430 0 + 761 C1A 41 C1A C1 CH4 0.000000 16.0430 0 + 762 C1A 42 C1A C1 CH4 0.000000 16.0430 0 + 763 C1A 43 C1A C1 CH4 0.000000 16.0430 0 + 764 C1A 44 C1A C1 CH4 0.000000 16.0430 0 + 765 C1A 45 C1A C1 CH4 0.000000 16.0430 0 + 766 C1A 46 C1A C1 CH4 0.000000 16.0430 0 + 767 C1A 47 C1A C1 CH4 0.000000 16.0430 0 + 768 C1A 48 C1A C1 CH4 0.000000 16.0430 0 + 769 C1A 49 C1A C1 CH4 0.000000 16.0430 0 + 770 C1A 50 C1A C1 CH4 0.000000 16.0430 0 + 771 C1A 51 C1A C1 CH4 0.000000 16.0430 0 + 772 C1A 52 C1A C1 CH4 0.000000 16.0430 0 + 773 C1A 53 C1A C1 CH4 0.000000 16.0430 0 + 774 C1A 54 C1A C1 CH4 0.000000 16.0430 0 + 775 C1A 55 C1A C1 CH4 0.000000 16.0430 0 + 776 C1A 56 C1A C1 CH4 0.000000 16.0430 0 + 777 C1A 57 C1A C1 CH4 0.000000 16.0430 0 + 778 C1A 58 C1A C1 CH4 0.000000 16.0430 0 + 779 C1A 59 C1A C1 CH4 0.000000 16.0430 0 + 780 C1A 60 C1A C1 CH4 0.000000 16.0430 0 + 781 C1A 61 C1A C1 CH4 0.000000 16.0430 0 + 782 C1A 62 C1A C1 CH4 0.000000 16.0430 0 + 783 C1A 63 C1A C1 CH4 0.000000 16.0430 0 + 784 C1A 64 C1A C1 CH4 0.000000 16.0430 0 + 785 C1A 65 C1A C1 CH4 0.000000 16.0430 0 + 786 C1A 66 C1A C1 CH4 0.000000 16.0430 0 + 787 C1A 67 C1A C1 CH4 0.000000 16.0430 0 + 788 C1A 68 C1A C1 CH4 0.000000 16.0430 0 + 789 C1A 69 C1A C1 CH4 0.000000 16.0430 0 + 790 C1A 70 C1A C1 CH4 0.000000 16.0430 0 + 791 C1A 71 C1A C1 CH4 0.000000 16.0430 0 + 792 C1A 72 C1A C1 CH4 0.000000 16.0430 0 + 793 C1A 73 C1A C1 CH4 0.000000 16.0430 0 + 794 C1A 74 C1A C1 CH4 0.000000 16.0430 0 + 795 C1A 75 C1A C1 CH4 0.000000 16.0430 0 + 796 C1A 76 C1A C1 CH4 0.000000 16.0430 0 + 797 C1A 77 C1A C1 CH4 0.000000 16.0430 0 + 798 C1A 78 C1A C1 CH4 0.000000 16.0430 0 + 799 C1A 79 C1A C1 CH4 0.000000 16.0430 0 + 800 C1A 80 C1A C1 CH4 0.000000 16.0430 0 + 801 C1A 81 C1A C1 CH4 0.000000 16.0430 0 + 802 C1A 82 C1A C1 CH4 0.000000 16.0430 0 + 803 C1A 83 C1A C1 CH4 0.000000 16.0430 0 + 804 C1A 84 C1A C1 CH4 0.000000 16.0430 0 + 805 C1A 85 C1A C1 CH4 0.000000 16.0430 0 + 806 C1A 86 C1A C1 CH4 0.000000 16.0430 0 + 807 C1A 87 C1A C1 CH4 0.000000 16.0430 0 + 808 C1A 88 C1A C1 CH4 0.000000 16.0430 0 + 809 C1A 89 C1A C1 CH4 0.000000 16.0430 0 + 810 C1A 90 C1A C1 CH4 0.000000 16.0430 0 + 811 C1A 91 C1A C1 CH4 0.000000 16.0430 0 + 812 C1A 92 C1A C1 CH4 0.000000 16.0430 0 + 813 C1A 93 C1A C1 CH4 0.000000 16.0430 0 + 814 C1A 94 C1A C1 CH4 0.000000 16.0430 0 + 815 C1A 95 C1A C1 CH4 0.000000 16.0430 0 + 816 C1A 96 C1A C1 CH4 0.000000 16.0430 0 + 817 C1A 97 C1A C1 CH4 0.000000 16.0430 0 + 818 C1A 98 C1A C1 CH4 0.000000 16.0430 0 + 819 C1A 99 C1A C1 CH4 0.000000 16.0430 0 + 820 C1A 100 C1A C1 CH4 0.000000 16.0430 0 + 821 C1A 101 C1A C1 CH4 0.000000 16.0430 0 + 822 C1A 102 C1A C1 CH4 0.000000 16.0430 0 + 823 C1A 103 C1A C1 CH4 0.000000 16.0430 0 + 824 C1A 104 C1A C1 CH4 0.000000 16.0430 0 + 825 C1A 105 C1A C1 CH4 0.000000 16.0430 0 + 826 C1A 106 C1A C1 CH4 0.000000 16.0430 0 + 827 C1A 107 C1A C1 CH4 0.000000 16.0430 0 + 828 C1A 108 C1A C1 CH4 0.000000 16.0430 0 + 829 C1A 109 C1A C1 CH4 0.000000 16.0430 0 + 830 C1A 110 C1A C1 CH4 0.000000 16.0430 0 + 831 C1A 111 C1A C1 CH4 0.000000 16.0430 0 + 832 C1A 112 C1A C1 CH4 0.000000 16.0430 0 + 833 C1A 113 C1A C1 CH4 0.000000 16.0430 0 + 834 C1A 114 C1A C1 CH4 0.000000 16.0430 0 + 835 C1A 115 C1A C1 CH4 0.000000 16.0430 0 + 836 C1A 116 C1A C1 CH4 0.000000 16.0430 0 + 837 C1A 117 C1A C1 CH4 0.000000 16.0430 0 + 838 C1A 118 C1A C1 CH4 0.000000 16.0430 0 + 839 C1A 119 C1A C1 CH4 0.000000 16.0430 0 + 840 C1A 120 C1A C1 CH4 0.000000 16.0430 0 + 841 C1A 121 C1A C1 CH4 0.000000 16.0430 0 + 842 C1A 122 C1A C1 CH4 0.000000 16.0430 0 + 843 C1A 123 C1A C1 CH4 0.000000 16.0430 0 + 844 C1A 124 C1A C1 CH4 0.000000 16.0430 0 + 845 C1A 125 C1A C1 CH4 0.000000 16.0430 0 + 846 C1A 126 C1A C1 CH4 0.000000 16.0430 0 + 847 C1A 127 C1A C1 CH4 0.000000 16.0430 0 + 848 C1A 128 C1A C1 CH4 0.000000 16.0430 0 + 849 C1A 129 C1A C1 CH4 0.000000 16.0430 0 + 850 C1A 130 C1A C1 CH4 0.000000 16.0430 0 + 851 C1A 131 C1A C1 CH4 0.000000 16.0430 0 + 852 C1A 132 C1A C1 CH4 0.000000 16.0430 0 + 853 C1A 133 C1A C1 CH4 0.000000 16.0430 0 + 854 C1A 134 C1A C1 CH4 0.000000 16.0430 0 + 855 C1A 135 C1A C1 CH4 0.000000 16.0430 0 + 856 C1A 136 C1A C1 CH4 0.000000 16.0430 0 + 857 C1A 137 C1A C1 CH4 0.000000 16.0430 0 + 858 C1A 138 C1A C1 CH4 0.000000 16.0430 0 + 859 C1A 139 C1A C1 CH4 0.000000 16.0430 0 + 860 C1A 140 C1A C1 CH4 0.000000 16.0430 0 + 861 C1A 141 C1A C1 CH4 0.000000 16.0430 0 + 862 C1A 142 C1A C1 CH4 0.000000 16.0430 0 + 863 C1A 143 C1A C1 CH4 0.000000 16.0430 0 + 864 C1A 144 C1A C1 CH4 0.000000 16.0430 0 + 865 C1A 145 C1A C1 CH4 0.000000 16.0430 0 + 866 C1A 146 C1A C1 CH4 0.000000 16.0430 0 + 867 C1A 147 C1A C1 CH4 0.000000 16.0430 0 + 868 C1A 148 C1A C1 CH4 0.000000 16.0430 0 + 869 C1A 149 C1A C1 CH4 0.000000 16.0430 0 + 870 C1A 150 C1A C1 CH4 0.000000 16.0430 0 + 871 C1A 151 C1A C1 CH4 0.000000 16.0430 0 + 872 C1A 152 C1A C1 CH4 0.000000 16.0430 0 + 873 C1A 153 C1A C1 CH4 0.000000 16.0430 0 + 874 C1A 154 C1A C1 CH4 0.000000 16.0430 0 + 875 C1A 155 C1A C1 CH4 0.000000 16.0430 0 + 876 C1A 156 C1A C1 CH4 0.000000 16.0430 0 + 877 C1A 157 C1A C1 CH4 0.000000 16.0430 0 + 878 C1A 158 C1A C1 CH4 0.000000 16.0430 0 + 879 C1A 159 C1A C1 CH4 0.000000 16.0430 0 + 880 C1A 160 C1A C1 CH4 0.000000 16.0430 0 + 881 C1A 161 C1A C1 CH4 0.000000 16.0430 0 + 882 C1A 162 C1A C1 CH4 0.000000 16.0430 0 + 883 C1A 163 C1A C1 CH4 0.000000 16.0430 0 + 884 C1A 164 C1A C1 CH4 0.000000 16.0430 0 + 885 C1A 165 C1A C1 CH4 0.000000 16.0430 0 + 886 C1A 166 C1A C1 CH4 0.000000 16.0430 0 + 887 C1A 167 C1A C1 CH4 0.000000 16.0430 0 + 888 C1A 168 C1A C1 CH4 0.000000 16.0430 0 + 889 C1A 169 C1A C1 CH4 0.000000 16.0430 0 + 890 C1A 170 C1A C1 CH4 0.000000 16.0430 0 + 891 C1A 171 C1A C1 CH4 0.000000 16.0430 0 + 892 C1A 172 C1A C1 CH4 0.000000 16.0430 0 + 893 C1A 173 C1A C1 CH4 0.000000 16.0430 0 + 894 C1A 174 C1A C1 CH4 0.000000 16.0430 0 + 895 C1A 175 C1A C1 CH4 0.000000 16.0430 0 + 896 C1A 176 C1A C1 CH4 0.000000 16.0430 0 + 897 C1A 177 C1A C1 CH4 0.000000 16.0430 0 + 898 C1A 178 C1A C1 CH4 0.000000 16.0430 0 + 899 C1A 179 C1A C1 CH4 0.000000 16.0430 0 + 900 C1A 180 C1A C1 CH4 0.000000 16.0430 0 + 901 C1A 181 C1A C1 CH4 0.000000 16.0430 0 + 902 C1A 182 C1A C1 CH4 0.000000 16.0430 0 + 903 C1A 183 C1A C1 CH4 0.000000 16.0430 0 + 904 C1A 184 C1A C1 CH4 0.000000 16.0430 0 + 905 C1A 185 C1A C1 CH4 0.000000 16.0430 0 + 906 C1A 186 C1A C1 CH4 0.000000 16.0430 0 + 907 C1A 187 C1A C1 CH4 0.000000 16.0430 0 + 908 C1A 188 C1A C1 CH4 0.000000 16.0430 0 + 909 C1A 189 C1A C1 CH4 0.000000 16.0430 0 + 910 C1A 190 C1A C1 CH4 0.000000 16.0430 0 + 911 C1A 191 C1A C1 CH4 0.000000 16.0430 0 + 912 C1A 192 C1A C1 CH4 0.000000 16.0430 0 + 913 C1A 193 C1A C1 CH4 0.000000 16.0430 0 + 914 C1A 194 C1A C1 CH4 0.000000 16.0430 0 + 915 C1A 195 C1A C1 CH4 0.000000 16.0430 0 + 916 C1A 196 C1A C1 CH4 0.000000 16.0430 0 + 917 C1A 197 C1A C1 CH4 0.000000 16.0430 0 + 918 C1A 198 C1A C1 CH4 0.000000 16.0430 0 + 919 C1A 199 C1A C1 CH4 0.000000 16.0430 0 + 920 C1A 200 C1A C1 CH4 0.000000 16.0430 0 + 921 C1A 201 C1A C1 CH4 0.000000 16.0430 0 + 922 C1A 202 C1A C1 CH4 0.000000 16.0430 0 + 923 C1A 203 C1A C1 CH4 0.000000 16.0430 0 + 924 C1A 204 C1A C1 CH4 0.000000 16.0430 0 + 925 C1A 205 C1A C1 CH4 0.000000 16.0430 0 + 926 C1A 206 C1A C1 CH4 0.000000 16.0430 0 + 927 C1A 207 C1A C1 CH4 0.000000 16.0430 0 + 928 C1A 208 C1A C1 CH4 0.000000 16.0430 0 + 929 C1A 209 C1A C1 CH4 0.000000 16.0430 0 + 930 C1A 210 C1A C1 CH4 0.000000 16.0430 0 + 931 C1A 211 C1A C1 CH4 0.000000 16.0430 0 + 932 C1A 212 C1A C1 CH4 0.000000 16.0430 0 + 933 C1A 213 C1A C1 CH4 0.000000 16.0430 0 + 934 C1A 214 C1A C1 CH4 0.000000 16.0430 0 + 935 C1A 215 C1A C1 CH4 0.000000 16.0430 0 + 936 C1A 216 C1A C1 CH4 0.000000 16.0430 0 + 937 C1A 217 C1A C1 CH4 0.000000 16.0430 0 + 938 C1A 218 C1A C1 CH4 0.000000 16.0430 0 + 939 C1A 219 C1A C1 CH4 0.000000 16.0430 0 + 940 C1A 220 C1A C1 CH4 0.000000 16.0430 0 + 941 C1A 221 C1A C1 CH4 0.000000 16.0430 0 + 942 C1A 222 C1A C1 CH4 0.000000 16.0430 0 + 943 C1A 223 C1A C1 CH4 0.000000 16.0430 0 + 944 C1A 224 C1A C1 CH4 0.000000 16.0430 0 + 945 C1A 225 C1A C1 CH4 0.000000 16.0430 0 + 946 C1A 226 C1A C1 CH4 0.000000 16.0430 0 + 947 C1A 227 C1A C1 CH4 0.000000 16.0430 0 + 948 C1A 228 C1A C1 CH4 0.000000 16.0430 0 + 949 C1A 229 C1A C1 CH4 0.000000 16.0430 0 + 950 C1A 230 C1A C1 CH4 0.000000 16.0430 0 + 951 C1A 231 C1A C1 CH4 0.000000 16.0430 0 + 952 C1A 232 C1A C1 CH4 0.000000 16.0430 0 + 953 C1A 233 C1A C1 CH4 0.000000 16.0430 0 + 954 C1A 234 C1A C1 CH4 0.000000 16.0430 0 + 955 C1A 235 C1A C1 CH4 0.000000 16.0430 0 + 956 C1A 236 C1A C1 CH4 0.000000 16.0430 0 + 957 C1A 237 C1A C1 CH4 0.000000 16.0430 0 + 958 C1A 238 C1A C1 CH4 0.000000 16.0430 0 + 959 C1A 239 C1A C1 CH4 0.000000 16.0430 0 + 960 C1A 240 C1A C1 CH4 0.000000 16.0430 0 + + 540 !NBOND: bonds + 1 3 2 1 3 4 5 7 + 6 5 7 8 9 11 10 9 + 11 12 13 15 14 13 15 16 + 17 19 18 17 19 20 21 23 + 22 21 23 24 25 27 26 25 + 27 28 29 31 30 29 31 32 + 33 35 34 33 35 36 37 39 + 38 37 39 40 41 43 42 41 + 43 44 45 47 46 45 47 48 + 49 51 50 49 51 52 53 55 + 54 53 55 56 57 59 58 57 + 59 60 61 63 62 61 63 64 + 65 67 66 65 67 68 69 71 + 70 69 71 72 73 75 74 73 + 75 76 77 79 78 77 79 80 + 81 83 82 81 83 84 85 87 + 86 85 87 88 89 91 90 89 + 91 92 93 95 94 93 95 96 + 97 99 98 97 99 100 101 103 + 102 101 103 104 105 107 106 105 + 107 108 109 111 110 109 111 112 + 113 115 114 113 115 116 117 119 + 118 117 119 120 121 123 122 121 + 123 124 125 127 126 125 127 128 + 129 131 130 129 131 132 133 135 + 134 133 135 136 137 139 138 137 + 139 140 141 143 142 141 143 144 + 145 147 146 145 147 148 149 151 + 150 149 151 152 153 155 154 153 + 155 156 157 159 158 157 159 160 + 161 163 162 161 163 164 165 167 + 166 165 167 168 169 171 170 169 + 171 172 173 175 174 173 175 176 + 177 179 178 177 179 180 181 183 + 182 181 183 184 185 187 186 185 + 187 188 189 191 190 189 191 192 + 193 195 194 193 195 196 197 199 + 198 197 199 200 201 203 202 201 + 203 204 205 207 206 205 207 208 + 209 211 210 209 211 212 213 215 + 214 213 215 216 217 219 218 217 + 219 220 221 223 222 221 223 224 + 225 227 226 225 227 228 229 231 + 230 229 231 232 233 235 234 233 + 235 236 237 239 238 237 239 240 + 241 243 242 241 243 244 245 247 + 246 245 247 248 249 251 250 249 + 251 252 253 255 254 253 255 256 + 257 259 258 257 259 260 261 263 + 262 261 263 264 265 267 266 265 + 267 268 269 271 270 269 271 272 + 273 275 274 273 275 276 277 279 + 278 277 279 280 281 283 282 281 + 283 284 285 287 286 285 287 288 + 289 291 290 289 291 292 293 295 + 294 293 295 296 297 299 298 297 + 299 300 301 303 302 301 303 304 + 305 307 306 305 307 308 309 311 + 310 309 311 312 313 315 314 313 + 315 316 317 319 318 317 319 320 + 321 323 322 321 323 324 325 327 + 326 325 327 328 329 331 330 329 + 331 332 333 335 334 333 335 336 + 337 339 338 337 339 340 341 343 + 342 341 343 344 345 347 346 345 + 347 348 349 351 350 349 351 352 + 353 355 354 353 355 356 357 359 + 358 357 359 360 361 363 362 361 + 363 364 365 367 366 365 367 368 + 369 371 370 369 371 372 373 375 + 374 373 375 376 377 379 378 377 + 379 380 381 383 382 381 383 384 + 385 387 386 385 387 388 389 391 + 390 389 391 392 393 395 394 393 + 395 396 397 399 398 397 399 400 + 401 403 402 401 403 404 405 407 + 406 405 407 408 409 411 410 409 + 411 412 413 415 414 413 415 416 + 417 419 418 417 419 420 421 423 + 422 421 423 424 425 427 426 425 + 427 428 429 431 430 429 431 432 + 433 435 434 433 435 436 437 439 + 438 437 439 440 441 443 442 441 + 443 444 445 447 446 445 447 448 + 449 451 450 449 451 452 453 455 + 454 453 455 456 457 459 458 457 + 459 460 461 463 462 461 463 464 + 465 467 466 465 467 468 469 471 + 470 469 471 472 473 475 474 473 + 475 476 477 479 478 477 479 480 + 481 483 482 481 483 484 485 487 + 486 485 487 488 489 491 490 489 + 491 492 493 495 494 493 495 496 + 497 499 498 497 499 500 501 503 + 502 501 503 504 505 507 506 505 + 507 508 509 511 510 509 511 512 + 513 515 514 513 515 516 517 519 + 518 517 519 520 521 523 522 521 + 523 524 525 527 526 525 527 528 + 529 531 530 529 531 532 533 535 + 534 533 535 536 537 539 538 537 + 539 540 541 543 542 541 543 544 + 545 547 546 545 547 548 549 551 + 550 549 551 552 553 555 554 553 + 555 556 557 559 558 557 559 560 + 561 563 562 561 563 564 565 567 + 566 565 567 568 569 571 570 569 + 571 572 573 575 574 573 575 576 + 577 579 578 577 579 580 581 583 + 582 581 583 584 585 587 586 585 + 587 588 589 591 590 589 591 592 + 593 595 594 593 595 596 597 599 + 598 597 599 600 601 603 602 601 + 603 604 605 607 606 605 607 608 + 609 611 610 609 611 612 613 615 + 614 613 615 616 617 619 618 617 + 619 620 621 623 622 621 623 624 + 625 627 626 625 627 628 629 631 + 630 629 631 632 633 635 634 633 + 635 636 637 639 638 637 639 640 + 641 643 642 641 643 644 645 647 + 646 645 647 648 649 651 650 649 + 651 652 653 655 654 653 655 656 + 657 659 658 657 659 660 661 663 + 662 661 663 664 665 667 666 665 + 667 668 669 671 670 669 671 672 + 673 675 674 673 675 676 677 679 + 678 677 679 680 681 683 682 681 + 683 684 685 687 686 685 687 688 + 689 691 690 689 691 692 693 695 + 694 693 695 696 697 699 698 697 + 699 700 701 703 702 701 703 704 + 705 707 706 705 707 708 709 711 + 710 709 711 712 713 715 714 713 + 715 716 717 719 718 717 719 720 + + 360 !NTHETA: angles + 1 3 4 2 1 3 5 7 8 + 6 5 7 9 11 12 10 9 11 + 13 15 16 14 13 15 17 19 20 + 18 17 19 21 23 24 22 21 23 + 25 27 28 26 25 27 29 31 32 + 30 29 31 33 35 36 34 33 35 + 37 39 40 38 37 39 41 43 44 + 42 41 43 45 47 48 46 45 47 + 49 51 52 50 49 51 53 55 56 + 54 53 55 57 59 60 58 57 59 + 61 63 64 62 61 63 65 67 68 + 66 65 67 69 71 72 70 69 71 + 73 75 76 74 73 75 77 79 80 + 78 77 79 81 83 84 82 81 83 + 85 87 88 86 85 87 89 91 92 + 90 89 91 93 95 96 94 93 95 + 97 99 100 98 97 99 101 103 104 + 102 101 103 105 107 108 106 105 107 + 109 111 112 110 109 111 113 115 116 + 114 113 115 117 119 120 118 117 119 + 121 123 124 122 121 123 125 127 128 + 126 125 127 129 131 132 130 129 131 + 133 135 136 134 133 135 137 139 140 + 138 137 139 141 143 144 142 141 143 + 145 147 148 146 145 147 149 151 152 + 150 149 151 153 155 156 154 153 155 + 157 159 160 158 157 159 161 163 164 + 162 161 163 165 167 168 166 165 167 + 169 171 172 170 169 171 173 175 176 + 174 173 175 177 179 180 178 177 179 + 181 183 184 182 181 183 185 187 188 + 186 185 187 189 191 192 190 189 191 + 193 195 196 194 193 195 197 199 200 + 198 197 199 201 203 204 202 201 203 + 205 207 208 206 205 207 209 211 212 + 210 209 211 213 215 216 214 213 215 + 217 219 220 218 217 219 221 223 224 + 222 221 223 225 227 228 226 225 227 + 229 231 232 230 229 231 233 235 236 + 234 233 235 237 239 240 238 237 239 + 241 243 244 242 241 243 245 247 248 + 246 245 247 249 251 252 250 249 251 + 253 255 256 254 253 255 257 259 260 + 258 257 259 261 263 264 262 261 263 + 265 267 268 266 265 267 269 271 272 + 270 269 271 273 275 276 274 273 275 + 277 279 280 278 277 279 281 283 284 + 282 281 283 285 287 288 286 285 287 + 289 291 292 290 289 291 293 295 296 + 294 293 295 297 299 300 298 297 299 + 301 303 304 302 301 303 305 307 308 + 306 305 307 309 311 312 310 309 311 + 313 315 316 314 313 315 317 319 320 + 318 317 319 321 323 324 322 321 323 + 325 327 328 326 325 327 329 331 332 + 330 329 331 333 335 336 334 333 335 + 337 339 340 338 337 339 341 343 344 + 342 341 343 345 347 348 346 345 347 + 349 351 352 350 349 351 353 355 356 + 354 353 355 357 359 360 358 357 359 + 361 363 364 362 361 363 365 367 368 + 366 365 367 369 371 372 370 369 371 + 373 375 376 374 373 375 377 379 380 + 378 377 379 381 383 384 382 381 383 + 385 387 388 386 385 387 389 391 392 + 390 389 391 393 395 396 394 393 395 + 397 399 400 398 397 399 401 403 404 + 402 401 403 405 407 408 406 405 407 + 409 411 412 410 409 411 413 415 416 + 414 413 415 417 419 420 418 417 419 + 421 423 424 422 421 423 425 427 428 + 426 425 427 429 431 432 430 429 431 + 433 435 436 434 433 435 437 439 440 + 438 437 439 441 443 444 442 441 443 + 445 447 448 446 445 447 449 451 452 + 450 449 451 453 455 456 454 453 455 + 457 459 460 458 457 459 461 463 464 + 462 461 463 465 467 468 466 465 467 + 469 471 472 470 469 471 473 475 476 + 474 473 475 477 479 480 478 477 479 + 481 483 484 482 481 483 485 487 488 + 486 485 487 489 491 492 490 489 491 + 493 495 496 494 493 495 497 499 500 + 498 497 499 501 503 504 502 501 503 + 505 507 508 506 505 507 509 511 512 + 510 509 511 513 515 516 514 513 515 + 517 519 520 518 517 519 521 523 524 + 522 521 523 525 527 528 526 525 527 + 529 531 532 530 529 531 533 535 536 + 534 533 535 537 539 540 538 537 539 + 541 543 544 542 541 543 545 547 548 + 546 545 547 549 551 552 550 549 551 + 553 555 556 554 553 555 557 559 560 + 558 557 559 561 563 564 562 561 563 + 565 567 568 566 565 567 569 571 572 + 570 569 571 573 575 576 574 573 575 + 577 579 580 578 577 579 581 583 584 + 582 581 583 585 587 588 586 585 587 + 589 591 592 590 589 591 593 595 596 + 594 593 595 597 599 600 598 597 599 + 601 603 604 602 601 603 605 607 608 + 606 605 607 609 611 612 610 609 611 + 613 615 616 614 613 615 617 619 620 + 618 617 619 621 623 624 622 621 623 + 625 627 628 626 625 627 629 631 632 + 630 629 631 633 635 636 634 633 635 + 637 639 640 638 637 639 641 643 644 + 642 641 643 645 647 648 646 645 647 + 649 651 652 650 649 651 653 655 656 + 654 653 655 657 659 660 658 657 659 + 661 663 664 662 661 663 665 667 668 + 666 665 667 669 671 672 670 669 671 + 673 675 676 674 673 675 677 679 680 + 678 677 679 681 683 684 682 681 683 + 685 687 688 686 685 687 689 691 692 + 690 689 691 693 695 696 694 693 695 + 697 699 700 698 697 699 701 703 704 + 702 701 703 705 707 708 706 705 707 + 709 711 712 710 709 711 713 715 716 + 714 713 715 717 719 720 718 717 719 + + 180 !NPHI: dihedrals + 2 1 3 4 6 5 7 8 + 10 9 11 12 14 13 15 16 + 18 17 19 20 22 21 23 24 + 26 25 27 28 30 29 31 32 + 34 33 35 36 38 37 39 40 + 42 41 43 44 46 45 47 48 + 50 49 51 52 54 53 55 56 + 58 57 59 60 62 61 63 64 + 66 65 67 68 70 69 71 72 + 74 73 75 76 78 77 79 80 + 82 81 83 84 86 85 87 88 + 90 89 91 92 94 93 95 96 + 98 97 99 100 102 101 103 104 + 106 105 107 108 110 109 111 112 + 114 113 115 116 118 117 119 120 + 122 121 123 124 126 125 127 128 + 130 129 131 132 134 133 135 136 + 138 137 139 140 142 141 143 144 + 146 145 147 148 150 149 151 152 + 154 153 155 156 158 157 159 160 + 162 161 163 164 166 165 167 168 + 170 169 171 172 174 173 175 176 + 178 177 179 180 182 181 183 184 + 186 185 187 188 190 189 191 192 + 194 193 195 196 198 197 199 200 + 202 201 203 204 206 205 207 208 + 210 209 211 212 214 213 215 216 + 218 217 219 220 222 221 223 224 + 226 225 227 228 230 229 231 232 + 234 233 235 236 238 237 239 240 + 242 241 243 244 246 245 247 248 + 250 249 251 252 254 253 255 256 + 258 257 259 260 262 261 263 264 + 266 265 267 268 270 269 271 272 + 274 273 275 276 278 277 279 280 + 282 281 283 284 286 285 287 288 + 290 289 291 292 294 293 295 296 + 298 297 299 300 302 301 303 304 + 306 305 307 308 310 309 311 312 + 314 313 315 316 318 317 319 320 + 322 321 323 324 326 325 327 328 + 330 329 331 332 334 333 335 336 + 338 337 339 340 342 341 343 344 + 346 345 347 348 350 349 351 352 + 354 353 355 356 358 357 359 360 + 362 361 363 364 366 365 367 368 + 370 369 371 372 374 373 375 376 + 378 377 379 380 382 381 383 384 + 386 385 387 388 390 389 391 392 + 394 393 395 396 398 397 399 400 + 402 401 403 404 406 405 407 408 + 410 409 411 412 414 413 415 416 + 418 417 419 420 422 421 423 424 + 426 425 427 428 430 429 431 432 + 434 433 435 436 438 437 439 440 + 442 441 443 444 446 445 447 448 + 450 449 451 452 454 453 455 456 + 458 457 459 460 462 461 463 464 + 466 465 467 468 470 469 471 472 + 474 473 475 476 478 477 479 480 + 482 481 483 484 486 485 487 488 + 490 489 491 492 494 493 495 496 + 498 497 499 500 502 501 503 504 + 506 505 507 508 510 509 511 512 + 514 513 515 516 518 517 519 520 + 522 521 523 524 526 525 527 528 + 530 529 531 532 534 533 535 536 + 538 537 539 540 542 541 543 544 + 546 545 547 548 550 549 551 552 + 554 553 555 556 558 557 559 560 + 562 561 563 564 566 565 567 568 + 570 569 571 572 574 573 575 576 + 578 577 579 580 582 581 583 584 + 586 585 587 588 590 589 591 592 + 594 593 595 596 598 597 599 600 + 602 601 603 604 606 605 607 608 + 610 609 611 612 614 613 615 616 + 618 617 619 620 622 621 623 624 + 626 625 627 628 630 629 631 632 + 634 633 635 636 638 637 639 640 + 642 641 643 644 646 645 647 648 + 650 649 651 652 654 653 655 656 + 658 657 659 660 662 661 663 664 + 666 665 667 668 670 669 671 672 + 674 673 675 676 678 677 679 680 + 682 681 683 684 686 685 687 688 + 690 689 691 692 694 693 695 696 + 698 697 699 700 702 701 703 704 + 706 705 707 708 710 709 711 712 + 714 713 715 716 718 717 719 720 + + 0 !NIMPHI: impropers + + + 0 !NDON: donors + + + 0 !NACC: acceptors + + + 0 !NNB + + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 + + + 1 0 !NGRP + 0 0 0 + diff --git a/example_file/methane_pentane/GOMC_CPU_GCMC b/example_file/methane_pentane/GOMC_CPU_GCMC new file mode 100755 index 0000000000000000000000000000000000000000..02e807df724faee3860acd0844d887bb3cf4303a GIT binary patch literal 2409892 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

VUhq#pd76HlHxO1_f`wm$LLfv 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%0AFZ|K~ahvS0@frB}y`<2zGP)`dqb+#G`Z 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

8WePMi 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

kx5W84 ztif-{=qXF#kVeXgye11D7cP)F#dR@mFt$^w3X#)f=i`vl_i_JAJbn&%PP)SM=VP@b zCXm72I9WCu@vw{)cjVPb@G`i6`6X#nF6B_nk%AIQ?~B(d+CI%y$O(rzeEMrEr;)RT zNirgSR?BVNzg-uN^`{hdaY*B3)U{9+P8ANSi!oODe#elh9qt)fS^sb@d*M@AxIswC zoZ|Ijes&K_VH5hTloSr>5*hQim-*xTlpLpc{^@$Ac~%K!Q9*q|m&=&vCRx~0NXeYy zdE(DOIKY_g1_HHZxn+Dxmi!7;E6IEChs|4fCk=wCfkqW}L0=WEV79Hn2d8#+beICct8 z=!pD)-(!z{J7J2J;)KI^TtnT>{|^trPssT5>%yAuM?9tG)zI_?`W)Y|F0SeA2tI=3 zkavVr(s{C}bU^;`N-0I0;yxFT-%a8G&Y7}BWDJqfn>QmExELb%VKjfI>K7##X%$i{gz5?oLEktLnw48$8UR@4!8CBpNRRk)1Ajhcp+ z3FRf6m@nIP)*MR#XPS(+=KS?9>f*h^@V5fOk#Q1SpE^-ATV2UhWE?JSM-YBe#(sKE z`!}2=XQgIyWT0}AE8uU{m0acGTqPST^F?q89MV%V+V!$5r0FS{)3@q6H_peoS~i{x zM(L!kXC$cWRawaOL`voq*TopdS@#s#@no`(`pHs=@&faZ*EFmu+%4fmlx>vsrFzZ~ zaJXsshq|~=xwYh+bgabda@b_&BHop_R8yyva;nSgqG{MtC>sTWcsX%jx+V_b(3iH8 z(LWM<5!^t~m$)$Vl^ko}NZheJ55235BK)%Cq5l_8vTjpV%n66VW<(BQhm3DW%|dh) zShrOOK3PiE?G*{ujkhAgFC@Nm-DsW@4rBQN)$ab;L~T5gn%66b)p3OPVG#VfMR=yr zP{OHG_QQqxXH_Mx&X~;GE zL2di4=j(^-_cea3`u~m32RPq5?a)puA+LN6fqx8@na*b%`k~vuDSi(u8EtXcn@`CO z-{%iMFDKfkt2N~i=Q#0CrEo6iXbW=)RmdgDSMqaS?!-=#-A)dN7NQ@5lWlT-eMEvo za=Pr$@1${VsiCuBlUZqa#7tKp( z>YrZYy~h$VN8XS6ct%czdDpsWJkK-<=4nSHr%*MHRF~lL!0BNL2Eb$UX!RbGSRMuZ z)9j5U9y(5u_1c`󼛣zzBxr%>sizzwn~3l)-)BiU717lo75qWd z;0A#`_Xc8|P&kfkm0&lzZPm0BDE2x#qp9#`O`SsX@V?)rYo5xgmZh_){-^84BmLUr z`_^yXQFv{V?Kh*FyL$>abgH!+(j#PaXHHVd(n7JH91QQjy5o0t& zyo9(v65LJrg6k$6QnqId2i+15rNAXJn&n3+?IJNnQ$MZX;GctdSyorZ*KRy^rzD)> zHb(a&2Q8&Lr8rtyN|wy;Yg25oEPP%_$(-W4=$m9PI6C3nE?b6rN5-o2+P43X?s?>r z;`!sxIWAQmyJibJU`QmsM7$Y^LOJE|xf8|CMqCvMURL$jhluc_5ZKVsJye(iWVBS!#YAKMV#XG zo6cuHHI>Ds3mw=Sm~C>WEbJ(xWKQus(f)ZY&d1@t%@2C$IMw3_&vvM*j;4qHpVo{m zrB#A+=cUYczKny&DgD_7JCNpGMP40Qw)m#_I*dx3a46kg7S^#ab?Jy=(1cP zxPv|~hmA&mIQ0MQqMfYcnX-B^w;@|QqWj)+2$67D^Q#eT4}UO+Nd8agLH&CX;rJ+8 ziD)OI`5R=(kK67*jFb`Ck9bbT@s&rL*>~@mnhs@~-z}shoQOutXCvj2aU<^^hhdBH z>AA-(#0JFcGQ{VI+ya|`r&4|rKnL{a)DJ6ys70iyaKENoG!6OLmV^3Sd`u>nNH{E} zv&{b+hb=cs7E)14=0qc+_Man%IXK?@aVvtSq<(%xXSx6}P)1#ja6NIJtUZwofyi`C z!%Kz65>DKWC6TcbsVET0SMvV*QMX_E*<1;=gSwc#}NxoA0c&jLn$}T61XExdTImZE#&y70DT!>@V>BrwT9uG>WG5KYiY1Cyh zj+9*pnvC$iyf+fwPSYd`$@m1>Ki1Gj)5j#j!9q&Hi74AC?!$Gh1spb7PcjC{=tC1_ zA-f|bbBgC@JC;@sU6noZpN@O~>--wSOK7QdpqVT_?m!C=aR+)ALH}X^<6{T^ui})1 zQ@k$vEb=sEuwADTV7z8HT83crBmRcy5Q*cN^{z;qhZq)#>ku6JXUUwnEO|@zq$1%k zA?0j=qU?+G@enuRMl$0jJb;LsFdA{CEUCM9l(9k6@C_j)b2@b0HxP^KW^D4lWA$jV zKecdNXeYyy6Holg4l4ii7--D#35ZFqhYCp@L--AerBS3l5ib0QG)HjdbAqPr5H|^29lxb%IA2IfILTK!FeYAR zhP8mh#^F)3FORvjYlL`8#@NActNHCJwg5+`|E(Cpk*>;FF2OILhg|uUl5nCZ%X~0- zKk}E(5pY;gH_H54#`>&4JS{s{#%*u%wRyiG#?4u=I6`x2g1-}eMI<~Amug=r!hcN& zM<1#^I_G7m0BilQ%x@X8Lw#kydAkm|q!(pvWqz0N6jhv(aFVZd9I8I>Sy#r!5-=0{KeWp0gaZoZBgK z$mRGgOO|t+D-rrju$n?7b*|yh}7M-8966w+Bb*5JCYA+>eNIz zM4lw_D!TrDK?xE>V-$^9%JSpLyc%=y{ zu5@5bw(Y|cAE)@y&jW0QSCl(E3Itavhc%i?gntv7Y@d-5tkIwIsczmXeJ-A-SG0Xv zY0ZKMvu~f2a;WVdBIgN7yKj_8Y8xeytSi5x&APHRf)BE9pVOl4;}(?3zI{eU+lQ?Y zbkDwhCPmxF^URbeqxLx+V*4DH{xgH^bJ+TiYx@uTkLURh`;X_L|M)jv*g*02iLRAu zr?*=AUSgrd7Zf;G;KKPhdKMo$bNc0V<={6G1vM>&m@UD0#e?R6uk^ET{cnNzu0mId z*E9`h3#BBSR7xp6&+`z6GqVS}QF1tM`~N1*h^qSqb^kdMHzGK3vmg%+e8!LXBN0C1 zM|^-NB-GK=iI2sW%B!jl?zgQ{>HM#^NA%gRuTqHN6xNj0@;`)5MrnQ^mdKSXrJBG+ zl+&-H$b2G?3x0k==)jl_q5i`XZgQ;P_?RTSq3j%)QxB0X{tA%+vLwR6Nn|aNm$OH9 zM3H|G;gTkq=WOLLkFS0%l1TRXT@vi(GimQIi4~eUwNp+}dAtGPw_vYG=co555x>N? zN#V=mNc#GQC9y}VkbRmg+jAbS502!xt`*s~C(7QC`BgH+X2et(;-82UwXwN8t)*#L zUPzHklCR{?E!lFM1bq9}I}$}HFi_T9=Cnq9N47wbkW21^jy1K5-Ar9q%DitlPCPi* zkW-OdQb!qk?rB*#LP*J+SZvg;YvnNeBjj|81U=I~ADGlNQ5n?rp)6b_q-0Ln>Oxr+{{K}gA*;<~OPjad4^G0(`K56zYtOqPV$xFdqn($>i#3Saow*W*w1W` zcM%(8)LoLg`H&2x)ei@laN5r-$ayO!?Dkm}=ad#x1K`e^I0t9c; zQtVv>|BoE81Mzqyjy+CdYb1&xs^v@aVU7g)J& zocGIVCyY>0N6yeuoS~LGa-G7ZRLn`4O8>X-k^GDOQj)C_@0Tiwc)v76#QUW!VtlkK z?m)!*We6hPFHa)k{W2F3@0Yg_@qY17-NyTc9|ceLOJO!^ykE{i#QUW_BHk};5%GTM zf?&TCQ2Tl#?i1KAIZo1kxlsFsY8{!8KfPZZ*;(Ka`{iG3t0TG(7txk+ALbQ(_u*Hg zKJ3V`3LmNuYb&SUgNhxt`|l7uJ}ZGk8ZYCFKTme(-vF4dTe-7NRhSBD%KT|4^ZZH{ zHW5-XC+%mY=>K&7hx71!;VjL~V%k$pT^ZwNKSU2%dD#qE_?VEAImOHTvFDGj$vejF z!ueE<>!txPxLPO~NA8kf`{mFM4f{)66i2u%KA?Ht(Qp;a6Owt>OCEqoY{IDso}nUMLUfA+qlF)K67df*jEf?^c7GufzII<0317Q!iiEG- z_eH|j?mUyAHr~(l^EAYTh>N4h^@x^{;2uA?B@!wHu!1wYwoe?sW0pFc*yrkKh^W~?LG*4s)Q2`1926y*UHMt{NVxD z3k;@?aOZKMgwvH0j4XVWF}y=!R}}DnFm5ctt4$$qo0X8@clg4JIu37-BTFQRG$OK1 zVuXa#J<2I9ueipxV5vk=O{*dp?Fz?{%O%Kk3m%n6vGcg#cwXXFO`X&Plv zLFN?K#r`Uy98PuD6R9k_0*7?ue`dfr_iU{xSK+?VWg{RK$d1s@DaYo>@kovIeSb?MC|K^-EGN>H`u zc`b@uOQf~VD38XGvz0@!yLAN`-Yrouj?9s$DRFro;d2R&NY{3wa+t?$yC)K^V3|Z; zZ4gHWstm=va=(j&x6b59c)Kl>n51H^AXCjKCE=usl)n3WAWbQ-n=BEcP*|5?*5n!2{nlylJfG3Mz0=sTa&r9XpxMJ3qpJfrecD_X^cmA^*M*vUO* z__A`ev(k~xktj+-c$Az(N+}27d3fEggI3nHeX4qs+Ky3`$@58;#r|N7U|7_?N`I=} zDH2?0`g;EVvG*qMaaHC2|GAUN9$nxtm^4WjNzyS%OOd6MCX*&K z%QXva5n+I`3Fs)5O~7FjP>?}Ti-L@@OO;VkK~M%LShV7xMRxeVpL@=oByCelf8W>d z_5Xe4zH;-q&pFTYoadZ-?pdFEM>KEXwC?4f&FLP)<-Mtdt6WNCs$tp*pBZ=lA`hUL zxmvO&TM9z_4Ycm%UzMlLOVg~mNjKatakZR6oGru>&N*@+$7P&i|DBw>_Abf)bXuRq z63LyLsd6q3<8+S?zvcNh3n{hCJ>;T?^9`Y%<;+#N4^k6A%*it2=|a>{LgW9 z5%s|OJViJT;tC;dg!rNtGlvj~xl3YB;h)Ss-Q&*?6S(@4v}IHHCj)?sgpjveq%m}3 z#3@>8u4}>H4BMF!;^*IwK=;5Jjv*ht4wvSiT$FO2DFGL7N_KAKwBr1;Io-pP=Uxb1 zt3&lgHN*=Na0lmZoc|QULPT^O0DipRi0KpY5a&|4ki#9{?9at=&MP@BF?R;1dq~GB zkFs0%87?IIK1ugwE~aq02LT+eu4!Bd(3O*+`E3Cj358|#*gBcwU}BY!(?&R zcU_0;z>9>CM_L-=D}+e!Pa2t9Xe`~XI!=HaBWtu0rJ5!%OseAu@b z(fSZB_Gb{OlKi`in06*Cs+WIK-QFprR-Om(HwZUofDnmsWzI8%tL<_KsjqH2KY*C& zDflbIC-qh49E&*J6|GGMjV{xsWBIYow8Tk$>V2egLhXI+%Y_4WDJO zZpnL~OQ^?gjQ4w`uFQ=@%Phh@9)OSv>dHI@vE4d377pq5TSew$-n0ML+t~lcI(Lif z2hzgLmPz0ZQqyiR#Jxg1&nY!6Ekr*5_TzMY?I%;^W)av*RZ?d`$Q0dmvGx2`-Iy1M zkxJ$M__%zM^>9z7143kO76o62nD52B4>1lxs;nAM%PbAYuY_0yA?CO-mqCctZaVTo zJCWH#8t@MwWHI6ZA!KJkWZW3}UE-4&)RCd3W=ll$w&{0Tye_kM1zW%Ezi)`4m^|1JaFL!0%{{mcLBZPiEF|KHe_y(DWi zO;iI}mf1sUf-F0p!zpWW?pN%j16&Vb$#)qJ_F`fX664B9&zWPB!Qyyg+=FY5kDfb! z)V=xN9{=B1_h^S@l|(wk1ErqGvbL;)lnWtitE)K0Tie}T0^%lQCqUC5IWDjs}X)$FhsZB!VcnU(+d!OWSu*6gTv!1pv zEvBpp%V&_)IsBUly2mXL(j&SucSAHuUnNHYS|pu%dAQCqgv+)L;y7WE!^^|Px%dA5 zNAmDHjB@kvv}aEVA!5(x#oUVw;j&!`v5h_Q%JCZ19i79B`vvc?#t4X z!S8Td(%0CW?&0P4fBQ52QTdbdJCqWUHB8x_a3>H#q=XPZZzuFan(E$K+k;LLqF z=@zc7ukue~+{3e3%5g{a@T1E4e|!9YV?8o^jM7%Shg?YCQ6r7L)T^IRdm4o}k$*Cw z{|acW;@>u76QgTBOzt5UqU)Pd0i&D~xwugX@c#Q1_`s09&K|2VVCbUIh7UhHa9P4P_e1yir`gxeJ}|btrup4*#fEQ^!LcFD_u*L{ z;!9D@S*!JW|0PV0U~Oe^-n?*2-#}+;m)u8HdBnVV%bJc~*j&9}S$$Pw^TLLOs&e|= zuHM#_Ri{P!T2@5+g)Mhf&R8@!;0zA5EbofWZRvM)NaTCBz5d(!{tCqoqlfrS)tBVM?r6va(nOGKVDIFn5}AN<&36iOJ8e;r@@o+a7ccZS8YdV z7>b|SFt@#P^@vE648_lw+uPH&b@Z_KnN>Y2y0$iNSp2M-PKv*;rE7$aA^o!!b~}B& zPPA`CyyRonym_u}spXY33{fu+VNa(zf-1fo%ec$tYFXv786&9as&blJ13XqyI_x-d zL1+I!?~1;bZeGRx#}5;4K9W2}*Q-~LePa64^Q7JQ>HU9v=J_+8owMN1`>y`iA5TAK zm^hc2V~2-h(pEL_gpkW0`dX;iUwFgUzy8j#o5pNhF@Ep=9J@F;<+i=%w&-}68jf_@ zmYW-1-M6NHpmJn!kpJU{*BDptuz$nkXI2gLcK44IAFlt1#%Om--^#5y@J9~U%pLaV z+R~ol_j2$XE6b{{zDkZ)N7VNtoBLXN`ny^NqH0!s?`b32waUZmd%N8D_TIj3x5YcW zv3Edt-NTKKwhnehHB+=t9l5Y)ps%HARg0r$HAYwT^{$cz%p8?RpwH#6T}`d;SrM)D zqFmfIe%eRGPge~yT9bdpRTa_O7$K|b@R#QE%FB)Ayh3@Sc z&Sc^%YpSbzyPe*iXwSg#Xl$W2FKb$`a9*=IGS_tsnP}t>AFjVC8qGa;CVoaubzNuA z%4plx7U=j{ZZr+UR%x>aLq|81S}s4qn(9S8O-@I&Z>uMGC_nnHRWGU^p);3WQ|I;` zf73p{eQa$*jcTl=hdfSIH=fYcT&b#>7uDM~9ZG$*YHF?xtFT?kXAXiD!Jw*?f79gO z;vQ+)?15f;RbS_TdqD@cENJ(--KgCzea|RNl_QwucCB2dmd#zXbXm~t%En8gP59_< zPg?r#k%^2Ooo_@s<5X>5UvJ-RyE@v{WmDlh`|Y0I0lVLcwsy96M%(Pp9-9Zu?(O4B zEOGPDUs0ka_S+N7+h+4`+TmOtUNODho_NI2{}Q#Zr@eQ!O##@-4oCYsd)qo&hbL6I z{orXIt-56UlGD}kRgDb`8|IH2H_l#8y8Rt}gFP$l<d@PuADi2wyTgB+8VpJ-EJjz1k2&m z3`;|F^?*8TaeuV0|FHVrj+XB3mbRw3ht)*;R}S<#he;JWtiP}Iup#|woM@}4;Q^d9 z**@b8TVJWuFp--xds+Q5+N>4PWt}}}9T*-?jq2J?ux4D=GPs(-RD)`6TwJS8sBKb< z=FL;{s_L3(HWqoeUbXfPcD3~!GC(=mebLt56+NA&N884!l8NOrf^wJpOO&+Yl$O1) zhvA?*hMG-S{{a1(%CXtrJvT9Se`og~EiJJVjn=J&bmX=|-gsEo+O4HbtUcH-rLet(yQ2f#aaG;h+eb;!W%PRm+>|Q?iua3y zoqf@Mc_MhKq&=9_KN-`T2KokD2L}71L^RDC7SSB-W|Yz5MtKE2qhdz8eVkX=`j!mm z3-=Dtl6SUrsUUe`-GaYt7~8GrXtt=w9$u%|`WgT{VWNv`g=S@LpZ5@_S$Yw2l?DzEcg(%UuI z9pzaaCMK;;`3$$&(NN`S@ucjg!R6&z)E;`yb4nYfe&!Um(;JX###e?y-f_*I$KpULob?5>W}x_R8~x{ z&6TICXh_%|V%JlzdA);uoec1FQf`>7WxN>d?Qd=AA`_~nGwP;IvYLNbK;vMKG_H?6P|XyO&4%q*v*88Ee0&1+=P$T&y%6U7gF#L{{@wwVgVgSw^&WOWUb~ z{R7Ol>8+*3iT1RvQDK^$ej1qSmabN>W%9yovcagmtk>YCaurVrVh8&?nGcf-nMux)R}?G3$$F?&JVu=WlN=aS*QtP5YUOAlG4cJp`sjn`5=E$iX_0x9gsX{hMo(Ky-(=`!+^C_S^4X5Yl<0J}#*hK)6bRhOaA5l@qh#lwA_j0@YpCmQ({&nM^iE~TIE(ohH1!!jizI3 z25F)O+ya*v_ktE&H^Pdmy66A{J*C(8wwqADyYx4#@VRHTJ<+}uYvgu%ZKqt*s-Re| zYGi4YO2lQ;U|&0JVzXW>ReDssOs3UpVMB9MZEcNL`&qYSfW&M~;&T0|lx!|o9`~vC za>ndib*0SUauSPsR`&F+>S0_VgL`~#yeFW)q=XTBPiH@CVfOZ>05#F}mcg!p+4kry zbB<-S_Bh8N?c>(1TrScZUwEcW2%rJmLU>IQMx@gbT;nR$qg6;M1xyWIi zc`mGJ+ab`hZtiikt-|SV*Hd>@!Sa}L=kK|)mO;*T4cw_aHBxeTug!3}!;DWDJ9YF9 zuMpDGw|T4YqoyOnO7F?;?rn<>uOU+V?9*Dh2BV{j!*13RsKZi^q>0*g2;nge)40tr z!{eFP+tFe5=o^CrP-hsrZ&HoN$b~L2kff&<08NLn;*Lzw!nG<^hIi@?51S_!2rN_y9 zQLk@$t1X`5<fjrL+M?~9JyAyB!$#hEg|9z% zzqVTW*e2a!E!ftqqjvOOX0{Q?)uk?GhPGRg^z%4WZ0?BO6bgmTa!zh6zO8M!!rn@% z&1|Ka0s77hw!2da#zo%vf9FMe=nZ#HFxPeH;fLFIZryL>a<;I?9>z9x_|nogz1XNi z^datE5DO^GJa>?%ZBmoA!(BJ}7(&C=dv@N$VM5+w(#J@0JBw30kRG;jxdW~p4k~g* zJ#tntGz8y)VsExHG$q<8vF**Wc96=*naWP3u=T`br-Wqk($~p&Uz+co7&HteGQ`Y- zzD-T>8WAQyww?h=Biuo1?pE}UlFHp2ksWGFwvyc@#hloXiM@JYx%K>NTWd=gy9`8U z+gp{oH@s=9u=RY*ZqZ&Z-rR88Inqbz@n&;7t0~7X%W&R`+c3Lw@jGc*j(-$=W-@7; z+2qceIeNk6dhMMwaCA*(%Db~BZS`mmD>HL1P3;)%9*!=bE5nb_kmDPrtaI`IhkCZY zXCI+%^o-^1)h=uB?$M|U8f%-HaU@e_pU&*Od3$NB<{R$;_eyUfG38Q~<+!<&&rsw4 zhmRd7v~hN8URYIUH!ZARTvye+a8ZL@+fds${{(vnM(jW#Qns6UHk^km-GMfuRQ;kQ zwaZlHY!#f1CqY&7GIm01o0ciDh5yY9o9k+4D_aiN(V%%zb5)(J{4`cgnmgHCH0Z0^ z#z}Rbo2*=xWwmv+)y=pqz};9|y)dkrYU}2y>P3x>q@%SiSyZ>UzSd2!X>nt%7OY=X zhf#I&8mp?8NyxIA+J>fu%_k^W<}GU$f-U5FqoQVEQ*+}93aF~Ct_?R2T}_nB`l_X> z5sRB^UC=BN;9gCXKw)vS({y}QSgwqs+!b84^BWf(-@L$F7zQ2cX`(zDn&#CuvbkN= zU^s>@CrXxTmr^Yo=GW?L!{df~O6pnM>SjVQ)cL!+Ycds>h;PGcdyYME7MqJx?KMM} zr+b$rs=j6Q|B?Lh`0zNgAlq&Hge3X?&Nc?T9n2MnHja%&xlS=RYL$ideiru_@17p* z>m8AkRXE5n2OsQdV+q4+3|Q30tD~Rg=~g^)q~~+fqc@i%^(2LvDkYFxGD5ndqQZ3( za2Ly&#xZPOl7;MuZx`^maVvpvfWMQhk1Hdl(-L( z{L|B8qif`g#Wy_&oa<)BZ9Cx^NkUGd#lZ-~ZA7sy9ph5;owjSj4y92AqYHsgpJZ;*hvIyJS z>FE6$R8Ksdpq1S%Ze*@*97lj1UERu>-B5{jxy5NF9u!$W-g?n)`!sh;og8?>;H~Oi zdmsBa-m0M3EUrJE&yee)YMbp)TQ57ZmDnR5MAVT%YKXn6LsqVoDPXA~UPZKX^B|ea zkK;>Lx)UjH8d!r!Zu!kE0;PMF?Z?es)KJr;c+%@|aj99jpthzF9~ZT-KHRt{ObgMl zs6kj*IB%FcZ{gA*dRhHKJYgivy_zzP28X`uICnj;s&;AEZj^ruxU{R}pR32NUfkR; zm(HWcu5Mn`KsOR@vX|giP4v=wdtt+Zg%oFt>o22*@-e*RT*sAdGQ(3T3z4!~zk}@B zt6HcQ`l&WGyq3qGH6;-qA;^8!kAxndv&dm8fZXMk(KV~^Rq<-}LAg?rvN%W{fT5s+ zNV{?4x6p5o$$ z5;b1#Xt63TR#m61s3=zKj1(WYytsIIkP9v;oB>2!Ac)3O`wvSI6(85z9bG}J3&hU0 z?c!~kRJ@6Mq)GLvj{E2hHL!hNjWSQ4w`s$JF0K}Ob)Li~jht9b=0%BW{YXjz+(%iP zmnV4~Z!8#H+J$K7uDOlVq$#eyAC+bbZGTVu_eULIaQ;vk~6&v*^qOGFiN~k49n$VthBY!@R~c^hRc&v)RUApQwkCHYQ@SD=YA;Y+^z0>gbIByyFuGy*lZF@8)z;X}i|oe54funK z1Djo4#j~@pnt>OMLQ`%1+`8I|9SN87b>VS`;$J9qJXyM9qk z?G6UFUUtRzw~G$8jqZ<9&;_%o$L{FuACOI)T-X8=VB>^(T1#h_IJ>GjAM@~TSFRgS zZoP6FG`V5kN-cBr)$WiYw^_go5nJ!%)4X(d_PaiLvV_ZTnk|qqPYb8CR$Z)5kgaV6 z`)8~2ojjyxG^L5O?8-ifOX7JCyKQ-A=bh|yN4G;ckbTU2w zru7~*sTn5C5_Mc_N2jQ0i*^mPSC!{#j-%R07GZ1%|52+lvf_8fh+F;XRND`iw+><+!Svo#E=5Y@X;`(N8kKAEg3K)YC zQgJwUeOge58O3gPcS5sa_X=evB)kOiSCUKDkUp@6)eWsYxR00{Q@Pz3b3?p| zTDx0ic~imd^JT<#2<<_eIDWUUk$KiY3$yWq%!Ed|E@5OKpX)MZR%wgJk&Fnv4#KVP zZp1P(?Q@-2rpTdO6KC5MhpFSube|{2yR}vLMRhy)kF%wv=i|IaV6TwbEj32oAK^J- zpemDIZTvXpdV#p3O?k}f8FEE?*duLTB^`I4?es?n+jv<+zZhVKk2#ITHOd=SiWd}( zDx;a@3`g7C+R1pYZLk$$`5HI-#P$rdu*71|k1`k^U`QyB^oWPtZB?u4>ZDiZdBSYz zB6X+8rybmu$89F0kmV6Di=%EfCiW|Wm>e*3l$m4`^`GW%RvUi?MqC*}9+(o^1b2~5 z`0R=0Gy6H)401iae`4h{+RTZS;-SrTn@C72A}^lMEsDIf53}_?t_|TBAs!d$aQtDkFY!5RCZUC*Fty>Xb@Nr>+S3t8VC&e z>O*PapK`rHg9;pPhC(97i6-HP8;&3aWWH$2#} zW_SGM8BBAxJ+ld;lqG9Jd0i+@2j$uUe5%{~>TEMUTh1ab&pri|bLL>-P-Jt7xh+_Z zPs&NA;$)wsv=Nlnh-A&Hr8_gJkylXTbzn$PunCJAmbQL zY=N&1(yCTUxl6I3Ow+Y0yu4!OP|5>N+v7ilLee%%tYZcw`*yrx_Hw z?k7Aow250enCCPx%I7_(K3aC1u!19sTHZ^WJv-dly7KsF=ZX%ROWw(o9>86xmKl?b zfmXS3ZoN~k5w0eeMT_B^x_od2H4(q-5;ZJ>_JQ}xR{{Nl-TWW^x?16x@FI5 zbZdtcFe99PQ|7~q#2ff{emGvSZc`XF)%r!8jx@NSQdZd6WZ2&W1*+I~UDOCqLNAfKdFours_}x^1Po>1c zB$x&x%dqRf-Q0x3U@U?@pv zKcWXrf;S2MC*&pmS>(_cevY@@!N6bO1GCR7_0|-^Um$)mG&litUPQ0ZU>lfx34SoR z5xrpgW%Pp1E7&FUCgjl*L*h7U}>#@7nU$^XA87cfk%c@E5uu~bb3 za(w$L4mx{VDhbBMTIxMez9hQ;Ves!~sSYs9Cu-J#Nq#Qs${^)cWvTUG@;FP~S4p|m zp%+w3Ej3{}{3lq-0iBaAl?GFMe{|Li%Du%>Yr$~4rGhg_uM>TOD=if|l>5D>Ogv)Vu(_eCTzHPY~BE<^KPG`ws?x=u`d^uj6hM%B3z%+P|&>JWZFz_qV2jk$FCFp;We1d7PS?J#)55|9o9O&>Z z#!V9b2l%ir@U%~@J{h~8qke($m&o@i;Ojn>1k+o%Phcc3PhGhT9FwQEfPq8uR477u zPR~=9fSGxOgXsl%YD^1!&3Wpi<=DSCPu&UzkIz$2fvGRRC*da{-%5BSPbEMV%~M5f zq}!gSnn7m;;b6qcQ*}|&J3UXmCHSR0wf02h!JEL~8F}g%sUndFp8}crE&c=10WGt{^^v9GJeIas%Tx!UsAxqjx3s zh2K+I3kH9br_w?{n5V*B)R#xm3);WWqiqDUlnh>f00ix0j?GL-;@)W z0UrV*TPP<`{fBZo6+UnRsNO~%jJ$&!7`V~zq;vQ|9*Z|)&tG&4on3D z2l!Q;&|nuB{;XeJ0;a*+L5B|{ZvX@1{A#n%L8sA zcp(^^}|3mZ4_=I|uygDd7jVfRRDJ8uLYHa0Zw-&99n4o9}fG zfT`7fwGND|@vD1;=BK=#l6Za`bPVaJGyQ4-m^uqSN%w5O+C(}Te*f#j(~!FaenCF? zykQk~T<%w))#RTqnBD_Mt|8qua^Fc0jNIT?&w;U9{i^14%I|xW3z)vcuig^8lXCkK zc$Z&gK>KHYX8q^`L!f%VuOgrW#=s1i0K+N2N(l{Sz`!rKKVK%D2e~hx^C;zWCiXv$ z9ia0B4PaS1|~D4a}IXC z=vOC!S?~-nv(c~K1JkegRol7Py~(fEf{|DKDhY=8fwU~>{N1ktYvJ4MS4V@+KadCG zuW_Hj$Qyoj>v{112YbN`IOcr#tb8>C3>4(6Yry!FeC5A@{7%hRU0|p@U)>Hm75VBd zFc8dF6E1{rcD`x@V@Kz!4PbaqzAC#2zGL#$0QWV0Y`(e&OoZ}P=wk9&m9Ju8xF%mc z2gW|1uj=5p8%YODfR_l}M0#Kb+yF+J^VMchEkXZR-~*?E>ICG$$QO_ULnr2|l!TuQ zANteF2)_h-Pt8}8E+yQ_R}X>N!F(0@DtLCjdJhbppRX2t4ZAMLSL?v!h1e~4Q9c7a z(z}H8z|7Z(2UA}sUhsD8yo~hkCVn0AKgw4d!Swz4YW>$Kho9xEr@<`vme739e(X1> zzo~pR3rvDb!SFBg)oL&cUMcj$$V>bq$bs=k(N8+z$KeBmPmu3#V$TNh2L{vVyBzvA z`6>a1f0wT^VB{(Cbp_#n%vU#E1^s-!NENnnB>7l$hu%i)0yAI@m}tU2&~7GQU}`b>0wYVvm(WX*m-sIr zhrQ~=0<{!Oodh2k;1>!mxrOkS0_IBaeTjVDOgy+A44pwfg$CaOV_z;%W4{CcnFVSV zm^cf4U?^6gRttR&@)ExmIWPm3p*L|pd|>dR0(JX$$?v7;15`~J3se$x?k`ZG@5BEfc7w?$(0eERPmz9-e7sno#{7W$ z1kM1%8w*qf%zz0Af4M-t2dckP-gm>lsX%pr@z)B}t)TpTL*O3Ld7XTL>fe+H7=M%d z@I$%(g=+sFqi;;1S_>vVU8o)c<9in>dp+S}3sn~w+^dORI`2xPAybzpsK(Q zFcmCRX)sh-r~>z4=QQj9W77-O?Vvpac`$Tzq1tdi^qfL9_Gic+Q>d1Lk@@I-06Q0= z4@@pX9~k~T`AuPOQ=#e*Y%WyyfXU+vmHIh$oKUFhz~C3iFBm?lP?i0H`*;d^!DM@( zN`b*H_#ebBunr7&V;>mmDOBshU~i%FKSa1wsKQ`iRiSzhbXFIt1rLK~6{;;@I##Gc zkAN4DA5dL{-H&1ixD-rXjJ{jR&n1QGX)pu6CG@4__crqVRrtXKxD*V<3)N~c170cg zWynkXI^@9EHw)EN>TBo<_`pB{B%LI9B^bOOexbpqLFWeKz$`fSG4Ah8qz49XCOx5V zK_1NBiX51}jeJP>_uzXRJxR(14Bu6#E&&X|PV{ z^~i(qdyxa3pA@Q$gx?3>6UhIpP({Ev7!&#d>X*=9O6U~)LW61p^v|i+U>pny{R`xU z24g}$h`i8XO6Z4>7aCN*qTC-YRAZhb{YR+RVBiVlz|hn1f$`_i4`1-l=m(QvMCiZ3 z2WG(p=sb^pFz^C$U=mcnhTe!g=)8;^7=EQtt&{Lg@PYQ<3RUvAr1y8~6KHSdx%nM> zUnd+?Tewe8L4$2zh+pQ~0tVj0p5Jr-!3dZJW1#&$_JGL`$k!jR|3l(Ihp!CZE@&00 z&0q$c`bYBbD^d|KSWrZsNpJTewIEIX0y{u^k0N!U(BQ3LBv7Ot12fV#gPG4D2d4HeQuj&tKJbyh*uF*TXfU&1kvc=@1Bz7UPv|`eJDvq66sf1c zMQQ_>onEBI{)PO_EK+Ttb9j+Tg7%R`+!M-qZjoC0 zJbJ3(2h;P5)Qk*x9Qgo44Ml1T7+XZXUqJuoi_|rseD;46mSoRF% zw1jd4lVBa_9ABimz$|zP7(an>27~-o_y(a*LSEueMvi=@Pa&URJOUq>Sze?Pq!Vw2 zAIwJKdkI`oq*jCR4$1)xb&-GKQ(zf%q`OEx^fKuT6sek5;5&x-!C&|nY@-CIQ8hP|KzMt)kP;-I>Z`y}+wkeB!ekRu<7 z6!`!nzkpBZN3r)c%Kul~=YOK_4@IgObod#B`@rNg)TbQ>6C)H+*kHgYkEY)N^3^J@jn>KZF*v ziq)()(C;f&OTlnnv05!yP^{hpRZ+2u{0GFvHUTEU6c{KeW^RFgP`ydHmli795#cDIC0>x^)B(tWiO*t}gyYIPmGTZx#@=_yCqHi=dXMrcFILxp zfy0Vb;C<|=ELLm5;EZB5<^%FGlXS5wd^qWXX|U`a=p)bv24;~i7zew+;B4#$)8Oqw z&p}?|k3o)fonuKC3|7GhW^0O7vtr+2L9x0IOnt6cO|W)Xk$U36;4<|1c2}V6 zWuJ>3{@qpP0@BMT{NiHu9vJ>wu{x<>ca^>t{e{R~&wT<@-z`=#FmM<53k?65{Db!6 zlna=Aj{8*v{cr9U7~8Kzg@pcWiMj;L9$2ED29s>uO(+K0$Z^2z_!4!W;Di!YRD#}v zOH>;eJETOVKsC8U?O#gz?3*ko!>(B+Y8@D6o9!OZ;lqfT-3b3ei7MNJ{G3>#mV)7v zNLT3P=m8V0CDa-8;6@PwLr#f`fyqI_KZTyPC2BJmzo1tx?}l0K;J!cH&-st>8xcjGhy zrofQUKSCai{TMkgvc5z;CE-7TkNc_aD^VR|DVN_;PWzItH=#lM-4eA4bikthC`YSQ zT?wXrrRr%gmRG9A?hh7}syZ-UNIV!QE>-J6yQEb451<@MOVtE0^C{@hQcio8sv0mb zrc}kj$Y)B`eW0^nsVX`Udk!d7&4Lq3m9oiyIr>3oMyVR0JOVRI)jBW^-XrwkrRpg# z4Q>I$N0h2Ddt>jcQZ)mNABjGpk3t>{&p{3h9#g6|N%*nwk^gj6sk-$b^0T5;?LQv9 z9i{4M(C#i}4GX(_ki(8hFX@39aEs6m>5YT$i|7FpU^5u%Cp|C&t`qt+>X}zq(W<#h!1KvJVFhX2I|^rRq^-l zgYVneEA;iqOZ*MUfyo;wfAl&x!v}_Mp?oKy@0n6{4VZYbRFxf!Juj82sbC7M6MAE* z>H^ivrRowe2HpFisk?jya> zer4)8Fa^FR^!{aP|H*Ry%hb_e3_J<64=ht>fGO}Ap$|e{;>RNgMkbW0AbRbC;RDsA zGBu%`azCt0g)7M4v@-P&7@1wBHiFJk@E=Bb98El!t%W`mzIo7KV1Ai$ga+eactIIs zA<7XzSH@llbUpH5x&b*bxu{ItB;ouzP!MN|{6~`tmaMG?)e70-Y<$)Y$3ReN~y7 z1t!6zLSKVC=v<2&7{0DdZII|d7(VpJ?k!Wd&L+M4%G4Gx@v|}& zI*R-L2_W#qufD`jdD>Dim$1M}E-FH? z@q4j%KSo)R18DASWjW*NPA1?6P^DCYGc^~PYIv)al?9y|9wknvR$0kfbj@S`d!Dk= z^V#QKfcygD!Sv^dtK+&(S%G@w8(216giIKn%aj#6mGpYheI{{dq8oJ1f}hig!52gR zY;>QEu5-|RF1pVp9!#G{+yz`;fbI*CzX;u5LFQs|d@Z`=XDWZJEc?ggfzw_Ou2)tD zjNGeK=3esmQ>9`*rCdP!KIoqj_W;)^Wrb46{{lOIfy{&OKSbEW&<{g{kw*yQj690` zqsTml{>PM+dR(c{FDc7k5)Y;}5cg}Ye~tbpkx!H6Z;)ZnKlump!ybO@Pw0M`Ja0nx zTj+TkyWb)F9rV15{Cn`dhYm3NKJ@|PJveNv*O{N_BFzBFV zC4=k{&$g`WQScpYS(!PO3RPKFq{>o>xx`mn>;+p^u-4*7LoF-xIrhZsEX%29PrU(L zWU1^T%L;_qyXOpi9{fD%fZ;}THlmxKmT{UbE8a}}V(2Bru{R$$0lnsKr*^;h(~3g6$!_umNz)n?M%Oq%~d=Re{5 zCo*6rYgw_^!PhM-`7d<-+p_E}$ZWx`H^4V6D+^}+gY9o3&z^nkZOclqXCHY78QHUc zm+(TLiWT{+WC?q;r9LZG%ClHT7^m6|YO=O4s)O)~6EJQE9Iy?gpQgx`Djjh+Q`l zcN4mACV#j2ti<=>ztd-h?nIU|#GZC4iQHZAbE+TsEcwQ*a zJ@P+6*H4hSkFvNQyHeQuF!$n7!hZ|?9-coU&wg~~d1PMj<;7ow@2}+Lb)S{_moLxW z0{xbchu8Z2EZkr6Xco%UyLoTP{i02cG5k&L!SjjFlRA*LteoevoaYmtrsOQzDf!8z zqm^YJ&9e_C=0G1qn_I>0rd_pZPh+&5iFwG)N6&Feg=jAo?PaQ-=Nn8mqGt(sBI!kt zYXMu(vmE*5v=^LqE7%G@7->US8#>z2-HvY1UIE=noV2+sv2P{v-K5ctObG-!|cDM!nuJx*}iF_3mS14hm!4ccXOE@{vnCqR2G^!dcmF54H92JN!? z3Te5q{#K+0Xg3i-~ zJ&m2u(9Uz>^JInbdrEVLpQYUJdCERVU+`z*{|x;+aT%^(K=%vCzl7e6*hhOBq}_~A zEoeI}mB;hTsr;bdvQl6upY|Z1_Mm`gx{&sukoY3#V&Y1)^ed^GeREXv=Ow?@j2q85?fK z1~3I?z~FaC|2yaeQ()j0=v%M{jNM9E-G=_#EPv(>Wbd@BK$5t-ki84uyUE+#qz%S? zNFINLP0|OXu;u6QKS(+clI}wwXYgU{ew6UXu<0>u0wa$@KSBHk?EV#Y{K~SNUt22s zYjiz{{b|ZPOnM?hx7}FgOXG$?!}84?~9b-I+x@Jd5`CNZL`(z--!}**?}wd@6ht?dj3zKN=nM z1MxY~#}XIfx(a)$kgujKrC$iq575S2u`ppvd@6Dh@>Kjt2mCAH?IOIJw7Y$b!+e(A z3pzfPa?st6jzQ8rjr^U4ovVqX?GIjtEbVye8sZbAaTC|H+Zj;&kTRT+@A$05ci_Lp zrxLfI|5ox%n;yB1crf)n;_l%34xgoH=cRqeXUR&?t_Nw?!?foK+Vc31xn56twCAaN z38O7f)263>N;tkt&M%-JCQpx029HoCoDOY!_EGG7jPm6SJ`V3M(eX>4l?9zApnpZ& zuepAba()u|-%w8U2Z86fH#7>F4D`#`wi&xNV;5-ugY-G=*T~0f*v=XGr_YLIk)f}! zUnd@n{hK)amlAJa^Bc&&N#5T==51`r%d=7id3nJi8l2KRl`74%0%duO2?*Z}pPSwD ztn}`ADm0exeZl?mSR>D~GW+ML>;ZXJ^0RsPx#n33JCE^so)wya?8H1PJS9)rhvr#X z`7!Ys@Ewtd4-4V5@aN$S9|<0b&e_Ow29CwV%sK=+4)e@L2O!ouIg=eH7heiionRV<(D ze7_16fCc!T6#6Yy1Qz?Pc!{6;?zb|f@RfmO@a^Weg1duz_^ng`pOsJft-zk>+!Ndj zzP%Z_&6i`qH|w#+kPu~ke~G$^h|(%0zNyF{Z_gh{tCYp4iY}i zZ`p?)~%i zPZRN+v1Zb4#z$%~;fo1hg8n7Mo#?k>Cqth?K2L#e1*2d)`c|N?3+w@Vv9}j{z<`53 zhkW*7cOUkH;eNkLbA|`VD?V2N{H)@GqmHv{S@htNAS2<^5 z!})%tF2ME+u$|Ms5WEmuzz9B8_*q%%V$!`B`$78>=&us@HLl~>7)Sma*!>N3T!HKr zboGP`X2Z_$^}f^PX4}+9`WP4hy4GHd-wphKM2o*ek%dm55dQ2 zKkT<655vb9c?6k9(e;?$vL7QJjQx_hC%E1~-tgCo{hE9|NqMI!$KO!izlHuCI`G|c z@Y@PJ%k{I!JWskA;$J|=ikB)Rryv{ z;iu!ncPEeQJbZJC@~w0czD*@yNj~eq`IfyWzB_xt^XYv0?0hS}H}U)8=d)iv&gk%P z#y?B=f$&Vsw^Ebxl|3b2g(`@v%(p_*&^sev#b%PmOu`P&w*s@^Ju=^Nj)V^%u+UNY zR_rMBA5D7rf+aX@e8CcP@|lN|9{ymNV@NNA9tNG_4`x?ER})vmbuH=CB0oQ0rRL{b z;e}j(4j-e>cd_sRENl;Pdzz6TxmVdMRj9e!h}2Po4Nw*MTRkD}`_%I0y(<8k7C3C}M{;|XN( z3Cn`^AGkMv%(sHip!*r}{U>z(iF|{h=b-4W0?m3oo<;p-K8g>?VQ^(NBV zgl^Dzl`?r1p3PjphW-D1}23p(#1&*{8RzTZdx2c-Q0IzA*{s=#to0sj64R@zsff_|?31y&%xK&1=t zRVplCPEw!}pDM6Idlsn3UIkWSuLAmy0+rdD@O{Dk3M_knuJ?x*3>|>45@+bM1y<~{ z1_!cYc8;o$K!L>USP#L!L9-;+=IPeB>aoS4`Rz8d09<(tiTsIn{?L_zZUrm2)_Wm zUx)AOq;my%y#oGg@rAk$eRqDi+5v&wq-3n;GpV$0sH5 zNeO&X0-uz?CnfMn34BrlpOnBSCGh{75@1z}{i(%Pgz1bNDfXz?mQXQ^{S%fdlkD|p z4kBzkI9^%y1olWc)kOAFCaXOAP{KJAQ`sviN4{KHF*d%~x3aRbcg3Dnl0E%2Uj@i4 z=DLOJcCOi1a@bc&u&-qIv0o*7Ndu%gNcd^W%CM&tkv*kV=va+CoN5hwL~BTcGjzJL zB40w!mq_;v;?IC)|0%`3Q;a>QL=5?J(9K>`Xf3+GuB_D6$X%x_I|Z_56nT*Rab_Q9 zFN^*6z!T){3HZPid+@O*v5P(UP@25{hWOti!#;cp%>EA9XV9hhlq~fu`$X&~$-DHj zuax);@z0arm(a;RlI+*pe*<~<-TsHNGH-xy68|1@?<2=PeVQ};0r&ys{ULIk0luRU zWE&xAvEKl)^=bu~R>YZdh6~ucV2TnfV*i5ura%dM54*9iav1v;2!(^}Nq`aAPnwDF z5tfP_VOa^#o@J>7r+p;xN3u7<8DZZ)b`&@NXp8j+;=$N4#2w3Z2)!ZX=d%1zjZ6(; z^U>9U?iOrXj*aZmr@?S5c5ur6Q@jmZqSzZ{U!@&eS76r);=yDmalBifUTIlbFxhP> zrw5r{bgx3!_1Jdw(nuf_pt4DY~WOPSXPKVq7-N7``B|QcCueYL8%yp75M>i z>=niC!Nz-#{}H-=jLdp$z;__?B4IC~^Cfg`gpX6bO#I8pafV(&2YWf}=U8eJ@$BhD z{zly2xyBD5!TwIO-oE`7VeILr+0(b#(@*$V^Uq`7B#-?8Kl=%O_9BYe zYuKIrgx%ST0K@DHr#Zs`_7(#0v0oHtzbMImQIP$j@Lt4&vbP`Dn``!qvS4x__9OO1 zWK9BY?zMB4EPTBkvaA#*#B1z@O;5%g-#^?MC1fd0%f1*Wb~a(Jg0LCcnbMkMtYn< z_K?CY=xxC+&{+=MMqHHZcJk1Ud6}uT7-yuCtbqo2v1v$>pt-jpel=?35--W)NIQFPw-$&o~ zNhgW@cloR_N*~tgY|5_=uzyon6sM}~p9>GyxiN*``f@3c`|$Xq;kk9m>mSO23zj~r zb`QwK$Iv@*xZaN;_m7fc_IwPvAMT>umv>RFb{FM#+eNwG7w=lR;6*-ke?LZfMt4yT zFZ^9f?~S5ele>So+;-~swZr2_%l~NM+tF9QGy1k8_vu}f<1MaTD$kpDQLcLzUP}eR{Z@8C8C4NKIj(0I96O3}b$w z?QuA_f+2&k12r8p^y-5&y~)=2)_9E_h8{an)2j_WZ7^x%RvZ4MMqj{$&pKGkt)F1@ znsk>M`f0;gbcl|>(Bn6HcD4X6KVUaEf6h9cf7$Po{HAx;7&x1S6X>j=Q_tvfk#}<4 zaNf}sbS7x|y=Q)@IGJ42(q11Ws*y)=gQ z(WqjYKXIw1v*td8$LsJQb7PSUwCH$;d8^Qwr*t_-&eHcOcCNG;eE8p9?&z&o~*PQu*RFz9+F3@_@dup_O8Y43_f9Ora$2+gWFYjWz*rn}EjMbPtQDdym(6t)l^9`E#w87*z zwEoCsUCxPKO{e<}`i)(zJxY3!pJ~1%zLi1;?lt$9^+Tak_+AQ%KbBzF%Ll!<%a31! zpnMZcFjJqe(S%0~9Wk_H?n{z&2;sL49r&iXPpnBuxbuWA5BbJ}(DIE3m!EGx2(rfH zVt9;3`9`BF7dGW+;!`s;E#E?L^~}^L-&PPhWatRrMiAQe@J-$BIDDf)!sQ#5f(iUc z1+#NBMhqQ@m~!>vPt|hCPK{x{dEn}2?M5(cFlP9|9^cn=e8#j(fy*_W_Ug5fOPP8T z#Ba^D%V5a65BR;g;lDBW1wS`8-G@zn9?>Y@G?Q@o_L`u4dri|(hlvlLq3eI*N{vZF z%ljR|mu9_AF#AnSXD`;YtnEv<_)og=7i&!az|ae|9S+~r{+ z5a0e0`2^p}aP8uo7=n?Y4iA@Wv>lD%t|y^?XgYJKrqiz)8vjJ$lXuSqvlBEXU()&m zo_@ZOA@KpDKm7|WA2<4g_;E^n(&$g&-|5muzr5cjbjs*g3$@*ud8SC)ucq6|;W9mhnpTs^ooy6%nT$z3-y}!0U&bPtbe6G_NXH`V#q-kF=M`$`!uG5X1 z=Qa`4^)(gO_D3$)nEsY2_b#nJ@CQ?_OEsf7I!xk2CZ%tv|@Sr=r(s)b}Te zf2z=tNjf~uI|pw3-a0=abKepN8N1#z`JANbz+IXS9Hwd8+{c)?kC{WX-iWz>F?0WH zbN}Mz{$&!{{-C*k2~+=5A!E0>U+Fp8-aw_+8#_wd8=kGxPdi#q@@-AW4LSw`2k7=S z#y3SIpV_HeK4Hcw5i^d78w@_DpG!5M^~Ozqmd$8A$$lN4HkdT+a>~qmB4!?>O#hta z{S~)--`9G>ducjVt}%0t)*E0CNBHFZQo;Bo8hKB}rDK277(Z8s2TlKxI#JV^J#~D- zpuFSarpr4sE}D5!fOqzU4jDS=jT7G1{fRPk#L#g=2h4oR_R4>=zEAOg7<^5me1lK) zE0bT|nQ`f~!N7Ui-bh;4W5>+jA}jU%37nG9`3Rc%LBe3b%qOyDeh@a}o|M-w z^9>EL!#4Sdy`}S)GIYqy&uoJcGhVjM{Yh^$>6>wV*kH(vlaq#ynetX9y#(KOkaXi_ z{2Usi^PgR&^@UA-gJ!qFR}GUI#O8~5Y4FMJ`7#(!UE@!uCr8QL~<(&)(;Oquz+eS>cQB2!I&kkA2Lec5834^ysLv)&LfwWdQ?==>#2y$u-* z7>u8w?T;L!?}KAdnQ?O974v+Xe8oI8GYR1W(ONYep>DbxSUw0n z#Dfh64bC=LW3a*CQiBT=8OrSEgnJa2LHyrssP zayd|Ac%q@r^AwE|9(wH_Fe8sdwe7jHNc>l}Am_f&zHyR9$ zGwIkS-AY3TO}hK&a*LSxRFH3aiC$%Jxw#MV0}TJaG-jUHb~%Plm1%pz?`r##2D9vf ziN46?8f|mmVnGu=O=Hl|S)(t^J3%5BGZ^yHeO-rV9i4vC*by-07BlJE1_NGsnevhM zJw>l=%7vGNH0_m(Nhfa5HtDBK`DDCuGV^P-LAMWCzM1Bh+aEL?GvyaI?M?P^9Uk0A z^QE8E^&)QCm4u;{=@$|!bUsu2=<3X}Wx-oep-IbT8I=vUop8e0+b-b=)2`Xmbh{Qb?V8Q|QW77WZtOWuKR=PB@LaJqr(%X zeRIq>G{f$#=yjgf@(DxRe8X14v;WrdX|wJhsnOvvgF(~p1@_YUbPS!GqVJ=;XDE6C zray|A{H9lFds1K3@sX=F#(Q-+WO_7)4V^XZY{JYF;%}O9(>of&h7O;s^N}{~v9r6O zm+11~`z)?KaYF|pIy_<8<(Mfq$6LqPsO@x2JDXIRju`tx7n}NEnfw@Zmh13zR^RWe z8HZ#|JD^HUJ=v@=Xu<LZ`Hjo?A8lr3Nc4)DIJn{K*N%O?$Hrs?pIS+B_$O#5}Y zgz_{d4%Fo@?;MK#j)@N&boSHnU8Y?<&0x&nR}8K*c%8vp4gSF3eFh&fm^Sz)gBuOL zX7DY8zWsDRTxRey25o~=49+lkjKKv48x5Xhu-%|z@N|P~4Sv<&l?HDxc)P(L8B7`c zrNO5R{>5PA1YO^P_~}Zy+PCWap_b|A!|~cz_`c4o{hOH+`gT zmy>*BRQN-t{pHVYk*N@Z#8YABL&#Zff`9`9fe=`qA;v*|`;xihPrrmOCwO-p`#I&mkvyK?! z9aWKwoAxzk))OORO?zV6(Ll3qKkNmjz2$vpk;`77F=)^}O~+>p#tjC|JR03IT&>C%TF8Kg(ok+KVhppKW>dLXy3^y|+csHf$k) zpl}KFC0=296r4g!C^U$7N^e_JN)uWrDwkUVX+b=@ynpA+ocW$JpT6&tyx|WPva|YT z=A1KU&YU@OX6DS*BE`2fklww=(Qld;FwPhMewC;{LhF(a*^O=TlXaScz6SZpy5uJt zeYN<`{#DR9NA`Q`=LEbtqNgqW{}3A$@y(GxaBhtFNq*dWX+j8NK^ z{3rYMvGo1%l>P#xGn5{s^aQ0hQo2UzHl=k+lOGp)HhHa}Hzw_Nh_#FKH=jas{5+Ai z$v&BT2leBw_`U~m60rQJw9{urKURKCv^(}2qW>C?6#dfri0F?P+4*zS56v^8+$ixi zR-}IaM^Udyc6$2?fp-n=RU_Uc#L&jHLFwp_C_i$Gpey!d@q3NZ*e}s)B=>ui#vVxDDgABY<9SM7O6ea_x=(idZS;GO(mA=_ptM10m+aMj(wi~rhZyxk zTiTP-PJFv)cbDwFIpXU+>8&L7OPlmilKKT=AaZ`~|GMCBhsGJkyFos-X`Jno-BNi3 z@#~p_@3DF6*EfsrBOTEX`&E&)$ZqefiSjM_UZHg4Hc@Wx^&*{nuqc$G0$e zztVcELur!M6&O>U_dl&KFir}mpVmEd^t&t9XMZ5_@eM01*Q9k>m(n#_m*AUJJfGHS zT}szzoq}&wVSbF(BTY)@sC_Y7*WsIrSZ;*oh2$rQkEACXFA?;QlAdh-k@(#vebXX+ z(;$uMU6MBeI+M@4ke=ELYY;LSSO6x$3sg1uY4-;wUqm)l+hw5QWagG;ajAPn) zqe$1DDg1^FN*Tm(=kOr8xW0n0V0 zKE9cNzwr$P4u^iPQ94o)-}flRH)XIKzQw@HZxP+(FRak-7Oh9|O$RIoaVN=ud3;lf*N3=bJpEPiyE!9%W4tl`oqpq6RQP)o;+0{FZ?|EJ z_oOhzw^}g8*h`pJC~f?Upri6n;(Ld_;~Otnu1V`@8*L|`N zIuIM4mw%#2_sBkL(s+x}yq0{p&;zZ%7jhq?{C$Y=g!Mb}`(@Pcw~+pLiAeEnH7wU4 zKShVu*?aVTguc&FT7frXI9;?p$G0r;_Z+Re**gW^J=*7MeV_P8``}5q)5qzec?aL% z#ozcQFNaI{7~>LuS7@C+LhJUuE%ANrTVlNeA#ixPeaau9eYh6EZ+}yigV>t_KHPug z_-NjoBfkK?&57Uf?J-UV?Z4w&o}3Pni#bX$jvjt*9}#??qk3y_YXHA@yQ1CrCMf=n z(K*P@PYC`sH$=Km{)4vkSJHQUV~fN2EXnOd#qS3B3);^Yzgy(r?2vuje3+?}c_X%H%{1-8@+vdoR(fkh~ccbLLz&BE` zUHCQ%=gWVIbcFmE?azzfb6*wd8vRa^zavKe>jwR9$nunq65JN$x9EF=>a{4HBYNg8 z7xF(!=^C9kVPto9$*-~ovB7wMkY8nu%Htc3_#NM>#FRmdFiiKz&k{Q<^4G}D+@t-a zHS)`h$a2yjPw??gNDhzibSUk^X`GH!L?*F3r-k{%mb$JlB3yG#D37NsL}9-=|NyX2?Z zCx6x`r5INZ>$fP4Q3^2+`S&*c9wq&E;f?bpEFUO@-JX_B9;MR3+A?LL^`Q9i~8M>t)o5AkIA?~zfFuF?8^ z6y65Gaxt2Z_m_p9_$yimb$(sw*>+Nl+b*Ral`-0DN*9-kNO6#A_GlV{G(fTJw_IQ%)@h+|Z*T^1kl09A_dmLhiaXMP0 zKS#)3W;Fk-k-a=Z_WB&z>-%Kq&yl^}AbY(*_V@_d<9lSkw~h)t9pdL2+2HHNr>O^K0c=Vbl$1?mx5n0nvdHb68+b>k;=op zeO~_c0&eR!MSqV{Izs2S_D|4!0xrotr~YY6zuUU#AAB1U>BQIwm^NQ6+CBFP!S~9? z#P1}XUyIFAyWT|nBmY2*_Q^-dkJ_R2NSD?XO$!i3h2A$t%lYe)g{Ijts>TjB7I^++X zqjMGe=l6*Bayp z>XIL*L3(hG>{&+k<_P)W*2oXkCH=z457#9>&>WpRt4Mu9=OUAIF0x7ID)yznn9eP< z>6~LXDfseD>erFK5PaQV5$PWJ6`C}z_lYlibWWy4{)9Q2Phuwpzbm9~Fs>)>N76&d z2_b*YKM~*eXur5Y`@8#eE@9*e0?r)m3#`fgOWNlgAvx;O`GO?v^R;PQw#aYCsJ|HX zSCjfHM*WqfaoMJEIYRx_lKZi;zog%Y#$|)XWt+xjSDqs!e}9X{WrOq$z9EKuz&CX< z#W!;?#kX-W#W!#<#W&C~#kZC*ZBjc&$zR@}@q%xU@p3d?@GUm{jc?;(if_yEd>SwK zHY5JVH)%2L(0HlPc)>T$@jJeuiz&YGj47k}xlQAxP2**s#!HvvE=h912v3XT2V#73 zI58S`71~cpK40|zD9KNo{84+PZ<})@C!}xjOT6@0Ax*Kjj5q_i4QC(>P)z7jq;R-6iUGk_SfqkTvpqjQp(NdxOq{kC5MMMEZ5; zoOzqhEkaCMPR|_KJ4y1}G|B(4M(47+A0odOrHv1Y-)&0w=zE3ysiSmnrLisO#W$p} z-A(#lk>%xlOW)TZHa3=k&ygM5r2XuDxqmHFvTG}}e_fIGE!hbpWalP-TJ&d^_NQZ%&XL{Qm3~pO ze;K7M8ozsTUz+UUJ=%xHw;GTy72<1?=;;t04Z^=hcJ?0O8(k)TOo@JKw1oVQ()@>S ztRvj+Q$>E~HjzI<<8+_w(@`2f-Cw41ZxH41?RKocKO?@kUn9OZXrF47#&c^?^lLXM z%2%lT8kN7ApZ{epUR=5qw~U3>k#rS#jB9==-amp_EkM^pM!l>Qv0QHB>m9l1j2jrRW#DaK1jJae~-@zQ*Y zNMnC3(vc5Q`UR1;t`z#anIS!16zSRr==(?L_cdalE_Rgm>)tKw((arXpL73Hq?Ox5 zI{IZwpD5C?L8Y%h z^&!07_fY%^31{mk1f0F+i~8*XrMHN5u0g-)o(+46_`UWbkyc(T((X&0sl@w?Ulw>J zJ~Mr|3-235{gDrf)Qz|GA@P0x!<2uQNShxO=?KKJ+)I`ZAHa;m!Suy1&joLh!Bf zR#C6DC(`{76TE#&KOxe}yD6XU>+g5O@8oAi+J3J{=RPCS#s}#4N9gxQMLK$)NZX$h z>E3^dbnQ#@{Xa#@2>%GBowtealJ9kDm*k5~laCbbV#74<50M_wv}^yzL_Taxihg&s zt4rTyyP6Ld<=T%HY2~pZ4ce}KDxZ9usON6i?^3&D|HyX9v_J}uIm*b`;POw85$zq>c9z?wauSY&8>8~9;w*nwQ+|!gcXyoSZ`PET zc=o7X`z@m0{$Gi-^DdFP_2KIzJlFgs;k6!1`s1xMpHn(V>8MLDuF>~~EdMr9uSvg0 z=y#IRip-~UkJ2usBYUF$D5Wt<_bGplekUnillg>CwnNIt*QvcaebS}&uKkz5+x?D6 zN4_gkH@w)qkmnY~hm!fR$I*Bo`+SY+Hz<|#R5bM~RDbk~0&n}PG!MJ#H#PMo9c_ZM z_IP1WRi;GR(ag8+Ab7g@cJ4}Q7oE%M$a7nC-*2DN*nQ+b{JcmTUlZx*mqp6HL%%7N z{CM3_!Oyc4UrV+_rh5`U#oJ*|6ZRha4Ux9!{;q7_+NSv4pj5(<`1T23SA%c#D$(B7 zvjv>J=ZJLlMI!C~jz}dw*-vY)6yM$WVhf^uI($vS*SuZSue@EPbALm>|3aj0e9cda z?{0j_9{5JC7VYcMxvVC|LmHhDc5#!^?ljrSl(uHY@6L=!E3!VNlD`$guj|hS;oqnJ zk?Govg#RYOL-H#5+jyqgsz zpGUuMr}Vv){sX15zJ$Lo`9~QYlK(l16Ed2h{#g_$yH2G0GQHlvpCmqa>Yjg_|4x1c zN+o?sn%`voQ5T=x^<=p@iW@mXaRWQA6#j_Tt3EP%_ZY=T82u9`ef#u#=C=s`$n^y8%_7~Sl>M3b-QA=7+eIqt z%l3_H;4_L7+J2g-wI>;98So1YTt9;I&h6%G7RvXADTCF-+Ji*)q!B5mA9 z-znbWD5Y-rO$~f^f6IFA)IC0BzrKUu%JMpUL*@rf-S}iZiMQ**EAyp&C+B;a%6yqh zJ5Gm3mitlqBM$tC13%)xk2vrn4*ZA%KjOd-8wVctQ?a$jCf5G(p+_qtYrir7^!b(f zU!SjxJoD(vQTR9hH^25M_yB*c99=zHxg7pCvN|6qee?>HTLB34KMry2(Exh&=*s*m ze1`w{$6tr^8Sq{H=l*>Yl)nke<9~qq(G|EBDL}*Dkar3QyJ-Qxi0`K`JwR`T4m;s@=o3SVU%)(rEIDmk7u_s)pWg@$=7R3*+gOmzKsL4d^TOK)vHFP zxU`yHjinQ*skErQdgF3DmQH8Sp3SW1cjNJC_;(>wtEKDbDn>eA+9)Sj2<2#>YMmc$4`1K9 zaHw_RNPGB6?`qvU^se^s%)44=+lRK~U&HXPceidm(mwJGC7O6Ty<1e`=}0_KwROiM zT4#CvTqe288eNl!HP*UF1%EIkN)(`k`(r6nWR1%`U(XcXC4rBbbY-V%q<8bx`c9_6 z8n^ybv)Q^h{Fe~8x!G*~CH#kf{;G-C(wk?`rYlCZRxV`<`TDu^Zj3eV`uO(+Nkh#m zpv*C2BePSeuk4hJ6Xk5CV6eu;@5#n-AhmiXdpe!nI-TC!$y9UjOyw|r&w<2Lpr3Q+ z3b}NxzO$ZQ&zImMYcdqKiQ1V=Wo70Wzjo7nwVFAXilspk_ju)-rt`H-Et}8hg_yw4 zS|yV;OUqgY(7e#T9sZ>2v&u4GU6l$~A8TF&(v&Zs95OvOE$gWgN zo9UWS->JmMk}J#CacR%gGhFNw+X2g&@Wzf7%GuNNyGAv$X-wQ?RLd4FN8aSAYQAnH zit8o{NA^_8sIM3siDa%v{s$U*joYQ7HiI&T0-0Djz8oLRmP;FXDTCvQU87Wo&adZ7o3(@#Kaj?{Q7wuN&Qvog zsG1_pxg4L6y?CNrK8=FBUOt-!>8fVxOJ(*&q zU_@Z!WNK$Um*36jj2zcA(GlZ*d|xY z^-RIyt2^J-k&~;{OsTd3opv%)ujbFj<3QlCd}b5%aw2DP!d+}^p<1rhlGSoOq7(5d;_3N)aeFP8`^j5YYb7WVjJwOpJ(o3G86HVZ}~ z*Mk&q@l-k$_W{3ZlxpQ_z=n=Ly_82@u4GENaxsz1nGBp-%%3%Kr}DY_){2pViD(=I z9E_CO%JFz?pHGv>cU|W4!2_xK;0UXfr_=-^} zz+`(Wj|$GFaHc#($Hd$^U&=vNVr2rS(v{=0@PkiDH5>2cH-XEj#-~KxWF}vw`c~;_ zSvqkROv=(G5EWZ7vSpZH5z)F$9Vv>ACG*+SP;RNTklD3FT~Tt9nrfmmXLLp3a0E{+ zWD42UtRMQB)K-22HLQPw#)7wf46K=8Z6Aw=X!}^W&Km38_OXC%9}nL4@xW~#57YMX zaBUy&-S%-!+f!(vf_`4C8qeA>O4)N_9`aZV6REmUkv76uaW_86=jmMornx1sug}8V zMyh&z;f9lFQ=&2C_&ANy37MvN;@mO4RDuCkGaMghmqC}p^58d}pPf?}*3R8%R~GoC zxa9eALh(f^T&z-Y7AWl$#}?L?a*4$5$|_Dl)-*AWd8ub%9^{y_hy1+l{XBWJyi|zE91#`nR?8jk|Jvm<}oZ^O}G@J#C<4p7l^kG@y)6oH zb#=JM$+N^Uxfah-fxnK_P*OZ(OYCz%BqIr6$E)!1UBHmzX%c`qmU! zz<{XV2vT5<0|9pm+k8U_b5oTq1DGaf3z0uVsuyN6YWA3DH#8moZ}uxMJvQcS8K0}r zGNTsaYFI2*mBnu;5ee4%dE04r@oM9#b6^440STRwoI1IRZFS^eXFCf|VRh(xM>+fm zo#6a9O>Gwq-gdUt%-jZtkQ`rf)Qnr>i<4|Cj56cs+G$Rrn;`xbrPNVY_6GHVi=?b& zolmTTw`vAeXr^|$W&y#qGgyqJ+*Q>tFJoCV@Db|1JXtJWMNzRxaf8QIeS-!K)?Boy7L zklsEn`8ipGS-m)o3-1)J1wmNNiQSzC)1EsI>f|d^6(f#5{~Ln6OfN;nbP zviV}#VgaYeo?Y0fZRxZ5Dm+0B++{cJ>G_>{d9i5Yjtl%WE!=Qjn>?;wl6!#K>L5py z>u0}8>b1OI4fT57U1Jt>eKwDljFutXYv}4ki`kGXm4h2LWa*d;S#rj7*Q$c|&csFv zJ025WEm+!H{X%(8mp6TMdBNzbb5TGaon}87C-GPwOf9f)aqS@~rM!u)3`kc&IuhmA z0{FNRNq1R?VIzz3k8+NbA8Q6o$?od>qpRdp)!?{XpFIW&0XDy@%G*sBdwKlsDsMAe zri2SC9=jgQwt}$?zDKTbN#DxsxX4aat7XsEO4q^ z%_$3vUso>Yz?d~o9fJ)Ni(;xj!8ID@;)PqChxdw;$=pG#6 zt8-O7B|gH!T8?h|;ur+fUiOx>*#{bP#1a zJ4k$VbB@WBPO)ODNLSvnan>4w zX5J*OXloOGnKPJ)s7*OBYtJs@YInV?g)j>vasj44urFk{&nzx-&$^=7lfvarqiH62 z>?k)E;$kN;lUv*=WzmsuEf>tqtGLs9Ynr5{od~nbd&U&G%8_n%^I zno(b>EnGjpa`I$CsyK5L5Ukl-kv_AF)R_jbixqObph(^kcNk=hxTx!6O zWX!_GFVKNIcGwu04aeoE2@DCH41-{dfYV>A1dKjfWqJubEgB2l)ixNBT4Ss4XvrA% zkGb*b(?2%f5N>`)Yl;U**tU28^xYWlNpcUtK>cE)MF8oeF#I+zlrQC=V+8{`ELtubO& zjmM8IEWl94)h@)XaCq-~Ex@?15Z_@xOg`^m2ILHIPk-13L z&j@((HNCP9hhYsPU4r>~369WKVBxR?wQXAo*5LE>$#j6}FAAEl?e}X5$mrrJT zV2QyuLxp3YZ5V?SFIEe1w{Z~`crZxZ^3`{bB=x8U*&@pqPrKOOrp)v!Tq+y~(+1ip zJkT~+I0o4Un3~-pG}$lT5oTx_duSfp(rB{xVx*@cbEwNnG@-*mRSfvZ6e?i#O`diT zN2gK?vR`5q!_-ElyoRytH<6jbqk!cgZwk9QDoAq#4uCupR=?!IV6%}EV4-ds8&KDQ zKCoFscEUDpp}Gv5AS*9P0VvL?Eg1nH{}Ocs?gx*ch zTx8{Xla&igR?a~dZ0kzbww|oKi!Af1kzbXNJ(72jm0vk7cW(7Kwq0ax_vY5NO{Gb1 zxgUa%jo5ZH0-X50aTHyRFpp5^$tw2j@=3T!n5oq9GF-k^%9QYMWqws*-N2Q@5^%v5Q%`!hCj)j(}NG43U_L4>2Npd`moNk)Xoon(WANPen8g0#Fl zeM5ykUh@QzdEzJx@2u)_mV)^uV$bF+U~*32d$a}bK7&#+RQ0VRLp|i`AY|3%p_mwm zsM-MzL{e=42PCLAh=Y^Ue#O*o%~?W*=MJU1fSZ1bc|s*-fnX`NwW7fauEwl(^*s{d z7P_?XvcMrYJs3hIvHaI&|pHcLA)IN9pT0m)WWR+4Qz zE7W|92aJ|eX^bS`p4LU|fkZ0dwE{R21tSAMJF13e(MA-C zwfYJGZ(dDwZxs{(wuT|mx=%x>LOKIbrT|u`qxjk^KcCqz0ES~;zPd5^PKSd*F#v(n zG~}QJ1er820YP8`6Odva1Vl5=d=*)IG6#py;T}>cYw&m}czkmPUP5Z?t}=~^rOQPN{wMXP;3g@I|6*YkPJqD z>EWw1dicIq!!H?^z=#z{Y^H|K$~~GL;K49(W5$hvw0aV4W^2^imcRZD!P{!M9+*up zLEJG=Kju9%%c-J483i4LHcP0cDmMyCe_zUmSy%_&Hq9K-do8Az5ID0e3U#WhH*AH? zz+tNtNpENxN`rgf{3X>-bZl0RpEoW50)=geEU_c#Z%Fq>;BTk(?uXtO1|a7eB$35j zu`oow2e5l0Gh`4WNW%uzOy8SM4G$Dvw*Z2y0Tyj&Yk;W?f-udr;sxMDEbexhm(ZXt7l7Nc#Z2{d%?$zqNG&d6bhSKOJ(*pE zn;Wk9F;Kt?q{wfLB#kOu`q_cganj9qJRV$vVQA21fu=t?MQ9G3csK&FpCf{Oq#0%gzus7fAV6I)daXQV#W%b!5CXe;?zF#JLQ%j|l><--M$x)ON^On^%td(s2<_xmpQ!PjxD+-LhY-7r$AjT_(9rzF zBRCerP3dqFH2d_@8KRr_5p2L)fiK+sX)kO+c3fQxR%P3HSr00~{jnNEffKjM;!_oV zXRKfp;qWu|$!oL?}r8tKTKJZfy_OSYbK1+L^l z8ep99k!;DmyVMvJS%P3JwxC(Z{UdAUtXsi7N*d2XkDRITdz6MNs{W-haLhucbP}TA zxm1+9VN?>Y`t>M@qX4*I2dn3oRoH~AEj+nYg8&iwE<#vGG3bdkTwJY~S*k6U5s|$} z%E(k9BA|>tis5-6Y81wDu*@AW(!h6v@kboIcUGN*JFD3(Q5TAB!{{=FZ9-cV0vN$6 zQePDA?jn5{kprpPUU!f%iF4x)-j5U^aN=VS($s)kJUm#U6`<{S+#Pb%H5%O6p7G$0 zC^|V`sT3f#l>I&{U@?Q~hzq=)_;1JK81j)*C*#B54fut!VGDk8JdOs8Xo8H^7^u`( zpi<+CQmB!~PiD?qa~gh`I$@MHA!MZ~llXB)d`vyd`8l_XgU#%6ELp^$KCVwz^i|F| zxDV?9UcoEERuvwawrT)a(I1UF|^)=VE3v zZ^iLDE=$+XK#zm+af6xSU~HlwW0Mr~X8}HBm^I9(3@+neewQQDtYAh%fC#n_C7~u} zVAB?`vO)3f6fvT;!J{e2c<{@|ts)a<5gwqPl$-*VyPy)7l8Zj~hM0AkTrD-_E9c8@vJleA2^GUlYXF_wY70nEVHI}@&>oHyK6yk--R)5N%4IDJjhT59!nN7r;wXchv z$a%9iFm$y7gy=C01Pvs>tYeG7bKC@DFT~5Jh@nDbNDeQgCP@?vKocr1qR8q9$ryqH zMTj165g8UE1_WUw3pF{i6bx=ya_lZ`P-F~wqT6Bum7FGUiq51GGkFhN!r37_O!~4Wl@R6SmJKD0u-Rq{PeWlBJ=l!^OBT z?S>0$VT$L&72gh59IjIN5~Das9p--2#5%+_vkX_;OxGu1`}(FQRBIma+dvOXYcQx$ z3FY&pHP*o}H1B-$L8uSZ10b|w+wBX{Ni^9Hy79hXBevcbX2j-Omd2nt&Eai;Z30pjGY*W+A)PTt{ebkVOTj zS(XeKT!=2tg4;S&C-%K6QUC}+Z{JHQ1%MFf70aP;eWw7>ANo+8r@$U+$o0LLQve9j zd`0b0%~#ZSHXpW3V87D9*O%h8`jS*w+GxW3%|dvSlr?6=JCblhQU^h?<6>6tU0EBu zGB^xNUz+|2f>(y!4pG=T)CqhVOWz25E?3j&yjDI-AziWY+4RZu zrcqC?R;-6CEO&P=SYoM2p?spjvaRI+4qkW+4aYKN$vZv(Kw>@AKOngh=pT}0{`U{d zW-wptTxG&Tgd;_3&kT^F(0!zDT&RAsw4rHeg<_7PzTk=(_8Sc~e_63$nD$yk8qE5k zX#le?6iz5FaF{W`v7Ivx-N%hZQOdknqAnzQ-(F~zLxNM^HJ2`JTy7fRW7dNr&Vs#_ zlc37368ZqwQ_vKpWm?q}l`Jj52-I2Q*3=!|aTkd13P^p? z;Cyj-g~qzNVr+&ZtJd5@;6^&Am5))V7+ z1l>IGo~lQOG_ir#GFPluKR{RZ0nK?-x*t%J>-^sEKpHu7+Blca!h>20o_VxEG}ea& zyWfUv* zb9Q|Zq}B{PW01*WC?VVYA+y56L0ErFD;Cy)yG5-7{~^&baYa- zmQKpo(@6zcQif!hL?Hk9zP(@GybLOMC!mRNi9^ z8jtT5M&rQ@(5RTAkItwV0}joo;6sed$S491%Bb*zkCvzy!VHzjIKqq*&A!CJ4VV59 z_AzSuL+mk8bc&}xG}E9;tL3sS0zj&MFqlF~Vt)JTT<4tnkU9 zcxcNiDyHZn7!_kc#T^xV2*n*4ML@+J6@GBV9Th{E;Sw1~2*qvTpry+t7$@N{4Pu;x z!x(y;gaaRGoPbX(s*R`lY5#N$!u~IvSdS+Xvv>ku z{9f)6KuWr`_!Sg$o8R%2V`?7ED|mJS-hyL|y-*8$iVNxWPnjkmsOB_$GNlL~N87P~>KL&s~IXmjXt_ zhAAM0YZ>?q)yG2uwn|?=OpEkTLbk^5I7!eJ`NHtD%4eGOJrd)8>C-dMT6cznX>F^# zhvJ&nF0d+vW4psBq!SDQxvi|~A=zh^R00S~zB~=#cO^O?-z}Ti=X$lLffIT&z%qRO zsEgWSGN$q16kpYbZKb=ur)56l!)louO4QbnTOe|4-1Vci#tkK0Yv?RW!0{tXyD80T z2f3^fjw*7l2c$}tc2kwpQYCAIql)AvAXT!oo2tB)Dp?~ORn-3hsgkALRBdaik~Ml$ zB^H%pWeKJ<;hzaB5&6gH%1(9)AAZ9P?UD@+5sKzn^n%GOXX@YQvml!3>XlD(En-r4)1vL zC(fpiEnEk0fNo7Ba_|%`I6x8!aCoeyQ`6~`d1H!`+Z&*5O@gnUBzO!C0c|R6-S7(! zO{`7uAkhGz$(6x?z}ZaKejs{H$G)H`jlX_67i=n=SOxzl(r`T4@(_(nq0$SRHAl)> zr5|F}`=TY=S8aTBDLNnWebvU7N2B8|_EX!V&H4luINVCAJ{DWgWKXB_rJ7N-A|Ak{ zWYgT02b1AOqY%)Abn0j*0fpwN!YX)LEfGwnFC|j5d4U}aYkKY} zFUslL>{6J!arH0->LQU?25r5R#7{^0Z_&lqrBjOoCdp#}SoFYv0eVpBoAkgZ++vYk zvY1XK4vrpSLj2IsBaM(B8iH(Q%>7Ff7#bDDKf{>sfEFcjD=g;DHCu( zOFftlR(MtVQZONZz&uc?GJ$#fU@?bKX0bg=)=uFiKxVTY4hkFSL%a|z zhLUUX)u+%oc3uvQerpN=TU^=}WD)DNUf)fV6PMhXI4BiiO_8!~2ZYJ9A`c}OahS`4 z>T~ywaw3sjO(&0|2>`m>?i*F~QW!)kU!6n-mgj8Gi6aCua43jYz#}FA+wQ~YuNB}q zI2gd-A~+bp;0w?J4(y!b*H(;-6$=lFqgwVCyTaTH%_4Ml*WdMNC=yEx&9&_W4Ai>2*M*IAgZP*jhGopf!uez35c)x%(i zfgYxI`jG!Y>mO~ zaD1}?@5iQLHIOgv6cfpm%}Cc4&X>G}RsLh%^v0-MVubKyiv>=NHAW&-&RLHrhjO1g zdTMOUwI1?pCIaKcrr>(Iq*?#y?5RG1i}lW6f!o$Mx~;d+RD0Gl2LaiCceD?h<$C1+ zh&CrNFhQhQ5B7)|bsEGrtoT{Hwyj471wHuoY*@P0r|SkK+CJO1VF`7tlLp0CYchiU zMEkl35rD%)$_5z0GnQfwPr7>@G%)^}>pHpa85CswE_K+}>vycfLelSEhlQly$qot0 zyB^eSk^2C~-Ar)LI_9%p8*q-{U`jzS2l0SO3FWyRFz!%Z+(2Q<)k__xX%ggh17Ueu zr?CPdcbluxLy^bhh4LA=j<#OjaRxZ=Cn&k&#$!K#*5zcx#&U8~$e zb1@jiUR(?YrEe|}8M6FT>*9Tar(tQ{11%KvkXo_O0Dm4XpiGTtv^?6Cchru0R(bnYGq z;g$f}27kYd@i_w$o)aGF8=Q1_T~fNEE1}5-(5h`F4@N2HPM5lcuIGsXQs{xtK!gV! z>eNGM@DM6qv$-D{l>W#>Xi(r?8WdIfV-caL(jSBf4XWtZz>R!C+(b;k$`SsVv}rnP zKM2PPL|p>Cv2q+{8oQO`0bmVc)$ReRdxQkLxFI0PlTx?=fwiYX)s_Zz@7myR7HsI{ zXjWYe0+~eGX0@~hhOY7*gKPzap3GBOaL8(SY*Lck20=r(LCO|&aK$ayCFT4sFaP7U zSh_8i**Tl&#bA&fZbX8WZ@vg_NtPd`F+8{+V^yW$lrY~8U+RSr@o+StY)~&INFG=NJV4jZRLT`Nvk|%>vz49N zmZ%uMm&Jn3wg3#m1z7)C7vD7%oRPf_QfeKTf(ehKNs!0v0aY=}etJE|3gU-IwcLY@Uq}rwn;3IN2SdU20al z*V%Y`?*MqMLlarEQrDtpg=jmVS#9@#O&02~>iS4mUauc@HG21wuBOmJHjh%z*7WRH zvAR6)j&-65IErj+aMZtKg5kg#KrkHTwfa)mtU!|FKrtC`nxz3@cc!Z(#{oN(lsak# zl2S*FUQ#Ok6bCJ)ECSOC^2_2LSxzdRs%_pzsn+@k1dR7Y>vRMp_Ys*6ga#)l)ly36JZ zl>IeWd(EQFi|SGhV=w03z3ion;#l^Q;DPx((=z%e%l zMfWHcz21uYK5=0P+!0|(x40jOU>(b)tNGwq?#2+9<*tecItfD$yU^)-*i}$Fb9!NF z-7(&xgOeKBuOVXl4QNOm?hk&mpwRwuG$6JFnQ@Y=$w6hcqarwrE4VJ>i$jXtneSatlJGrG|hN6;^FZ2qyn-!itcq{shlmc1P zoE$T?T7I*XChuJ+?eCpx|<3V6E1;AqP$99yb2f%7{$GG)~ouu6}Yy(%-^eh3^ zb|&RdNnWiS*K$j0UJprN|7k1P1VdX!DF-qDb;xB(mXxFQ!j2RV3D6@RE4Jr&w1r7P zdU*&0dSHkizo(0n+OnEHrIt+K(@b!?Krz~=gtpfy-`49|8f35c-*THM`0z(53^ML_ zNMXp4FyuVrjR0yGOu1V2QNE)=S{%v-kumJna=n7{e|S|wA@ZY`OoB0$B#`)Bp)j*+gPs~EmO=qQ8qnc|H zb26_n)`&TpVL`b*dWTAA2ae3w8FDf|*yf99j>?K7IHcdKe${nkP$efY`V9br)Q>1@ ziIgs6?TB(HByB0J!Ae|HDlA(4gjHDEq_DOeNTOWrIFb3faU%1BjT1qvt_On3es9K`D`+jd9RjK?r4>+WwnIS8ATqG- zl`9@t8mkUJdfse>V}z~?UU;yOzY?)&)OiRS+mWsV!c;Ie>cw)+dYfJQG<&~o!h0_z z2+ISjbzG3Ftiudv82r-`9+)#F}H=&1EfhJ$a1$IU!=6z&(F4?>y4wUabF*_?oAnU`9R zJ5Zb4ga?Bxmk)NHgiBOuoR9@?FLeVYZs^uai`x6D_(8}mVi6YWr8hwE zH8XA!+#fw_Lw-MWZ7RK+DZm_kKd1|AxDENG6>5C=juw?DZwlmaFC>ty0B25Ip;-YQ zgtasZ@WfoaR_E4p|0{{U&;(yb^o6G1HAHmeVHXgQF@;<`M8*?o=@1#)pwYH{3Q&(EGJ;(7N zNH9aR-!CNK`}4s)^tu>vL3xhYLYUWmvKO)SZDsdMLug~WPlRD@?mp4sIg)IlTq37^ z)Rl3+f)#BA&}Z8Rwh-u(j;QN_furqrSi`P$up1TTJ?#`~7|PbnwlEz7a_$KW^TbjS0Sk zGBEu23;Hl?!TzMG|0Q9+`1@WN4vc{NsjK^5C-%>PK9`IA5%5E^Y7_^m=B?W-RWz;9x$`} zGhCxGJAlP{43Er&nMCN&{z03P5zs_2B_p62oGBR=d2~}UB&NuwWJo-Hnvx;04c?Rt zNr2b1JJ_-3#WyfhGF;2Unv&t5hc_j|!H-}{hD9(aQ?d`deVLNs@D9+FjEcBl+any_ zNTy_X6az9P!y+~fy1q@x$e1s6cMi^!4BzBInUdi!56+b2kyRY0ts!`y%L~cF`Gq?b z5(;c^Q!x}+U(*oU)XU2l99dXXFfinhre9#V3RBM(0@0j&oDS^3&;yxvgX{pWX$7X- z02}0muQA=AQ3J&s%v1~7F+okUpzs2lV!;9Wm|g=En0~!>LEF=}X%!w(w7EAZo)D%} z7?65XX@H&Hzn3j|lT0J*pu5A@^cgVo`ZINcGB1E>Gml;}hk6$g)JyOTDLmOU#lxwW zmXhn+@RS+^Fd9$8V_fjYljDZ9x=L;v-Z=|bC6Dhtg{!h%gy*C*Rr2K;zwA3vGwK`Y z*BehS!KcMyeWQ@stfk;tvBu@{`PCU&dh$#@SKmq$ESpB=%vP#KHebt^OEMQ=#?lMr z5`;O}$=21+QGw{}CRdSZ7C!%a;t3o_Jx-;vmhA}`c$me)q^x1ZNT>HILsbzEHiW4n zL;8oQV@16WQ_B`+yk|8Cz*6hMDKOiun3TN%)@67zkSTi{TIj<)x?sd4 zzEP)Uge}ewsS}e8J`J?j5*j6BEvZyORMb8K;R=rHL4qLo)S>Q!FcXwgO!6Ee zvC0Y7Eqor?!;ttrdulxp>};S?xj?1zfl6%$Dpd?p3K%t>KAN{)Ob=M;fSytpU1EFa z+|`lrQyGNU-3sbki1IJ3Gyw?0IMy?ztPv!DpE*0x^a8PdmI2CSz7DH}dbtYWwKDm7 zZD}dI2s9$`e{=H3v0^h$Y8fUBQcTK=G1z@X0q9x;!XjAZ}sF#&H^jXHYVhJ0L!jv z8xKN2RT0}8YBDFwI296v9OVyb4yv0A)X&hv5FyoETY!j$!ldfxLLR#W0nbDStm0mQ z_q76WF>^Kz@ivM^slJ3WIjVBIHjfwcCI13dqgdWGxb@XjTvTm_w~D20z$M1ETmzPl zRWj9jK2u27%2img%%;{*C80EexrMaYthVF}`q*z92SAhkxQIXuJRP_@At zND+am`b-5BmWJl4jv|o)lg88OOm2IpRv(xu)5~~BTqKUb$Eb)-l&eF+Kpa!pgN;YoFo{4y`nk zFEw79oqb7AV>nfF`7NKapm2sT6%VLCEgaT@8zt5yw`eI1Ms8K(Tq-bC)bH>kLp9vP zVW8E{^s$BOs+r2xL?X9oi17=I3CIUG4DS5mWQ2xcxx#pT7-oTKa4U&^0Px}72LKwl zeLyf>Xnnx2hH+RRo|Ur&z#FXIE4E4H8k)o45)lXnI`~$(=@nE2?3Rv2up-R8f?`WK zz@pRb|Kq^GM;4qAsmRWG&tWVs z1_iO>Ygy9-A79U8PgATyqq<~co;mO0`xdrR)=~nT3oCX{;y8bk2#exd7`b`)W-P0tWYH{5ROHk-1rRrul#yC`EKxW#s zf_E|mK_!U=%`#;aCZiH_jku!sc#D=QnyPV(<2iwfeFzY(X0f8J${$IcOdZ69`SU zkWL+SxZG2TWrzCozgrpuzV?39}s60s# z4Yg+)R1cS=rQrAoF(tQetbX371H&pO;7iZHgca34!f#C4TDqc>LJHLb+Ihu#KfU-@{g| z(UcJMmbtpPeNh~yot9EjIIMIwx`u>+hI)_MJ*;(QZLP_!EUmTMm8G@DyRx*_f`{!@ zho2*jn`Lel;j3c;LGV>Feh_+V8BOh=YNmH}Up>>adJjd@vwlxa(-T5(Rig$GSl4K( zhw%WYLFl!OrhEW(qpK;kL{7$SoD zNW#)3BjZ6=Mq-YQE~z)w%cT2}Fq=C4;h=3mf<0q7J0tboAmqAV8dPhmu%gn723V_U z52va}t93ATEavnM$=gddxi{zgB5XjSPYi5xaX^l)0^tUh8cM2G6x+&X74i&eD_8>T z^@JDE(PYOT7#PiaMcgZh1b}9~umG|}zA+rM^>~>p1bKLoOH~|pe0NHlJFrIx?mm8Y zu?~*np7W7o=fdg-hld&s2Y$HO;T9c>h*32_;T)#-m~m7Ds?i76I}`};)Iz?52RTbM z15SG$oMU|~Dk>GXu>Wl*oFl_lF-ig3Im-DmEz?u3!upb3?qu-V!TDy2mjJ2;*cXuu z&jL&>V3jf#Fi=t7KlDvmY!jmHtX@%bR?maOqr4);R-yawI65+~B0&sXuTI zCls1x!e2UpiYqu}9)-v+t@I5`x~B#}msC&#AxS$^xBb z^2T#GhNIt1>hW+j(S;_pa=4o4O_MrSSrbmxsBEU?@XBUNp79xzh1{n;Nrk%KB~iw_1>drFiDt>hK4_M6jB{H#3Z3rFVt^60 zd)*tz5kR;%l_P*~Z!`x6AvR#r894G{X+Ki|;1&!n4{dILT=T&2m8W05Q>O)yZ^t+{ zWWv<;lTqB8!Npia!c5S%of=$2^$U(96ZdVRgM(ch$2Lv~p23ceV@oGQRoLBeZ11?M zPTF^Q3i*2@VOES-d4=3!cZLx#j z=IIBWieK0r_N|_N;H&thgm1q%AoU18j;GO0jsdHiRypN5$et}@(46Y2$sdd**4_!# zy^-863Y*dz00T_QZOW^Eu&%9W-F)QBRM-A=Bp9wuYYmL?%z7;+Lye~D;}9ZfDG!I8 zUj@q@`h{Hg|ejT*Y;vYYCg% z$KtB(_Mf=2-M$f5w%hOF%GSlD6{LYN7$_jES^CmNqBT)Q4naGC>!+SprD`@6!G)$N z9=^2S0)bPhAQ4MQ3C=$HOrI0^n_w)7fcy>udU!5{M+lUje^u#}6doV2ll_a!QQ%u# zI9`Bw6)fRe(PWBKxXR3AHU;pqrc`4mc%>GKn9(Aj+XKWC(%l8Y(-&yN!~fmQ2msYK zbJ~=h+OkE551`_qizA@Y&7Yip9ug@6P_^^|l~Dnz<~!>=u!2He)1(`O-gkq zHB+i>K#1IvnR+#UHnF<`y=UD%n5bc~sYJ=BZk|(TCXdI*PL>NscBfz*hoK}&S@HD+ z2q-mvw0!nh9)bwtYaX4R8ad}+xa0R-gJCjX zD`iScxkP>yB80SeX-G^~^P5|)f#j(RPN{)v(H^1ME$V_I?n}}3poSO~l$3yqc(6!S zs>QmOOb~|=uz|mtD^ysrq`bMkc71uwAUJ%=6g{1xRZYgbg%lCK|q@Cz(ddln7VVQ#%CcL^+{;!pycf2B&UB8)x@8@rIRO!%?Tx#8V0;gvEq+e2fwaXB!C>1W zeLCtj%OD!#k72N_>A46SM1y)F89}V21Vwu$`XrAp$Zs3$Kfvn#WK9jV$^pk!ojSa;H+|7 zgY_;)%At2b(^=NLs5L${WtBd5&QfbRYjwJ^G@W%4ld^hpbk`#b0%oBgSj3@W)BmQG z9>QWbJ^+KYDE73&DhW0cZ?w43rkvpI?n>G9TJWB^I3#=$nIQ1R{1^_tDQW=_$T=$< z2Ahlqz+sjS*$;N{4uHlg9t4kPD~2S*Yx^ZVMFYVXMy_-3MnCjOx}C*?j6IsztW~0I z9Kc*?zQmxL_8gB)>3LvxM+IrVHKi#|A#*fV{AoMImUZSmYb7T^c+SD6HS+W`Z3O69 zZjtEOGYA5otbic!ErWqd>*0$H8f9;alcT_VeQo&`ghGhnH90h?{A!B{T#4J<0ny_Y zldH0}xkaL_jdGe)El%xnr!6A8Tq$ZAu(FORCOyiT-R&rsE*iN!_#z!-g42dS88YFV z0A*SG;WL{9dnPRl*bkxE3tZw?Cru$5Y2yF}Cz_3*oCkJLTUjqYE8HX-lu;A~@ zYXsr5!LbeoQ!wuzpu2QlrGO-1h`2Q0YUsHeV2@2`sc>#@;TjSC;E@_oKsKM&Y;gFh z&d1{~kpZd%Kmo9rIc*H=5kf9tmgvt02d-+qTU>)fQ?*?QjlaR3s@ZlVOiK>Dkm6}d z-lG_1H)YxSqGi?#?#`kx16jLvv-JMK0G~eS?M$8JvHb`2eyY1$g98uJt-+xM=+?|K z?5x4Ln5A+py;!Vo6f&E&6u6HsC!cVpq{^nuY}u13X9(k2OK{jE9?x#U#SwbW7#!97 z1m}7ZW3^2GP{*tkjswwzX5TN7U6G*c4cqt1!x;8)xFvM6e6(f_&tQU-< z(5I}?{i@uOZV%72EHw7kR`_g<8ANC>FP zIfTSnAfU8q#98CQ1GTwhtYOmTsXA_Dj>YYqI+d?)E#_f=k2N~~^nF3XQ0v}XhT2D- z(Yp2Fgl%f2T!%=vu$3=4K0|#`gHHO6r2Jh}95U0X>z5W+Sz}FpItgz!3ohL;+&X(F zfWKX4tr(lt@|pS;bjEijD9W2PIRz(czUj_fDuF6X!Ko4;LTJd7g7WJRte$%;%%l2ckqzW5Ed!QHf{U z$)lT=r%tY}WJyY#Mgh#pmR5V%ryH@Pbi?NJ?W zJ}tyC3Od+5ta^v*JEyAc_&8=3zRUjoSX@BfcYGWZAMcSL^HcfFQW^Tc05=F(wPSv- z))Ff@{B*D5(>8wUIzDkhxF|oB3$;XY5e7sG4={kt{*vh4l+3UWn1Y{-7ddY)!f`h3 zUpQg6+P`ojTJ|pmM0LUbMTn>TQX4n$pe2^N!~8atsel=olcL{NWpFTed2-~C*f(>g zt45^&@2w_!IVrMW#3x|wDM8%h1yL-@%#J-1!uakQV%*(peg|2Bp$p}4nZrBBo+aU2 zw0|txi#MJ^{Zj)-oI&T!FH(e>=9f%La_d(6H;JZYev}I0g88L#LRQ_gf0I?uA0;|q zWhm6ZhF*sxCd$xr2+v$D$Q1#ypcx9*WVTQSV}`f=)=)L4^R+Z5gx76_sw=sDAyh5d zBW#0_b&a!SeV0M;W3|H03vc`fr zN~qs`8zEVCK3p})vi*dKE&Svz2lhP?fdK6YLOH-Y(P1j#-5U{}WYk5gzO-RLc?B?o z{2JL6lo8cQd6_Trl$`e2w7+;tLJ}aJE9+3Uu1Re|)73s5|Dh@OQ_nIb$dP&Y&`|2BOu)Rut7E*C63`fkqZAUa}YfQN=B)5O-jsP*}x zL-yfbw zS|qbAY2hAlhq&xLo4T&5Ty=S1=6g$E=h?WZO=oKO@I<;==RCbvd|dxcqguwcbj9!N z*-RRw=xn}@A1`uZ()e-R*vyyk?Wyb*<}?~ZNGHz%qut6lZ_B6}Tm@nICVkGGgVi`J zOS2hp|H1cL8$+D9Vy1Swx>GXnTZ_IyAeDS>V+=oCpiiLavZvG8t9~<1N#otZw8y3R&>sI=OIt_of#Bb0+VvR3; zqE(Bzd*WvW=CV4keg}QnsdF;g=1*SxF7dOL&6IfQefn(}ym9yNpMVNEQ{KpB&LNHt z{|XGq6eP#)rB9of-{n7wMloCA{J zziWBkyq5T3(tAPtu2(_xW92>h8)P1T-@$(qmE3_dlx9cRaGG6F%mB#7orl64le2&n zOo)1!z2@UX)9m@57>Z9Pu^rdLJ2+>+XR}n=DDSeH?>q!&Heghqs~Gtr``7OtT4lfU zuSZN@7yFxgkFXy*&OSL5XWu^r$bayV8TN{YPq6nqYMj0BF=OnGYi8M3e|eJK@h?MD z?B?$Rs_qYl*n{Hi&BHV7j~~h1TL15HV=>2V#N~47hAMcoKXolYeAUm-vM-L2Z;gHa zdqWfKbFUemX77LF@MPjlrjTQQ@cv==976DHVSPfxPfd<%&B-ER+} zZ`R>{ow?4aFO-c9^xb^(MMpfoRrca0u-&$c@xG|MZz*c4!g2=}V=YaTdRP>yWs>d17S& zfBwU#hi}YR;kj}8{fSQxA3EIpCB`lvW3N9v&i?$zCfHxh#@YKnJ~YX`@r|JvyXED> zQ|vA6!_(|b-#g3>AI0H4ziU)8n+CghnDYcUxLyWVBwA!(>8iH3+3&yY(8)5p<<3Ld za%m&KDZKCO=6^fFE}LNQI}(rafw`Km7mP%z25ynd##1|RQHZ_#vgu>xQ&l+HkSK1m zS6wzq|6bo_pLxg>OiwGuMk2{R_YgMB@uRg8WI+LDz>=4^a zutSHt*Rw-xe+mCOfqyMC_ONmGnFma;?>+#;>+(43J}~H(8T-_aXV}dns@>kd9x1aA zj7+gl{o)LJ)8ZJr`_wf1ot;_s{_{h=JF@I`pBREoRMxt0$bX~sAO7$VSYzys?>WQ{ z@u*$@{QwbS>y;0~s9o%P6Ne7Bp3c}2&yDG~UtVM1d=L+|#XbNhY1pf88FIwq`pV0P z4jpbo-NW7+ruRM2dvo+FUm3FBGX2tm}Bf;XxH-O^_F{cqr2 z>qf>7@oVUR_G5V0nmzv~gWN%9Z-@iuvF=fJ-;XW8g=$baVn2z!=*vSXfMMiZV{)2) zZ?kXS4vO72h->TxKW@LA&00Uf4qHRHl3N#Jb#lI5E`lfZ_;P&AK8B|R<^;R@$7k3J z9~@_Y|KO=qrdWY-Tx6ek$RXANN{3;f!8Y~Rew=SQiy!A7%!b7t^zS?vca*>V5NOp+ zF!(yZ4i#`LqXzUMjE^UFVZj9>A9j^DYYFx@4?b2VB8u!^07~b70B_>+xNzg@3XVdu z4?koQL7qY*ECuy|JWo^NaoCK^o;GqfX2566{`Mi94ZO<99hlL3*4T&Uwx5X#BLjbR ztN7Ph_^Wdcnzi>^(5&1x>pleZ@Hc?W#&5&dHvZLkHe;8~u(v-n&i?daQ|$bc$JooC zGX(MTDsaGoweKDhM}zRt1h_4MeK4!OyY>Ch~}sX`_{W*KsgWU$h|9E629su#QU@2+~0}ycp?$voF4nn z*8&?FcLD>fLFpWT@k!WhtHT)!b3}k(gM>`oST4XG9188MIf|zis^@C;cp{f$FM0R^ z`|m4-Jf+zyu9}7VRAoEI{`jiHto=zqd$}~_*sCA0U=#``z&>N2exlq!XJ7umV7%~i z9yL>InA_`g8G`-gZHMsQ1+V*Jv;+!(Y^TEh?7l*+cKJPIgn^5rZ;k|DS4MEOpuVRNy zF8tjiO)mV&&zM|z+25L6VE_I>FlxrxD;_nw0I@0s8Q>||hGD<=sHqcTTXUQJ<)dI{ zVViyQ+Q|hB5CLL$`*b{ZjPK$a;CF$%m%VzJ4TEh5|9sPbm^z z&Uc|nM>dUek$w45ctx3=|LNq)@^$P}Umw~vvUPUhJHzYwdJS#Gldw{(0g%svC3j?; zec;iP?Dww~8`&5K1VqI&+=&;Td>dHK-@9*^qJ>modx4^bST?@UNB{JEm=uqd>j~C* zbaD%IC7Ro?JA{W5+i!w~m|xg)9o{d?G~*7vbNP?z2Qn1vfovd?{O zsI*gL-M0?o(&g@phsry3*8Vo|cy<|x&J@I^^4A_CMfvSl7TI&I$=!&GGR@v{4Q$u& zf8G6!q3NX(n67+_pG^( zPd(N-17CE_!0cnM9cD-3?EK@V*@quD3;W~MOeJ}AA+f^ly=sQN_3Ejm(h4lGV2^Tz zy{ZNFdpxz3-;hHQ1ZM>q34;DtkDFlcx)N6et7VzJ%f50Y4AjOjFs}W(urfn&nLnGy zUjEGEP7x~h#;c&MzX#b5$n6Sd{MnUK5_j2mMrVXnrk({-c-u9lO-TOeTSGf7Ic1Vr#=MA>*AqLc@oq{2z1lSp!o-FGDj?NSkz3Mtr|HF7YL zbL`^PKrqxh%=T`<+O+BWf~#n&_$8ounlHrs#>;sr{&)M8h_CyHSYw6VaTVtY`@%PH z@Us7Nl_|H|?9=!S^dJ0xn|wzSYFqiwUL4}Ugc!f@BOs|% zo5sLvu12yi0NGur4}U`^v0>S=1pD`^mr4tn-F*EV@CQK&p|^?mHv7R_0IZ<-t5>fe zyzc|N#%nk{5D@tH>*4Ri-3tKw@+5oys1--%Z%3`bG#?wa!p{8X>tF$HSq5fIn@`_% z*d4X!_wG3Yd&U%(<^}g0(Fgx|#XU!uEDHnoLlPhS`}{u+S)q9T<1Y>!kFyWneZ-2| z^OAc&E?O|sLDu-+%{L>Xo?go1x^S0$V-yrFSY^Z|_OWl^3=d^sV7(Pfo=C8lUb7^G z?B4J2o^4&jhwf)ldGA9ZK=3w>fdAdP9jYBtFXz8^O>s9qiAoQAE2*7zb4C1tuMBN$ z0NbkdiBn4_jwRSTK$i@9a{Zla<1-7HLKf!=Ti~N@wtuZuQ~!LebH@GR<6&I<1M*>^ zTCRcp`G#v(w~Ttm5-Rozry9NUS`Z|ZrRV-M49Kq{U%LG7=6}P#S)2d8|1AJ{IL>Z+ z{ER8GLJ+%;pOy+@1p^E60rSnr+f|hOOe5jDk7vU=?euStpU~=o&q34nzmGI^pL+=Y zZl1@#TQ9)B_g{#Ax0~?y;l^tZf$E=O|N7H1&IbF=D?oSt?{^%TT7+Xo^YJW7kIlg# zf{wBmzvl>dJSA3^Q)$OFRd(myN7$j0aP5E}30#>7swn2cg8xMy&?@4_TT&9PJwm*6XP*lS}nj)Z?sp~owp9pF7FhDNd?2^qjw*khTq5X zTeyzdzZ*cqPu6}S*5XmOw%G?>0qR98(019~PefY_3xDu#Fc!M+18N_z!2bS8v+TC9 zDHwxjQ{~}+wW$QzyC&l7y%W>dRr6wix&n6DiUO-9pgwnTohX-2gAw=U=?N6`3HGU{ zOeQmMIF8UPaf;h!P!fBMwfWdlM} zt(O7UOXfND93FePWsw~oTdF0_Ze_q-mWLxIyX?77o?y33j3-K93s=ECkEBBD*&R=b z;Xi9jC790>dG^mw0Ui8#>{zs#%GD+I$|u9>|Kb+AoNlzS&pbKB-aDCOUwqDR4mJ~V z30Ql+Vwmo+u@Agzcpbj3!`Cl;ahSp_v-iIF&@%gY=Ma0~6#M$m(%GGt{rn_*(J%6Y zC9Sd9%1&(yR&m+Wz>qw9{dAoD-L_B?aMbkKFfQ`ql*VQ36OWzrH625+sNRxT93 z@c;AnCjL<+Nt&R?L1tC&%+9rQ&;ASB2n0z^RqsqDh$<#84a%%^l4t~E z_Ri74C2sM!1Ofqp5FjoQNL&&Kg8PQx25|)-ZUF(}28sPXdq=!@@j?=r)t$fm86kh} z=H}++?&jv^ZpUHeHT(Vi|CObherAE6YI;I0=pjOI=GT4HjnP=)&|0+lG1}~dutHDmjOjYpaQdju{i#{c zQp}P(w2N|JF?Y&hgYrZl@J|b z!VmTfylPh^h}Fh|6DmUJ4@~w0!=M4`Uaw;IBfJvTvU47LS0j~^p(+Qdkf3Z%Zpxgb09i(FNvqePLu*@Y@JsT<{wKhFT8cW}{<)|9KJP}3n| zeHDgjc3tH4r}{`SF97K#A=Nex z24(tr=()3T4Tbmysr#kS{nOOpe{b5ZY#NE(Zf01&)zJgKUa~!hVF}b$AM$;Q#(@a5 zgGp+}N$6)i5*qpB-|IRva*^#)u;LKp5Vl5D@~Z-#a!q>X>8my((K}kr{8hfHImF3l zCVN&?DvXu2zxt8~%Nc41G?frOA;T=f&>UuiN)!2&IZoS`!nhHeD_`f6P5p|%Q|#h@ z^`Ax+3hgw^g=%P z>vRKk6%d6Nu*Rssz(W3xRj??A=J-FehUUYwu0yi{2JNJwdFaoaL-W@9j)rFN2*)>F z`dj|YTx1v3dHUeAYmjmKV8;#&ENwC9`h_+3syF}lZ(-Lg8ZrX+9rkXuq^ejooby3w zjN{7fO+L$#s;2DpXR7^&{SYkuR#URoa?F@+*7c?|%#Y$$jk{TpJ@bl7cp^qwnp*T9 zaNw7zuJ*-oU8dSxP>_#*CJ)CUU#7ZV0YwcyX>e|bwaXej_;T|<^eoK#!PE_@vxdK- zVLW^I$WbHmaFVXS>MGB=p4#qJAAh0F|3{bgQ$3&IaalN3bGR7ka%?Km%Y5QjAz4L3NORXH{(-6beoBx=lrj0?CB{w1Sw7F0HjAl98w(l1+c9e({BB_}s1CCq`zeyA9Cis;5Aov*4JZ|>_-k_Xcqht2QZ_-%fjwh3&n4Y={v%u;$0 zb+5dp3p?3%s;}_qLSHjS3Am+Il3QUw)$I!v>*qozugYT2OrJ-meCe)M8Pwk|mU^<( z<~wdY>KcNzTYa`&yE?QIv*b^s=5rim_17;@nMQ(iJ<^5MPYLQ==k3eDzMz)+k8mr9 zX$W#AFf1@CFjyt&D`Y-XCw}wy{dUN>;az@=L)}~oCB%HVRNeiJ`3{PT&Bs)dsb2mj zOYI%_wYqk|qdv}83x1oW)_t9++9!C2s#lw6P~GOmIYKRD>?!EVc5ROm(Kj+(xCT zd3ENlI!(Rc0F&G9X{v@~yu&UA=XGBV8j?41(6__mQyvD>jR8IJAvaGvb+JX}hF3Lw zm1f&DV?9{)m*`YvDSktHgzAa^ zu<6yG%e^$#$Bn%a`!R3C0Jr>jJfyoVSA2qpU+F-4tG42V(U*%uKDtUE)Qm6r z*aB81C_kM)Ev^ohd(beLM7s9$hB~kW@{_6RzwB)LsU{s_w;IxbQ|E+$up7V1QZF+z z)$NI1^DQH1mdlu6Qta=N3yd-)K%M?NzPVHlm@iCqMveK#SW?uK4Ln_NMiExcRQ+I~ z5MIEk)fi|?zcCWjlS~Y>kY01cH>Rwmsj~?bT>U0a0mYHqmNaz(6PQT~Q&A04S3+yg z9xznj*XT*LuEenj9`r?#X@^sf!UvhoQHXj9)E3YXw_af!?xp$_MN6=ZZ_wLQ{-0s2 z#F)Vb$Qe&^#cex-kNoF&^P~j!?amTa%j1nTx#`TaW1zXhvs$p*nPGgbTQ3PZ@v}}0 zdU^FQO%%0yW6lgjV>0pb*4hNppAEE=&hM)e2xZEKEQ>7uIVA-V{MO7Wqo~sF57g-u zAHw9LwxUv>C6Mp4^h#Chbq^duOuH9vCtxPhztM1Z{w7U<=x0pM87lOxNrt+(#fx6C zORLyOR1AXPO&mg4bPLqQZykeZ7Dr5k6#k;epoAr&{&$`DYK*(%fvrMjxU}Mt3G_a@ z=Shr3q~4eL(&ep?5qY=-&ExZ&(Kwk>cNV&OdE`gwZZ6dQZkj{z zOE8zU6zkK;-)E_t$Dm}+D799*6j|TbT5Dj698)kWqN5PWFD*rmiY=JqX0}55~tFyXbQFaxPGIwxE5XO8;x7nma;u zbJI>U^AQAqFZe?zHXa1W46By?rOVy{MiImVNX|T=4$A$4cW(QNj7&JBxD*+`3_Ut6 zz_Xk!9Py#8GJ67Y(X;Pu7yLI^s!u@F#>~J1X#cWxBi2HDg0>yYqCH`11y)FV!c{Jo zZ^ok9a6PA(&UttEzh$cP|05Oe>`hY#{>q(a37K|m1g|!UB8`f?ue+|F4^%^W`>O5OH${?*YD@?Mb2QI&;1p z=W}B~mYQC}4yuLQj$4K5akk5L83Q7rlaIE#ZJRUHVKVUKakmY#Gu&zH0?2rH3ENLc zD9}ZNQ-&RF8wsf*f4#cTp}tY3$Km$DpR3CyTnjVs*Tuoz@lW@R4BTQ6`70ct9{w#X zni(Iv~38z(MUUp8-sDe>^8)$$!`xqzOgVg4{ zzC5&}PCh{0-vzZLKG4Su`Fq}zck=4v)E~OOW8c0QotUXghj3`VSmaZG@`YOXeNsHf z8DlWFZ<_@*0uN5;-3kXg?88@W!R+Bk+qfO0V)A%jQe4MnnCYFF+i9~ zhpaVNpe*A+`04k#*3i^bu0jy3fVFy33C&oqPy2GLh{JmNB-*Z8?_$ylY-d-q2RWE# z-w zu1Br-Lofcbbyzz7kyS_?TMgCqD?@qVX1>#NA^nJ#+t0-~vG*ERbRp`)>C4`!wr05j zBp=H|))F@|wZrtI|3MaZFqB&)*=Hr}?W?HR2OHUc=%OJoHj6s;^T_GZ9d4-f=1%Bn z6{6=xF&DkU<536U7$O(5vL_ZqQl`D zGzZi&W5gF~{eRC=^EbM3`lq73TJO4`{8V(uG5f`15U9#Er5;#-b=9ygJn;cUF9oO&J36KS%& zhgV}e(e3JZArsqt`!3Zvn{S%WS<;z$2*)7ddbH)-&U$v2V;F0vMDhS}N9~UjR_yZV;*O$wy@UrS z&Yb_A0**b{hD9L&k3i+MokG4JjZ?bp9G;$!R;LfpN`frNc!n?xh^ZbY*4c1H!-3w& zydgy+{$_yM@q_3)=B*dq8vJY=)`d>RW8sfjpTCBL^s?~c;1V|j@Snx4w>C=wZ_SUnJ#Ml)6G8Y zgioO6Lsye^`L*XU6$Q_6Zpl<{{uUIg^%ZbU&6gtqeLtb==##n8xI^N2GGPC*jLdN+ z){s1B;v&-LOngNGC!Pg?O%Fhz^YasG&{0r`bpgI^$_E8CamI^pzNe1$xSyNF2L_}X zhZj7QQ~MfyaSM0{o}cf+*v=dK_%ytqqt}iwqUy?654ZW)ohPJsI`M8@C40Nc<6M?! zXZsr$%KGd~euT1W_8#=f+-WX-66O-^Ec1%`g)?yqjl*viaM+N&5Q8P-UC43_wmmvk zj?};e5Eb4FqVAC>$JhNXYD2rO@+3&MMv7KfaF_^1oo@R~)5zcf>h=T=_kJDj5^dS< z?(@K;m$Yl!Re~mLo9?n5Jc>3XWgpLTN$1Y5YzyYQ;03T0HnrmuJ#LF7G-7ioiTPMf zoRiY3=FB>7yt`S=nQz|IZeOdpb#Q8Pqu^_7+tJ9^fBI$@Et@dCW?yd!5-iPTz95E!ywc3Bzi_=cG)d5eAFfX>OxLfcAmOJ&} zxm_Q$+_5p+n5U~WiePckoyPeO5I~#4V`_rnS~aIM;a&vhX5}*^R;*o}tr>2E7X~eJ zBPvFDR0G4`;~99CLvE0CDg1^y8^pEFInTK7y39TmXT1{5120r{z7olyD@^W;Ky^z? z?%Ph}sfIfVx0X42z7sSz-8T>px#$GRsg!#Mr_^+UXiu51t1{IIrYApB;yOWJwhHnX zLFYohx=t7qsKJJWbb+CpGS-_Z0Pr=Ed3;z=(eO@&xakxKCKdu18Xo@I~Yuq zGH7KC&UKvu>{+U}bmdBiUgA@Um9%|1_z=3qmTGr7F5M*3AVS?LbEUxiT+^l6B{%kN z2U&BZvpRX)c4J;g)iTG%52=}VzmBtV?S85T$A=&pe}BGf{qZ5jObuNk!9Fpv)EUwd z)9HYP0eualnEbCcmwW8@JdmowiFN1&(#2&5w*4mJ3b(K;1CK(GD5$h z)^H-|O3N@ICZ6qnmxvi=P{VSc3Hp_!Ch{y5W1Q4nS=uFPVn30Zb;6sMsi-jqzB*ay zN`?9PMVD$fdPUW-&e&_z>CIO+D?OvtJt|j$w=zuux{pA5Q=nhjqqmp2l4Hv;XKN}+ zPS8xT*)vd{6rxgB&TXMtdzE|bwk!)$R*zR>F_3!6K!QYANYAtW&^xjq2I$TL;UFgA z=yF#I%+JA;wc8snxiLZCWX-`gcE^xWIA4VS+lRW3?OfrpyU&?EMes1fh4A$$v>B7y zbt^k;%!&_c%snkC?QwX#WyKm^g>si7(wRW$uGOvtB<0(Yl8_{+)|sq(%Zyn`(H;xC zi$6FHL>b5QT|C^ETko^ic=Xfv4Eb|457?u`(t?^{$;3XiuC-$NaquzPShcAQG zCO%7;sbXt9o$lT?!;_#JoEf=>q!}C5D{Em0G&i?u-FA-^WLV$Ojz4GL5%V2Wxe7_bi8C5KIR!c5^Y8qA zw9YrQK&Qv~X^J~p1)$3y%~_)LIVXcT>?PQ8)5YmTX*Dn<8h>P}7r52{R&J~5oR!CM zvBig0B{1Pd4Y`+)q~Ri=BiAxACPG5U80I!fRn6;Z@I69?B&G`^5|YYNGaw<~`WI~W zT$kFMCl@m|pz?)Bos~PY-A|&$nWLg>q@h@%AIc_@8X>9ZgtZ$y1@IJueVJh|b5yL3 z9&F&3$gah)v9%tEh$FG`oG%v+K#4gg)^{5`bg(1w%sKQ$po~@Oo;rnaNrHIv)+c&Q z@{P3~!+{xh(X&-e+)r8?5#+OZ;Bs><c4?2DK%g@6Vv@wWPDCwQpcC=?ksgk{bAA>7CJN4oc%67 z4?t`1Miv`&2u=@>l;D0y%GpICDckp>ea?K75*m1SzrBG@rarT`5c_naLVcrt;DFUc z=cnChBTnLNok7e=o7V^%8ABrh=>y=8G{|p2<^5DW#`|wMd?9%2bnFy6@g@x(^u!-N zspd0SZYE=O`5=h4mL`KhxZ5nIf56>i@DF$i*8t-M0Zc%cwc#kD-W~MFybnXq*h4&Z zY!pHP-Rm(jV^Ak}b;S<3)}A8wUD8w*0ZnhOal5{QY>5-EY7S$&XEi#$!)1?ik?Lg( z`&BREOOA{R`wBMwh}DZ6F!oQ|aGTa;NU^h-%{+QObC#ki#9540n~%sE$c$j1zQL$> zEPV+d=N>ib5YH@oxm}(P~$1#L4nZYM4)dku)?{L+~YVg71_5qEOa;HAU-P{I{k1c1icCrzbqc370$9wBemCtC97Q4)2GbduZc90-Atr z1x)xb?WEbdgyhp`O7b=*AxjJC4uNh=Ujl=>`8zC7J1Xe{Lnqlbw^>QIKjD74tkPrg zZgG5+TbIxD$0f{6XEt%rog((YS;4Ej`eAAwlv{-RD0qqkTPB=I9^^B~VjD>Q)*@K+ z^6@II!)?RfSqVXqMgWDx8I^)e|73Gym@`%tS1v^$dZZ$(oEiXp60tRkfN@i z^-xV|IL}1}C{P^{;kjV_+4x20Jn~%F-D6(sq0ZTDUgI^t@-{qwf2tJK$3h>|mzgh% z)tpCcr1=a&6?$Yo`*-TDH{l&uaOT2Yul0)S>qh@ieZ>{~9?m%MILs;G1FM&| z;bV>pfiXbk$9+xf%~MVe@dqB@#F(LKF2K!k!gc$C_o4-kJ}wJhDm*$RYT^Yt^8APq z0S3cH894**l)zhEWPLv)h{wn8eV5IM3Jad8|Gda{){b z)}mcL^EK1viyrfd)1!C2U3(wZ;2ss>vtxlVun8EwJyc1Prx%=n4dMK3SblbKhB`{= zq`j}7F1^?jsI^UqqA()=yT2JwIDFJdrqnh;W`n>3QQAYk7vnx^fx6S=>C3P>YTg*H z9x3eP4n~?7H9S5(s&NSEMN|j|A%M4|de?*yWtIC7i~)ge)T&D!hAM~X9K3||ea#TF zd(ECtGtGF8c(?BeuW9A0-IqK=)$(KhT($C~UnYfhjNlS{M45;JLK@(z20vxn0~%Oj z91_AsM;*UxxBFL|g2{FK6IZ!N!ib)8VB~@Xw!n!QgRbrh;<026Vr(fy=sI&1BWC6` zJRPAb@O}qx@*yJHeGivXLqJkR8vTqT98>S9mbiedeuOcO%ayyXc(QODbOnFuB0(f^ zPjCIL6EsvkzG8{b^DCGQVhevkW>x$G0wLk5K;yitp3&LEM&%(MH?XMiePG28>%n2X zk!A*VJ$}`bDs*eZ0ZQ5;B2H0w>a~=GH?nY$g}c$(Yd-tLiZKPaH?1TJ*0$ULYfV=2 zv5&t-J5=ifPY!)X#G8ogUm_4g5!#Go?z z^JJ4f_nw9V4U@I_ze%$9VBl=CqdMT(njqj}O!Bkiv`{RdUPIUroE^`MpG? z%2#taheephoBt!Cg^X5}w>-n}Iy!z;-$Jt@)vPGEiaB&^AXX$Sb+V;AaZBG)f{Vf1 z$Q)bCx>6|W3$Q++5A1J%VR==xw>^&Ms+P3jCDq_MskeqOB2Zh;-yuNfQ({E(^0t#t z%iFvOB2g@pc9@z)AS9>&b?K|WgRW}7VehIP!4zGkq8HIq`s26|uoHJYm?cK5DfiI+ zsNmH$2wulD?NAL4-L((mN5?RTSIls&G9?~EHQ0jC2>w2Q$om`Io54e~(D3ehaKdV; z1)Ia>fZQIA56Jsr4oDCRq6KQT!V-bOIy3+iy*{G1-otDU^u`3egAI*rWDd6}|Is~< z+tj_kh2p_d931-d@K{|M?%TQW_$;`f&2;60SqM5ybU$d1Y)VBz?7k}nTRCiECdbJ|vNJdwQip+}t6Yh{81Ht=0w-~fLI1!{-*J1j5;s84_P zSBfau{2zCO!Vp_Z-+Vo2)5KX)&WLb7TxHP#d`0OS9FIfiP-DP$B%#L&z4Wauc&vCkrosVqk;f zT3n2s<+pey9BVi}ZF%D9J)A^l49hEE5XX^u3~?y-FNB_GeB$Y0|BUz=LgrI2T?Jkd z#>V{;Ff@fQx`HrP2j~xPAq;K(CD=1GUtN3R$;}_CZau*bt9&_CHow z6$#vhrv}pz`z=?Ud*R3s?TH(!DBvCljVpZj&*4|tMXO`1U`ofaw8 zN*DvgI$SsiFYvLe2JpcbIVi?>Km5#t2esY4M0m9%_>35W&slHq1@Qa=VRs-^&pkcy zFJd9wcnN{N`x5%v!wKC!QEw)8>yw$E^9T48AsQI35+XjFDx2I5bMt6*p|o3%9rs~3Wyebc6 zjrNU!dD)DQy}tpz)jidn7oHxfx!scn2KUR)9#Vt{>pTEzN!J`SZej5~sIX!l#wjcl$iMIKNm#39sK7nIS@)upeIpUl`s= zU4Ds`l5_Lbb~HIW?oY^&@qfZ-DrEIHg+M(rYxwtgEfGAv{K}KYWK}Y;TlW#*Fp>j9XKWsXpv4*u=Nq-8p4~D5 zHN$!%q`i5Ct}uQ-k`9^3uVzx&YtKN2OH_e(pgb~(l!qrHhtJVj>dNb+zM59yMX;~j z{L%Sv@{|zd>L}udd3${}eE2XkK$~iRZ4U+b{30mSrl1CYd~6r1OK&`O^Vr)}c2in9 zg@oZJ_pjEs`?|qR!d?u_%gG-;LLTc!XpKXty+=~aTShV^w3}m?&v@_o63rfv zi&<8G4`k_kwr)95L{|u+RfM56M3JlN-h%`6%o9ZlTDO+zoM2A9_wZ#E7(`C5$664< z2aKI{lBq_13yc6NU*F6>&%!8ClLHWJ6}<-2u&P{z`Kzxw7Vw$@G5VMRTCpf52A(w| zKNl3JnPa@xUuySwN_>VDYAvmMJfOXrFa}PS?w_WP@j_4!gG?1UNf zu$^%M{x%=B)RJQ7=+D$VDY1VPqkx$xBG7~CE(bg2p^@ImI>Z8JuPFz2xya% z_>^@=p0feJDJse(zTfxDMkpIpJHcBtJg@K@m|A}rfxG2Mx)z}c;w5Q}35>py-|tx7 zDHCdKi7R_m@CevSap9S*coT~G;dqJHNKw&=ph|o1hSiibMB0uaw_fGaYj8MmBPzq2lY9C7&6d0T8MhOQp z&xyn_5jK;`DXtCWsMNFR-XMWvoIR$wVzhRWz-{(lh8jE79dSIj2#*YZ!~r_S!D@sD znK#udcAQ1*ycjA)!=_8a1V#Xp1(uaVDs628EpkdWW12f9DV;Fu*jTO9wH8|V^*VI_ zqMIp@J6&Jui8Jhu)6pfHrl+Dep-XlWW6Tw!`925w4u`ZjahP1{iqg!7rof#E&M5nc zGdRPw<;EhB>b(7}dljZYq$+kqYSi3nOfWwjnBm?6`v&l&@EEwD8MtC}3jY$#6{%DB zuMlr&rW=h8jLwN+#>}o%;4F2M^+mfKeXz}dPMtR*BdwRN{%2w-hJufBsoitE{nhGAUR_iBT{c3!UfJd!KB91l9*irk2gB{sYQqIz?Ss#e z7pg>l&hO~xaCNRXU!D%e4q3IqU+W{rX+xV3j2W81rZSTcdZ1s6y1Q+N2DiQ4--n2) zJ7f%Wa7;P#lP}>O7f6+%(%=7kD^Coobr;bc8)K@E_@SO?W zK2>ET9%uBNR7 zraJ5%bJbl0mV}9zqh8y>eojzObJf=Qx_Wvp_`&KaL;6uU#cr;_R899Z#62aVF)UCa zR0_BiRU#Q_6cy?XfGvweV?@#p% z87iHF0YB963wgQ;V|ngYZ*LVo$Ww#s6b5qxP*S1Oa&3LQ`=-{JB+aaYqs#G4R5xy* zln-t^6<&HkGL&@2K$i&F@lH~cR(ks&t8UQhByZ_Tuli+AwSKX;2drp}qblJWxeuQc z^cp7SzC|P8^T5~+8R~Knyj#80`w4At`S1lX9GGZd0$KWYEgtgQHaSsxuEIiU*70q2 z{xC$@#$&~(ZLr#~9Nb#5!rL9+4V*3w1&#$Py$pG6bDRpI5mv-a%#!N%VuWeb${!A#MUM)p|p+hrs)s`jRfzGB5 zRX0|0!n`TN?>4&4D}&FPsMWnCUWYAg;xS;<<99-s#|8~SM1C3LDt(2D~mwDdwHB?)DrOtlfiK$lg-5h8Y|DqZRwn)wBc zw5!pqh?E^Ujv+xz&`*seXWWM$w1>o!euRLS;`p$Oc!$%z1~g{dvwe{ z;G8ucP(@4lJFt*2xCr3oxdUh9N8b8LGCd^D@RQ z?3zPpZWy84i1c#?6+G@IcjF(w%qtu+@_XYLLam;}e%vhm2&lZA5cNPt@YS-$HzcnI zDwMg5wW6(KS8|FleJ@?6mV^;CheJ8Mg^i0e5Ng{A13LxoX3gm?I8e{ImFV2$Sr=a} z6K8CnU^px|kCXFgEp5o7RcW;sc4tQWMX2!8-F};0j9$j?HNxmq$oq>=)$wYG;IalN zk0s~2VY$S-rna7kZnNkD1hoDFG?dWAZZyQnu>>dbt2l({_L-WqivDkE$Eo-si?Pb9 z#?##(IQ<}XS%1wEt1osFMlpq_9QaRdMBo8$ZmuB~*72j-zRFuTWLTb=Rn^Fop`;dO zO!iK(YFY(brtXASi6}W<%UJ(>mAALiznIszqHDD?EZEDGotdjeRMa90YVa(WhWBNe zL)Jl1x^cDFkg5h|iJoH??L1*fVC2kuv0=G5cg*)wRR;`F-R=PIB-o8$48c?F zH;&<`-E_8GwAPyXj+}rpp*>-P?18Nxf z`0%Ldn$vnzkDz?y6?hzCDK}RKRQf99{h9a9wOWoLQ~{op5{725IvN#dT}`)~yVh>d zt*h|3Y2Sb{G3HBU9euUIX$5VqO}3ZP#`v1`2Q}6l78ny4n#q)iz*v=hT}~JSj9cj% z5v+}7<*HNU(+bHZFb0_L*!#m;ukE$>%e*0z2ZC(=XG0cUXDZ6%&A-#fe=jz z5rzc@Hn8bdAQ=6Tm^T}}dTgbke00V%AAZi)qSW5aATNwkAhMP)Dp0Ev%mTHIk}go& z#NT0o!7cn95g6FY-yt2=lLi~ZTM*SH9{;@>a6t zC`&~JMvkK_-pu}>^DJHarMy(vyUZHU0JneeoT1~yVbf66&bvV|5C;BTAPih23<``0 z3^Xw%q{B;+^BQ3U(0K0jIU>U1xzl&#s}^M|?Y^1VRARr?;N)7_b_dsTaon;UJPQE> zcqTA>pT7eSSe0qaZ*I`L_CCFH!uSMQ1jd-n=Qyuv*yc^)vbuj;((ncePq$I_T7(3F z+Cx@u1=Tg2V_UXaGTk6VBNvDk7U<;Cs4I=$v@~%=_^r6uV36$G;q9%v;A9l2eLJuY z@=DPWWW+xw8>#ea|2q__U^!tJ5PAjdd9(~-L^+PJ(|Tr%#d5@UA-IQ8w}a-k z{&Hi9r;JpV(y#%o-{H0S@o#zz;k25kvpv{LG z!rmUe|9p5Zjy#P$1nqxx7x@-;0Pc4thrNA18-|M{U**wIIU@}9Z*CZucaQ9qcDh?m zFYQceRK32F{5VXiBF90M@aiS=k5+B`7C0f_E)&KCMz8UA@H*R&uGa1nV{qK51)LfM z{miy~Q4@FL)b{iqZ!fBDS=fl?z#$5)BDdwraoj)y=e+8D-tGhQilOJw{)1aBmHW}k z>iyo{QixpzW6L)qunR*i4l{vzydO6gC8H?q%^f$* zS7*KyM-M>BT7G~kc?(+{cp*F>^he)OYSPrj-PF#0#5J1l&=?0TL)DlA@Ihdk_3zHc zs`3LMwx_BBYs6?F73;1+rqN=kns~sQP9!$7S2Ew!Y@ot6`ti+{-PU8swsWtSmG(nNNFLX|%2)gL!ode!DF*QrU2>B(hTjVhC;lVIm{r29 zXDate#b%{(tFV)M=Fu4s@M`w4QPcksx+z>r7?{h7^!x0`_Icyi*i>*e_AzmRBNlP) zc)HK~Nx#0o8Ie8w`*gJ)PaElKZrOgzNupwZf|EpG4s@L064d685UM~Bb^7vt973M+ zf+b|?%6{&0r7;8ZzJowL-)|Q(BrKtXX();@Md**NlHaQd!}S7p5Jq+h+zW_HsQeu~ zM;N|H7`j9ly$ljQ>Z_(5^!8JcgVxN_axh`uczO^c>eWH-r|jYn{ zXO|O)9ka`&!``&SKD&OH!Zc4v2!aHTp*RH?2$o$3<7Cg_E{&5z#2H&koZ2eF@CL%z zM#9J@fty*E=~(r3pYOiYkFw&g%d65O-hOKTF>>-WGW)GhYS$5OZ`e1oi}Tc`quzAd zBh>a4zFuN=S2fkRlG#ViIO^@4JsfT?u-Ru7!wB7D5MJO{4acCnU`@-yombddGT>?c z_O*{Tu`hC9w96{SME1s)j=u}#kBM(Ef`-6(%2<@vALWXen>P%eHOxHy4R?UP^J_qU%7{EAM-hwed`x*MN!#5_0V7_1?MyaYMmJ0oANI(v`G zkzmyMGgQ?a^Y(-=z&r#Oy<_lP9+sC~h=m8IK;Vx*ip+o)2tyYMW0%QZO5HiM7yn!) zA46Bj`sh{W2wWqK07C1>ynrop>I*GAl*&+hk0Z27Huv70-Hb^Se_LbQ36my#d&g>r)9!ilgmDuH zm0vjv7KK=woun5h5=eR%1W6IeBnW0j;t0+)0YTupjZZ5dZ`Xto7rzgF<#i;wam!0w&9`85L;_MP)lyK{B>11E(D}fiMfM>?dBkbf_ zPI`@tE0t9gUTGOBGVS}?Df=CqyX>scO_3JBIP<&MqOqqxlm~Cmd)3G2xI3r4wmY-+ zXS}$~^WqF9^A(d!`^=4HV)*Ff&TK!rOX0RpO;!A&)w?S2#D0Hj+!^a;)#YXQ=Db9O z4pnue!Fc)5cK`JrB`hY)Np%l4c7_*>+zJOLu@9QbSsbK}Kg)}}(TO0yyoeh->$P9R zT?z@oWleWv=g+39W&x`SqZ&*U0<~MxrGW7+H7Z{rPu%$02D;++BC$FgMKbjDzkW=N@Xy6&SaN ziH7loO@*;A=c+wdpo-=WwQ$Gv94k{o^||U0ZP{G7XIznmdoC>4N_z-q;c6Ni%x`P- zZyWe6gj6VzZG=HWT(|!x{4FrBlfT1J!oYPve;5#29ux@Geg&H-Sldl=I!>BeH{y)w zGqAz7Fo&*sf0K}6Y5}~=rLJBD!KMZwDW|TQbBA2_QWvhG&jL4Cc}!sBCP?s63(FW@ zoIeb%4Zu@*%}cGzNWtlJI#a8!d3zu=D}P8qwwZSP8k!w!W|Lxo7)|`j+y~*fZ{})Z zuJA49(ryz*1%~cO33=9KT2#)mij&n)(J3=jXa$BtnyQRi0+dxeSgpqG4jfB0B6WE7 zi0lHoS{u)1G`zu9O7=k6x&22Kir+?Y#$fe6>ecnTL7#m&;Iphj1N!|%hMIi6TgG2} z^X-7X_QV<2yP>T+{qslQn6Q&4NuFJY19$)5+sk%VWa=xw zJm@lztK`!g@sp5OH_U1I=1t?Y4Rc}WmZeD{|Mc6iN+sUjN9uwZzE0jcf&Cj|hUs># z#))Y5Kc#S%b%2H*+^Jry1)~^Ie=oUAkxND=P0p0Onq&Uv`?R<~D#<u)cW*6yU<# za9p6A1hMj^lLxpZWMjpid)}U(!5bhKR|?@7dEy>+v~oZB^AY(lyNp&R9&=r2V1=Pw ztT0085AG$CWGzyU?|F^g@&m}OOC@FZ%}T@rq2fMJMu7mx4g-zfrN|Adh`NhWlSorb z3}(Lpf05BIL$$~hcZ|3~$ARl3o2%epRs8^Rx^|waXg!)2SDjkReZAH0MSO1w=aq|i z>UJUpEl(bpt(We%=oCm2FloPzZ4?p_QT5mhax%!b8 zPbBedYQt-9$vDvfg5b8|q)^@TqauY1|M{bFL-6jm)A$vOw1yLIFW@23FS2}dpf`xc$ z5B*|YR57|JBg4$5zgOB6Lzh^YEb~NSrrY!o)*h0$z$3yCp$a_~*edWPVc-?XO|kqZ z*&b57JT>lV@~rIKvZp9I?|@(Z66<{HQ|yBfArS-e)-!C@)K;x4yPm$>Zo@m_?JQg{ z9Y4pEfXX>O_)OswrrYW{KGQq|gG6H))GX{i#rY6Vln zWB(c1IqsiFiv}q9C?j@2Y-AVjJe9MtChX!b?OL zBf^in^rjV?TlxY$aPpOGmvvKz^`_OPSqKZA_@>qKSw5FHt# zR$`&?=#{+j<=oS=>Juba8&AgmOnIFB@+ZsVYd#B?Z1cMH5;UP5w1p)-gSGiJRJEC4 zg<$cgq6fl2?jt(hYi9DXs=yb zl%Xae8Wd*IgcqPbft)OQ<2?CaBP~KTsInB5b?brUkqW13e*@P--bhy0#`tr1-DI(4is`4;QUu^3gq7l&8yuvk^R^}CJdq9EJG5=m%ww z&x5N`H_3SSSa;_Fgk2qehj8w~PrbMV zQ8J6);iLM|1ycP&!l=Mth5Qy6TGSy~cB0hG_O4N5Cq=y`4Uw+bf=Ms%4=C3S}*QbZTx9U_*>1aVvoN;d$ekPG#s^ZL|O`kKn_v}BCW z^pv?chRt1?60g7->GaT8-ypmJF=#{{hFM-=P97F|HE$l}W`(dwV62+I z!>c=P)P!-qk!m&l2(`5-b9SMVpk+jeYU)WgUQh{>AB?k@{A3(H#qbGrt&>&?4Acmn zfb3R0(Qa1=caKlzx#Q~ML3(C|*0Xqz-h9rZs9;cbP7WS`!rRGEY~buMXk_+~jC6^A ztzJysnts!^OR2VnP*{hcx)0nF2Zp_#6n;cu#1n965+zh zI2?X9+2`^o>7!*y3S4!Sn*s-Y;wq2p0uhoCILT&M8x6H*vd`L@sAto_KAVaH&Hd5j z1jjz?2eCdP{XS8K1sPS8nNxg8D#|$=SahtSu!*NpGX4%{LzP`cX=Wu+RDyZrR07=@ zs%=V~@C>E#C?~NiaSgISt(@xY%ouS-PIum!m!?{sd7VcQ!Ly`8J4YB27yJFFC^NS$}s z_)>d^JzZ+=u&t~lf=a-si>%6}OBza@U9y*@!c8m{y)0#~2$Sy+gU#zWR_e2PB(Ib! zqsW7)u;%lPWS$oPHZkwzrGktESdyi+atEE(mmf9ZQJUcU~CAP2Q57U~P zl7OkRTnU&>Z9mXTvTcuYuAk+D}Oz%p))&FeWfMp6S{I!Z2V;QNSu^e-xs9whNOIa%^n_qqGvD zG+S6P$GQYr!^Vatvf9uj!kED56!|@srMRZ+FS5GybY>PpWj~nXGj^dbWfwY)g`+bF z0~%4}7vjD?;yi+%Zep=#t}pw?4s#shracH;;Euqk{(Gj>1PCMh;6czS^xeNK#q?*v zL_538M@7zDiRF`eHV?D1Mb#j+p)5`T;^~#4w!kdn4hf73jLl(6q@1-4S69n?@^a}} zMiLs1D5qtKuA7(Ph6t=7+%`CSrni+qFd9>C8o^#KjGMFH zFVwv*tE+u|Y!l*ohCW*^oMRE|3aw;ak!qcp_U?Bozgrf<{>KcC%AGYEN}@cfqvln>^80t9!Ro50ezE4^ zHul3R;o53}YX}4D2*Wjm+IsmdFc6a80%HP08<-NRC5#CS*2!;y+D8742#jvxZ*4PS z7?Agpy26wM)j75Zf}6l=8u#@U!5q*NdsW)w|4#U3RHKJ$p0^#03vKCoGjtmDzTLRQ z*$T&YY3<)xBkY~ONZPQKgXM#|0x!crt)7D;ki@QV?sIDC9T={cZr>(?ATZR(-=Q5M z2s`ELF47R!#G8V?xQ<>)&maAPa%kSMpnfDhmS-tpl!Mp_4DJ?u0;2*Wdzcc~M;H_s z1r&3(+ky*q9CIWZc4jFjOZ;dNCnvq+F~N0Qa0%2R{H>iyq8~hy>7!??~$&|n?!l1w?VCQ_Ss51Dtk<`WXk`D#fBf%w5i}APi zj2MMir>b;bU63{*9lR2#J(sdC2}1&-`tMhQ;SFKrt^9rmY)6_}{?C3X9liHEX4hPbsK1uffr1IqUjjFw#p_`UZE$ztdJCJ+OdSg95{Vc-mBL zS?Qy6TLz86x(Pv5!t0w3!kH2R$@tb#jOGryItmTz-bv)7S|Uf)R=0i>tNt<{FVy}Sr2mrAa$^;tgp z@ziDOeDUysW>+jY4|@_{*NEqvyat!r;jC|US7be0_{`&*`Zc<)^kP?Bf4VW&Z@5I? z9qaF-UeAZ>9y|f^KJKk1uQfHUOKbI#i`HS={;m!OLbwKk6LB2A9N!d2*0jlIb3~ zquO;7NJyE=3(!Hyn{Lifu9DYQj5ZrT|N zS|CaodjJY7agGmr8+zSWk77d&N*!L0aWE}}aZnwiT({bp6$t6xD22P#+ByAsG#o#29!mi9 z!~_}8fJ^TQW8?k>MPv$LZ0f%NdOa{;{62Vft9Upf;Z=Q9uYAwtU7Gaii=T6ZTM9APns!4D2Ed?^iwG=IkghR*P}c9t-7 z4tPH5tJc?BL;nL_lvX$EF%8|T$J{Z$!56>Xy|Dqxp7{CEJMy;};&gcqBgz66Y}|#m zy$*T49E)0Tu7ECEe~Gs%AC#Y}dOR8c;NPo7t%uRD%xuQ^V9q zi=b*Hj0%iA=kMTa zwn?khY-G<+EBF@*2e+YL>ao#Rp|XDoYLHaNq@7F(&-<4oLSSG%Ka<$AM1be-nIni) z`u?mDf)K4@p2!NqXtn%at&`w-5{JWR7+aFJ z?`F8pZ!s6+nO#-U=yNHLwG4VFao7TUGL+HkJ)G6nuwog2I~!rQh0Xb|N8yniWJlDC zH>6fui!A!K=tiUAbyckHHtG#}#4I6Xfn*B|tmAJ@V3<%v*As^8SyTKaFSUAyZ*(3! zKIC-()ldhoadSD(LKrXOdC)J?y2}M`xrt#tC%R#$?^AA7sP)Oy1MzFhmVT(V?!vOU zV;6*`X&2QsXnUWJ${z*?*rW^5h!dllOL5V&6ps=?nn5bm(wjTY#eB6bs#dtgXSe#7 zufz;yTo}Uc_}xyQ=_Dlj{Y^4Y-(TWuRoEvt0z+Y+<;}dmg-mW14hoD3)NV-%pjjSf zoMy8ee#Z=4FBs)3Cb@&RStcSdaEJWHCI(w1y5{OkJDz$k~{FZ?S2Q*&%24WB#I=V2@UK z;b8|CyPiFYYiS!HY-XQ9br0<^`|Lhj9~$$o&^Fp?<(WUUdymg{WU*l-#!YzKzd{?M zfQZ3^*LL>8*sIF+VFW>2u)8D9xoDECH9-ikw!n??P}_%iKHh2Lgk=lP7TxPJkA{vj zOr6WwfYL}xl3iXkF{)Z%Jlkh^Acpn9IW`CxA)^)s%nn!PgPA5tBIf*$h*MM1nC7pcP^A2aOFY;qpAf;ST-my zEHE-jFbmWs^LI#KM4&bWDJr%cb@_X%*a2PlpK=JDy8DRP$7_zV(Rnfh6wvP4aImWy z8FItAmciX23ofUNQn;QiGw~tj%Au}ev%T%}N_-|7*dA>=+Yk|`HOlWW)5ClCTiZ(* z-OoCE;PqSXYLB9Q#?MoD8V;}fGEZ1wO#gk5`RQ`Tm&ITNHD1OkIjn2<7#$Z5v)>LQ zUn=eX)ZrxU9vBPM{liZE{yO;*I6|tmql96Bfn)p~1WY<#W`NBFN1S^8Q*tFH`OOXN zc4V^Yyq8#0@HjELM5IF(Ejb!j@4L8{cXaXwRuMrJm`YAa10wQUV4#`5BLV}r_&Y2x zA~0~9DItMTfwB9N@_;ZVFw`Qy1qL3oA+pd1k6D`bS~_!u@d*S748-_b6Brg4e9DxF zz(6a1hjjRizk_e(E1*r&Pvx7aRvq`byFB7;AWS@_5FuoMAw)-x>p}$WMvH({t-VVX z>93*z9rTa+6WQrC@0bFu-7HE;GrBX9AquE0r?yiV4=f$UdxT}~y0xymK zyxUEimvbc@^RK~^z*zF66Y@k^dD(gGO5?SuprEw2pJtQO;V>(+l-|)9Ut>%T$Yj!I z?0CZ#)qhY{2JS4JPQhxUP_ZswMj2heo|4;P*Sa%lRMM?q=q5~zb!U9V@b)#*^pm<* zEFT(2c4Vo2^p~r;kFnuwN2V+m_H(N-XLV!=HMC3L3pOVP8v>o0-9R8_FCD8+&iI`m zCpMma6r4a95g0Au@6bfTsKC%<`6@6bFg%4RfvJSrLc*}XnEtzhDKUY;Mf@ER7+fsr zOThr_`PQ6=`hMWNx%D+R1+II7o9A(>Qns{T{-*(j-xa|u>umBsj7s=B(!58fZaW&) zd;v>0720jUgMW5GeOJLo5Tjy%`nU7?w=4Xn?clfQF2cZWA^JL@c7rgg!<+maZbtc! z%sVRB2Ar}iqZckfA3Sm2yw0Q^-ltw6S7#@#^t)VzolWgC288I3TZ9op+)C!}=p(|w zV@VgN#pJiZ;1l^RFbWv=N;!B@Kid~K5jS=6LJKC}SS!nG&j>>TBY?_p?QW(t#dkFo zE&5KUvPIuIE)lw=RPZ_L)=S~hoJ|eN$B7K!T z{C9aH1~ax7_xm4?QmuSo1hCby=@&SEBCb>Da1}xqKzip92IiwX>^5L)Y+=gafTBUT zE4NzV@4ob!b=>nau$12N8P@urfn?7eDnM+T{iUBNrRj_;f-w4o&9C zKJL@3!hLSrS(Pg_DirOw&1w#sqYmAnwS*xClp&uxB(ApB!X;n+d zB8Hxg4iG3OX&bIvHJeFWSl8OSE@x?T&iNhDHn`{U-vB)d9VD6oN9_`sK;-oHhe z2+9EaQDP4R;`IWWm9YXlAG7VnhgBKk!hFsaw_J;r)&iaLGdb4hIf`zI9-cc`e}AwS zC4y<6^zV;yqlT+8SynHxI_VsygEy0tCo3PPjkai|%y%6`;u zzi9x?cJiZy<5Orkz=ZVoY)_o zBB%sidXQDcPX*NM$Hp?bYbut>bQOMV&d2KZOxv=F_fIVaGDB6hV(TU2TAg{UyOgM- zr8HGwX-$k%`r@%}s=&f^;t3mj%t682m_b3wG@;;1%%p(21efYGwRnb&lz8&iS#g@; zsYfm1;%VcaBs#tz9_n&z;84XJh^Lm)VgEqZH?T`>A0@g-iz?-r&BLgl9rK z1YJAD#)Sn2PV;wEVE6)>>r3yCd69P*aHMBj8?8M!cI4{#3tz9VvPb58FZtA(SH4fP z^0G(de4jOPgd`0e%$>U`r^i}^Xg`)$Tb3i^@KMFz<6;38Kj4Q#QUC5|Y9vSJnv3SC zx$#Bw^dEWAd~z|ak?gq&uE&}v9Bk%L_QbwdJ_NAGH46Mb`HEb=BxCQg2+|ei{X{){ z1$h}Z?Dtu0d$D@`78Z;g1lP_UA$v$Zus&GLe(n3V=+E(XEdrx4*Ag-@5EX1U2m`kT z-X~7DO%7F!ujw|42YQ(^h;%SrVBmq|(H#yE{pz*paESO<%p1aY^u9o?g}*}rV* zSx)l83s^F+P|8=Zd@+1-^77T$cfRc6oc#QJb)9ua7BNRmhl`mnL(OgTrBZ*ebY{pD z2&-ld5BX3f$lueJiYn`()fQ5vEny9&x^=zHy2Mmj$FIvsOGIFJxzHsrx>8zEO&Aua zts`J&YuvN2bCidgNQ}z|u{$ZCTFA12m@p{7&5^Jb!M4YrWkN-ePu#17Z zulN6{31)+A%dE5ije`1RogMbJcD2xj*{tO-^9f`$s zo~@Ylfjmn>wD%|QFbT=k59MhRhU&>5#N(v$4di)fvt!I?Q##?fUA*97*2&9=SbARQ zd=E`A`K}Jz8K|1wIAJrhbm6HE*q0loCUN6~afHc{@Ky&$E>1OOkt6eD7FjpVYzWkc zjM16AFM=srMeSS4#7}SL#5MWEFEg!)Br*NcG^05QRqQ8$fqD{{OUvDhX@1j)HvTOpL)@#OQb*qq@}Z*g|kC zGHr(Y#$)paV2c6|=-w?<3e@%p{(Xc|Kqxu-rdvHK^$U|=&=Da7)A67yuO?{wnL8{n zB2YUZSOmrdMh-JYJK6y!nrApUaesz8CxSGYMt}?Om*5~+B&E11*8j+L2$5Zy6nKa9# zXX@EAVdTTiE--LfS|uZT>|+}uzypcDBvc9vT>iN|^K8x^wP(hM(KFgrQWyb@kD1E3EQ*d3+>?+R=sUYi>KWUetUzL_QS;*m0&8U?8{7I^5eFpr&FZ%vwxFIz&k zxzX|M`g2S1aC~ViGv-G}`Z8X=i8@KGm}ii>cD9f@YrdUS*8!%UR9h6gXK1t&?wZA% zoA1P%;hImKn%~jlrB>B~4HmNbewq6p%5Al0(uo2ifC5e@Y>Hf$;=D;&+p`5$XQ#mOirpS~ z;b`3Kg+}8J>Wzynv^S2MEWK&^E$%TPtHYh2X4#wK{5UVZggZY~RTzXjKeUtHkdxj$ z6$ZU;b$S;qveWC3^oenD9be|#sdao?6erg4<-{V3$@U({bt{f2C#jDX8Kkb$_wYv+ z+exKQtIk^8%V>I>R_CY1c4D0$m&K`detN&yAlLa}idZLJIz(ad5`*6J`d0AO5<9&P zR?Lo*>-bV-r`GXpLY!E~m(@Xc)@nlPD+j5Ef(EIRb$#>n($u6TDfQ*4NKeYSI(1W$ z@=i_Fw4|KND_xtKl&_3U53}isXGf-0`eCIrwr62y6GQSZDHoDwzTtmCfqETdrej-qtgrZjbx^v6?_8tG_Wz3BnsAw|sIS)&! ztNbZ!OB<`)HI*Axz!(B9)GshNh4piWOFU(|T;(@a;KigljC?2~Fg#U$3k*)<@8ER8 zu)wImP$^TQ0>hf*7Z{u==>h|@_&YdTQUpfk@wYagFj7t!T0j`Ako3ibQGuZ){2g0L z7^#%sRfM7C0#~qAa?ZJQg`crv>*=YfRm(?#fpzkGJu@Om;tD?kkTOqb1JeVwgh7E( z{rCUR+nc~!QC<1|b?-d~oDy%+>2&&KI!R1t=uW=_8iKE1zZ`=XB`ThWBr)Bc<{;oe z5KfSgq|==)1r_H~5plwD#tDxI3J6-rAP8zH4uB}-z@UPZ2!e|G|NZt}>)w6qo-0Ru zpMSw!r+!uYyVu&gcI}$0?lb9U(Z+LVgL!7$*xG{}Pv)B`3utQ#%@kvUN6ZvsV`HO5 zoRTi4^_Q6Om9)X*jK{gTrtY@8fumDgeO@y?_Zjb7LMCrNh@HInNfTRa;xsmV3URjI zR}kE8Tl{4+w4Gniql@rq0yWrf?ptyX>v4bVxL!Zj*B{|MPeb{#&cQ?4di|t*;xJq` zK4r|zASmgXd8TZl79z!G7YIjb1+fJLq4xwRsX-p_!ic8i2B9~##(oe zAJ)vU+qs5syjpv212^57j^^%raAEhc4ek4Lb(exkIdMDtqSa=dT1V@@WP)8!8z!`| zwQn$d=TVWJ_qco4GfX~jGJRxhYHYa0AGCwIg=QP(7`dO8_+rTx&htATb}$qOj$EFF*f*+QzC0W;&^Io?0*B};hEn+ zo}cOFt}AEe>O47v>wMSDXYU0E2{r_IXY3tqoB zPg{@lwlbyv0MqpH7SGBZKKO`1N3{(eazwv=eDzHKK}Yl(+~!@o0bh-<)Ny0Rth=d}?(rTzc_5Q9OPN$GGs(k}GHDj_Od?&1NMb z4JzYdr0mhpOK0cotxtHL{rx%jQ`z(G&mHbX_oHOjJ&@bWSGJ#j5J#ux0dl9p`q*~{ zdDD?cH{ZCOaX)GzU26*P0TN<52JVxjFkeZ10J=xduLc{SmM(pT1r;H-{U@JAe8*VTJiGwl9tBm$vAd?8=J!7{nMR3 zB|Z1SoU?qeLOuLouJf0SpW?y^5@r?}TQfE?Ha0ea<(l)r{M=92Pw*?%`hYsVXzp|w z-mdw%zI^4LNEXW<{eZ0V~MzZE)a(jC|*Q5ILKAexZlk>mH zmFGfQKlmnAp~3i=6FZJ;7UWJCHgps}D7qf=SPM|j2(wtDz3rvMP7I*Jq4H1M#d(WV>}m3p>IA@ zbIC&pdAxT8Q>WLObl1}+w7K{$+OS3&!Q#LNUpd36eVj3n2LYdX$R79LDeH}Vq{+X} zBsMmj#qq@0a5l&N`)N~S!v{DX&S62dyY}vWIM=7&SiH)tm$!8xb`5x+rg!}#`0^W; z8=H!`*OMo`Gw(m^avP`@M*8`xUVZxWg=D`vZTPrT?H9JZTch0J=0g@o9e-Rud;iU* zg}FX(fp2r8PH$Vx3R#5+z3>?pyh{$tBd(3!?vK$T4)xw_cgFjvdf{bYqt6)E-+ZKU z?qa0CVrv`ZUAPdRLgwv0of15Xx5ebTU@t7p4bLQed0}p3X43pcIlKv{Q+AIm!eWS? zGnKoV1&G(M0P-oXI(2c?BTm8ZX2FxSTqvKq#&;nj@54tvq1x|9Z0N2SkG(n9R6Wi^ zj~vDikPY{4UX*KJ2KOJ-h&V32RrSD;3gzqwW z`+FsVB{_4$`L#iFE3#e!N?}guYJh*!N_w5Wj-)HSyMfe2V zM7bPMcn>lFeLKVK^AO_k0rNz^hoz;#jLG`O!%ese4GIJ2I1>$aRE@SJAbH zc^(4@Uu0In%d`nBwtQp8o<7vn3`%~+$dTCIAdKGF-b+UIVG7(8+kONuk92#Nm>ge0 zE?qWU4?meJACuj5EqSubHt(q?bM%+l#!Yw%rA{|7$mn%r-=GcNWWdf#tv-a8v8Q1# z3AZ|T6!Z#)m2LsyB`IyV-PjLdbLpAiLLR*}lR+a+;;V^t$77_oMi;dyc9+?2GVkcD zZy~36BCJiT)DSDwO|mCdLkFI|izEvE5!Q=ZNpHD(;1zLu|yp6<

  • (J*`xNiNr*X8>G5?;Y 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 z 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

    |BU1Kf^yBrIHLZIu^o5B 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 Date: Wed, 6 Jun 2018 12:08:59 -0400 Subject: [PATCH 016/199] Fix the logic of error detecting. --- example_file/methane_butane/in.conf | 23 ++++++++++++------- example_file/methane_pentane/in.conf | 10 ++++----- example_file/perfluorobutane_butane/in.conf | 25 ++++++++++++++------- src/MoleculeExchange1.h | 2 +- src/MoleculeExchange2.h | 4 ++-- src/MoleculeExchange3.h | 2 +- 6 files changed, 41 insertions(+), 25 deletions(-) diff --git a/example_file/methane_butane/in.conf b/example_file/methane_butane/in.conf index 5b3136e0c..fa0bd502e 100644 --- a/example_file/methane_butane/in.conf +++ b/example_file/methane_butane/in.conf @@ -86,28 +86,35 @@ DisFreq 0.20 RotFreq 0.10 SwapFreq 0.30 RegrowthFreq 0.10 -IDSwitchFreq 0.30 +MEMC-1Freq 0.30 ############################### # MEMC PARAMETER ############################### -CavityLength 8.8 8.8 11.8 -Exchange C1A 2 -Exchange C4A 1 +ExchangeVolumeDim 8.8 8.8 11.8 +ExchangeRatio 2 +ExchangeLargeKind C4A +ExchangeSmallKind C1A +LargeKindBackBone C1 C4 ################################ # BOX DIMENSION #, X, Y, Z ################################ -BoxDim 0 25.00 25.00 25.00 -BoxDim 1 35.00 35.00 35.00 +CellBasisVector1 0 30.0 0.0 0.0 +CellBasisVector2 0 0.0 30.0 0.0 +CellBasisVector3 0 0.0 0.0 30.0 + +CellBasisVector1 1 35.0 0.0 0.0 +CellBasisVector2 1 0.0 35.0 0.0 +CellBasisVector3 1 0.0 0.0 35.0 ############################## # CBMC TRIALS ############################## -CBMC_First 10 -CBMC_Nth 8 +CBMC_First 8 +CBMC_Nth 6 CBMC_Ang 100 CBMC_Dih 100 diff --git a/example_file/methane_pentane/in.conf b/example_file/methane_pentane/in.conf index 2c68f9322..9bd25a41b 100644 --- a/example_file/methane_pentane/in.conf +++ b/example_file/methane_pentane/in.conf @@ -95,18 +95,18 @@ ExchangeVolumeDim 8.8 8.8 13.0 ExchangeRatio 2 ExchangeLargeKind C5A ExchangeSmallKind C1A -LargeKindBackBone C1 C1 +LargeKindBackBone C3 C5 ################################ # BOX DIMENSION #, X, Y, Z ################################ CellBasisVector1 0 30.0 0.0 0.0 -CellBasisVector1 0 0.0 30.0 0.0 -CellBasisVector1 0 0.0 0.0 30.0 +CellBasisVector2 0 0.0 30.0 0.0 +CellBasisVector3 0 0.0 0.0 30.0 CellBasisVector1 1 35.0 0.0 0.0 -CellBasisVector1 1 0.0 35.0 0.0 -CellBasisVector1 1 0.0 0.0 35.0 +CellBasisVector2 1 0.0 35.0 0.0 +CellBasisVector3 1 0.0 0.0 35.0 ############################## diff --git a/example_file/perfluorobutane_butane/in.conf b/example_file/perfluorobutane_butane/in.conf index b446a2cf3..8e8dc716f 100644 --- a/example_file/perfluorobutane_butane/in.conf +++ b/example_file/perfluorobutane_butane/in.conf @@ -86,27 +86,36 @@ DisFreq 0.20 RotFreq 0.10 SwapFreq 0.30 RegrowthFreq 0.10 -IDSwitchFreq 0.30 +MEMC-1Freq 0.30 ########################### # MEMC PARAMETERS ########################### -CavityLength 5.0 5.0 5.0 -Exchange FA4 1 -Exchange C4A 1 +ExchangeVolumeDim 8.0 8.0 10.0 +ExchangeRatio 1 +ExchangeLargeKind FA4 +ExchangeSmallKind C4A +LargeKindBackBone C1 C4 + + ################################ # BOX DIMENSION #, X, Y, Z ################################ -BoxDim 0 30.00 30.00 30.00 -BoxDim 1 35.00 35.00 35.00 +CellBasisVector1 0 30.0 0.0 0.0 +CellBasisVector2 0 0.0 30.0 0.0 +CellBasisVector3 0 0.0 0.0 30.0 + +CellBasisVector1 1 35.0 0.0 0.0 +CellBasisVector2 1 0.0 35.0 0.0 +CellBasisVector3 1 0.0 0.0 35.0 ############################## # CBMC TRIALS ############################## -CBMC_First 10 -CBMC_Nth 8 +CBMC_First 8 +CBMC_Nth 6 CBMC_Ang 100 CBMC_Dih 100 diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index fa3faa3d5..8ecc561ea 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -67,7 +67,7 @@ class MoleculeExchange1 : public MoveBase if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] = i; } - else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ largeBB[1] = i; } } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index c50216673..c81093311 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -69,7 +69,7 @@ class MoleculeExchange2 : public MoveBase if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] = i; } - else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ largeBB[1] = i; } } @@ -88,7 +88,7 @@ class MoleculeExchange2 : public MoveBase if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { smallBB[0] = i; } - else if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ + if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ smallBB[1] = i; } } diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 8527b4948..140edbaac 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -69,7 +69,7 @@ class MoleculeExchange3 : public MoveBase if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] = i; } - else if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ largeBB[1] = i; } } From c6db525e49a25c7d8e8ce31294a49e4581e29455 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 13:57:46 -0400 Subject: [PATCH 017/199] Fix getting correct atom number for COM and backbone. --- src/MoleculeExchange1.h | 4 +++- src/MoleculeExchange2.h | 12 ++++++++---- src/MoleculeExchange3.h | 5 +++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 8ecc561ea..3422177e0 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -237,7 +237,9 @@ inline uint MoleculeExchange1::ReplaceMolecule() } else { - SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); + uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; + uint end = molRef.MolStart(molIndexA[0]) + largeBB[1]; + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); } //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index c81093311..3a35266bc 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -197,8 +197,10 @@ inline uint MoleculeExchange2::PickMolInCav() SetBasis(cavA, prng.RandomUnitVect()); } else - { - SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(smallBB[0], smallBB[1]), sourceBox)); + { + uint start = molRef.MolStart(pickedS) + smallBB[0]; + uint end = molRef.MolStart(pickedS) + smallBB[1]; + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); } //Calculate inverse matrix for cav here Inv = transpose TransposeMatrix(invCavA, cavA); @@ -269,8 +271,10 @@ inline uint MoleculeExchange2::ReplaceMolecule() SetBasis(cavA, prng.RandomUnitVect()); } else - { - SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(largeBB[0], largeBB[1]), sourceBox)); + { + uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; + uint end = molRef.MolStart(molIndexA[0]) + largeBB[1]; + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); } //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 140edbaac..5b7f1bdb9 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -244,8 +244,9 @@ inline uint MoleculeExchange3::ReplaceMolecule() SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); - //use the first atom in molecule as the center - center = coordCurrRef.Get(largeBB[0]); + //use the first atom in molecule as the center + uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; + center = coordCurrRef.Get(start); //find how many of KindS exist in this center calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, kindS, exchangeRatio); From d384ba5fd0ae09005817e9bf289fa539d97f4581 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 16:50:23 -0400 Subject: [PATCH 018/199] Wrap DCSingle oldMol. --- src/cbmc/DCSingle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cbmc/DCSingle.cpp b/src/cbmc/DCSingle.cpp index 355765919..992c67e6d 100644 --- a/src/cbmc/DCSingle.cpp +++ b/src/cbmc/DCSingle.cpp @@ -39,7 +39,7 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) } else { prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); } - positions.Set(0, oldMol.AtomPosition(atom)); + positions.Set(0, data->axes.WrapPBC(oldMol.AtomPosition(atom), oldMol.GetBox())); data->calc.ParticleInter(inter, real, positions, atom, molIndex, oldMol.GetBox(), nLJTrials); From 5e09d9eb2b68b5586a9cd7e3f61995855f1376cf Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 16:54:25 -0400 Subject: [PATCH 019/199] Update example file --- example_file/methane_pentane/in.conf | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/example_file/methane_pentane/in.conf b/example_file/methane_pentane/in.conf index 9bd25a41b..be75bbefb 100644 --- a/example_file/methane_pentane/in.conf +++ b/example_file/methane_pentane/in.conf @@ -86,16 +86,17 @@ DisFreq 0.20 RotFreq 0.10 SwapFreq 0.30 RegrowthFreq 0.10 -MEMC-1Freq 0.30 +MEMC-3Freq 0.30 -################################ -# MEMC PARAMETER -################################ +################################ +# MEMC PARAMETER +################################ ExchangeVolumeDim 8.8 8.8 13.0 -ExchangeRatio 2 +ExchangeRatio 1 ExchangeLargeKind C5A ExchangeSmallKind C1A -LargeKindBackBone C3 C5 +LargeKindBackBone C3 C3 +SmallKindBackBone C1 C1 ################################ # BOX DIMENSION #, X, Y, Z From 0d862fc30e2ce68a7b5be9d43e1d87673bab7231 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 6 Jun 2018 18:40:18 -0400 Subject: [PATCH 020/199] Add backbone info to TrialMol.h --- src/MoleculeExchange1.h | 4 ++++ src/MoleculeExchange2.h | 18 +++++++++++++----- src/cbmc/TrialMol.cpp | 6 ++++++ src/cbmc/TrialMol.h | 3 +++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 3422177e0..51e7b6544 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -398,6 +398,8 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) { //Inserting Lmol from destBox to the center of cavity in sourceBox newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); //perform rotational trial move in destBox for L oldMol oldMolB[n].SetSeed(false, false, false); } @@ -425,6 +427,8 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) newMolA[n].SetSeed(false, false, false); //perform rotational trial move on COM for L oldMol oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolA[n].SetBackBone(largeBB); } } } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 3a35266bc..eece96e02 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -431,7 +431,9 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) if(insertL) { //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); //perform rotational trial move in destBox for L oldMol oldMolB[n].SetSeed(false, false, false); } @@ -439,8 +441,10 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) { if(n == 0) { - //Inserting Smol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); + //Inserting Small from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of small molecule to be inserted + newMolB[n].SetBackBone(smallBB); } else { @@ -461,7 +465,9 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) if(n == 0) { //perform trial move in cavity with fix COM for S oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of small molecule to be deleted + oldMolA[n].SetBackBone(smallBB); } else { @@ -474,7 +480,9 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) //Inserting L mol from sourceBox to destBox newMolA[n].SetSeed(false, false, false); //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolA[n].SetBackBone(largeBB); } } } diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 8e39f639c..2a183a07d 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -293,6 +293,12 @@ void TrialMol::SetSeed(const bool inCav, const bool fixCOM, const bool rotBB) comFix = fixCOM; rotateBB = rotBB; } + +void TrialMol::SetBackBone(const uint bb[2]) +{ + backbone[0] = bb[0]; + backbone[1] = bb[1]; +} XYZ TrialMol::GetCOM() { diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index bc99565e0..a1dfdf553 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -168,6 +168,7 @@ class TrialMol void SetSeed(const XYZ& coords, const XYZ& cav, const bool inCav, const bool fixCOM, const bool rotBB); void SetSeed(const bool inCav, const bool fixCOM, const bool rotBB); + void SetBackBone(const uint bb[2]); XYZ Transform(const XYZ& a) {return geom::Transform(cavMatrix, a);} void TransposeMatrix(XYZArray &invMatrix) {return geom::TransposeMatrix(invMatrix, cavMatrix);} @@ -179,6 +180,7 @@ class TrialMol XYZ GetCavity() const {return cavity;} //return unwrap com of tcoords so tcoords must be set XYZ GetCOM(); + uint GetAtomBB(const uint i) const { return backbone[i];} ~TrialMol(); @@ -195,6 +197,7 @@ class TrialMol RotationMatrix worldToGrowth; XYZ basisPoint; XYZ cavityCenter, cavity; //The center and cavity dimensions + uint backbone[2]; bool comInCav, comFix, rotateBB; bool* atomBuilt; From 500ab7550e222f5b638f7b9f9e31f5b2b84de3ff Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 7 Jun 2018 10:57:42 -0400 Subject: [PATCH 021/199] Use atom Backbone for rotation. Has segfault --- example_file/methane_pentane/GOMC_CPU_GCMC | Bin 2409892 -> 0 bytes example_file/methane_pentane/in.conf | 4 +- src/cbmc/DCGraph.cpp | 62 ++++++++++++--------- src/cbmc/DCLinear.cpp | 10 ++-- src/cbmc/DCRotateCOM.cpp | 37 +++++------- src/cbmc/DCRotateCOM.h | 3 +- 6 files changed, 61 insertions(+), 55 deletions(-) delete mode 100755 example_file/methane_pentane/GOMC_CPU_GCMC diff --git a/example_file/methane_pentane/GOMC_CPU_GCMC b/example_file/methane_pentane/GOMC_CPU_GCMC deleted file mode 100755 index 02e807df724faee3860acd0844d887bb3cf4303a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2409892 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

    VUhq#pd76HlHxO1_f`wm$LLfv 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

    8WePMi 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

    kx5W84 ztif-{=qXF#kVeXgye11D7cP)F#dR@mFt$^w3X#)f=i`vl_i_JAJbn&%PP)SM=VP@b zCXm72I9WCu@vw{)cjVPb@G`i6`6X#nF6B_nk%AIQ?~B(d+CI%y$O(rzeEMrEr;)RT zNirgSR?BVNzg-uN^`{hdaY*B3)U{9+P8ANSi!oODe#elh9qt)fS^sb@d*M@AxIswC zoZ|Ijes&K_VH5hTloSr>5*hQim-*xTlpLpc{^@$Ac~%K!Q9*q|m&=&vCRx~0NXeYy zdE(DOIKY_g1_HHZxn+Dxmi!7;E6IEChs|4fCk=wCfkqW}L0=WEV79Hn2d8#+beICct8 z=!pD)-(!z{J7J2J;)KI^TtnT>{|^trPssT5>%yAuM?9tG)zI_?`W)Y|F0SeA2tI=3 zkavVr(s{C}bU^;`N-0I0;yxFT-%a8G&Y7}BWDJqfn>QmExELb%VKjfI>K7##X%$i{gz5?oLEktLnw48$8UR@4!8CBpNRRk)1Ajhcp+ z3FRf6m@nIP)*MR#XPS(+=KS?9>f*h^@V5fOk#Q1SpE^-ATV2UhWE?JSM-YBe#(sKE z`!}2=XQgIyWT0}AE8uU{m0acGTqPST^F?q89MV%V+V!$5r0FS{)3@q6H_peoS~i{x zM(L!kXC$cWRawaOL`voq*TopdS@#s#@no`(`pHs=@&faZ*EFmu+%4fmlx>vsrFzZ~ zaJXsshq|~=xwYh+bgabda@b_&BHop_R8yyva;nSgqG{MtC>sTWcsX%jx+V_b(3iH8 z(LWM<5!^t~m$)$Vl^ko}NZheJ55235BK)%Cq5l_8vTjpV%n66VW<(BQhm3DW%|dh) zShrOOK3PiE?G*{ujkhAgFC@Nm-DsW@4rBQN)$ab;L~T5gn%66b)p3OPVG#VfMR=yr zP{OHG_QQqxXH_Mx&X~;GE zL2di4=j(^-_cea3`u~m32RPq5?a)puA+LN6fqx8@na*b%`k~vuDSi(u8EtXcn@`CO z-{%iMFDKfkt2N~i=Q#0CrEo6iXbW=)RmdgDSMqaS?!-=#-A)dN7NQ@5lWlT-eMEvo za=Pr$@1${VsiCuBlUZqa#7tKp( z>YrZYy~h$VN8XS6ct%czdDpsWJkK-<=4nSHr%*MHRF~lL!0BNL2Eb$UX!RbGSRMuZ z)9j5U9y(5u_1c`󼛣zzBxr%>sizzwn~3l)-)BiU717lo75qWd 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%0AFZ|K~ahvS0@frB}y`<2zGP)`dqb+#G`Z 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

  • (J*`xNiNr*X8>G5?;Y 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 z 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

    |BU1Kf^yBrIHLZIu^o5B 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 - idExchange = new DCRotateCOM(&data); + idExchange = new DCRotateCOM(&data, setupKind); std::vector atomToNode(setupKind.atoms.size(), 0); std::vector bondCount(setupKind.atoms.size(), 0); @@ -350,20 +350,26 @@ void DCGraph::BuildNew(TrialMol& newMol, uint molIndex) } void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) -{ - //Use node 0 because atom zero is in node zero - uint current = 0; +{ visited.assign(nodes.size(), false); - //Visiting the node - visited[current] = true; - //Copy the current node's focus coordinate - uint seedInx = nodes[current].atomIndex; - if(seedInx != 0) - { - std::cout << "In MEMC-3 move, atom 0 must be a node." - << "atom 0 must be bounded to two or more atoms! \n"; - exit(1); + //Use backbone atom to start the node + uint current = -1; + for(uint i = 0; i < nodes.size(); i++) { + if(nodes[i].atomIndex == oldMol.GetAtomBB(0)) { + current = i; + break; + } } + + if(current == -1) { + std::cout << "In MEMC-3 move, atom index "<< oldMol.GetAtomBB(0)<< + " must be a node." + << "This atom must be bounded to two or more atoms! \n"; + exit(1); + } + + //Visiting the node + visited[current] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareOld(oldMol, molIndex); @@ -405,19 +411,25 @@ void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) { - //Randomely pick a node to call DCFreeHedron on it - uint current = 0; - visited.assign(nodes.size(), false); - //Visiting the node + visited.assign(nodes.size(), false); + //Use backbone atom to start the node + uint current = -1; + for(uint i = 0; i < nodes.size(); i++) { + if(nodes[i].atomIndex == newMol.GetAtomBB(0)) { + current = i; + break; + } + } + + if(current == -1) { + std::cout << "In MEMC-3 move, atom index "<< newMol.GetAtomBB(0)<< + " must be a node." + << "This atom must be bounded to two or more atoms! \n"; + exit(1); + } + + //Visiting the node visited[current] = true; - //Copy the current node's focus coordinate - uint seedInx = nodes[current].atomIndex; - if(seedInx != 0) - { - std::cout << "In MEMC-3 move, atom 0 must be a node." - << "atom 0 must be bounded to two or more atoms! \n"; - exit(1); - } DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareNew(newMol, molIndex); diff --git a/src/cbmc/DCLinear.cpp b/src/cbmc/DCLinear.cpp index 3b982b3ee..0e82c8783 100644 --- a/src/cbmc/DCLinear.cpp +++ b/src/cbmc/DCLinear.cpp @@ -22,7 +22,7 @@ DCLinear::DCLinear(System& sys, const Forcefield& ff, uint size = kind.NumAtoms(); atomSize = size; - idExchange = new DCRotateCOM(&data); + idExchange = new DCRotateCOM(&data, setupKind); //First atom of the molecule forward.push_back(new DCSingle(&data, 0)); backward.push_back(new DCSingle(&data, size - 1)); @@ -114,8 +114,8 @@ void DCLinear::BuildNew(TrialMol& newMol, uint molIndex) void DCLinear::BuildGrowOld(TrialMol& oldMol, uint molIndex) { - //Need to find the atom to start growing - std::vector& comps = forward; + //If backbone is atom 0, we use forward, otherwise backward + std::vector& comps = oldMol.GetAtomBB(0) ? backward : forward; for(uint i = 0; i < comps.size(); ++i) { comps[i]->PrepareOld(oldMol, molIndex); @@ -125,8 +125,8 @@ void DCLinear::BuildGrowOld(TrialMol& oldMol, uint molIndex) void DCLinear::BuildGrowNew(TrialMol& newMol, uint molIndex) { - //Need to find the atom to start growing - std::vector& comps = forward; + //If backbone is atom 0, we use forward, otherwise backward + std::vector& comps = newMol.GetAtomBB(0) ? backward : forward; for(uint i = 0; i < comps.size(); ++i) { comps[i]->PrepareNew(newMol, molIndex); diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 1b9859641..65ac8d8fb 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -17,19 +17,27 @@ along with this program, also can be found at . This file is only called from MoleculeExchange and IntraMoleculeExchange file. This file depend on ensemble kind, swap the COM of small molecules with one large molecule. - - + +Molecule is allowed to have trial position in Box or trial position +in cavity (HasCav()), or no trial position (COMFix()). + +Molecule is allowed to have rotation around COM or around Z-axis */ namespace cbmc { - DCRotateCOM::DCRotateCOM(DCData* data) + DCRotateCOM::DCRotateCOM(DCData* data, const mol_setup::MolKind kind) : data(data) , rotateMatrix(3), invMatrix(3) { rotateMatrix.Set(0, 0.0, 0.0, 0.0); rotateMatrix.Set(1, 0.0, 0.0, 0.0); rotateMatrix.Set(2, 0.0, 0.0, 1.0); + atomNumber = kind.atoms.size(); + multiPosRotions = new XYZArray[atomNumber]; + for(uint i = 0; i < atomNumber; ++i) { + multiPosRotions[i] = XYZArray(data->totalTrials); + } } void DCRotateCOM::RandRotateZ() @@ -47,7 +55,6 @@ namespace cbmc void DCRotateCOM::PrepareNew(TrialMol& newMol, uint molIndex) { newMol.SetWeight(1.0); - atomNumber = newMol.GetCoords().Count(); //old center of mass oldCOM = newMol.GetCOM(); } @@ -86,7 +93,6 @@ namespace cbmc void DCRotateCOM::PrepareOld(TrialMol& oldMol, uint molIndex) { oldMol.SetWeight(1.0); - atomNumber = oldMol.GetCoords().Count(); //old center of mass oldCOM = oldMol.GetCOM(); COM = oldCOM; @@ -134,14 +140,7 @@ namespace cbmc std::fill_n(inter, totalTrials, 0.0); std::fill_n(real, totalTrials, 0.0); - std::fill_n(ljWeights, totalTrials, 0.0); - - XYZArray *multiPosRotions; - multiPosRotions = new XYZArray[atomNumber]; - for(uint i = 0; i < atomNumber; ++i) - { - multiPosRotions[i] = XYZArray(totalTrials); - } + std::fill_n(ljWeights, totalTrials, 0.0); if(atomNumber == 1) { @@ -160,7 +159,8 @@ namespace cbmc XYZ backBone; if(atomNumber != 1) { - backBone = newMol.GetCoords().Difference(0, atomNumber - 1); + backBone = newMol.GetCoords().Difference(newMol.GetAtomBB(0), + newMol.GetAtomBB(1)); } else { @@ -269,14 +269,7 @@ namespace cbmc std::fill_n(inter, totalTrials, 0.0); std::fill_n(real, totalTrials, 0.0); - std::fill_n(ljWeights, totalTrials, 0.0); - - XYZArray *multiPosRotions; - multiPosRotions = new XYZArray[atomNumber]; - for(uint i = 0; i < atomNumber; ++i) - { - multiPosRotions[i] = XYZArray(totalTrials); - } + std::fill_n(ljWeights, totalTrials, 0.0); if(atomNumber == 1) { diff --git a/src/cbmc/DCRotateCOM.h b/src/cbmc/DCRotateCOM.h index 259ac1354..79d25e5c9 100644 --- a/src/cbmc/DCRotateCOM.h +++ b/src/cbmc/DCRotateCOM.h @@ -19,7 +19,7 @@ namespace cbmc { class DCRotateCOM : public DCComponent { public: - DCRotateCOM(DCData* data); + DCRotateCOM(DCData* data, const mol_setup::MolKind kind); void PrepareNew(TrialMol& newMol, uint molIndex); void PrepareOld(TrialMol& oldMol, uint molIndex); void PickTransferCOMNew(TrialMol& newMol, uint molIndex); @@ -36,6 +36,7 @@ namespace cbmc { XYZArray rotateMatrix; //inverse of matrix XYZArray invMatrix; + XYZArray *multiPosRotions; uint atomNumber; }; } From d61b012da4a4a9471b04ef58a806927f262391ab Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 7 Jun 2018 11:54:58 -0400 Subject: [PATCH 022/199] Fix the segfault and reading atom in backbone in ME-3 method. --- example_file/methane_pentane/in.conf | 4 ++-- src/MoleculeExchange3.h | 8 ++++++-- src/cbmc/DCRotateCOM.cpp | 6 +----- src/cbmc/DCRotateCOM.h | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/example_file/methane_pentane/in.conf b/example_file/methane_pentane/in.conf index 5af834f9b..be75bbefb 100644 --- a/example_file/methane_pentane/in.conf +++ b/example_file/methane_pentane/in.conf @@ -86,7 +86,7 @@ DisFreq 0.20 RotFreq 0.10 SwapFreq 0.30 RegrowthFreq 0.10 -MEMC-1Freq 0.30 +MEMC-3Freq 0.30 ################################ # MEMC PARAMETER @@ -95,7 +95,7 @@ ExchangeVolumeDim 8.8 8.8 13.0 ExchangeRatio 1 ExchangeLargeKind C5A ExchangeSmallKind C1A -LargeKindBackBone C3 C5 +LargeKindBackBone C3 C3 SmallKindBackBone C1 C1 ################################ diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 5b7f1bdb9..e9083d969 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -398,7 +398,9 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) if(insertL) { //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the a otom of large molecule to be inserted in COM of cavity + newMolB[n].SetBackBone(largeBB); //perform rotational trial move in destBox for L oldMol oldMolB[n].SetSeed(false, false, false); } @@ -441,7 +443,9 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) //Inserting L mol from sourceBox to destBox newMolA[n].SetSeed(false, false, false); //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the atom of the large molecule to be inserted in COM + oldMolA[n].SetBackBone(largeBB); } } } diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 65ac8d8fb..91fc88800 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -248,9 +248,7 @@ namespace cbmc newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, 0.0)); - newMol.MultWeight(stepWeight / totalTrials); - - delete[] multiPosRotions; + newMol.MultWeight(stepWeight / totalTrials); } void DCRotateCOM::BuildOld(TrialMol& oldMol, uint molIndex) @@ -371,8 +369,6 @@ namespace cbmc oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(stepWeight / totalTrials); - - delete[] multiPosRotions; } } diff --git a/src/cbmc/DCRotateCOM.h b/src/cbmc/DCRotateCOM.h index 79d25e5c9..c154cfbd9 100644 --- a/src/cbmc/DCRotateCOM.h +++ b/src/cbmc/DCRotateCOM.h @@ -20,6 +20,7 @@ namespace cbmc { { public: DCRotateCOM(DCData* data, const mol_setup::MolKind kind); + ~DCRotateCOM() {delete[] multiPosRotions;} void PrepareNew(TrialMol& newMol, uint molIndex); void PrepareOld(TrialMol& oldMol, uint molIndex); void PickTransferCOMNew(TrialMol& newMol, uint molIndex); From f681fe0eb1b70f1d85ff985b42210a4866f4a3f4 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 7 Jun 2018 16:39:23 -0400 Subject: [PATCH 023/199] Fix allocating memory when one of the CBMC trials are zero --- src/cbmc/DCData.h | 9 +++++++-- src/cbmc/DCRotateCOM.cpp | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/cbmc/DCData.h b/src/cbmc/DCData.h index a22de18d9..36a5b7c65 100644 --- a/src/cbmc/DCData.h +++ b/src/cbmc/DCData.h @@ -40,7 +40,7 @@ class DCData const uint nDihTrials; const uint nLJTrialsFirst; const uint nLJTrialsNth; - const uint totalTrials; + uint totalTrials; //used for both angles and dihedrals double* angles; @@ -72,12 +72,17 @@ inline DCData::DCData(System& sys, const Forcefield& forcefield, const Setup& se nDihTrials(set.config.sys.cbmcTrials.bonded.dih), nLJTrialsFirst(set.config.sys.cbmcTrials.nonbonded.first), nLJTrialsNth(set.config.sys.cbmcTrials.nonbonded.nth), - positions(*multiPositions), totalTrials(nLJTrialsFirst * nLJTrialsNth) + positions(*multiPositions) { calcEwald = sys.GetEwald(); uint maxLJTrials = nLJTrialsFirst; if ( nLJTrialsNth > nLJTrialsFirst ) maxLJTrials = nLJTrialsNth; + + totalTrials = nLJTrialsFirst * nLJTrialsNth; + if(totalTrials == 0) + totalTrials = maxLJTrials; + for(uint i = 0; i < MAX_BONDS; ++i) { multiPositions[i] = XYZArray(maxLJTrials); } diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 91fc88800..77fca1817 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -35,6 +35,11 @@ namespace cbmc rotateMatrix.Set(2, 0.0, 0.0, 1.0); atomNumber = kind.atoms.size(); multiPosRotions = new XYZArray[atomNumber]; + + if(data->totalTrials < 1) { + std::cout << "Error: CBMC first or secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } for(uint i = 0; i < atomNumber; ++i) { multiPosRotions[i] = XYZArray(data->totalTrials); } From 7d9e9bcbe36a4b912c657d00f495adddb4a468af Mon Sep 17 00:00:00 2001 From: YounesN Date: Fri, 8 Jun 2018 12:25:28 -0400 Subject: [PATCH 024/199] print remark to show step number and frame number --- src/ConfigSetup.cpp | 9 +++++++-- src/ConfigSetup.h | 1 + src/PDBOutput.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/PDBOutput.h | 2 ++ 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index abfbcd8cc..89bef6ea1 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -38,6 +38,7 @@ ConfigSetup::ConfigSetup(void) int i; in.restart.enable = false; in.restart.step = ULONG_MAX; + in.restart.recalcTrajectory = false; in.prng.seed = UINT_MAX; sys.elect.readEwald = false; sys.elect.readElect = false; @@ -298,6 +299,10 @@ void ConfigSetup::Init(const char *fileName) } else if(line[0] == "RunSteps") { sys.step.total = stringtoi(line[1]); printf("%-40s %-lu \n", "Info: Total number of steps", sys.step.total); + if(sys.step.total == 0) { + in.restart.recalcTrajectory = true; + printf("%-40s %-s \n", "Info: Recalculate Trajectory", "Active"); + } } else if(line[0] == "EqSteps") { sys.step.equil = stringtoi(line[1]); printf("%-40s %-lu \n", "Info: Number of equilibration steps", @@ -786,8 +791,8 @@ void ConfigSetup::verifyInputs(void) "than Equilibration steps!" << std::endl; exit(EXIT_FAILURE); } - if(sys.step.equil > sys.step.total) { - std::cout << "Error: Equilibration steps should be smaller than " << + if(sys.step.equil > sys.step.total && !in.restart.recalcTrajectory) { + std::cout << "Error: Equilibratisys.step.totalon steps should be smaller than " << "Total run steps!" << std::endl; exit(EXIT_FAILURE); } diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index e2332a62d..625e0e05c 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -50,6 +50,7 @@ struct FileNames { struct RestartSettings { bool enable; ulong step; + bool recalcTrajectory; bool operator()(void) { return enable; diff --git a/src/PDBOutput.cpp b/src/PDBOutput.cpp index 3b025c312..7940ec490 100644 --- a/src/PDBOutput.cpp +++ b/src/PDBOutput.cpp @@ -21,7 +21,11 @@ PDBOutput::PDBOutput(System & sys, StaticVals const& statV) : moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), coordCurrRef(sys.coordinates), comCurrRef(sys.com), pStr(coordCurrRef.Count(), GetDefaultAtomStr()), - boxDimRef(sys.boxDimRef), molRef(statV.mol) { } + boxDimRef(sys.boxDimRef), molRef(statV.mol) +{ + for(int i=0; i mBox(molRef.count); SetMolBoxVec(mBox); for (uint b = 0; b < BOX_TOTAL; ++b) { + PrintRemark(b, step, outF[b]); PrintCryst1(b, outF[b]); PrintAtoms(b, mBox); PrintEnd(b, outF[b]); @@ -308,8 +313,6 @@ void PDBOutput::PrintAtoms(const uint b, std::vector & mBox) } } - -//NEW_RESTART_CODE void PDBOutput::PrintAtomsRebuildRestart(const uint b) { using namespace pdb_entry::atom::field; @@ -343,4 +346,32 @@ void PDBOutput::PrintAtomsRebuildRestart(const uint b) molecule = 0; } } -//NEW_RESTART_CODE + +// This function should print a remark for recalculating trajectory +// The format is the following: +// REMARK GOMC +void PDBOutput::PrintRemark(const uint b, const uint step, Writer & out) +{ + using namespace pdb_entry::cryst1::field; + using namespace pdb_entry; + using namespace pdb_entry::remark::field; + + sstrm::Converter toStr; + std::string outStr(pdb_entry::LINE_WIDTH, ' '); + //Tag for remark + outStr.replace(label::POS.START, label::POS.LENGTH, label::REMARK); + //Tag GOMC + outStr.replace(name::POS.START, name::POS.LENGTH, name::STR_GOMC); + + // Print Frame number + frameNumber[b]++; + toStr.Fixed().Align(dis::ALIGN).Precision(dis::PRECISION); + toStr.Replace(outStr, frameNumber[b], dis::POS); + + // Print step number + toStr.Fixed().Align(stepsNum::ALIGN).Precision(stepsNum::PRECISION); + toStr.Replace(outStr, step+1, stepsNum::POS); + + //Write cell line + out.file << outStr << std::endl; +} diff --git a/src/PDBOutput.h b/src/PDBOutput.h index 150231d92..d202887cc 100644 --- a/src/PDBOutput.h +++ b/src/PDBOutput.h @@ -61,6 +61,7 @@ struct PDBOutput : OutputableBase { void DoOutputRebuildRestart(const uint step); void PrintAtomsRebuildRestart(const uint b); void PrintCrystRest(const uint b, const uint step, Writer & out); + void PrintRemark(const uint b, const uint step, Writer & out); //NEW_RESTART_CODE void FormatAtom(std::string & line, const uint p, const uint m, @@ -97,6 +98,7 @@ struct PDBOutput : OutputableBase { //NEW_RESTART_CODE bool enableOutState; std::vector pStr; + int frameNumber[BOX_TOTAL]; }; #endif /*PDB_OUTPUT_H*/ From 00c2120d26c35f2c12129c26f72b3022c14ac8f2 Mon Sep 17 00:00:00 2001 From: YounesN Date: Fri, 8 Jun 2018 13:22:59 -0400 Subject: [PATCH 025/199] added a functionality to read a specific frame --- src/PDBConst.h | 7 ++++++- src/PDBOutput.cpp | 2 +- src/PDBSetup.cpp | 42 +++++++++++++++++++++++++++++------------- src/PDBSetup.h | 10 ++++++++-- src/Setup.h | 2 +- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/PDBConst.h b/src/PDBConst.h index 0f7d45504..f5d80962d 100644 --- a/src/PDBConst.h +++ b/src/PDBConst.h @@ -119,7 +119,12 @@ static const ConstField POS(35, 12); static const uint PRECISION = 3; static const char ALIGN = align::RIGHT; } - +namespace frameNum +{ +static const ConstField POS(15, 10); +static const uint PRECISION = 0; +static const char ALIGN = align::RIGHT; +} namespace stepsNum { static const ConstField POS(50, 15); diff --git a/src/PDBOutput.cpp b/src/PDBOutput.cpp index 7940ec490..97a77abc5 100644 --- a/src/PDBOutput.cpp +++ b/src/PDBOutput.cpp @@ -366,7 +366,7 @@ void PDBOutput::PrintRemark(const uint b, const uint step, Writer & out) // Print Frame number frameNumber[b]++; toStr.Fixed().Align(dis::ALIGN).Precision(dis::PRECISION); - toStr.Replace(outStr, frameNumber[b], dis::POS); + toStr.Replace(outStr, frameNumber[b], frameNum::POS); // Print step number toStr.Fixed().Align(stepsNum::ALIGN).Precision(stepsNum::PRECISION); diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index 28773a709..c0019f8d4 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -27,35 +27,49 @@ namespace pdb_setup void Remarks::SetRestart(config_setup::RestartSettings const& r ) { restart = r.enable; - reached = true; + recalcTrajectory = r.recalcTrajectory; + if(recalcTrajectory) + reached = false; + else + reached = true; } void Remarks::Read(FixedWidthReader & pdb) { using namespace pdb_entry::remark::field; using namespace pdb_entry::cryst1::field; - if(!restart) - return; + if(restart) { + //check if GOMC is taged and read the max dis, rot, vol value + std::string varName; + pdb.Get(varName, name::POS) + .Get(disp[currBox], dis::POS) + .Get(rotate[currBox], rot::POS) + .Get(vol[currBox], vol::POS); - //check if GOMC is taged and read the max dis, rot, vol value - std::string varName; - pdb.Get(varName, name::POS) - .Get(disp[currBox], dis::POS) - .Get(rotate[currBox], rot::POS) - .Get(vol[currBox], vol::POS); + CheckGOMC(varName); + } + if(recalcTrajectory) { + std::string varName; + pdb.Get(varName, name::POS) + .Get(frameNumber[currBox], frameNum::POS) + .Get(step[currBox], stepsNum::POS); + + if(frameNumber[currBox] == targetFrame[currBox]) + reached = true; - CheckGOMC(varName); + CheckGOMC(varName); + } } void Remarks::CheckGOMC(std::string const& varName) { using namespace pdb_entry::remark::field; if (!str::compare(varName, name::STR_GOMC)) { - std::cerr << "ERROR: Restart failed, " + std::cerr << "ERROR: " << "GOMC file's identifying tag " << "\"REMARK GOMC\" is missing" << std::endl; - exit(1); + exit(EXIT_FAILURE); } } @@ -138,7 +152,7 @@ void Atoms::Read(FixedWidthReader & file) } //end namespace pdb_setup void PDBSetup::Init(config_setup::RestartSettings const& restart, - std::string const*const name) + std::string const*const name, uint frameNum) { using namespace std; map::const_iterator dataKind; @@ -148,6 +162,7 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, for (uint b = 0; b < BOX_TOTAL; b++) { std::string varName = ""; remarks.SetBox(b); + remarks.SetFrameNumber(b, frameNum); cryst.SetBox(b); atoms.SetBox(b); FixedWidthReader pdb(name[b], pdbAlias[b]); @@ -158,6 +173,7 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, if (remarks.reached && str::compare(varName, pdb_entry::end::STR)) { break; } + //Call reader function if remarks were reached, // or it is a remark dataKind = dataKinds.find(varName); diff --git a/src/PDBSetup.h b/src/PDBSetup.h index da10fac39..e92066160 100644 --- a/src/PDBSetup.h +++ b/src/PDBSetup.h @@ -28,13 +28,19 @@ namespace pdb_setup struct Remarks : FWReadableBase { uint currBox; double disp[BOX_TOTAL], rotate[BOX_TOTAL], vol[BOX_TOTAL]; - bool restart, reached; + ulong step[BOX_TOTAL]; + uint frameNumber[BOX_TOTAL], targetFrame[BOX_TOTAL]; + bool restart, reached, recalcTrajectory; void SetRestart(config_setup::RestartSettings const& r); void Read(FixedWidthReader & pdb); void SetBox(const uint b) { currBox = b; } + void SetFrameNumber(const uint b, const uint frameNum) + { + targetFrame[b] = frameNum; + } private: void CheckGOMC(std::string const& varName); @@ -104,7 +110,7 @@ struct PDBSetup { pdb_setup::Remarks remarks; PDBSetup(void) : dataKinds(SetReadFunctions()) {} void Init(config_setup::RestartSettings const& restart, - std::string const*const name); + std::string const*const name, uint frameNumber = 0); private: //Map variable names to functions std::map SetReadFunctions(void) diff --git a/src/Setup.h b/src/Setup.h index 43423b882..61d4a2e35 100644 --- a/src/Setup.h +++ b/src/Setup.h @@ -32,7 +32,7 @@ class Setup config.Init(configFileName); //Read in FF data. ff.Init(config.in.files.param.name, config.in.ffKind.isCHARMM); - //Read PDB dat + //Read PDB data pdb.Init(config.in.restart, config.in.files.pdb.name); //Read molecule data from psf prng.Init(config.in.restart, config.in.prng, config.in.files.seed.name); From 50eb6237d0d697becf776e437b8f8ee436b341c7 Mon Sep 17 00:00:00 2001 From: YounesN Date: Fri, 8 Jun 2018 16:40:00 -0400 Subject: [PATCH 026/199] cont. --- src/OutputAbstracts.h | 16 +++++++++++++++- src/PDBOutput.cpp | 2 +- src/PDBSetup.cpp | 41 +++++++++++++++++++++++++++++++++-------- src/PDBSetup.h | 8 +++++--- src/Simulation.cpp | 12 +++++++++++- src/Simulation.h | 3 +++ src/System.cpp | 11 +++++++++++ src/System.h | 3 +++ 8 files changed, 82 insertions(+), 14 deletions(-) diff --git a/src/OutputAbstracts.h b/src/OutputAbstracts.h index 3d0cc5097..01864dbf8 100644 --- a/src/OutputAbstracts.h +++ b/src/OutputAbstracts.h @@ -40,7 +40,10 @@ class OutputableBase } else { Sample(step); } - if ((step + 1) % stepsPerOut == 0) { + + // We will output either when the step number is every stepsPerOut + // Or recalculate trajectory is enabled (forceOutput) + if (((step + 1) % stepsPerOut == 0) || forceOutput) { DoOutput(step); firstPrint = false; } @@ -62,12 +65,23 @@ class OutputableBase stepsTillEquil = tillEquil; totSimSteps = totSteps; firstPrint = true; + + // We will use forceOutput for recalculate trajectory + // If we are not running any simulation then the step will stay 0 + // But we still need to output console for each frame + // So by setting this value to true we will force all the outputs to + // output even though the step is zero + if(totSteps == 0) + forceOutput = true; + else + forceOutput = false; } //private: std::string uniqueName; ulong stepsPerOut, stepsTillEquil, totSimSteps; bool enableOut, firstPrint; + bool forceOutput; //Contains references to various objects. OutputVars * var; diff --git a/src/PDBOutput.cpp b/src/PDBOutput.cpp index 97a77abc5..e15c177e3 100644 --- a/src/PDBOutput.cpp +++ b/src/PDBOutput.cpp @@ -365,7 +365,7 @@ void PDBOutput::PrintRemark(const uint b, const uint step, Writer & out) // Print Frame number frameNumber[b]++; - toStr.Fixed().Align(dis::ALIGN).Precision(dis::PRECISION); + toStr.Fixed().Align(frameNum::ALIGN).Precision(frameNum::PRECISION); toStr.Replace(outStr, frameNumber[b], frameNum::POS); // Print step number diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index c0019f8d4..4daba1908 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -11,7 +11,7 @@ along with this program, also can be found at . #include "PDBSetup.h" //Corresponding header to this body #include "FixedWidthReader.h" //For fixed width reader #include "ConfigSetup.h" //For restart info - +#include "MoveConst.h" #include //for exit #if BOX_TOTAL == 1 @@ -28,10 +28,12 @@ void Remarks::SetRestart(config_setup::RestartSettings const& r ) { restart = r.enable; recalcTrajectory = r.recalcTrajectory; - if(recalcTrajectory) - reached = false; - else - reached = true; + for(uint b=0; bfirst, pdb_entry::label::REMARK))) { dataKind->second->Read(pdb); } @@ -186,3 +192,22 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, pdb.close(); } } + +std::vector PDBSetup::GetFrameSteps(std::string const*const name) +{ + map::const_iterator dataKind; + remarks.SetBox(mv::BOX0); + FixedWidthReader pdb(name[mv::BOX0], pdbAlias[mv::BOX0]); + pdb.open(); + std::string varName; + uint count = 0; + while (pdb.Read(varName, pdb_entry::label::POS)) { + if(varName == pdb_entry::label::REMARK) { + dataKind = dataKinds.find(varName); + dataKind->second->Read(pdb); + remarks.frameSteps.push_back(remarks.step[mv::BOX0]); + count++; + } + } + return remarks.frameSteps; +} \ No newline at end of file diff --git a/src/PDBSetup.h b/src/PDBSetup.h index e92066160..5fb575591 100644 --- a/src/PDBSetup.h +++ b/src/PDBSetup.h @@ -30,7 +30,8 @@ struct Remarks : FWReadableBase { double disp[BOX_TOTAL], rotate[BOX_TOTAL], vol[BOX_TOTAL]; ulong step[BOX_TOTAL]; uint frameNumber[BOX_TOTAL], targetFrame[BOX_TOTAL]; - bool restart, reached, recalcTrajectory; + std::vector frameSteps; + bool restart, reached[BOX_TOTAL], recalcTrajectory; void SetRestart(config_setup::RestartSettings const& r); void Read(FixedWidthReader & pdb); void SetBox(const uint b) @@ -93,7 +94,7 @@ class Atoms : public FWReadableBase std::vector atomAliases, resNamesFull, resNames, resKindNames; std::vector startIdxRes, resKinds, molBeta; - bool restart, firstResInFile; + bool restart, firstResInFile, recalcTrajectory; //CurrRes is used to store res vals, currBox is used to //determine box either via the file (new) or the occupancy //(restart), count allows overwriting of coordinates during @@ -110,7 +111,8 @@ struct PDBSetup { pdb_setup::Remarks remarks; PDBSetup(void) : dataKinds(SetReadFunctions()) {} void Init(config_setup::RestartSettings const& restart, - std::string const*const name, uint frameNumber = 0); + std::string const*const name, uint frameNumber = 1); + std::vector GetFrameSteps(std::string const*const name); private: //Map variable names to functions std::map SetReadFunctions(void) diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 6379d19a6..244a9604c 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -17,7 +17,6 @@ Simulation::Simulation(char const*const configFileName) //NOTE: //IMPORTANT! Keep this order... //as system depends on staticValues, and cpu sometimes depends on both. - Setup set; set.Init(configFileName); totalSteps = set.config.sys.step.total; staticValues = new StaticVals(set); @@ -38,6 +37,7 @@ Simulation::Simulation(char const*const configFileName) std::cout << "Printed combined psf to file " << set.config.out.state.files.psf.name << '\n'; + frameSteps = set.pdb.GetFrameSteps(set.config.in.files.pdb.name); } Simulation::~Simulation() @@ -52,6 +52,16 @@ Simulation::~Simulation() void Simulation::RunSimulation(void) { double startEnergy = system->potential.totalEnergy.total; + if(totalSteps == 0) { + for(int i=0; iOutput(frameSteps[0]-1); + continue; + } + system->RecalculateTrajectory(set, i+1); + cpu->Output(frameSteps[i]-1); + } + } for (ulong step = 0; step < totalSteps; step++) { system->moveSettings.AdjustMoves(step); system->ChooseAndRunMove(step); diff --git a/src/Simulation.h b/src/Simulation.h index f90eb0cab..351a55437 100644 --- a/src/Simulation.h +++ b/src/Simulation.h @@ -30,6 +30,9 @@ class Simulation System * system; CPUSide * cpu; ulong totalSteps; + Setup set; + std::vector frameSteps; + uint remarksCount; }; #endif /*SIMULATION_H*/ diff --git a/src/System.cpp b/src/System.cpp index df5e29599..e56c3a030 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -124,6 +124,17 @@ void System::InitMoves() #endif } +void System::RecalculateTrajectory(Setup &set, uint frameNum) +{ + set.pdb.Init(set.config.in.restart, set.config.in.files.pdb.name, frameNum); + coordinates.InitFromPDB(set.pdb.atoms); + com.CalcCOM(); + cellList.GridAll(boxDimRef, coordinates, molLookupRef); + calcEnergy.Init(*this); + calcEwald->Init(); + potential = calcEnergy.SystemTotal(); +} + void System::ChooseAndRunMove(const uint step) { double draw = 0; diff --git a/src/System.h b/src/System.h index 3b3836bd7..e4e4eb7b2 100644 --- a/src/System.h +++ b/src/System.h @@ -39,6 +39,9 @@ class System //Runs move, picked at random void ChooseAndRunMove(const uint step); + // Recalculate Trajectory + void RecalculateTrajectory(Setup & set, uint frameNum); + //print move time void PrintTime(); From c146264f00ab454ce1f22cd897a016822b1322e7 Mon Sep 17 00:00:00 2001 From: YounesN Date: Fri, 8 Jun 2018 17:04:46 -0400 Subject: [PATCH 027/199] fixed recalcTrajectory --- src/PDBSetup.cpp | 18 ++++++++++++++++++ src/PDBSetup.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index 4daba1908..7b5eb1c41 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -155,12 +155,30 @@ void Atoms::Read(FixedWidthReader & file) l_occ, l_beta); } +void Atoms::Clear() +{ + chainLetter.clear(); + x.clear(); + y.clear(); + z.clear(); + beta.clear(); + box.clear(); + atomAliases.clear(); + resNamesFull.clear(); + resNames.clear(); + resKindNames.clear(); + startIdxRes.clear(); + resKinds.clear(); + molBeta.clear(); +} + } //end namespace pdb_setup void PDBSetup::Init(config_setup::RestartSettings const& restart, std::string const*const name, uint frameNum) { using namespace std; + atoms.Clear(); map::const_iterator dataKind; remarks.SetRestart(restart); atoms.SetRestart(restart); diff --git a/src/PDBSetup.h b/src/PDBSetup.h index 5fb575591..3a5139c09 100644 --- a/src/PDBSetup.h +++ b/src/PDBSetup.h @@ -84,6 +84,7 @@ class Atoms : public FWReadableBase const double l_beta); void Read(FixedWidthReader & file); + void Clear(); //private: //member data From 8f0202f83e3fcc8a0d0c3c8b782193429ab7f0bd Mon Sep 17 00:00:00 2001 From: YounesN Date: Mon, 11 Jun 2018 11:34:33 -0400 Subject: [PATCH 028/199] added re-initializing staticVals and MoleculeLookup for recalculating frames --- .vscode/settings.json | 5 +++++ src/PDBSetup.cpp | 7 +++++++ src/System.cpp | 4 ++++ 3 files changed, 16 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..3ec87ace0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "__tree": "cpp" + } +} \ No newline at end of file diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index 7b5eb1c41..19f9c4da1 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -207,6 +207,13 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, dataKind->second->Read(pdb); } } + // If the recalcTrajectory is true and reached was still false + // it means we couldn't find a remark and hence have to exit with error + if(!remarks.reached[b] && remarks.recalcTrajectory) { + std::cerr << "Error: Recalculate Trajectory is active..." << std::endl + << ".. and couldn't find remark in PDB file!" << std::endl; + exit(EXIT_FAILURE); + } pdb.close(); } } diff --git a/src/System.cpp b/src/System.cpp index e56c3a030..6b183e225 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -127,6 +127,10 @@ void System::InitMoves() void System::RecalculateTrajectory(Setup &set, uint frameNum) { set.pdb.Init(set.config.in.restart, set.config.in.files.pdb.name, frameNum); + statV.InitOver(set, *this); +#ifdef VARIABLE_PARTICLE_NUMBER + molLookup.Init(statV.mol, set.pdb.atoms); +#endif coordinates.InitFromPDB(set.pdb.atoms); com.CalcCOM(); cellList.GridAll(boxDimRef, coordinates, molLookupRef); From a37f849f0a2d19571e19c832e1dcd56250d1637d Mon Sep 17 00:00:00 2001 From: YounesN Date: Mon, 11 Jun 2018 14:38:08 -0400 Subject: [PATCH 029/199] fixed recalcFrame --- src/PDBSetup.cpp | 10 ++++++++++ src/PDBSetup.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index 19f9c4da1..f412a339a 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -75,6 +75,11 @@ void Remarks::CheckGOMC(std::string const& varName) } } +void Remarks::Clear() +{ + frameSteps.clear(); +} + void Cryst1::Read(FixedWidthReader & pdb) { XYZ temp; @@ -170,6 +175,7 @@ void Atoms::Clear() startIdxRes.clear(); resKinds.clear(); molBeta.clear(); + count = 0; } } //end namespace pdb_setup @@ -178,7 +184,11 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, std::string const*const name, uint frameNum) { using namespace std; + // Clear the vectors for both atoms and remarks in case Init was called + // more than once atoms.Clear(); + remarks.Clear(); + map::const_iterator dataKind; remarks.SetRestart(restart); atoms.SetRestart(restart); diff --git a/src/PDBSetup.h b/src/PDBSetup.h index 3a5139c09..9eb9c7aa9 100644 --- a/src/PDBSetup.h +++ b/src/PDBSetup.h @@ -42,6 +42,7 @@ struct Remarks : FWReadableBase { { targetFrame[b] = frameNum; } + void Clear(); private: void CheckGOMC(std::string const& varName); From 76b087dfcf6be89b138345f21534edd148671861 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 11 Jun 2018 16:22:21 -0400 Subject: [PATCH 030/199] Use inheretion for ME-2 and ME-3 from ME-1. --- src/MoleculeExchange1.h | 556 ++++++++++++++++++---------------------- src/MoleculeExchange2.h | 472 +++++----------------------------- src/MoleculeExchange3.h | 487 ++++++----------------------------- 3 files changed, 399 insertions(+), 1116 deletions(-) diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 51e7b6544..e8d885faa 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -31,63 +31,28 @@ class MoleculeExchange1 : public MoveBase largeBB[1] = -1; if(enableID) { - if(molLookRef.GetNumCanSwapKind() < 2) { - std::cout << "Error: MEMC move cannot be applied to pure systems or"<< - " systems, where only one molecule type is allowed to be swapped.\n"; - exit(EXIT_FAILURE); - } - - if(cavity.x >= cavity.y) - cavity.y = cavity.x; - else - cavity.x = cavity.y; - - volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.memcVal.exchangeRatio; - - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = molLookRef.GetCanSwapKind(k); - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] = i; - } - } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } - } - - //checking the acceptance statistic for each kind - counter = 0; - molInCavCount = 0; - lastAccept = 0.0; - exDiff = 1; + if(molLookRef.GetNumCanSwapKind() < 2) { + std::cout << "Error: MEMC move cannot be applied to pure systems or"<< + " systems, where only one molecule type is allowed to be swapped.\n"; + exit(EXIT_FAILURE); + } + + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.memcVal.exchangeRatio; + + SetMEMC(statV); + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } } virtual uint Prep(const double subDraw, const double movPerc); @@ -95,15 +60,17 @@ class MoleculeExchange1 : public MoveBase virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); - private: + protected: - void AdjustExRatio(); + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + void SetBox(); void ShiftMol(const bool A, const uint n, const uint from, const uint to); void RecoverMol(const bool A, const uint n, const uint from, const uint to); - uint PickMolInCav(); - uint ReplaceMolecule(); + virtual uint PickMolInCav(); + virtual uint ReplaceMolecule(); void CalcTc(); - double GetCoeff() const; + virtual double GetCoeff() const; uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool insertL, enableID; @@ -130,6 +97,46 @@ class MoleculeExchange1 : public MoveBase Forcefield const& ffRef; }; +inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + if(molRef.kinds[k].name == statV.memcVal.largeKind) { + kindL = molLookRef.GetCanSwapKind(k); + } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + kindS = molLookRef.GetCanSwapKind(k); + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + largeBB[1] = i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } +} + inline void MoleculeExchange1::AdjustExRatio() { if(((counter + 1) % perAdjust) == 0) @@ -165,6 +172,40 @@ inline void MoleculeExchange1::AdjustExRatio() } } +inline void MoleculeExchange1::SetBox() +{ +#if ENSEMBLE == GEMC + double density; + double maxDens = 0.0; + uint densB; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) + { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) + { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) + { + maxDens = density; + densB = b; + } + } + + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + +#elif ENSEMBLE == GCMC + sourceBox = 0; + destBox = 1; +#endif +} + inline uint MoleculeExchange1::PickMolInCav() { @@ -181,17 +222,11 @@ inline uint MoleculeExchange1::PickMolInCav() //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, - sourceBox, kindS, exchangeRatio)) - { - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); + sourceBox, kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; totMolInCav = molInCav[kindS].size(); - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { //pick random exchangeRatio number of kindS in cavity uint picked = prng.randIntExc(molInCav[kindS].size()); molIndexA.push_back(molInCav[kindS][picked]); @@ -202,9 +237,7 @@ inline uint MoleculeExchange1::PickMolInCav() //pick a molecule from Large kind in destBox numInCavB = 1; state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); - } - else - { + } else { //reject the move state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; } @@ -219,24 +252,16 @@ inline uint MoleculeExchange1::PickMolInCav() inline uint MoleculeExchange1::ReplaceMolecule() { uint state = mv::fail_state::NO_FAIL; - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); numInCavA = 1; numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { //Set the V1 to the backbone of the large molecule - if(molRef.NumAtoms(kindL) == 1) - { + if(molRef.NumAtoms(kindL) == 1) { SetBasis(cavA, prng.RandomUnitVect()); - } - else - { + } else { uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; uint end = molRef.MolStart(molIndexA[0]) + largeBB[1]; SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); @@ -261,52 +286,29 @@ inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, uint state = mv::fail_state::NO_FAIL; //deside to insert or remove the big molecule prng.PickBool(insertL, subDraw, movPerc); - -#if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } - - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; -#endif + //Set the source and dest Box. + SetBox(); //adjust exchange rate based on number of small kind in cavity //AdjustExRatio(); - if(insertL) - { + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + if(insertL) { state = PickMolInCav(); - } - else - { + } else { state = ReplaceMolecule(); } - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { pStartA.clear(); pStartB.clear(); pStartA.resize(numInCavA); @@ -316,14 +318,12 @@ inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, pLenA.resize(numInCavA); pLenB.resize(numInCavB); - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { pStartA[n] = pLenA[n] = 0; molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { pStartB[n] = pLenB[n] = 0; molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); } @@ -336,29 +336,21 @@ inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); - if(state == mv::fail_state::NO_FAIL) - { - newMolA.clear(); - oldMolA.clear(); - newMolB.clear(); - oldMolB.clear(); - + if(state == mv::fail_state::NO_FAIL) { numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); //transfering type A from source to dest - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, destBox)); oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, sourceBox)); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //transfering type B from dest to source newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, sourceBox)); @@ -367,8 +359,7 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) } //set the old coordinate after unwrap them - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { XYZArray molA(pLenA[n]); coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); @@ -379,8 +370,7 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) oldMolA[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { XYZArray molB(pLenB[n]); coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); @@ -391,44 +381,36 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) newMolB[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //SetSeed(has cavity, COM is fixed, rotate around Backbone) - if(insertL) - { - //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of large molecule to be inserted - newMolB[n].SetBackBone(largeBB); - //perform rotational trial move in destBox for L oldMol - oldMolB[n].SetSeed(false, false, false); - } - else - { - //Inserting S mol from destBox to the cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, false, false); - //perform trial move in destBox for S oldMol - oldMolB[n].SetSeed(false, false, false); + if(insertL) { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } else { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); } } - for(uint n = 0; n < numInCavA; n++) - { - if(insertL) - { - //Inserting S mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - ////perform trial move in cavity in sourceBox for S oldMol - oldMolA[n].SetSeed(center, cavity, true, false, false); - } - else - { - //Inserting L mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of large molecule to be deleted - oldMolA[n].SetBackBone(largeBB); + for(uint n = 0; n < numInCavA; n++) { + if(insertL) { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + ////perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } else { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolA[n].SetBackBone(largeBB); } } } @@ -439,11 +421,11 @@ inline uint MoleculeExchange1::Prep(const double subDraw, const double movPerc) inline uint MoleculeExchange1::Transform() { + //Need to calculate Tc before transofriming the molecules. CalcTc(); //Calc Old energy and delete A from source - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); //Add bonded energy because we dont considered in DCRotate.cpp @@ -451,8 +433,7 @@ inline uint MoleculeExchange1::Transform() } //Calc old energy and delete B from destBox - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); //Add bonded energy because we dont considered in DCRotate.cpp @@ -460,8 +441,7 @@ inline uint MoleculeExchange1::Transform() } //Insert A to destBox - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); @@ -470,8 +450,7 @@ inline uint MoleculeExchange1::Transform() } //Insert B in sourceBox - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); @@ -485,26 +464,20 @@ inline uint MoleculeExchange1::Transform() inline void MoleculeExchange1::CalcTc() { W_tc = 1.0; - if (ffRef.useLRC) - { + if (ffRef.useLRC) { double delTC = 0.0; - for (uint b = 0; b < BOX_TOTAL; ++b) - { + for (uint b = 0; b < BOX_TOTAL; ++b) { uint kCount[molRef.kindsCount]; - for (uint k = 0; k < molRef.kindsCount; ++k) - { - kCount[k] = molLookRef.NumKindInBox(k, b); + for (uint k = 0; k < molRef.kindsCount; ++k) { + kCount[k] = molLookRef.NumKindInBox(k, b); } - if (b == sourceBox) - { - kCount[kindIndexA[0]] -= numInCavA; - kCount[kindIndexB[0]] += numInCavB; - } - else if (b == destBox) - { - kCount[kindIndexA[0]] += numInCavA; - kCount[kindIndexB[0]] -= numInCavB; + if (b == sourceBox) { + kCount[kindIndexA[0]] -= numInCavA; + kCount[kindIndexB[0]] += numInCavB; + } else if (b == destBox) { + kCount[kindIndexA[0]] += numInCavA; + kCount[kindIndexB[0]] -= numInCavB; } tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; @@ -521,8 +494,7 @@ inline void MoleculeExchange1::CalcEn() self_oldB = 0.0, self_newB = 0.0; recipDest = 0.0, recipSource = 0.0; - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { correct_newA += calcEwald->SwapCorrection(newMolA[n]); correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); self_newA += calcEwald->SwapSelf(newMolA[n]); @@ -530,8 +502,7 @@ inline void MoleculeExchange1::CalcEn() } recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { correct_newB += calcEwald->SwapCorrection(newMolB[n]); correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); self_newB += calcEwald->SwapSelf(newMolB[n]); @@ -553,8 +524,7 @@ inline double MoleculeExchange1::GetCoeff() const double volSource = boxDimRef.volume[sourceBox]; double volDest = boxDimRef.volume[destBox]; #if ENSEMBLE == GEMC - if(insertL) - { + if(insertL) { //kindA is the small molecule double ratioF = num::Factorial(totMolInCav) / (num::Factorial(totMolInCav - exchangeRatio) * @@ -563,9 +533,7 @@ inline double MoleculeExchange1::GetCoeff() const double ratioV = (volSource / volDest) * pow(volDest / volCav, exchangeRatio); return ratioF * ratioV * numTypeBDest / (numTypeBSource + 1.0); - } - else - { + } else { //kindA is the big molecule double ratioF = num::Factorial(totMolInCav) * num::Factorial(numTypeBDest - exchangeRatio, exchangeRatio ) / @@ -576,47 +544,38 @@ inline double MoleculeExchange1::GetCoeff() const return ratioF * ratioV * numTypeASource / (numTypeADest + 1.0); } #elif ENSEMBLE == GCMC - if(ffRef.isFugacity) - { + if(ffRef.isFugacity) { double delA = molRef.kinds[kindIndexA[0]].chemPot * numInCavA; double insB = molRef.kinds[kindIndexB[0]].chemPot * numInCavB; - if(insertL) - { + if(insertL) { //Insert Large molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav - exchangeRatio); + num::Factorial(totMolInCav - exchangeRatio); double ratioV = volSource / pow(volCav, exchangeRatio); return (insB / delA) * ratioF * ratioV / (numTypeBSource + 1.0); - } - else - { + } else { //Delete Large Molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRatio); + num::Factorial(totMolInCav + exchangeRatio); double ratioV = pow(volCav, exchangeRatio) / volSource; return (insB / delA) * ratioF * ratioV * numTypeASource; } - } - else - { + } else { double delA = (-BETA * molRef.kinds[kindIndexA[0]].chemPot * numInCavA); double insB = (BETA * molRef.kinds[kindIndexB[0]].chemPot * numInCavB); - if(insertL) - { + if(insertL) { // Insert Large molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav - exchangeRatio); + num::Factorial(totMolInCav - exchangeRatio); double ratioV = volSource / pow(volCav, exchangeRatio); return exp(delA + insB) * ratioF * ratioV / (numTypeBSource + 1.0); - } - else - { + } else { //Delete Large molecule double ratioF = num::Factorial(totMolInCav) / - num::Factorial(totMolInCav + exchangeRatio); + num::Factorial(totMolInCav + exchangeRatio); double ratioV = pow(volCav, exchangeRatio) / volSource; return exp(delA + insB) * ratioF * ratioV * numTypeASource; @@ -628,15 +587,13 @@ inline double MoleculeExchange1::GetCoeff() const inline void MoleculeExchange1::ShiftMol(const bool A, const uint n, const uint from, const uint to) { - if(A) - { + //MoleculeA + if(A) { //Add type A to dest box newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); comCurrRef.SetNew(molIndexA[n], to); molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { + } else { //Add type B to source box newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); comCurrRef.SetNew(molIndexB[n], to); @@ -647,8 +604,7 @@ inline void MoleculeExchange1::ShiftMol(const bool A, const uint n, inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, const uint from, const uint to) { - if(A) - { + if(A) { XYZArray molA(pLenA[n]); oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); boxDimRef.WrapPBC(molA, to); @@ -656,9 +612,7 @@ inline void MoleculeExchange1::RecoverMol(const bool A, const uint n, molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); comCurrRef.SetNew(molIndexA[n], to); molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { + } else { XYZArray molB(pLenB[n]); oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); boxDimRef.WrapPBC(molB, to); @@ -674,87 +628,79 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) bool result; //If we didn't skip the move calculation - if(rejectState == mv::fail_state::NO_FAIL) - { + if(rejectState == mv::fail_state::NO_FAIL) { double molTransCoeff = GetCoeff(); double Wrat = W_tc * W_recip; - for(uint n = 0; n < numInCavA; n++) - { - Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + for(uint n = 0; n < numInCavA; n++) { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); } - for(uint n = 0; n < numInCavB; n++) - { - Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + for(uint n = 0; n < numInCavB; n++) { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); } result = prng() < molTransCoeff * Wrat; - if(result) - { - //Add tail corrections - sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; - sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; - - //Add rest of energy. - for(uint n = 0; n < numInCavB; n++) - { - sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); - } - - for(uint n = 0; n < numInCavA; n++) - { - sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); - } - - - //Add Reciprocal energy - sysPotRef.boxEnergy[sourceBox].recip += recipSource; - sysPotRef.boxEnergy[destBox].recip += recipDest; - //Add correction energy - sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; - sysPotRef.boxEnergy[sourceBox].correction += correct_newB; - sysPotRef.boxEnergy[destBox].correction += correct_newA; - sysPotRef.boxEnergy[destBox].correction -= correct_oldB; - //Add self energy - sysPotRef.boxEnergy[sourceBox].self -= self_oldA; - sysPotRef.boxEnergy[sourceBox].self += self_newB; - sysPotRef.boxEnergy[destBox].self += self_newA; - sysPotRef.boxEnergy[destBox].self -= self_oldB; + if(result) { + //Add tail corrections + sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; + sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; + + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); + } - for (uint b = 0; b < BOX_TOTAL; b++) - { - calcEwald->UpdateRecip(b); - } - - //molA and molB already transfered to destBox and added to cellist - //Retotal - sysPotRef.Total(); + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipSource; + sysPotRef.boxEnergy[destBox].recip += recipDest; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; + sysPotRef.boxEnergy[sourceBox].correction += correct_newB; + sysPotRef.boxEnergy[destBox].correction += correct_newA; + sysPotRef.boxEnergy[destBox].correction -= correct_oldB; + //Add self energy + sysPotRef.boxEnergy[sourceBox].self -= self_oldA; + sysPotRef.boxEnergy[sourceBox].self += self_newB; + sysPotRef.boxEnergy[destBox].self += self_newA; + sysPotRef.boxEnergy[destBox].self -= self_oldB; + + for (uint b = 0; b < BOX_TOTAL; b++) { + calcEwald->UpdateRecip(b); + } + + //molA and molB already transfered to destBox and added to cellist + + //Retotal + sysPotRef.Total(); + } else { + //transfer molA from destBox to source + for(uint n = 0; n < numInCavA; n++) + { + cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); + RecoverMol(true, n, destBox, sourceBox); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB from sourceBox to dest + for(uint n = 0; n < numInCavB; n++) + { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(false, n, sourceBox, destBox); + cellList.AddMol(molIndexB[n], destBox, coordCurrRef); + } } - else - { - //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); - RecoverMol(true, n, destBox, sourceBox); - cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); - } - //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); - RecoverMol(false, n, sourceBox, destBox); - cellList.AddMol(molIndexB[n], destBox, coordCurrRef); - } - } - } - else //else we didn't even try because we knew it would fail + } else { + //else we didn't even try because we knew it would fail result = false; + } #if ENSEMBLE == GEMC subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index eece96e02..d652f00b4 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -3,9 +3,9 @@ #if ENSEMBLE==GCMC || ENSEMBLE==GEMC -#include "MoveBase.h" #include "TrialMol.h" #include "GeomLib.h" +#include "MoleculeExchange1.h" #include using std::vector; @@ -18,36 +18,39 @@ using namespace geom; // Sub-Volume location and orientation is based on the COM and backbone of the // the small molecule. -class MoleculeExchange2 : public MoveBase +class MoleculeExchange2 : public MoleculeExchange1 { public: MoleculeExchange2(System &sys, StaticVals const& statV) : - ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), - perAdjust(statV.GetPerAdjust()) + MoleculeExchange1(sys, statV) { - enableID = statV.memcVal.enable; - largeBB[0] = -1; - largeBB[1] = -1; smallBB[0] = -1; smallBB[1] = -1; if(enableID) { - if(molLookRef.GetNumCanSwapKind() < 2) { - std::cout << "Error: MEMC move cannot be applied to pure systems or"<< - " systems, where only one molecule type is allowed to be swapped.\n"; - exit(EXIT_FAILURE); - } + SetMEMC(statV); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + protected: + + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + virtual uint PickMolInCav(); + virtual uint ReplaceMolecule(); + virtual double GetCoeff() const; - if(cavity.x >= cavity.y) - cavity.y = cavity.x; - else - cavity.x = cavity.y; - - volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.memcVal.exchangeRatio; - - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + uint smallBB[2]; +}; + +inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { kindL = molLookRef.GetCanSwapKind(k); } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { @@ -56,101 +59,53 @@ class MoleculeExchange2 : public MoveBase } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); + exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] = i; - } + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + largeBB[1] = i; + } } for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } } for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { - smallBB[0] = i; - } - if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ - smallBB[1] = i; - } + if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { + smallBB[0] = i; + } + if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ + smallBB[1] = i; + } } for(uint i = 0; i < 2; i++) { - if(smallBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.smallBBAtom1.c_str(), - statV.memcVal.smallBBAtom2.c_str(), - statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } + if(smallBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.smallBBAtom1.c_str(), + statV.memcVal.smallBBAtom2.c_str(), + statV.memcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } } - - } - - //checking the acceptance statistic for each kind - counter = 0; - molInCavCount = 0; - lastAccept = 0.0; - exDiff = 1; - } - - virtual uint Prep(const double subDraw, const double movPerc); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint earlyReject, const uint step); - - private: - - void AdjustExRatio(); - void ShiftMol(const bool A, const uint n, const uint from, const uint to); - void RecoverMol(const bool A, const uint n, const uint from, const uint to); - uint PickMolInCav(); - uint ReplaceMolecule(); - void CalcTc(); - double GetCoeff() const; - uint GetBoxPairAndMol(const double subDraw, const double movPerc); - - bool insertL, enableID; - uint largeBB[2], smallBB[2]; - uint sourceBox, destBox; - uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, kindS, kindL, totMolInCav; - vector pStartA, pLenA, pStartB, pLenB; - vector molIndexA, kindIndexA, molIndexB, kindIndexB; - vector< vector > molInCav; - vector oldMolA, newMolA, oldMolB, newMolB; - - int exDiff, exchangeRatio; - double volCav, lastAccept; - double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; - XYZ center, cavity; - XYZArray cavA, invCavA; - double W_tc, W_recip; - double correct_oldA, correct_newA, self_oldA, self_newA; - double correct_oldB, correct_newB, self_oldB, self_newB; - double recipDest, recipSource; - Intermolecular tcNew[BOX_TOTAL]; - MoleculeLookup & molLookRef; - Forcefield const& ffRef; -}; +} inline void MoleculeExchange2::AdjustExRatio() { @@ -160,22 +115,18 @@ inline void MoleculeExchange2::AdjustExRatio() uint exMin = 1; subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) - { - if(currAccept >= lastAccept) - { - exchangeRatio += exDiff; - } - else - { - exDiff *= -1; - exchangeRatio += exDiff; + if(abs(currAccept - lastAccept) > 0.05 * currAccept) { + if(currAccept >= lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; } lastAccept = currAccept; if(exchangeRatio < exMin) - exchangeRatio = exMin; + exchangeRatio = exMin; if(exchangeRatio > exMax) - exchangeRatio = exMax; + exchangeRatio = exMax; } molInCavCount = 0; counter = 0; @@ -209,10 +160,6 @@ inline uint MoleculeExchange2::PickMolInCav() if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, kindS, exchangeRatio)) { - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. @@ -254,10 +201,6 @@ inline uint MoleculeExchange2::PickMolInCav() inline uint MoleculeExchange2::ReplaceMolecule() { uint state = mv::fail_state::NO_FAIL; - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); numInCavA = 1; numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box @@ -290,94 +233,12 @@ inline uint MoleculeExchange2::ReplaceMolecule() return state; } -inline uint MoleculeExchange2::GetBoxPairAndMol(const double subDraw, - const double movPerc) -{ - uint state = mv::fail_state::NO_FAIL; - //deside to insert or remove the big molecule - prng.PickBool(insertL, subDraw, movPerc); - -#if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } - - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; -#endif - - //adjust exchange rate based on number of small kind in cavity - //AdjustExRatio(); - - if(insertL) - { - state = PickMolInCav(); - } - else - { - state = ReplaceMolecule(); - } - - if(state == mv::fail_state::NO_FAIL) - { - pStartA.clear(); - pStartB.clear(); - pStartA.resize(numInCavA); - pStartB.resize(numInCavB); - pLenA.clear(); - pLenB.clear(); - pLenA.resize(numInCavA); - pLenB.resize(numInCavB); - - for(uint n = 0; n < numInCavA; n++) - { - pStartA[n] = pLenA[n] = 0; - molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); - } - - for(uint n = 0; n < numInCavB; n++) - { - pStartB[n] = pLenB[n] = 0; - molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); - } - } - - return state; -} - inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); if(state == mv::fail_state::NO_FAIL) - { - newMolA.clear(); - oldMolA.clear(); - newMolB.clear(); - oldMolB.clear(); - + { numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); @@ -550,70 +411,10 @@ inline uint MoleculeExchange2::Transform() return mv::fail_state::NO_FAIL; } -inline void MoleculeExchange2::CalcTc() -{ - W_tc = 1.0; - if (ffRef.useLRC) - { - double delTC = 0.0; - for (uint b = 0; b < BOX_TOTAL; ++b) - { - uint kCount[molRef.kindsCount]; - for (uint k = 0; k < molRef.kindsCount; ++k) - { - kCount[k] = molLookRef.NumKindInBox(k, b); - } - - if (b == sourceBox) - { - kCount[kindIndexA[0]] -= numInCavA; - kCount[kindIndexB[0]] += numInCavB; - } - else if (b == destBox) - { - kCount[kindIndexA[0]] += numInCavA; - kCount[kindIndexB[0]] -= numInCavB; - } - tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); - delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; - } - W_tc = exp(-1.0 * ffRef.beta * delTC); - } -} + inline void MoleculeExchange2::CalcEn() { - W_recip = 1.0; - correct_oldA = 0.0, correct_newA = 0.0; - self_oldA = 0.0, self_newA = 0.0; - correct_oldB = 0.0, correct_newB = 0.0; - self_oldB = 0.0, self_newB = 0.0; - recipDest = 0.0, recipSource = 0.0; - - for(uint n = 0; n < numInCavA; n++) - { - correct_newA += calcEwald->SwapCorrection(newMolA[n]); - correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); - self_newA += calcEwald->SwapSelf(newMolA[n]); - self_oldA += calcEwald->SwapSelf(oldMolA[n]); - } - recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - - for(uint n = 0; n < numInCavB; n++) - { - correct_newB += calcEwald->SwapCorrection(newMolB[n]); - correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); - self_newB += calcEwald->SwapSelf(newMolB[n]); - self_oldB += calcEwald->SwapSelf(oldMolB[n]); - } - recipSource = calcEwald->SwapRecip(newMolB, oldMolA); - - //need to contribute the self and correction energy - W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + - correct_newA - correct_oldA + - correct_newB - correct_oldB + - self_newA - self_oldA + - self_newB - self_oldB)); - + MoleculeExchange1::CalcEn(); } inline double MoleculeExchange2::GetCoeff() const @@ -688,146 +489,9 @@ inline double MoleculeExchange2::GetCoeff() const #endif } -inline void MoleculeExchange2::ShiftMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - //Add type A to dest box - newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - //Add type B to source box - newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -inline void MoleculeExchange2::RecoverMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - XYZArray molA(pLenA[n]); - oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); - boxDimRef.WrapPBC(molA, to); - - molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - XYZArray molB(pLenB[n]); - oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); - boxDimRef.WrapPBC(molB, to); - - molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - inline void MoleculeExchange2::Accept(const uint rejectState, const uint step) { - bool result; - - //If we didn't skip the move calculation - if(rejectState == mv::fail_state::NO_FAIL) - { - double molTransCoeff = GetCoeff(); - double Wrat = W_tc * W_recip; - - for(uint n = 0; n < numInCavA; n++) - { - Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); - } - - for(uint n = 0; n < numInCavB; n++) - { - Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); - } - - result = prng() < molTransCoeff * Wrat; - - if(result) - { - //Add tail corrections - sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; - sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; - - //Add rest of energy. - for(uint n = 0; n < numInCavB; n++) - { - sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); - } - - for(uint n = 0; n < numInCavA; n++) - { - sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); - } - - - //Add Reciprocal energy - sysPotRef.boxEnergy[sourceBox].recip += recipSource; - sysPotRef.boxEnergy[destBox].recip += recipDest; - //Add correction energy - sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; - sysPotRef.boxEnergy[sourceBox].correction += correct_newB; - sysPotRef.boxEnergy[destBox].correction += correct_newA; - sysPotRef.boxEnergy[destBox].correction -= correct_oldB; - //Add self energy - sysPotRef.boxEnergy[sourceBox].self -= self_oldA; - sysPotRef.boxEnergy[sourceBox].self += self_newB; - sysPotRef.boxEnergy[destBox].self += self_newA; - sysPotRef.boxEnergy[destBox].self -= self_oldB; - - for (uint b = 0; b < BOX_TOTAL; b++) - { - calcEwald->UpdateRecip(b); - } - - //molA and molB already transfered to destBox and added to cellist - - //Retotal - sysPotRef.Total(); - } - else - { - //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); - RecoverMol(true, n, destBox, sourceBox); - cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); - } - //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); - RecoverMol(false, n, sourceBox, destBox); - cellList.AddMol(molIndexB[n], destBox, coordCurrRef); - } - } - } - else //else we didn't even try because we knew it would fail - result = false; - -#if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); - moveSetRef.Update(result, subPick, step); -#elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::MEMC); - moveSetRef.Update(result, subPick, step); -#endif + MoleculeExchange1::Accept(rejectState, step); } #endif diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index e9083d969..2efdf352a 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -3,9 +3,10 @@ #if ENSEMBLE==GCMC || ENSEMBLE==GEMC -#include "MoveBase.h" #include "TrialMol.h" -#include "GeomLib.h" +#include "GeomLib.h" +#include "MoleculeExchange1.h" +#include "MoleculeExchange2.h" #include using std::vector; @@ -19,35 +20,39 @@ using namespace geom; // Large molecule insertion and deletion is perfomed by CD-CBMC. -class MoleculeExchange3 : public MoveBase +class MoleculeExchange3 : public MoleculeExchange1 { public: MoleculeExchange3(System &sys, StaticVals const& statV) : - ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), - perAdjust(statV.GetPerAdjust()) + MoleculeExchange1(sys, statV) { enableID = statV.memcVal.enable; largeBB[0] = -1; largeBB[1] = -1; if(enableID) { - if(molLookRef.GetNumCanSwapKind() < 2) { - std::cout << "Error: MEMC move cannot be applied to pure systems or"<< - " systems, where only one molecule type is allowed to be swapped.\n"; - exit(EXIT_FAILURE); - } + SetMEMC(statV); + } + } - if(cavity.x >= cavity.y) - cavity.y = cavity.x; - else - cavity.x = cavity.y; - - volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.memcVal.exchangeRatio; - - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + private: + + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + virtual uint PickMolInCav(); + virtual uint ReplaceMolecule(); + virtual double GetCoeff() const; +}; + +inline void MoleculeExchange3::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { kindL = molLookRef.GetCanSwapKind(k); } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { @@ -56,116 +61,70 @@ class MoleculeExchange3 : public MoveBase } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); + exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] = i; - } + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + largeBB[1] = i; + } } if(largeBB[0] != largeBB[1]) { - printf("Error: In ME-3 move, atom name of backbone should be same.\n"); - printf("Atom names in backbone was set to %s or %s in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); + printf("Error: In ME-3 move, atom name of backbone should be same.\n"); + printf("Atom names in backbone was set to %s or %s in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); } for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } - } - } - - virtual uint Prep(const double subDraw, const double movPerc); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint earlyReject, const uint step); - - private: - - void AdjustExRatio(); - void ShiftMol(const bool A, const uint n, const uint from, const uint to); - void RecoverMol(const bool A, const uint n, const uint from, const uint to); - uint PickMolInCav(); - uint ReplaceMolecule(); - void CalcTc(); - double GetCoeff() const; - uint GetBoxPairAndMol(const double subDraw, const double movPerc); - - bool insertL, enableID; - uint largeBB[2]; - uint sourceBox, destBox; - uint perAdjust, molInCavCount, counter; - uint numInCavA, numInCavB, kindS, kindL, totMolInCav; - vector pStartA, pLenA, pStartB, pLenB; - vector molIndexA, kindIndexA, molIndexB, kindIndexB; - vector< vector > molInCav; - vector oldMolA, newMolA, oldMolB, newMolB; - - int exDiff, exchangeRatio; - double volCav, lastAccept; - double numTypeASource, numTypeBSource, numTypeADest, numTypeBDest; - XYZ center, cavity; - XYZArray cavA, invCavA; - double W_tc, W_recip; - double correct_oldA, correct_newA, self_oldA, self_newA; - double correct_oldB, correct_newB, self_oldB, self_newB; - double recipDest, recipSource; - Intermolecular tcNew[BOX_TOTAL]; - MoleculeLookup & molLookRef; - Forcefield const& ffRef; -}; + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.memcVal.largeBBAtom1.c_str(), + statV.memcVal.largeBBAtom2.c_str(), + statV.memcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } +} inline void MoleculeExchange3::AdjustExRatio() { - if(((counter + 1) % perAdjust) == 0) - { - uint exMax = ceil((float)molInCavCount / (float)perAdjust); - uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) - { - if(currAccept > lastAccept) - { - exchangeRatio += exDiff; - } - else - { - exDiff *= -1; - exchangeRatio += exDiff; - } - lastAccept = currAccept; - if(exchangeRatio < exMin) - exchangeRatio = exMin; - if(exchangeRatio > exMax) - exchangeRatio = exMax; - } - molInCavCount = 0; - counter = 0; - } + if(((counter + 1) % perAdjust) == 0) + { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) > 0.05 * currAccept) { + if(currAccept >= lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + } } - inline uint MoleculeExchange3::PickMolInCav() { uint state = mv::fail_state::NO_FAIL; @@ -184,10 +143,6 @@ inline uint MoleculeExchange3::PickMolInCav() if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, kindS, exchangeRatio)) { - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. @@ -229,10 +184,6 @@ inline uint MoleculeExchange3::PickMolInCav() inline uint MoleculeExchange3::ReplaceMolecule() { uint state = mv::fail_state::NO_FAIL; - molIndexA.clear(); - kindIndexA.clear(); - molIndexB.clear(); - kindIndexB.clear(); numInCavA = 1; numInCavB = exchangeRatio; //pick a random molecule of Large kind in dens box @@ -244,7 +195,7 @@ inline uint MoleculeExchange3::ReplaceMolecule() SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); - //use the first atom in molecule as the center + //use the first atom in molecule as the center uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; center = coordCurrRef.Get(start); //find how many of KindS exist in this center @@ -257,94 +208,12 @@ inline uint MoleculeExchange3::ReplaceMolecule() return state; } -inline uint MoleculeExchange3::GetBoxPairAndMol(const double subDraw, - const double movPerc) -{ - uint state = mv::fail_state::NO_FAIL; - //deside to insert or remove the big molecule - prng.PickBool(insertL, subDraw, movPerc); - -#if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } - - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; -#endif - - //adjust exchange rate based on number of small kind in cavity - //AdjustExRatio(); - - if(insertL) - { - state = PickMolInCav(); - } - else - { - state = ReplaceMolecule(); - } - - if(state == mv::fail_state::NO_FAIL) - { - pStartA.clear(); - pStartB.clear(); - pStartA.resize(numInCavA); - pStartB.resize(numInCavB); - pLenA.clear(); - pLenB.clear(); - pLenA.resize(numInCavA); - pLenB.resize(numInCavB); - - for(uint n = 0; n < numInCavA; n++) - { - pStartA[n] = pLenA[n] = 0; - molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); - } - - for(uint n = 0; n < numInCavB; n++) - { - pStartB[n] = pLenB[n] = 0; - molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); - } - } - - return state; -} - inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); if(state == mv::fail_state::NO_FAIL) - { - newMolA.clear(); - oldMolA.clear(); - newMolB.clear(); - oldMolB.clear(); - + { numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); @@ -398,8 +267,8 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) if(insertL) { //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - // Set the a otom of large molecule to be inserted in COM of cavity + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the a otom of large molecule to be inserted in COM of cavity newMolB[n].SetBackBone(largeBB); //perform rotational trial move in destBox for L oldMol oldMolB[n].SetSeed(false, false, false); @@ -443,8 +312,8 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) //Inserting L mol from sourceBox to destBox newMolA[n].SetSeed(false, false, false); //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - // Set the atom of the large molecule to be inserted in COM + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the atom of the large molecule to be inserted in COM oldMolA[n].SetBackBone(largeBB); } } @@ -535,70 +404,10 @@ inline uint MoleculeExchange3::Transform() return mv::fail_state::NO_FAIL; } -inline void MoleculeExchange3::CalcTc() -{ - W_tc = 1.0; - if (ffRef.useLRC) - { - double delTC = 0.0; - for (uint b = 0; b < BOX_TOTAL; ++b) - { - uint kCount[molRef.kindsCount]; - for (uint k = 0; k < molRef.kindsCount; ++k) - { - kCount[k] = molLookRef.NumKindInBox(k, b); - } - if (b == sourceBox) - { - kCount[kindIndexA[0]] -= numInCavA; - kCount[kindIndexB[0]] += numInCavB; - } - else if (b == destBox) - { - kCount[kindIndexA[0]] += numInCavA; - kCount[kindIndexB[0]] -= numInCavB; - } - tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); - delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; - } - W_tc = exp(-1.0 * ffRef.beta * delTC); - } -} inline void MoleculeExchange3::CalcEn() { - W_recip = 1.0; - correct_oldA = 0.0, correct_newA = 0.0; - self_oldA = 0.0, self_newA = 0.0; - correct_oldB = 0.0, correct_newB = 0.0; - self_oldB = 0.0, self_newB = 0.0; - recipDest = 0.0, recipSource = 0.0; - - for(uint n = 0; n < numInCavA; n++) - { - correct_newA += calcEwald->SwapCorrection(newMolA[n]); - correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); - self_newA += calcEwald->SwapSelf(newMolA[n]); - self_oldA += calcEwald->SwapSelf(oldMolA[n]); - } - recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - - for(uint n = 0; n < numInCavB; n++) - { - correct_newB += calcEwald->SwapCorrection(newMolB[n]); - correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); - self_newB += calcEwald->SwapSelf(newMolB[n]); - self_oldB += calcEwald->SwapSelf(oldMolB[n]); - } - recipSource = calcEwald->SwapRecip(newMolB, oldMolA); - - //need to contribute the self and correction energy - W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + - correct_newA - correct_oldA + - correct_newB - correct_oldB + - self_newA - self_oldA + - self_newB - self_oldB)); - + MoleculeExchange1::CalcEn(); } inline double MoleculeExchange3::GetCoeff() const @@ -673,146 +482,10 @@ inline double MoleculeExchange3::GetCoeff() const #endif } -inline void MoleculeExchange3::ShiftMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - //Add type A to dest box - newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - //Add type B to source box - newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} - -inline void MoleculeExchange3::RecoverMol(const bool A, const uint n, - const uint from, const uint to) -{ - if(A) - { - XYZArray molA(pLenA[n]); - oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); - boxDimRef.WrapPBC(molA, to); - - molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); - comCurrRef.SetNew(molIndexA[n], to); - molLookRef.ShiftMolBox(molIndexA[n], from, to, kindIndexA[n]); - } - else - { - XYZArray molB(pLenB[n]); - oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); - boxDimRef.WrapPBC(molB, to); - - molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); - comCurrRef.SetNew(molIndexB[n], to); - molLookRef.ShiftMolBox(molIndexB[n], from, to, kindIndexB[n]); - } -} inline void MoleculeExchange3::Accept(const uint rejectState, const uint step) { - bool result; - - //If we didn't skip the move calculation - if(rejectState == mv::fail_state::NO_FAIL) - { - double molTransCoeff = GetCoeff(); - double Wrat = W_tc * W_recip; - - for(uint n = 0; n < numInCavA; n++) - { - Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); - } - - for(uint n = 0; n < numInCavB; n++) - { - Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); - } - - result = prng() < molTransCoeff * Wrat; - - if(result) - { - //Add tail corrections - sysPotRef.boxEnergy[sourceBox].tc = tcNew[sourceBox].energy; - sysPotRef.boxEnergy[destBox].tc = tcNew[destBox].energy; - - //Add rest of energy. - for(uint n = 0; n < numInCavB; n++) - { - sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] -= oldMolB[n].GetEnergy(); - } - - for(uint n = 0; n < numInCavA; n++) - { - sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); - sysPotRef.boxEnergy[destBox] += newMolA[n].GetEnergy(); - } - - - //Add Reciprocal energy - sysPotRef.boxEnergy[sourceBox].recip += recipSource; - sysPotRef.boxEnergy[destBox].recip += recipDest; - //Add correction energy - sysPotRef.boxEnergy[sourceBox].correction -= correct_oldA; - sysPotRef.boxEnergy[sourceBox].correction += correct_newB; - sysPotRef.boxEnergy[destBox].correction += correct_newA; - sysPotRef.boxEnergy[destBox].correction -= correct_oldB; - //Add self energy - sysPotRef.boxEnergy[sourceBox].self -= self_oldA; - sysPotRef.boxEnergy[sourceBox].self += self_newB; - sysPotRef.boxEnergy[destBox].self += self_newA; - sysPotRef.boxEnergy[destBox].self -= self_oldB; - - for (uint b = 0; b < BOX_TOTAL; b++) - { - calcEwald->UpdateRecip(b); - } - - //molA and molB already transfered to destBox and added to cellist - - //Retotal - sysPotRef.Total(); - } - else - { - //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { - cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); - RecoverMol(true, n, destBox, sourceBox); - cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); - } - //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { - cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); - RecoverMol(false, n, sourceBox, destBox); - cellList.AddMol(molIndexB[n], destBox, coordCurrRef); - } - } - } - else //else we didn't even try because we knew it would fail - result = false; - -#if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); - moveSetRef.Update(result, subPick, step); -#elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::MEMC); - moveSetRef.Update(result, subPick, step); -#endif + MoleculeExchange1::Accept(rejectState, step); } #endif From 6a3da284c17c28a9c955f0fb3ab35b02256b50b5 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 12 Jun 2018 12:11:50 -0400 Subject: [PATCH 031/199] Fix the header file. --- example_file/methane_pentane/in.conf | 162 --- example_file/methane_pentane/par_mie.inp | 166 --- example_file/methane_pentane/setup_box_0.pdb | 754 ---------- example_file/methane_pentane/setup_box_0.psf | 1328 ------------------ example_file/methane_pentane/setup_box_1.pdb | 750 ---------- example_file/methane_pentane/setup_box_1.psf | 1173 ---------------- src/MoleculeExchange3.h | 1 - 7 files changed, 4334 deletions(-) delete mode 100644 example_file/methane_pentane/in.conf delete mode 100644 example_file/methane_pentane/par_mie.inp delete mode 100644 example_file/methane_pentane/setup_box_0.pdb delete mode 100644 example_file/methane_pentane/setup_box_0.psf delete mode 100644 example_file/methane_pentane/setup_box_1.pdb delete mode 100644 example_file/methane_pentane/setup_box_1.psf diff --git a/example_file/methane_pentane/in.conf b/example_file/methane_pentane/in.conf deleted file mode 100644 index be75bbefb..000000000 --- a/example_file/methane_pentane/in.conf +++ /dev/null @@ -1,162 +0,0 @@ -######################## -## Init File -## -## IMPROVEMENTS -## - Compacts inputs into one line -## - Suggestion: edit inline with (insert key) -## -## To-Do -## (make editor + XML version) -######################## - -############################################################################ -# ========-------------------- INPUT --------------------------=========== -############################################################################ - -######################### -# enable, step -######################### -Restart false - -#################################### -# kind {RESTART, RANDOM, INTSEED} -#################################### -PRNG RANDOM - -#################################### -# FORCE FIELD -#################################### -ParaTypeEXOTIC true -Parameters ./par_mie.inp - -#################################### -# INPUT PDB FILES -#################################### -Coordinates 0 ./setup_box_0.pdb -Coordinates 1 ./setup_box_1.pdb - - -#################################### -# INPUT PSF FILES -#################################### -Structure 0 ./setup_box_0.psf -Structure 1 ./setup_box_1.psf - - -############################################################################ -# =======--------------------- SYSTEM --------------------------=========== -############################################################################ - -################################## -# GEMC TYPE (DEFULT IS NVT_GEMC) -################################## - - -############################# -# SIMULATION CONDITION -############################# -Temperature 273.00 -Potential VDW -LRC true -Rcut 10 -Exclude 1-4 - -############################# -# ELECTROSTATIC -############################# -Ewald false -ElectroStatic false - -############################### -# PRESSURE CALCULATION -################################ -PressureCalc false - -################################ -# STEPS -################################ -RunSteps 20000000 -EqSteps 2000000 -AdjSteps 1000 - -################################ -# MOVE FREQUENCY -################################ -DisFreq 0.20 -RotFreq 0.10 -SwapFreq 0.30 -RegrowthFreq 0.10 -MEMC-3Freq 0.30 - -################################ -# MEMC PARAMETER -################################ -ExchangeVolumeDim 8.8 8.8 13.0 -ExchangeRatio 1 -ExchangeLargeKind C5A -ExchangeSmallKind C1A -LargeKindBackBone C3 C3 -SmallKindBackBone C1 C1 - -################################ -# BOX DIMENSION #, X, Y, Z -################################ -CellBasisVector1 0 30.0 0.0 0.0 -CellBasisVector2 0 0.0 30.0 0.0 -CellBasisVector3 0 0.0 0.0 30.0 - -CellBasisVector1 1 35.0 0.0 0.0 -CellBasisVector2 1 0.0 35.0 0.0 -CellBasisVector3 1 0.0 0.0 35.0 - - -############################## -# CBMC TRIALS -############################## -CBMC_First 8 -CBMC_Nth 6 -CBMC_Ang 100 -CBMC_Dih 100 - -#################################### -# Mol. Name Chem. Pot. -#################################### -ChemPot C5A -3270 -ChemPot C1A -1680 - -############################################################################ -# =======-------------------- OUTPUT --------------------------=========== -############################################################################ - -########################## -# statistics filename add -########################## -OutputName C5A_C1A - -##################################### -# enable, frequency -##################################### -CoordinatesFreq true 10000000 -RestartFreq true 1000000 -ConsoleFreq true 100000 -BlockAverageFreq false 100000 -HistogramFreq true 100000 - - -################################ -# OutHistSettings -################################ -DistName dis -HistName his -RunNumber 1 -RunLetter a -SampleFreq 200 - -################################## -# enable: blk avg., fluct. -################################## -OutEnergy true true -OutPressure false false -OutMolNum true true -OutDensity true true - diff --git a/example_file/methane_pentane/par_mie.inp b/example_file/methane_pentane/par_mie.inp deleted file mode 100644 index 7d1324bec..000000000 --- a/example_file/methane_pentane/par_mie.inp +++ /dev/null @@ -1,166 +0,0 @@ -* -* Topology File for Mie General model (Mick, Soroush Barhaghi, and Potoff) United Atom Force Field -* -* Parameters From: -* -* "Mie potentials for phase equilibria calculations: Application to alkanes and perfluoroalkanes." -* Potoff, Jeffrey J., and Damien A. Bernard-Brunel. -* The Journal of Physical Chemistry B 113.44 (2009): 14725-14731. -* -* -* "Optimized Mie Potentials for Phase Equilibria: Understanding the limits of transferability in branched alkanes" -* Jason R. Mick, Mohammad Soroush Barhaghi, Jeffrey J. Potoff. -* -* - - -BONDS -! -!V(bond) = Kb(b - b0)**2 -! -!Kb: kcal/mole/A**2 -!b0: A -! -! Kb (kcal/mol) = Kb (K) * Boltz. const.; (9999999999 if no stretching) -! -!atom type Kb b0 description -CH3 CH3 9999999999 1.540 ! (ethane) -CH3 CH2 9999999999 1.540 ! (ex. propane) -CH2 CH2 9999999999 1.540 ! (ex. n-butane) -CH3 CHS 9999999999 1.540 ! (ex. 2-methylpropane) -CH3 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH3 CTS 9999999999 1.540 ! (ex. 2,2-dimethylpropane) -CH3 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CH2 CHS 9999999999 1.540 ! (ex. 2-methylbutane) -CH2 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH2 CTS 9999999999 1.540 ! (ex. 2,2-dimethylbutane) -CH2 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CHS CHS 9999999999 1.540 ! (ex. 2,3-dimethylbutane) -CHL CHL 9999999999 1.540 ! (ex. 2,3-dimethylpentane) -CHS CTS 9999999999 1.540 ! (ex. 2,2,3-trimethylbutane) -CHL CTL 9999999999 1.540 ! (ex. 2,2,3-trimethylpentane) -CTT CTT 9999999999 1.580 ! (2,2,3,3-tetramethylbutane) -CF3 CF3 9999999999 1.540 ! -CF3 CF2 9999999999 1.540 ! -CF2 CF2 9999999999 1.540 ! - - - -ANGLES -! -!V(angle) = Ktheta(Theta - Theta0)**2 -! -!Ktheta: kcal/mole/rad**2 -!Theta0: degrees -! -! Ktheta (kcal/mol) = Ktheta (K) * Boltz. const. -! -!atom types Ktheta Theta0 -CH3 CH2 CH3 31250 114.00 ! (propane only) -CH3 CH2 CH2 31250 114.00 ! (ex. n-butane) -CH3 CH2 CHS 31250 114.00 ! (ex. 2-methylbutane) -CH3 CH2 CHL 31250 114.00 ! (ex. 3-methylpentane) -CH3 CH2 CTS 31250 114.00 ! (ex. 2,2-dimethylbutane) -CH3 CH2 CTL 31250 114.00 ! (ex. 3,3-dimethylhexane) -CH2 CH2 CH2 31250 114.00 ! (ex. n-pentane) -CH2 CH2 CHL 31250 114.00 ! (ex. 2-methylpentane) -CH2 CH2 CTL 31250 114.00 ! (ex. 2,2-dimethylpentane) -CHL CH2 CHL 31250 114.00 ! (ex. 2,4-dimethylpentane) -CHL CH2 CTL 31250 114.00 ! (ex. 2,2,4-trimethylpentane) -CH3 CHS CH3 31250 112.00 ! (ex. isobutane) -CH3 CHL CH3 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CH2 31250 112.00 ! (ex. 2-methylbutane) -CH3 CHL CH2 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CHS 31250 112.00 ! (2,3-dimethylbutane only) -CH3 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH3 CHS CTS 31250 112.00 ! (2,2,3-trimethylbutane only) -CH3 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CH2 CHL CH2 31250 112.00 ! (ex. 3-methylpentane) -CH2 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH2 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CHL CHL CHL 31250 112.00 ! (ex. 2,3,4-trimethylpentane) -CH3 CTS CH3 31250 109.47 ! (ex. 2,2-dimethylpropane) -CH3 CTL CH3 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CH2 31250 109.47 ! (ex. 2,2-dimethylbutane) -CH3 CTL CH2 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CHS 31250 109.47 ! (ex. 2,2,3-trimethylbutane) -CH3 CTL CHL 31250 109.47 ! (ex. 2,2,3-trimethylpentane) -CH2 CTL CH2 31250 109.47 ! (ex. 3,3-dimethylpentane) -CH3 CTT CTT 31250 111.00 ! (2,2,3,3-tetramethylbutane) -CH3 CTT CH3 31250 107.00 ! (2,2,3,3-tetramethylbutane) -CF3 CF2 CF3 31250 114.00 ! perfluorocarbons -CF2 CF2 CF3 31250 114.00 ! -CF2 CF2 CF2 31250 114.00 ! - - -DIHEDRALS -! -!V(dihedral) = Kchi(1 + cos(n(chi) - delta)) -! -!Kchi: kcal/mole -!n: multiplicity -!delta: degrees -! -! Kchi (kcal/mol) = Kchi (K) * Boltz. const. -! Boltzmann = 0.0019872041 kcal / (mol * K) -! -! TraPPE Inherits most of its dihedrals from OPLS UA -! X-CT-CH1-X fitted to QM data in this work -! -!atom types Kchi n delta description -X CH2 CH2 X 0.000000 0 0.0 ! OPLS (ex. n-butane) -X CH2 CH2 X 355.029964 1 0.0 ! "" -X CH2 CH2 X -68.189775 2 180.0 ! "" -X CH2 CH2 X 791.317812 3 0.0 ! "" -X CH2 CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2-methylbutane) -X CH2 CHS X 428.729993 1 0.0 ! "" -X CH2 CHS X -111.850111 2 180.0 ! "" -X CH2 CHS X 441.270224 3 0.0 ! "" -X CH2 CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CH2 CHL X 428.729993 1 0.0 ! "" -X CH2 CHL X -111.850111 2 180.0 ! "" -X CH2 CHL X 441.270224 3 0.0 ! "" -X CHS CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2,3-dimethylbutane) -X CHS CHS X 428.729993 1 0.0 ! "" -X CHS CHS X -111.850111 2 180.0 ! "" -X CHS CHS X 441.270224 3 0.0 ! "" -X CHL CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CHL CHL X 428.729993 1 0.0 ! "" -X CHL CHL X -111.850111 2 180.0 ! "" -X CHL CHL X 441.270224 3 0.0 ! "" -X CTS CH2 X 461.289809 3 0.0 ! OPLS -- short backbone (ex. 2,2-DMBut) -X CTL CH2 X 461.289809 3 0.0 ! (same as prev., but for long backbone) -X CTS CHS X 1369.00000 3 0.0 ! this work -- short backbone (ex. 2,2,3-TriMBut) -X CTL CHL X 1369.00000 3 0.0 ! this work -- long backbone (ex. 2,2,3-TriMPen) -X CTS CTS X 2950.910000 0 0.0 ! this work -- from QM -X CTS CTS X -2047.060000 3 0.0 ! (ex. 2,2,3,3-tetramethylbutane) -X CTS CTS X 529.250000 6 180.0 ! "" -X CTS CTS X 150.160000 12 0.0 ! "" -! perfluorocarbons: use wacky seven term torsion -X CF2 CF2 X -1577.68 0 0.0 ! Fit to MP2/6-31+g(d,p) data for perfluorobutane -X CF2 CF2 X 791.61 1 0.0 ! -X CF2 CF2 X 333.65 2 0.0 ! -X CF2 CF2 X 854.01 3 0.0 ! -X CF2 CF2 X 349.25 4 0.0 ! -X CF2 CF2 X 211.51 5 0.0 ! -X CF2 CF2 X 117.66 6 0.0 ! -X CF2 CF2 X -83.44 7 0.0 ! - - -NONBONDED_MIE -! -!V(mie) = 4*eps*((sig_ij/r_ij)^n-(sig_ij/r_ij)^6) -! -!atom eps sig_ij n description -CH4 161.00 3.740 14 ! Potoff, 2009 -CH3 121.25 3.783 16 ! Potoff, 2009 -CH2 61.00 3.990 16 ! Potoff, 2009 -CHS 15.00 4.700 16 ! alkanes w/ 4 or less carbons in backbone -CHL 14.00 4.700 16 ! alkanes w/ 5 or more carbons in backbone -CTS 1.45 6.100 16 ! alkanes w/ 4 or less carbons in backbone -CTL 1.20 6.200 16 ! alkanes w/ 5 or more carbons in backbone -CTT 1.45 6.100 16 ! 2,2,3,3-tetramethylbutane (same as CTS) -CF4 269.00 4.355 36 ! Potoff, 2009 -CF3 155.75 4.475 36 ! Potoff, 2009 -CF2 72.20 4.75 44 ! Potoff, 2009; modified for new torsion - diff --git a/example_file/methane_pentane/setup_box_0.pdb b/example_file/methane_pentane/setup_box_0.pdb deleted file mode 100644 index 0c77fe679..000000000 --- a/example_file/methane_pentane/setup_box_0.pdb +++ /dev/null @@ -1,754 +0,0 @@ -REMARK 30.000 30.000 30.000 STEP: 2000000 -ATOM 1 C3 C5A A 1 14.352 28.307 7.567 0.00 0.00 -ATOM 2 C2 C5A A 1 12.971 28.947 7.804 0.00 0.00 -ATOM 3 C1 C5A A 1 12.829 30.102 6.796 0.00 0.00 -ATOM 4 C4 C5A A 1 15.505 28.849 8.431 0.00 0.00 -ATOM 5 C5 C5A A 1 15.301 28.816 9.957 0.00 0.00 -ATOM 6 C3 C5A A 2 24.510 4.538 18.639 0.00 0.00 -ATOM 7 C2 C5A A 2 23.519 3.556 19.290 0.00 0.00 -ATOM 8 C1 C5A A 2 23.890 2.098 18.960 0.00 0.00 -ATOM 9 C4 C5A A 2 24.202 6.001 19.009 0.00 0.00 -ATOM 10 C5 C5A A 2 25.388 6.835 18.489 0.00 0.00 -ATOM 11 C3 C5A A 3 26.528 16.841 27.284 0.00 0.00 -ATOM 12 C2 C5A A 3 27.439 15.811 26.590 0.00 0.00 -ATOM 13 C1 C5A A 3 27.566 16.073 25.078 0.00 0.00 -ATOM 14 C4 C5A A 3 26.413 16.469 28.774 0.00 0.00 -ATOM 15 C5 C5A A 3 25.687 15.141 29.056 0.00 0.00 -ATOM 16 C3 C5A A 4 22.357 25.205 16.382 0.00 0.00 -ATOM 17 C2 C5A A 4 21.448 24.105 15.805 0.00 0.00 -ATOM 18 C1 C5A A 4 22.022 23.270 14.644 0.00 0.00 -ATOM 19 C4 C5A A 4 21.727 26.171 17.403 0.00 0.00 -ATOM 20 C5 C5A A 4 21.118 25.554 18.675 0.00 0.00 -ATOM 21 C3 C5A A 5 20.831 1.977 16.120 0.00 0.00 -ATOM 22 C2 C5A A 5 21.950 1.949 15.063 0.00 0.00 -ATOM 23 C1 C5A A 5 22.898 3.142 15.287 0.00 0.00 -ATOM 24 C4 C5A A 5 20.037 0.659 16.185 0.00 0.00 -ATOM 25 C5 C5A A 5 19.290 0.468 17.518 0.00 0.00 -ATOM 26 C3 C5A A 6 12.399 24.256 28.987 0.00 0.00 -ATOM 27 C2 C5A A 6 13.253 23.032 28.607 0.00 0.00 -ATOM 28 C1 C5A A 6 12.471 21.705 28.642 0.00 0.00 -ATOM 29 C4 C5A A 6 11.045 24.546 28.314 0.00 0.00 -ATOM 30 C5 C5A A 6 10.289 25.770 28.863 0.00 0.00 -ATOM 31 C3 C5A A 7 16.636 10.876 25.884 0.00 0.00 -ATOM 32 C2 C5A A 7 16.944 9.481 26.458 0.00 0.00 -ATOM 33 C1 C5A A 7 18.384 9.377 26.995 0.00 0.00 -ATOM 34 C4 C5A A 7 15.198 11.002 25.349 0.00 0.00 -ATOM 35 C5 C5A A 7 15.005 12.311 24.561 0.00 0.00 -ATOM 36 C3 C5A A 8 25.326 28.500 16.622 0.00 0.00 -ATOM 37 C2 C5A A 8 26.372 29.193 15.729 0.00 0.00 -ATOM 38 C1 C5A A 8 25.811 29.927 14.497 0.00 0.00 -ATOM 39 C4 C5A A 8 25.943 27.483 17.600 0.00 0.00 -ATOM 40 C5 C5A A 8 27.006 28.204 18.449 0.00 0.00 -ATOM 41 C3 C5A A 9 25.007 6.627 12.467 0.00 0.00 -ATOM 42 C2 C5A A 9 26.422 6.950 11.952 0.00 0.00 -ATOM 43 C1 C5A A 9 26.515 7.524 10.526 0.00 0.00 -ATOM 44 C4 C5A A 9 24.873 6.303 13.967 0.00 0.00 -ATOM 45 C5 C5A A 9 25.971 5.375 14.520 0.00 0.00 -ATOM 46 C3 C5A A 10 29.368 23.095 28.993 0.00 0.00 -ATOM 47 C2 C5A A 10 29.354 22.199 30.245 0.00 0.00 -ATOM 48 C1 C5A A 10 29.339 22.962 31.583 0.00 0.00 -ATOM 49 C4 C5A A 10 29.204 22.416 27.620 0.00 0.00 -ATOM 50 C5 C5A A 10 29.023 23.386 26.437 0.00 0.00 -ATOM 51 C3 C5A A 11 26.712 11.089 14.020 0.00 0.00 -ATOM 52 C2 C5A A 11 27.021 9.725 14.664 0.00 0.00 -ATOM 53 C1 C5A A 11 27.585 9.811 16.095 0.00 0.00 -ATOM 54 C4 C5A A 11 26.175 10.993 12.580 0.00 0.00 -ATOM 55 C5 C5A A 11 24.821 10.259 12.580 0.00 0.00 -ATOM 56 C3 C5A A 12 3.446 9.882 6.841 0.00 0.00 -ATOM 57 C2 C5A A 12 1.997 9.501 6.485 0.00 0.00 -ATOM 58 C1 C5A A 12 1.616 8.037 6.775 0.00 0.00 -ATOM 59 C4 C5A A 12 3.861 10.512 8.184 0.00 0.00 -ATOM 60 C5 C5A A 12 5.351 10.608 8.558 0.00 0.00 -ATOM 61 C3 C5A A 13 20.132 25.180 23.923 0.00 0.00 -ATOM 62 C2 C5A A 13 20.192 24.016 22.916 0.00 0.00 -ATOM 63 C1 C5A A 13 21.105 22.846 23.328 0.00 0.00 -ATOM 64 C4 C5A A 13 19.540 26.494 23.379 0.00 0.00 -ATOM 65 C5 C5A A 13 18.008 26.427 23.519 0.00 0.00 -ATOM 66 C3 C5A A 14 0.541 20.636 23.809 0.00 0.00 -ATOM 67 C2 C5A A 14 0.842 19.718 25.008 0.00 0.00 -ATOM 68 C1 C5A A 14 -0.347 19.169 25.817 0.00 0.00 -ATOM 69 C4 C5A A 14 1.771 20.779 22.894 0.00 0.00 -ATOM 70 C5 C5A A 14 2.991 21.351 23.641 0.00 0.00 -ATOM 71 C3 C5A A 15 7.888 21.008 25.283 0.00 0.00 -ATOM 72 C2 C5A A 15 6.719 21.671 26.034 0.00 0.00 -ATOM 73 C1 C5A A 15 6.990 23.127 26.455 0.00 0.00 -ATOM 74 C4 C5A A 15 7.585 19.545 24.908 0.00 0.00 -ATOM 75 C5 C5A A 15 8.682 18.854 24.076 0.00 0.00 -ATOM 76 C3 C5A A 16 18.057 23.111 5.156 0.00 0.00 -ATOM 77 C2 C5A A 16 19.126 24.037 4.546 0.00 0.00 -ATOM 78 C1 C5A A 16 18.695 25.210 3.646 0.00 0.00 -ATOM 79 C4 C5A A 16 17.066 22.730 4.040 0.00 0.00 -ATOM 80 C5 C5A A 16 16.221 21.461 4.250 0.00 0.00 -ATOM 81 C3 C5A A 17 15.266 10.466 13.912 0.00 0.00 -ATOM 82 C2 C5A A 17 15.823 9.271 14.707 0.00 0.00 -ATOM 83 C1 C5A A 17 14.850 8.199 15.235 0.00 0.00 -ATOM 84 C4 C5A A 17 16.326 11.480 13.442 0.00 0.00 -ATOM 85 C5 C5A A 17 16.661 12.466 14.577 0.00 0.00 -ATOM 86 C3 C5A A 18 5.325 20.828 14.955 0.00 0.00 -ATOM 87 C2 C5A A 18 5.152 19.305 14.805 0.00 0.00 -ATOM 88 C1 C5A A 18 6.361 18.591 14.171 0.00 0.00 -ATOM 89 C4 C5A A 18 6.139 21.034 16.246 0.00 0.00 -ATOM 90 C5 C5A A 18 6.167 22.508 16.690 0.00 0.00 -ATOM 91 C3 C5A A 19 3.877 21.897 0.460 0.00 0.00 -ATOM 92 C2 C5A A 19 3.439 22.081 1.926 0.00 0.00 -ATOM 93 C1 C5A A 19 3.806 20.861 2.791 0.00 0.00 -ATOM 94 C4 C5A A 19 3.543 23.126 -0.405 0.00 0.00 -ATOM 95 C5 C5A A 19 4.419 24.355 -0.097 0.00 0.00 -ATOM 96 C3 C5A A 20 6.603 23.415 21.566 0.00 0.00 -ATOM 97 C2 C5A A 20 7.504 23.970 22.685 0.00 0.00 -ATOM 98 C1 C5A A 20 7.576 25.497 22.868 0.00 0.00 -ATOM 99 C4 C5A A 20 6.687 21.880 21.484 0.00 0.00 -ATOM 100 C5 C5A A 20 5.851 21.273 20.342 0.00 0.00 -ATOM 101 C3 C5A A 21 12.114 18.685 3.385 0.00 0.00 -ATOM 102 C2 C5A A 21 11.451 19.545 4.476 0.00 0.00 -ATOM 103 C1 C5A A 21 11.960 20.966 4.785 0.00 0.00 -ATOM 104 C4 C5A A 21 11.458 17.291 3.389 0.00 0.00 -ATOM 105 C5 C5A A 21 11.545 16.504 4.710 0.00 0.00 -ATOM 106 C3 C5A A 22 13.651 -0.038 28.160 0.00 0.00 -ATOM 107 C2 C5A A 22 14.169 -1.203 29.024 0.00 0.00 -ATOM 108 C1 C5A A 22 13.136 -1.858 29.960 0.00 0.00 -ATOM 109 C4 C5A A 22 12.967 1.151 28.858 0.00 0.00 -ATOM 110 C5 C5A A 22 13.935 2.099 29.591 0.00 0.00 -ATOM 111 C3 C5A A 23 21.705 11.894 15.165 0.00 0.00 -ATOM 112 C2 C5A A 23 21.663 10.690 16.124 0.00 0.00 -ATOM 113 C1 C5A A 23 22.750 9.652 15.790 0.00 0.00 -ATOM 114 C4 C5A A 23 20.694 13.047 15.299 0.00 0.00 -ATOM 115 C5 C5A A 23 20.722 14.178 14.254 0.00 0.00 -ATOM 116 C3 C5A A 24 13.825 6.509 28.406 0.00 0.00 -ATOM 117 C2 C5A A 24 13.834 8.046 28.301 0.00 0.00 -ATOM 118 C1 C5A A 24 12.403 8.592 28.143 0.00 0.00 -ATOM 119 C4 C5A A 24 15.225 5.882 28.535 0.00 0.00 -ATOM 120 C5 C5A A 24 15.729 6.023 29.984 0.00 0.00 -ATOM 121 C3 C5A A 25 23.986 12.398 8.594 0.00 0.00 -ATOM 122 C2 C5A A 25 25.425 11.980 8.950 0.00 0.00 -ATOM 123 C1 C5A A 25 26.259 11.928 7.656 0.00 0.00 -ATOM 124 C4 C5A A 25 23.062 12.536 9.818 0.00 0.00 -ATOM 125 C5 C5A A 25 21.680 12.999 9.323 0.00 0.00 -ATOM 126 C3 C5A A 26 8.170 9.498 12.137 0.00 0.00 -ATOM 127 C2 C5A A 26 8.272 10.043 10.700 0.00 0.00 -ATOM 128 C1 C5A A 26 9.001 11.365 10.398 0.00 0.00 -ATOM 129 C4 C5A A 26 7.524 10.565 13.040 0.00 0.00 -ATOM 130 C5 C5A A 26 7.207 10.154 14.490 0.00 0.00 -ATOM 131 C3 C5A A 27 5.188 8.289 24.337 0.00 0.00 -ATOM 132 C2 C5A A 27 4.000 9.266 24.257 0.00 0.00 -ATOM 133 C1 C5A A 27 3.325 9.264 22.873 0.00 0.00 -ATOM 134 C4 C5A A 27 5.319 7.661 25.737 0.00 0.00 -ATOM 135 C5 C5A A 27 6.455 6.622 25.724 0.00 0.00 -ATOM 136 C3 C5A A 28 21.831 3.632 23.237 0.00 0.00 -ATOM 137 C2 C5A A 28 22.675 4.827 22.755 0.00 0.00 -ATOM 138 C1 C5A A 28 22.592 6.172 23.501 0.00 0.00 -ATOM 139 C4 C5A A 28 21.768 3.428 24.763 0.00 0.00 -ATOM 140 C5 C5A A 28 20.963 2.187 25.191 0.00 0.00 -ATOM 141 C3 C5A A 29 0.809 1.077 15.624 0.00 0.00 -ATOM 142 C2 C5A A 29 1.776 2.124 15.039 0.00 0.00 -ATOM 143 C1 C5A A 29 2.665 2.706 16.154 0.00 0.00 -ATOM 144 C4 C5A A 29 1.484 -0.025 16.461 0.00 0.00 -ATOM 145 C5 C5A A 29 0.783 -1.033 17.390 0.00 0.00 -ATOM 146 C3 C5A A 30 10.513 0.626 2.013 0.00 0.00 -ATOM 147 C2 C5A A 30 11.027 -0.154 3.237 0.00 0.00 -ATOM 148 C1 C5A A 30 9.921 -0.511 4.247 0.00 0.00 -ATOM 149 C4 C5A A 30 9.613 -0.146 1.030 0.00 0.00 -ATOM 150 C5 C5A A 30 8.908 0.614 -0.110 0.00 0.00 -ATOM 151 C3 C5A A 31 24.679 12.142 26.388 0.00 0.00 -ATOM 152 C2 C5A A 31 23.597 13.229 26.253 0.00 0.00 -ATOM 153 C1 C5A A 31 23.680 13.806 24.827 0.00 0.00 -ATOM 154 C4 C5A A 31 24.392 11.325 27.662 0.00 0.00 -ATOM 155 C5 C5A A 31 23.117 10.482 27.475 0.00 0.00 -ATOM 156 C3 C5A A 32 17.975 18.605 28.519 0.00 0.00 -ATOM 157 C2 C5A A 32 17.094 19.001 27.319 0.00 0.00 -ATOM 158 C1 C5A A 32 15.607 19.047 27.715 0.00 0.00 -ATOM 159 C4 C5A A 32 19.494 18.793 28.356 0.00 0.00 -ATOM 160 C5 C5A A 32 19.892 20.252 28.068 0.00 0.00 -ATOM 161 C3 C5A A 33 17.405 12.431 3.417 0.00 0.00 -ATOM 162 C2 C5A A 33 18.537 11.395 3.552 0.00 0.00 -ATOM 163 C1 C5A A 33 19.909 11.810 2.989 0.00 0.00 -ATOM 164 C4 C5A A 33 16.056 11.884 3.921 0.00 0.00 -ATOM 165 C5 C5A A 33 14.930 12.925 3.782 0.00 0.00 -ATOM 166 C3 C5A A 34 12.230 20.381 18.539 0.00 0.00 -ATOM 167 C2 C5A A 34 10.789 20.456 17.999 0.00 0.00 -ATOM 168 C1 C5A A 34 10.000 19.157 17.754 0.00 0.00 -ATOM 169 C4 C5A A 34 13.030 21.696 18.517 0.00 0.00 -ATOM 170 C5 C5A A 34 13.053 22.460 17.180 0.00 0.00 -ATOM 171 C3 C5A A 35 13.970 6.188 11.735 0.00 0.00 -ATOM 172 C2 C5A A 35 12.471 6.458 11.510 0.00 0.00 -ATOM 173 C1 C5A A 35 12.023 7.712 10.736 0.00 0.00 -ATOM 174 C4 C5A A 35 14.315 4.781 12.259 0.00 0.00 -ATOM 175 C5 C5A A 35 13.786 4.437 13.663 0.00 0.00 -ATOM 176 C3 C5A A 36 24.042 7.477 0.097 0.00 0.00 -ATOM 177 C2 C5A A 36 23.326 8.435 1.067 0.00 0.00 -ATOM 178 C1 C5A A 36 21.909 8.041 1.524 0.00 0.00 -ATOM 179 C4 C5A A 36 25.532 7.837 -0.045 0.00 0.00 -ATOM 180 C5 C5A A 36 26.352 7.051 -1.085 0.00 0.00 -ATOM 181 C3 C5A A 37 -0.086 4.620 11.482 0.00 0.00 -ATOM 182 C2 C5A A 37 1.231 3.889 11.164 0.00 0.00 -ATOM 183 C1 C5A A 37 1.444 3.259 9.775 0.00 0.00 -ATOM 184 C4 C5A A 37 -0.183 5.272 12.874 0.00 0.00 -ATOM 185 C5 C5A A 37 1.235 5.732 13.261 0.00 0.00 -ATOM 186 C3 C5A A 38 5.940 2.383 10.540 0.00 0.00 -ATOM 187 C2 C5A A 38 5.194 2.070 11.850 0.00 0.00 -ATOM 188 C1 C5A A 38 5.846 0.970 12.708 0.00 0.00 -ATOM 189 C4 C5A A 38 5.627 1.431 9.370 0.00 0.00 -ATOM 190 C5 C5A A 38 6.180 1.710 7.960 0.00 0.00 -ATOM 191 C3 C5A A 39 13.646 23.184 8.635 0.00 0.00 -ATOM 192 C2 C5A A 39 13.994 21.741 8.226 0.00 0.00 -ATOM 193 C1 C5A A 39 13.039 20.580 8.560 0.00 0.00 -ATOM 194 C4 C5A A 39 14.627 24.274 8.164 0.00 0.00 -ATOM 195 C5 C5A A 39 15.957 24.270 8.940 0.00 0.00 -ATOM 196 C3 C5A A 40 12.924 7.220 23.618 0.00 0.00 -ATOM 197 C2 C5A A 40 13.994 7.900 22.743 0.00 0.00 -ATOM 198 C1 C5A A 40 14.062 7.465 21.267 0.00 0.00 -ATOM 199 C4 C5A A 40 11.481 7.678 23.333 0.00 0.00 -ATOM 200 C5 C5A A 40 10.544 7.054 24.384 0.00 0.00 -ATOM 201 C3 C5A A 41 5.840 1.664 2.399 0.00 0.00 -ATOM 202 C2 C5A A 41 6.194 3.153 2.563 0.00 0.00 -ATOM 203 C1 C5A A 41 7.369 3.339 3.542 0.00 0.00 -ATOM 204 C4 C5A A 41 4.903 1.287 1.237 0.00 0.00 -ATOM 205 C5 C5A A 41 4.626 -0.207 0.988 0.00 0.00 -ATOM 206 C3 C5A A 42 23.240 13.937 18.426 0.00 0.00 -ATOM 207 C2 C5A A 42 22.267 14.258 19.576 0.00 0.00 -ATOM 208 C1 C5A A 42 20.868 14.537 18.994 0.00 0.00 -ATOM 209 C4 C5A A 42 24.717 14.007 18.857 0.00 0.00 -ATOM 210 C5 C5A A 42 25.752 13.147 18.107 0.00 0.00 -ATOM 211 C3 C5A A 43 2.703 2.590 20.010 0.00 0.00 -ATOM 212 C2 C5A A 43 4.091 1.941 20.170 0.00 0.00 -ATOM 213 C1 C5A A 43 3.993 0.404 20.177 0.00 0.00 -ATOM 214 C4 C5A A 43 2.992 4.100 19.920 0.00 0.00 -ATOM 215 C5 C5A A 43 3.766 4.463 21.202 0.00 0.00 -ATOM 216 C3 C5A A 44 26.038 10.124 23.494 0.00 0.00 -ATOM 217 C2 C5A A 44 26.614 9.107 24.497 0.00 0.00 -ATOM 218 C1 C5A A 44 27.765 9.751 25.290 0.00 0.00 -ATOM 219 C4 C5A A 44 24.837 9.575 22.701 0.00 0.00 -ATOM 220 C5 C5A A 44 24.330 10.624 21.694 0.00 0.00 -ATOM 221 C3 C5A A 45 22.967 18.779 16.545 0.00 0.00 -ATOM 222 C2 C5A A 45 21.471 19.140 16.607 0.00 0.00 -ATOM 223 C1 C5A A 45 20.541 17.956 16.929 0.00 0.00 -ATOM 224 C4 C5A A 45 23.556 18.300 17.885 0.00 0.00 -ATOM 225 C5 C5A A 45 25.091 18.276 17.763 0.00 0.00 -ATOM 226 C3 C5A A 46 10.279 22.709 13.317 0.00 0.00 -ATOM 227 C2 C5A A 46 10.711 21.240 13.161 0.00 0.00 -ATOM 228 C1 C5A A 46 9.594 20.202 12.941 0.00 0.00 -ATOM 229 C4 C5A A 46 9.819 23.039 14.749 0.00 0.00 -ATOM 230 C5 C5A A 46 9.199 24.424 15.012 0.00 0.00 -ATOM 231 C3 C5A A 47 23.394 27.044 21.479 0.00 0.00 -ATOM 232 C2 C5A A 47 23.544 26.557 22.932 0.00 0.00 -ATOM 233 C1 C5A A 47 24.363 25.266 23.121 0.00 0.00 -ATOM 234 C4 C5A A 47 22.621 28.376 21.506 0.00 0.00 -ATOM 235 C5 C5A A 47 22.606 29.124 20.160 0.00 0.00 -ATOM 236 C3 C5A A 48 0.717 16.879 9.117 0.00 0.00 -ATOM 237 C2 C5A A 48 0.520 17.869 10.280 0.00 0.00 -ATOM 238 C1 C5A A 48 1.466 19.082 10.209 0.00 0.00 -ATOM 239 C4 C5A A 48 1.992 16.016 9.143 0.00 0.00 -ATOM 240 C5 C5A A 48 2.412 15.358 7.815 0.00 0.00 -ATOM 241 C3 C5A A 49 25.041 21.163 1.152 0.00 0.00 -ATOM 242 C2 C5A A 49 25.890 21.216 2.436 0.00 0.00 -ATOM 243 C1 C5A A 49 25.510 20.064 3.384 0.00 0.00 -ATOM 244 C4 C5A A 49 25.153 19.836 0.379 0.00 0.00 -ATOM 245 C5 C5A A 49 24.346 19.883 -0.932 0.00 0.00 -ATOM 246 C3 C5A A 50 18.966 18.255 9.492 0.00 0.00 -ATOM 247 C2 C5A A 50 19.467 18.129 10.942 0.00 0.00 -ATOM 248 C1 C5A A 50 20.572 17.057 10.892 0.00 0.00 -ATOM 249 C4 C5A A 50 18.132 19.533 9.288 0.00 0.00 -ATOM 250 C5 C5A A 50 17.354 19.617 7.962 0.00 0.00 -ATOM 251 C3 C5A A 51 9.763 26.649 19.793 0.00 0.00 -ATOM 252 C2 C5A A 51 10.148 25.159 19.732 0.00 0.00 -ATOM 253 C1 C5A A 51 9.330 24.176 18.874 0.00 0.00 -ATOM 254 C4 C5A A 51 10.675 27.504 20.693 0.00 0.00 -ATOM 255 C5 C5A A 51 10.188 28.945 20.937 0.00 0.00 -ATOM 256 C3 C5A A 52 20.582 27.079 7.318 0.00 0.00 -ATOM 257 C2 C5A A 52 21.775 26.825 6.378 0.00 0.00 -ATOM 258 C1 C5A A 52 21.435 27.230 4.932 0.00 0.00 -ATOM 259 C4 C5A A 52 20.800 26.995 8.841 0.00 0.00 -ATOM 260 C5 C5A A 52 19.484 27.134 9.628 0.00 0.00 -ATOM 261 C3 C5A A 53 23.795 17.351 7.167 0.00 0.00 -ATOM 262 C2 C5A A 53 22.936 18.391 6.425 0.00 0.00 -ATOM 263 C1 C5A A 53 21.937 19.196 7.277 0.00 0.00 -ATOM 264 C4 C5A A 53 24.611 16.571 6.118 0.00 0.00 -ATOM 265 C5 C5A A 53 25.442 15.537 6.900 0.00 0.00 -ATOM 266 C3 C5A A 54 4.191 15.123 13.540 0.00 0.00 -ATOM 267 C2 C5A A 54 4.409 14.832 12.043 0.00 0.00 -ATOM 268 C1 C5A A 54 5.373 13.661 11.774 0.00 0.00 -ATOM 269 C4 C5A A 54 2.969 15.926 14.021 0.00 0.00 -ATOM 270 C5 C5A A 54 2.911 16.089 15.552 0.00 0.00 -ATOM 271 C3 C5A A 55 16.725 15.923 18.905 0.00 0.00 -ATOM 272 C2 C5A A 55 16.520 15.071 20.172 0.00 0.00 -ATOM 273 C1 C5A A 55 15.838 15.974 21.217 0.00 0.00 -ATOM 274 C4 C5A A 55 17.218 15.184 17.647 0.00 0.00 -ATOM 275 C5 C5A A 55 17.496 16.140 16.473 0.00 0.00 -ATOM 276 C3 C5A A 56 13.062 17.871 12.985 0.00 0.00 -ATOM 277 C2 C5A A 56 12.231 16.729 12.371 0.00 0.00 -ATOM 278 C1 C5A A 56 10.713 16.788 12.626 0.00 0.00 -ATOM 279 C4 C5A A 56 14.543 17.469 13.114 0.00 0.00 -ATOM 280 C5 C5A A 56 15.594 18.439 13.684 0.00 0.00 -ATOM 281 C3 C5A A 57 1.187 29.398 6.081 0.00 0.00 -ATOM 282 C2 C5A A 57 2.658 29.829 5.940 0.00 0.00 -ATOM 283 C1 C5A A 57 2.791 30.599 4.612 0.00 0.00 -ATOM 284 C4 C5A A 57 1.037 28.684 7.437 0.00 0.00 -ATOM 285 C5 C5A A 57 -0.438 28.336 7.712 0.00 0.00 -ATOM 286 C3 C5A A 58 26.198 0.730 5.283 0.00 0.00 -ATOM 287 C2 C5A A 58 27.642 1.099 4.895 0.00 0.00 -ATOM 288 C1 C5A A 58 28.389 1.854 6.011 0.00 0.00 -ATOM 289 C4 C5A A 58 26.139 -0.144 6.550 0.00 0.00 -ATOM 290 C5 C5A A 58 24.696 -0.476 6.974 0.00 0.00 -ATOM 291 C3 C5A A 59 0.714 2.795 0.036 0.00 0.00 -ATOM 292 C2 C5A A 59 1.142 1.573 0.870 0.00 0.00 -ATOM 293 C1 C5A A 59 0.044 0.676 1.472 0.00 0.00 -ATOM 294 C4 C5A A 59 1.714 3.942 -0.205 0.00 0.00 -ATOM 295 C5 C5A A 59 1.213 5.222 -0.899 0.00 0.00 -ATOM 296 C3 C5A A 60 25.664 15.442 11.270 0.00 0.00 -ATOM 297 C2 C5A A 60 25.643 15.266 12.799 0.00 0.00 -ATOM 298 C1 C5A A 60 24.290 14.731 13.305 0.00 0.00 -ATOM 299 C4 C5A A 60 26.457 16.715 10.919 0.00 0.00 -ATOM 300 C5 C5A A 60 25.741 18.050 11.195 0.00 0.00 -ATOM 301 C3 C5A A 61 5.092 15.578 23.612 0.00 0.00 -ATOM 302 C2 C5A A 61 3.698 15.074 24.032 0.00 0.00 -ATOM 303 C1 C5A A 61 3.250 15.393 25.471 0.00 0.00 -ATOM 304 C4 C5A A 61 5.913 14.674 22.674 0.00 0.00 -ATOM 305 C5 C5A A 61 7.344 15.222 22.520 0.00 0.00 -ATOM 306 C3 C5A A 62 6.289 16.125 17.389 0.00 0.00 -ATOM 307 C2 C5A A 62 7.546 15.449 16.811 0.00 0.00 -ATOM 308 C1 C5A A 62 8.155 14.545 17.899 0.00 0.00 -ATOM 309 C4 C5A A 62 6.591 16.836 18.721 0.00 0.00 -ATOM 310 C5 C5A A 62 5.464 17.783 19.171 0.00 0.00 -ATOM 311 C3 C5A A 63 29.737 23.834 20.394 0.00 0.00 -ATOM 312 C2 C5A A 63 30.120 24.638 19.138 0.00 0.00 -ATOM 313 C1 C5A A 63 31.653 24.661 18.988 0.00 0.00 -ATOM 314 C4 C5A A 63 28.372 23.135 20.533 0.00 0.00 -ATOM 315 C5 C5A A 63 27.785 23.184 21.956 0.00 0.00 -ATOM 316 C3 C5A A 64 3.772 12.164 18.208 0.00 0.00 -ATOM 317 C2 C5A A 64 3.640 12.690 19.649 0.00 0.00 -ATOM 318 C1 C5A A 64 3.122 14.131 19.805 0.00 0.00 -ATOM 319 C4 C5A A 64 3.720 10.640 17.996 0.00 0.00 -ATOM 320 C5 C5A A 64 3.071 10.234 16.660 0.00 0.00 -ATOM 321 C3 C5A A 65 16.566 5.063 7.970 0.00 0.00 -ATOM 322 C2 C5A A 65 16.284 3.673 8.570 0.00 0.00 -ATOM 323 C1 C5A A 65 15.514 2.771 7.588 0.00 0.00 -ATOM 324 C4 C5A A 65 17.220 6.072 8.932 0.00 0.00 -ATOM 325 C5 C5A A 65 18.540 5.676 9.618 0.00 0.00 -ATOM 326 C3 C5A A 66 11.058 27.923 11.752 0.00 0.00 -ATOM 327 C2 C5A A 66 9.937 28.168 10.724 0.00 0.00 -ATOM 328 C1 C5A A 66 8.825 29.142 11.156 0.00 0.00 -ATOM 329 C4 C5A A 66 11.893 26.691 11.357 0.00 0.00 -ATOM 330 C5 C5A A 66 13.001 26.379 12.380 0.00 0.00 -ATOM 331 C3 C5A A 67 27.918 8.238 4.515 0.00 0.00 -ATOM 332 C2 C5A A 67 27.686 8.485 6.017 0.00 0.00 -ATOM 333 C1 C5A A 67 26.571 7.538 6.500 0.00 0.00 -ATOM 334 C4 C5A A 67 28.992 9.133 3.870 0.00 0.00 -ATOM 335 C5 C5A A 67 29.428 8.725 2.450 0.00 0.00 -ATOM 336 C3 C5A A 68 4.092 6.504 10.455 0.00 0.00 -ATOM 337 C2 C5A A 68 4.890 7.569 11.229 0.00 0.00 -ATOM 338 C1 C5A A 68 4.355 8.220 12.518 0.00 0.00 -ATOM 339 C4 C5A A 68 4.657 6.440 9.023 0.00 0.00 -ATOM 340 C5 C5A A 68 6.043 5.771 8.963 0.00 0.00 -ATOM 341 C3 C5A A 69 12.066 22.123 23.983 0.00 0.00 -ATOM 342 C2 C5A A 69 11.502 21.479 22.703 0.00 0.00 -ATOM 343 C1 C5A A 69 12.049 20.064 22.441 0.00 0.00 -ATOM 344 C4 C5A A 69 12.206 23.651 24.119 0.00 0.00 -ATOM 345 C5 C5A A 69 10.956 24.551 24.124 0.00 0.00 -ATOM 346 C3 C5A A 70 16.000 10.810 20.450 0.00 0.00 -ATOM 347 C2 C5A A 70 14.757 11.374 19.739 0.00 0.00 -ATOM 348 C1 C5A A 70 13.503 11.412 20.633 0.00 0.00 -ATOM 349 C4 C5A A 70 17.234 10.606 19.552 0.00 0.00 -ATOM 350 C5 C5A A 70 18.586 10.274 20.212 0.00 0.00 -ATOM 351 C3 C5A A 71 21.402 21.471 1.351 0.00 0.00 -ATOM 352 C2 C5A A 71 21.179 21.109 2.832 0.00 0.00 -ATOM 353 C1 C5A A 71 20.929 19.609 3.070 0.00 0.00 -ATOM 354 C4 C5A A 71 21.668 22.984 1.459 0.00 0.00 -ATOM 355 C5 C5A A 71 21.663 23.677 0.083 0.00 0.00 -ATOM 356 C3 C5A A 72 29.134 6.220 23.574 0.00 0.00 -ATOM 357 C2 C5A A 72 28.755 6.327 22.086 0.00 0.00 -ATOM 358 C1 C5A A 72 27.570 5.400 21.757 0.00 0.00 -ATOM 359 C4 C5A A 72 30.254 7.140 24.095 0.00 0.00 -ATOM 360 C5 C5A A 72 30.785 6.976 25.532 0.00 0.00 -ATOM 361 C3 C5A A 73 6.526 16.676 27.522 0.00 0.00 -ATOM 362 C2 C5A A 73 7.992 16.237 27.694 0.00 0.00 -ATOM 363 C1 C5A A 73 8.314 15.524 29.020 0.00 0.00 -ATOM 364 C4 C5A A 73 6.050 17.844 28.405 0.00 0.00 -ATOM 365 C5 C5A A 73 4.585 18.249 28.154 0.00 0.00 -ATOM 366 C3 C5A A 74 25.090 12.246 2.843 0.00 0.00 -ATOM 367 C2 C5A A 74 26.545 11.823 2.567 0.00 0.00 -ATOM 368 C1 C5A A 74 26.793 11.926 1.051 0.00 0.00 -ATOM 369 C4 C5A A 74 24.697 12.195 4.331 0.00 0.00 -ATOM 370 C5 C5A A 74 23.214 12.572 4.506 0.00 0.00 -ATOM 371 C3 C5A A 75 5.866 24.292 10.902 0.00 0.00 -ATOM 372 C2 C5A A 75 6.688 23.215 11.634 0.00 0.00 -ATOM 373 C1 C5A A 75 6.161 21.778 11.456 0.00 0.00 -ATOM 374 C4 C5A A 75 6.602 25.432 10.175 0.00 0.00 -ATOM 375 C5 C5A A 75 5.555 26.209 9.354 0.00 0.00 -ATOM 376 C3 C5A A 76 19.841 1.141 11.896 0.00 0.00 -ATOM 377 C2 C5A A 76 18.348 1.161 11.522 0.00 0.00 -ATOM 378 C1 C5A A 76 17.309 1.322 12.647 0.00 0.00 -ATOM 379 C4 C5A A 76 20.737 0.725 10.715 0.00 0.00 -ATOM 380 C5 C5A A 76 22.225 1.099 10.855 0.00 0.00 -ATOM 381 C3 C5A A 77 29.132 14.690 15.068 0.00 0.00 -ATOM 382 C2 C5A A 77 29.552 13.295 15.567 0.00 0.00 -ATOM 383 C1 C5A A 77 30.596 12.527 14.736 0.00 0.00 -ATOM 384 C4 C5A A 77 28.063 15.408 15.914 0.00 0.00 -ATOM 385 C5 C5A A 77 28.107 16.898 15.526 0.00 0.00 -ATOM 386 C3 C5A A 78 25.454 1.743 23.199 0.00 0.00 -ATOM 387 C2 C5A A 78 26.466 1.847 22.043 0.00 0.00 -ATOM 388 C1 C5A A 78 27.846 1.390 22.551 0.00 0.00 -ATOM 389 C4 C5A A 78 25.319 0.274 23.642 0.00 0.00 -ATOM 390 C5 C5A A 78 24.176 -0.090 24.608 0.00 0.00 -ATOM 391 C3 C5A A 79 4.422 3.300 26.444 0.00 0.00 -ATOM 392 C2 C5A A 79 4.896 2.463 27.645 0.00 0.00 -ATOM 393 C1 C5A A 79 6.297 2.880 28.133 0.00 0.00 -ATOM 394 C4 C5A A 79 2.988 2.897 26.051 0.00 0.00 -ATOM 395 C5 C5A A 79 2.465 3.360 24.678 0.00 0.00 -ATOM 396 C3 C5A A 80 27.257 0.452 10.692 0.00 0.00 -ATOM 397 C2 C5A A 80 27.403 1.908 10.212 0.00 0.00 -ATOM 398 C1 C5A A 80 25.987 2.416 9.883 0.00 0.00 -ATOM 399 C4 C5A A 80 28.561 -0.159 11.240 0.00 0.00 -ATOM 400 C5 C5A A 80 28.547 -1.609 11.758 0.00 0.00 -ATOM 401 C3 C5A A 81 22.247 16.996 23.061 0.00 0.00 -ATOM 402 C2 C5A A 81 21.993 17.765 21.751 0.00 0.00 -ATOM 403 C1 C5A A 81 20.526 17.940 21.316 0.00 0.00 -ATOM 404 C4 C5A A 81 21.647 17.708 24.288 0.00 0.00 -ATOM 405 C5 C5A A 81 21.889 17.075 25.671 0.00 0.00 -ATOM 406 C3 C5A A 82 18.455 6.002 3.385 0.00 0.00 -ATOM 407 C2 C5A A 82 17.599 6.822 4.369 0.00 0.00 -ATOM 408 C1 C5A A 82 18.291 7.632 5.480 0.00 0.00 -ATOM 409 C4 C5A A 82 19.000 4.837 4.232 0.00 0.00 -ATOM 410 C5 C5A A 82 19.908 3.819 3.517 0.00 0.00 -ATOM 411 C3 C5A A 83 30.633 11.416 10.274 0.00 0.00 -ATOM 412 C2 C5A A 83 29.830 12.520 9.562 0.00 0.00 -ATOM 413 C1 C5A A 83 29.455 13.662 10.524 0.00 0.00 -ATOM 414 C4 C5A A 83 29.657 10.517 11.056 0.00 0.00 -ATOM 415 C5 C5A A 83 30.319 9.162 11.366 0.00 0.00 -ATOM 416 C3 C5A A 84 21.569 4.087 28.607 0.00 0.00 -ATOM 417 C2 C5A A 84 22.453 3.370 29.644 0.00 0.00 -ATOM 418 C1 C5A A 84 23.049 2.020 29.202 0.00 0.00 -ATOM 419 C4 C5A A 84 21.012 5.378 29.236 0.00 0.00 -ATOM 420 C5 C5A A 84 20.022 6.138 28.334 0.00 0.00 -ATOM 421 C3 C5A A 85 8.392 11.094 24.260 0.00 0.00 -ATOM 422 C2 C5A A 85 9.605 11.571 25.080 0.00 0.00 -ATOM 423 C1 C5A A 85 9.911 13.075 24.950 0.00 0.00 -ATOM 424 C4 C5A A 85 8.566 11.073 22.730 0.00 0.00 -ATOM 425 C5 C5A A 85 7.228 10.941 21.979 0.00 0.00 -ATOM 426 C3 C5A A 86 15.927 3.774 23.527 0.00 0.00 -ATOM 427 C2 C5A A 86 14.770 3.168 24.343 0.00 0.00 -ATOM 428 C1 C5A A 86 13.345 3.332 23.780 0.00 0.00 -ATOM 429 C4 C5A A 86 17.229 3.979 24.323 0.00 0.00 -ATOM 430 C5 C5A A 86 17.116 5.153 25.313 0.00 0.00 -ATOM 431 C3 C5A A 87 25.561 25.743 4.669 0.00 0.00 -ATOM 432 C2 C5A A 87 26.594 24.608 4.795 0.00 0.00 -ATOM 433 C1 C5A A 87 28.068 24.989 5.029 0.00 0.00 -ATOM 434 C4 C5A A 87 24.454 25.319 3.686 0.00 0.00 -ATOM 435 C5 C5A A 87 24.876 25.054 2.229 0.00 0.00 -ATOM 436 C3 C5A A 88 12.000 25.572 4.546 0.00 0.00 -ATOM 437 C2 C5A A 88 10.525 25.889 4.854 0.00 0.00 -ATOM 438 C1 C5A A 88 10.238 26.028 6.361 0.00 0.00 -ATOM 439 C4 C5A A 88 12.438 25.200 3.117 0.00 0.00 -ATOM 440 C5 C5A A 88 13.916 24.767 3.081 0.00 0.00 -ATOM 441 C3 C5A A 89 17.130 27.675 15.435 0.00 0.00 -ATOM 442 C2 C5A A 89 16.336 26.824 14.425 0.00 0.00 -ATOM 443 C1 C5A A 89 16.639 27.338 13.005 0.00 0.00 -ATOM 444 C4 C5A A 89 17.054 26.936 16.784 0.00 0.00 -ATOM 445 C5 C5A A 89 17.493 25.459 16.798 0.00 0.00 -ATOM 446 C3 C5A A 90 26.296 2.451 27.045 0.00 0.00 -ATOM 447 C2 C5A A 90 27.004 1.417 27.941 0.00 0.00 -ATOM 448 C1 C5A A 90 28.381 0.852 27.546 0.00 0.00 -ATOM 449 C4 C5A A 90 27.152 3.702 26.775 0.00 0.00 -ATOM 450 C5 C5A A 90 26.294 4.821 26.154 0.00 0.00 -ATOM 451 C3 C5A A 91 14.612 1.006 19.699 0.00 0.00 -ATOM 452 C2 C5A A 91 13.449 1.880 20.205 0.00 0.00 -ATOM 453 C1 C5A A 91 12.680 2.745 19.189 0.00 0.00 -ATOM 454 C4 C5A A 91 15.365 0.262 20.818 0.00 0.00 -ATOM 455 C5 C5A A 91 16.793 -0.273 20.609 0.00 0.00 -ATOM 456 C3 C5A A 92 8.308 1.787 15.908 0.00 0.00 -ATOM 457 C2 C5A A 92 8.429 1.043 17.251 0.00 0.00 -ATOM 458 C1 C5A A 92 7.197 1.354 18.121 0.00 0.00 -ATOM 459 C4 C5A A 92 9.419 1.523 14.875 0.00 0.00 -ATOM 460 C5 C5A A 92 9.326 2.339 13.572 0.00 0.00 -ATOM 461 C3 C5A A 93 1.290 22.439 14.595 0.00 0.00 -ATOM 462 C2 C5A A 93 2.516 23.348 14.386 0.00 0.00 -ATOM 463 C1 C5A A 93 2.601 24.415 15.493 0.00 0.00 -ATOM 464 C4 C5A A 93 1.177 21.313 13.551 0.00 0.00 -ATOM 465 C5 C5A A 93 0.712 19.944 14.082 0.00 0.00 -ATOM 466 C3 C5A A 94 17.943 16.304 3.904 0.00 0.00 -ATOM 467 C2 C5A A 94 16.686 17.193 3.930 0.00 0.00 -ATOM 468 C1 C5A A 94 15.786 17.119 2.683 0.00 0.00 -ATOM 469 C4 C5A A 94 18.495 16.091 5.326 0.00 0.00 -ATOM 470 C5 C5A A 94 19.652 15.074 5.323 0.00 0.00 -ATOM 471 C3 C5A A 95 26.531 26.531 26.824 0.00 0.00 -ATOM 472 C2 C5A A 95 26.173 26.932 28.267 0.00 0.00 -ATOM 473 C1 C5A A 95 25.211 28.112 28.501 0.00 0.00 -ATOM 474 C4 C5A A 95 27.313 27.560 25.986 0.00 0.00 -ATOM 475 C5 C5A A 95 27.620 27.174 24.527 0.00 0.00 -ATOM 476 C3 C5A A 96 3.348 9.752 0.726 0.00 0.00 -ATOM 477 C2 C5A A 96 2.323 8.915 -0.063 0.00 0.00 -ATOM 478 C1 C5A A 96 2.468 9.104 -1.585 0.00 0.00 -ATOM 479 C4 C5A A 96 3.341 9.687 2.264 0.00 0.00 -ATOM 480 C5 C5A A 96 4.483 10.511 2.888 0.00 0.00 -ATOM 481 C3 C5A A 97 3.251 6.040 4.030 0.00 0.00 -ATOM 482 C2 C5A A 97 2.385 4.769 3.949 0.00 0.00 -ATOM 483 C1 C5A A 97 0.876 5.013 3.761 0.00 0.00 -ATOM 484 C4 C5A A 97 4.620 5.716 4.656 0.00 0.00 -ATOM 485 C5 C5A A 97 5.415 6.981 5.032 0.00 0.00 -ATOM 486 C3 C5A A 98 8.421 14.801 7.377 0.00 0.00 -ATOM 487 C2 C5A A 98 9.909 15.031 7.699 0.00 0.00 -ATOM 488 C1 C5A A 98 10.210 16.308 8.506 0.00 0.00 -ATOM 489 C4 C5A A 98 8.000 13.552 6.580 0.00 0.00 -ATOM 490 C5 C5A A 98 6.496 13.583 6.250 0.00 0.00 -ATOM 491 C3 C5A A 99 6.800 27.167 3.715 0.00 0.00 -ATOM 492 C2 C5A A 99 6.551 26.853 5.202 0.00 0.00 -ATOM 493 C1 C5A A 99 6.809 28.108 6.057 0.00 0.00 -ATOM 494 C4 C5A A 99 7.058 25.997 2.749 0.00 0.00 -ATOM 495 C5 C5A A 99 7.580 26.396 1.356 0.00 0.00 -ATOM 496 C3 C5A A 100 2.321 25.759 22.593 0.00 0.00 -ATOM 497 C2 C5A A 100 2.538 27.273 22.411 0.00 0.00 -ATOM 498 C1 C5A A 100 1.206 28.009 22.176 0.00 0.00 -ATOM 499 C4 C5A A 100 1.538 25.446 23.881 0.00 0.00 -ATOM 500 C5 C5A A 100 2.279 25.788 25.187 0.00 0.00 -ATOM 501 C3 C5A A 101 22.124 15.367 0.348 0.00 0.00 -ATOM 502 C2 C5A A 101 22.214 16.171 1.658 0.00 0.00 -ATOM 503 C1 C5A A 101 23.609 16.701 2.039 0.00 0.00 -ATOM 504 C4 C5A A 101 20.732 14.767 0.077 0.00 0.00 -ATOM 505 C5 C5A A 101 20.649 13.903 -1.195 0.00 0.00 -ATOM 506 C3 C5A A 102 14.048 13.862 29.452 0.00 0.00 -ATOM 507 C2 C5A A 102 15.222 13.928 28.457 0.00 0.00 -ATOM 508 C1 C5A A 102 16.325 14.771 29.122 0.00 0.00 -ATOM 509 C4 C5A A 102 12.922 12.990 28.865 0.00 0.00 -ATOM 510 C5 C5A A 102 11.726 12.914 29.832 0.00 0.00 -ATOM 511 C3 C5A A 103 5.487 16.695 3.223 0.00 0.00 -ATOM 512 C2 C5A A 103 6.759 16.797 2.360 0.00 0.00 -ATOM 513 C1 C5A A 103 7.886 15.918 2.935 0.00 0.00 -ATOM 514 C4 C5A A 103 4.760 15.338 3.266 0.00 0.00 -ATOM 515 C5 C5A A 103 3.523 15.741 4.091 0.00 0.00 -ATOM 516 C3 C5A A 104 29.145 14.358 3.410 0.00 0.00 -ATOM 517 C2 C5A A 104 27.863 15.039 3.923 0.00 0.00 -ATOM 518 C1 C5A A 104 27.199 15.910 2.840 0.00 0.00 -ATOM 519 C4 C5A A 104 29.899 13.461 4.409 0.00 0.00 -ATOM 520 C5 C5A A 104 31.122 12.818 3.728 0.00 0.00 -ATOM 521 C3 C5A A 105 8.652 21.953 2.875 0.00 0.00 -ATOM 522 C2 C5A A 105 7.446 22.082 1.926 0.00 0.00 -ATOM 523 C1 C5A A 105 7.607 22.204 0.399 0.00 0.00 -ATOM 524 C4 C5A A 105 8.349 22.313 4.341 0.00 0.00 -ATOM 525 C5 C5A A 105 7.525 21.240 5.077 0.00 0.00 -ATOM 526 C3 C5A A 106 20.225 5.870 14.288 0.00 0.00 -ATOM 527 C2 C5A A 106 19.219 5.910 15.454 0.00 0.00 -ATOM 528 C1 C5A A 106 19.713 6.443 16.811 0.00 0.00 -ATOM 529 C4 C5A A 106 19.948 5.135 12.963 0.00 0.00 -ATOM 530 C5 C5A A 106 21.250 5.002 12.153 0.00 0.00 -ATOM 531 C3 C5A A 107 25.954 22.582 17.929 0.00 0.00 -ATOM 532 C2 C5A A 107 24.537 22.419 18.508 0.00 0.00 -ATOM 533 C1 C5A A 107 24.402 22.723 20.011 0.00 0.00 -ATOM 534 C4 C5A A 107 26.251 21.728 16.683 0.00 0.00 -ATOM 535 C5 C5A A 107 27.659 21.107 16.622 0.00 0.00 -ATOM 536 C3 C5A A 108 6.327 27.238 17.162 0.00 0.00 -ATOM 537 C2 C5A A 108 5.061 26.687 17.844 0.00 0.00 -ATOM 538 C1 C5A A 108 5.209 26.636 19.376 0.00 0.00 -ATOM 539 C4 C5A A 108 6.076 27.342 15.646 0.00 0.00 -ATOM 540 C5 C5A A 108 7.251 27.919 14.834 0.00 0.00 -ATOM 541 C3 C5A A 109 25.742 5.234 2.820 0.00 0.00 -ATOM 542 C2 C5A A 109 26.764 4.284 2.167 0.00 0.00 -ATOM 543 C1 C5A A 109 26.137 3.018 1.553 0.00 0.00 -ATOM 544 C4 C5A A 109 24.950 4.406 3.849 0.00 0.00 -ATOM 545 C5 C5A A 109 24.123 5.244 4.842 0.00 0.00 -ATOM 546 C3 C5A A 110 13.985 8.502 5.177 0.00 0.00 -ATOM 547 C2 C5A A 110 13.104 8.848 3.962 0.00 0.00 -ATOM 548 C1 C5A A 110 13.138 7.794 2.839 0.00 0.00 -ATOM 549 C4 C5A A 110 13.865 9.255 6.515 0.00 0.00 -ATOM 550 C5 C5A A 110 12.510 8.974 7.192 0.00 0.00 -ATOM 551 C3 C5A A 111 19.379 13.171 24.524 0.00 0.00 -ATOM 552 C2 C5A A 111 19.623 12.089 23.456 0.00 0.00 -ATOM 553 C1 C5A A 111 20.333 10.788 23.874 0.00 0.00 -ATOM 554 C4 C5A A 111 18.752 14.420 23.875 0.00 0.00 -ATOM 555 C5 C5A A 111 18.303 15.346 25.021 0.00 0.00 -ATOM 556 C3 C5A A 112 9.742 10.701 5.346 0.00 0.00 -ATOM 557 C2 C5A A 112 8.433 9.896 5.442 0.00 0.00 -ATOM 558 C1 C5A A 112 8.284 9.254 6.834 0.00 0.00 -ATOM 559 C4 C5A A 112 9.969 11.529 4.067 0.00 0.00 -ATOM 560 C5 C5A A 112 11.227 12.417 4.081 0.00 0.00 -ATOM 561 C3 C5A A 113 2.105 24.459 4.790 0.00 0.00 -ATOM 562 C2 C5A A 113 1.869 25.851 4.175 0.00 0.00 -ATOM 563 C1 C5A A 113 3.065 26.444 3.406 0.00 0.00 -ATOM 564 C4 C5A A 113 3.228 24.316 5.833 0.00 0.00 -ATOM 565 C5 C5A A 113 3.234 22.964 6.572 0.00 0.00 -ATOM 566 C3 C5A A 114 0.508 14.105 28.892 0.00 0.00 -ATOM 567 C2 C5A A 114 1.311 14.260 30.197 0.00 0.00 -ATOM 568 C1 C5A A 114 2.823 14.082 29.963 0.00 0.00 -ATOM 569 C4 C5A A 114 0.841 12.783 28.176 0.00 0.00 -ATOM 570 C5 C5A A 114 0.312 12.712 26.732 0.00 0.00 -ATOM 571 C3 C5A A 115 18.490 10.652 10.173 0.00 0.00 -ATOM 572 C2 C5A A 115 17.542 9.961 9.175 0.00 0.00 -ATOM 573 C1 C5A A 115 17.043 10.825 8.002 0.00 0.00 -ATOM 574 C4 C5A A 115 18.884 9.541 11.165 0.00 0.00 -ATOM 575 C5 C5A A 115 19.819 9.905 12.333 0.00 0.00 -ATOM 576 C3 C5A A 116 17.602 -0.079 27.783 0.00 0.00 -ATOM 577 C2 C5A A 116 17.669 -0.884 26.472 0.00 0.00 -ATOM 578 C1 C5A A 116 16.514 -0.533 25.515 0.00 0.00 -ATOM 579 C4 C5A A 116 17.916 1.399 27.486 0.00 0.00 -ATOM 580 C5 C5A A 116 17.877 2.339 28.706 0.00 0.00 -ATOM 581 C3 C5A A 117 1.869 25.931 11.170 0.00 0.00 -ATOM 582 C2 C5A A 117 0.543 25.193 10.910 0.00 0.00 -ATOM 583 C1 C5A A 117 0.530 24.310 9.648 0.00 0.00 -ATOM 584 C4 C5A A 117 1.839 26.835 12.416 0.00 0.00 -ATOM 585 C5 C5A A 117 3.206 27.387 12.863 0.00 0.00 -ATOM 586 C3 C5A A 118 12.333 29.265 16.443 0.00 0.00 -ATOM 587 C2 C5A A 118 11.653 28.022 15.839 0.00 0.00 -ATOM 588 C1 C5A A 118 12.017 26.823 16.733 0.00 0.00 -ATOM 589 C4 C5A A 118 12.961 30.049 15.275 0.00 0.00 -ATOM 590 C5 C5A A 118 13.953 31.153 15.688 0.00 0.00 -ATOM 591 C3 C5A A 119 9.030 3.891 7.009 0.00 0.00 -ATOM 592 C2 C5A A 119 10.328 3.262 7.550 0.00 0.00 -ATOM 593 C1 C5A A 119 10.759 3.647 8.977 0.00 0.00 -ATOM 594 C4 C5A A 119 9.067 5.431 7.029 0.00 0.00 -ATOM 595 C5 C5A A 119 9.908 6.023 5.883 0.00 0.00 -ATOM 596 C3 C5A A 120 26.065 20.976 6.967 0.00 0.00 -ATOM 597 C2 C5A A 120 25.198 22.134 7.495 0.00 0.00 -ATOM 598 C1 C5A A 120 25.800 23.350 8.223 0.00 0.00 -ATOM 599 C4 C5A A 120 26.782 20.181 8.075 0.00 0.00 -ATOM 600 C5 C5A A 120 27.807 19.161 7.547 0.00 0.00 -ATOM 601 C3 C5A A 121 21.112 21.658 10.506 0.00 0.00 -ATOM 602 C2 C5A A 121 21.150 22.621 9.304 0.00 0.00 -ATOM 603 C1 C5A A 121 19.838 23.195 8.738 0.00 0.00 -ATOM 604 C4 C5A A 121 22.491 21.494 11.171 0.00 0.00 -ATOM 605 C5 C5A A 121 22.578 20.363 12.213 0.00 0.00 -ATOM 606 C3 C5A A 122 4.861 18.574 7.883 0.00 0.00 -ATOM 607 C2 C5A A 122 6.278 18.283 8.411 0.00 0.00 -ATOM 608 C1 C5A A 122 6.427 17.455 9.701 0.00 0.00 -ATOM 609 C4 C5A A 122 4.693 19.115 6.452 0.00 0.00 -ATOM 610 C5 C5A A 122 3.215 19.196 6.029 0.00 0.00 -ATOM 611 C3 C5A A 123 5.986 5.260 15.266 0.00 0.00 -ATOM 612 C2 C5A A 123 4.996 6.032 16.158 0.00 0.00 -ATOM 613 C1 C5A A 123 5.655 7.011 17.147 0.00 0.00 -ATOM 614 C4 C5A A 123 6.879 6.184 14.417 0.00 0.00 -ATOM 615 C5 C5A A 123 7.558 5.382 13.291 0.00 0.00 -ATOM 616 C3 C5A A 124 28.602 11.891 20.968 0.00 0.00 -ATOM 617 C2 C5A A 124 29.039 13.168 21.709 0.00 0.00 -ATOM 618 C1 C5A A 124 29.623 12.976 23.121 0.00 0.00 -ATOM 619 C4 C5A A 124 29.669 11.037 20.258 0.00 0.00 -ATOM 620 C5 C5A A 124 29.193 9.706 19.645 0.00 0.00 -ATOM 621 C3 C5A A 125 5.114 28.553 26.277 0.00 0.00 -ATOM 622 C2 C5A A 125 5.547 28.143 27.697 0.00 0.00 -ATOM 623 C1 C5A A 125 6.573 26.995 27.741 0.00 0.00 -ATOM 624 C4 C5A A 125 6.185 29.193 25.374 0.00 0.00 -ATOM 625 C5 C5A A 125 5.725 29.454 23.927 0.00 0.00 -ATOM 626 C3 C5A A 126 17.035 23.419 27.619 0.00 0.00 -ATOM 627 C2 C5A A 126 17.055 23.368 26.079 0.00 0.00 -ATOM 628 C1 C5A A 126 15.905 24.234 25.532 0.00 0.00 -ATOM 629 C4 C5A A 126 17.556 24.711 28.273 0.00 0.00 -ATOM 630 C5 C5A A 126 17.682 24.789 29.806 0.00 0.00 -ATOM 631 C3 C5A A 127 8.950 2.535 24.282 0.00 0.00 -ATOM 632 C2 C5A A 127 8.995 2.930 22.794 0.00 0.00 -ATOM 633 C1 C5A A 127 7.980 2.198 21.897 0.00 0.00 -ATOM 634 C4 C5A A 127 10.022 3.237 25.137 0.00 0.00 -ATOM 635 C5 C5A A 127 10.165 3.015 26.654 0.00 0.00 -ATOM 636 C3 C5A A 128 12.049 28.165 25.082 0.00 0.00 -ATOM 637 C2 C5A A 128 13.066 28.330 23.937 0.00 0.00 -ATOM 638 C1 C5A A 128 14.066 27.200 23.630 0.00 0.00 -ATOM 639 C4 C5A A 128 10.876 29.129 25.339 0.00 0.00 -ATOM 640 C5 C5A A 128 9.996 28.858 26.573 0.00 0.00 -ATOM 641 C3 C5A A 129 12.239 15.773 19.024 0.00 0.00 -ATOM 642 C2 C5A A 129 13.116 15.181 17.905 0.00 0.00 -ATOM 643 C1 C5A A 129 13.019 15.982 16.593 0.00 0.00 -ATOM 644 C4 C5A A 129 12.264 15.257 20.475 0.00 0.00 -ATOM 645 C5 C5A A 129 11.294 16.016 21.400 0.00 0.00 -ATOM 646 C3 C5A A 130 0.701 26.912 0.434 0.00 0.00 -ATOM 647 C2 C5A A 130 -0.832 26.899 0.583 0.00 0.00 -ATOM 648 C1 C5A A 130 -1.342 27.008 2.032 0.00 0.00 -ATOM 649 C4 C5A A 130 1.153 26.986 -1.036 0.00 0.00 -ATOM 650 C5 C5A A 130 0.696 28.279 -1.738 0.00 0.00 -ATOM 651 C3 C5A A 131 12.466 16.695 26.862 0.00 0.00 -ATOM 652 C2 C5A A 131 11.730 17.954 27.357 0.00 0.00 -ATOM 653 C1 C5A A 131 11.507 17.895 28.880 0.00 0.00 -ATOM 654 C4 C5A A 131 12.590 16.650 25.327 0.00 0.00 -ATOM 655 C5 C5A A 131 13.568 15.536 24.909 0.00 0.00 -ATOM 656 C3 C5A A 132 11.897 11.957 16.016 0.00 0.00 -ATOM 657 C2 C5A A 132 11.182 11.356 14.792 0.00 0.00 -ATOM 658 C1 C5A A 132 11.888 11.808 13.500 0.00 0.00 -ATOM 659 C4 C5A A 132 11.524 11.355 17.384 0.00 0.00 -ATOM 660 C5 C5A A 132 11.480 9.823 17.229 0.00 0.00 -ATOM 661 C3 C5A A 133 24.658 21.299 24.750 0.00 0.00 -ATOM 662 C2 C5A A 133 25.094 22.410 25.723 0.00 0.00 -ATOM 663 C1 C5A A 133 23.860 23.119 26.311 0.00 0.00 -ATOM 664 C4 C5A A 133 25.868 20.594 24.110 0.00 0.00 -ATOM 665 C5 C5A A 133 25.585 19.818 22.810 0.00 0.00 -ATOM 666 C3 C5A A 134 14.509 13.550 9.055 0.00 0.00 -ATOM 667 C2 C5A A 134 13.913 12.760 10.235 0.00 0.00 -ATOM 668 C1 C5A A 134 13.635 11.254 10.070 0.00 0.00 -ATOM 669 C4 C5A A 134 14.655 15.015 9.507 0.00 0.00 -ATOM 670 C5 C5A A 134 15.190 16.029 8.480 0.00 0.00 -ATOM 671 C3 C5A A 135 22.294 8.246 7.706 0.00 0.00 -ATOM 672 C2 C5A A 135 22.368 9.024 9.033 0.00 0.00 -ATOM 673 C1 C5A A 135 22.516 8.089 10.247 0.00 0.00 -ATOM 674 C4 C5A A 135 22.119 9.063 6.412 0.00 0.00 -ATOM 675 C5 C5A A 135 22.145 8.129 5.188 0.00 0.00 -ATOM 676 C3 C5A A 136 16.180 20.791 23.082 0.00 0.00 -ATOM 677 C2 C5A A 136 16.781 19.442 23.520 0.00 0.00 -ATOM 678 C1 C5A A 136 18.190 19.629 24.111 0.00 0.00 -ATOM 679 C4 C5A A 136 16.937 21.800 22.199 0.00 0.00 -ATOM 680 C5 C5A A 136 16.043 22.996 21.820 0.00 0.00 -ATOM 681 C3 C5A A 137 14.845 1.858 3.285 0.00 0.00 -ATOM 682 C2 C5A A 137 15.141 3.366 3.178 0.00 0.00 -ATOM 683 C1 C5A A 137 14.250 4.320 3.994 0.00 0.00 -ATOM 684 C4 C5A A 137 15.834 0.928 2.558 0.00 0.00 -ATOM 685 C5 C5A A 137 15.379 -0.534 2.723 0.00 0.00 -ATOM 686 C3 C5A A 138 0.005 17.518 19.239 0.00 0.00 -ATOM 687 C2 C5A A 138 -1.111 17.347 20.287 0.00 0.00 -ATOM 688 C1 C5A A 138 -0.526 17.417 21.710 0.00 0.00 -ATOM 689 C4 C5A A 138 0.630 18.923 19.324 0.00 0.00 -ATOM 690 C5 C5A A 138 1.441 19.331 18.080 0.00 0.00 -ATOM 691 C3 C5A A 139 1.162 18.211 1.930 0.00 0.00 -ATOM 692 C2 C5A A 139 1.429 18.607 0.466 0.00 0.00 -ATOM 693 C1 C5A A 139 0.239 18.255 -0.446 0.00 0.00 -ATOM 694 C4 C5A A 139 -0.001 19.007 2.549 0.00 0.00 -ATOM 695 C5 C5A A 139 -0.285 18.610 4.010 0.00 0.00 -ATOM 696 C3 C5A A 140 9.347 6.501 18.761 0.00 0.00 -ATOM 697 C2 C5A A 140 9.087 5.922 20.164 0.00 0.00 -ATOM 698 C1 C5A A 140 7.770 6.421 20.787 0.00 0.00 -ATOM 699 C4 C5A A 140 10.351 5.738 17.877 0.00 0.00 -ATOM 700 C5 C5A A 140 10.308 6.256 16.428 0.00 0.00 -ATOM 701 C3 C5A A 141 16.758 22.422 12.685 0.00 0.00 -ATOM 702 C2 C5A A 141 18.252 22.704 12.928 0.00 0.00 -ATOM 703 C1 C5A A 141 18.823 24.060 12.473 0.00 0.00 -ATOM 704 C4 C5A A 141 15.748 23.205 13.543 0.00 0.00 -ATOM 705 C5 C5A A 141 14.300 22.731 13.315 0.00 0.00 -ATOM 706 C3 C5A A 142 23.303 26.954 12.037 0.00 0.00 -ATOM 707 C2 C5A A 142 22.115 26.249 12.718 0.00 0.00 -ATOM 708 C1 C5A A 142 21.086 27.168 13.401 0.00 0.00 -ATOM 709 C4 C5A A 142 23.859 26.173 10.832 0.00 0.00 -ATOM 710 C5 C5A A 142 24.982 26.817 9.998 0.00 0.00 -ATOM 711 C3 C5A A 143 7.112 11.377 27.923 0.00 0.00 -ATOM 712 C2 C5A A 143 6.087 12.526 27.891 0.00 0.00 -ATOM 713 C1 C5A A 143 5.256 12.585 26.595 0.00 0.00 -ATOM 714 C4 C5A A 143 7.839 11.210 29.269 0.00 0.00 -ATOM 715 C5 C5A A 143 9.021 10.228 29.151 0.00 0.00 -ATOM 716 C3 C5A A 144 17.343 4.966 19.740 0.00 0.00 -ATOM 717 C2 C5A A 144 18.792 5.050 20.257 0.00 0.00 -ATOM 718 C1 C5A A 144 18.881 6.116 21.365 0.00 0.00 -ATOM 719 C4 C5A A 144 17.160 4.183 18.427 0.00 0.00 -ATOM 720 C5 C5A A 144 16.115 4.760 17.454 0.00 0.00 -ATOM 721 C3 C5A A 145 18.073 20.349 19.104 0.00 0.00 -ATOM 722 C2 C5A A 145 18.929 21.615 18.913 0.00 0.00 -ATOM 723 C1 C5A A 145 20.196 21.590 19.788 0.00 0.00 -ATOM 724 C4 C5A A 145 16.823 20.342 18.204 0.00 0.00 -ATOM 725 C5 C5A A 145 17.019 20.498 16.684 0.00 0.00 -ATOM 726 C3 C5A A 146 20.466 27.354 0.799 0.00 0.00 -ATOM 727 C2 C5A A 146 21.484 28.167 -0.022 0.00 0.00 -ATOM 728 C1 C5A A 146 21.117 28.401 -1.500 0.00 0.00 -ATOM 729 C4 C5A A 146 19.226 28.224 1.074 0.00 0.00 -ATOM 730 C5 C5A A 146 19.499 29.587 1.737 0.00 0.00 -ATOM 731 C3 C5A A 147 20.579 2.273 7.434 0.00 0.00 -ATOM 732 C2 C5A A 147 21.951 2.897 7.116 0.00 0.00 -ATOM 733 C1 C5A A 147 22.320 4.070 8.042 0.00 0.00 -ATOM 734 C4 C5A A 147 20.188 1.081 6.541 0.00 0.00 -ATOM 735 C5 C5A A 147 18.867 0.405 6.954 0.00 0.00 -ATOM 736 C3 C5A A 148 27.434 24.321 13.797 0.00 0.00 -ATOM 737 C2 C5A A 148 27.416 25.469 14.823 0.00 0.00 -ATOM 738 C1 C5A A 148 28.853 25.848 15.227 0.00 0.00 -ATOM 739 C4 C5A A 148 25.956 23.998 13.511 0.00 0.00 -ATOM 740 C5 C5A A 148 25.750 22.816 12.546 0.00 0.00 -ATOM 741 C3 C5A A 149 8.695 6.291 1.691 0.00 0.00 -ATOM 742 C2 C5A A 149 9.970 5.733 1.033 0.00 0.00 -ATOM 743 C1 C5A A 149 10.907 4.787 1.806 0.00 0.00 -ATOM 744 C4 C5A A 149 7.760 6.987 0.684 0.00 0.00 -ATOM 745 C5 C5A A 149 6.692 7.901 1.313 0.00 0.00 -ATOM 746 C3 C5A A 150 29.314 4.287 18.093 0.00 0.00 -ATOM 747 C2 C5A A 150 29.821 5.388 17.144 0.00 0.00 -ATOM 748 C1 C5A A 150 30.612 6.448 17.934 0.00 0.00 -ATOM 749 C4 C5A A 150 28.212 3.338 17.587 0.00 0.00 -ATOM 750 C5 C5A A 150 27.787 2.113 18.418 0.00 0.00 -ATOM 751 C1 C1A B 1 9.109 22.012 8.918 0.00 0.00 -ATOM 752 C1 C1A B 2 14.396 26.117 19.760 0.00 0.00 -END diff --git a/example_file/methane_pentane/setup_box_0.psf b/example_file/methane_pentane/setup_box_0.psf deleted file mode 100644 index d492e61bd..000000000 --- a/example_file/methane_pentane/setup_box_0.psf +++ /dev/null @@ -1,1328 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology top_mie.inp - REMARKS segment C5A { first NONE; last NONE; auto angles dihedrals } - REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } - - 752 !NATOM - 1 C5A 1 C5A C3 CH2 0.000000 14.0270 0 - 2 C5A 1 C5A C2 CH2 0.000000 14.0270 0 - 3 C5A 1 C5A C1 CH3 0.000000 15.0350 0 - 4 C5A 1 C5A C4 CH2 0.000000 14.0270 0 - 5 C5A 1 C5A C5 CH3 0.000000 15.0350 0 - 6 C5A 2 C5A C3 CH2 0.000000 14.0270 0 - 7 C5A 2 C5A C2 CH2 0.000000 14.0270 0 - 8 C5A 2 C5A C1 CH3 0.000000 15.0350 0 - 9 C5A 2 C5A C4 CH2 0.000000 14.0270 0 - 10 C5A 2 C5A C5 CH3 0.000000 15.0350 0 - 11 C5A 3 C5A C3 CH2 0.000000 14.0270 0 - 12 C5A 3 C5A C2 CH2 0.000000 14.0270 0 - 13 C5A 3 C5A C1 CH3 0.000000 15.0350 0 - 14 C5A 3 C5A C4 CH2 0.000000 14.0270 0 - 15 C5A 3 C5A C5 CH3 0.000000 15.0350 0 - 16 C5A 4 C5A C3 CH2 0.000000 14.0270 0 - 17 C5A 4 C5A C2 CH2 0.000000 14.0270 0 - 18 C5A 4 C5A C1 CH3 0.000000 15.0350 0 - 19 C5A 4 C5A C4 CH2 0.000000 14.0270 0 - 20 C5A 4 C5A C5 CH3 0.000000 15.0350 0 - 21 C5A 5 C5A C3 CH2 0.000000 14.0270 0 - 22 C5A 5 C5A C2 CH2 0.000000 14.0270 0 - 23 C5A 5 C5A C1 CH3 0.000000 15.0350 0 - 24 C5A 5 C5A C4 CH2 0.000000 14.0270 0 - 25 C5A 5 C5A C5 CH3 0.000000 15.0350 0 - 26 C5A 6 C5A C3 CH2 0.000000 14.0270 0 - 27 C5A 6 C5A C2 CH2 0.000000 14.0270 0 - 28 C5A 6 C5A C1 CH3 0.000000 15.0350 0 - 29 C5A 6 C5A C4 CH2 0.000000 14.0270 0 - 30 C5A 6 C5A C5 CH3 0.000000 15.0350 0 - 31 C5A 7 C5A C3 CH2 0.000000 14.0270 0 - 32 C5A 7 C5A C2 CH2 0.000000 14.0270 0 - 33 C5A 7 C5A C1 CH3 0.000000 15.0350 0 - 34 C5A 7 C5A C4 CH2 0.000000 14.0270 0 - 35 C5A 7 C5A C5 CH3 0.000000 15.0350 0 - 36 C5A 8 C5A C3 CH2 0.000000 14.0270 0 - 37 C5A 8 C5A C2 CH2 0.000000 14.0270 0 - 38 C5A 8 C5A C1 CH3 0.000000 15.0350 0 - 39 C5A 8 C5A C4 CH2 0.000000 14.0270 0 - 40 C5A 8 C5A C5 CH3 0.000000 15.0350 0 - 41 C5A 9 C5A C3 CH2 0.000000 14.0270 0 - 42 C5A 9 C5A C2 CH2 0.000000 14.0270 0 - 43 C5A 9 C5A C1 CH3 0.000000 15.0350 0 - 44 C5A 9 C5A C4 CH2 0.000000 14.0270 0 - 45 C5A 9 C5A C5 CH3 0.000000 15.0350 0 - 46 C5A 10 C5A C3 CH2 0.000000 14.0270 0 - 47 C5A 10 C5A C2 CH2 0.000000 14.0270 0 - 48 C5A 10 C5A C1 CH3 0.000000 15.0350 0 - 49 C5A 10 C5A C4 CH2 0.000000 14.0270 0 - 50 C5A 10 C5A C5 CH3 0.000000 15.0350 0 - 51 C5A 11 C5A C3 CH2 0.000000 14.0270 0 - 52 C5A 11 C5A C2 CH2 0.000000 14.0270 0 - 53 C5A 11 C5A C1 CH3 0.000000 15.0350 0 - 54 C5A 11 C5A C4 CH2 0.000000 14.0270 0 - 55 C5A 11 C5A C5 CH3 0.000000 15.0350 0 - 56 C5A 12 C5A C3 CH2 0.000000 14.0270 0 - 57 C5A 12 C5A C2 CH2 0.000000 14.0270 0 - 58 C5A 12 C5A C1 CH3 0.000000 15.0350 0 - 59 C5A 12 C5A C4 CH2 0.000000 14.0270 0 - 60 C5A 12 C5A C5 CH3 0.000000 15.0350 0 - 61 C5A 13 C5A C3 CH2 0.000000 14.0270 0 - 62 C5A 13 C5A C2 CH2 0.000000 14.0270 0 - 63 C5A 13 C5A C1 CH3 0.000000 15.0350 0 - 64 C5A 13 C5A C4 CH2 0.000000 14.0270 0 - 65 C5A 13 C5A C5 CH3 0.000000 15.0350 0 - 66 C5A 14 C5A C3 CH2 0.000000 14.0270 0 - 67 C5A 14 C5A C2 CH2 0.000000 14.0270 0 - 68 C5A 14 C5A C1 CH3 0.000000 15.0350 0 - 69 C5A 14 C5A C4 CH2 0.000000 14.0270 0 - 70 C5A 14 C5A C5 CH3 0.000000 15.0350 0 - 71 C5A 15 C5A C3 CH2 0.000000 14.0270 0 - 72 C5A 15 C5A C2 CH2 0.000000 14.0270 0 - 73 C5A 15 C5A C1 CH3 0.000000 15.0350 0 - 74 C5A 15 C5A C4 CH2 0.000000 14.0270 0 - 75 C5A 15 C5A C5 CH3 0.000000 15.0350 0 - 76 C5A 16 C5A C3 CH2 0.000000 14.0270 0 - 77 C5A 16 C5A C2 CH2 0.000000 14.0270 0 - 78 C5A 16 C5A C1 CH3 0.000000 15.0350 0 - 79 C5A 16 C5A C4 CH2 0.000000 14.0270 0 - 80 C5A 16 C5A C5 CH3 0.000000 15.0350 0 - 81 C5A 17 C5A C3 CH2 0.000000 14.0270 0 - 82 C5A 17 C5A C2 CH2 0.000000 14.0270 0 - 83 C5A 17 C5A C1 CH3 0.000000 15.0350 0 - 84 C5A 17 C5A C4 CH2 0.000000 14.0270 0 - 85 C5A 17 C5A C5 CH3 0.000000 15.0350 0 - 86 C5A 18 C5A C3 CH2 0.000000 14.0270 0 - 87 C5A 18 C5A C2 CH2 0.000000 14.0270 0 - 88 C5A 18 C5A C1 CH3 0.000000 15.0350 0 - 89 C5A 18 C5A C4 CH2 0.000000 14.0270 0 - 90 C5A 18 C5A C5 CH3 0.000000 15.0350 0 - 91 C5A 19 C5A C3 CH2 0.000000 14.0270 0 - 92 C5A 19 C5A C2 CH2 0.000000 14.0270 0 - 93 C5A 19 C5A C1 CH3 0.000000 15.0350 0 - 94 C5A 19 C5A C4 CH2 0.000000 14.0270 0 - 95 C5A 19 C5A C5 CH3 0.000000 15.0350 0 - 96 C5A 20 C5A C3 CH2 0.000000 14.0270 0 - 97 C5A 20 C5A C2 CH2 0.000000 14.0270 0 - 98 C5A 20 C5A C1 CH3 0.000000 15.0350 0 - 99 C5A 20 C5A C4 CH2 0.000000 14.0270 0 - 100 C5A 20 C5A C5 CH3 0.000000 15.0350 0 - 101 C5A 21 C5A C3 CH2 0.000000 14.0270 0 - 102 C5A 21 C5A C2 CH2 0.000000 14.0270 0 - 103 C5A 21 C5A C1 CH3 0.000000 15.0350 0 - 104 C5A 21 C5A C4 CH2 0.000000 14.0270 0 - 105 C5A 21 C5A C5 CH3 0.000000 15.0350 0 - 106 C5A 22 C5A C3 CH2 0.000000 14.0270 0 - 107 C5A 22 C5A C2 CH2 0.000000 14.0270 0 - 108 C5A 22 C5A C1 CH3 0.000000 15.0350 0 - 109 C5A 22 C5A C4 CH2 0.000000 14.0270 0 - 110 C5A 22 C5A C5 CH3 0.000000 15.0350 0 - 111 C5A 23 C5A C3 CH2 0.000000 14.0270 0 - 112 C5A 23 C5A C2 CH2 0.000000 14.0270 0 - 113 C5A 23 C5A C1 CH3 0.000000 15.0350 0 - 114 C5A 23 C5A C4 CH2 0.000000 14.0270 0 - 115 C5A 23 C5A C5 CH3 0.000000 15.0350 0 - 116 C5A 24 C5A C3 CH2 0.000000 14.0270 0 - 117 C5A 24 C5A C2 CH2 0.000000 14.0270 0 - 118 C5A 24 C5A C1 CH3 0.000000 15.0350 0 - 119 C5A 24 C5A C4 CH2 0.000000 14.0270 0 - 120 C5A 24 C5A C5 CH3 0.000000 15.0350 0 - 121 C5A 25 C5A C3 CH2 0.000000 14.0270 0 - 122 C5A 25 C5A C2 CH2 0.000000 14.0270 0 - 123 C5A 25 C5A C1 CH3 0.000000 15.0350 0 - 124 C5A 25 C5A C4 CH2 0.000000 14.0270 0 - 125 C5A 25 C5A C5 CH3 0.000000 15.0350 0 - 126 C5A 26 C5A C3 CH2 0.000000 14.0270 0 - 127 C5A 26 C5A C2 CH2 0.000000 14.0270 0 - 128 C5A 26 C5A C1 CH3 0.000000 15.0350 0 - 129 C5A 26 C5A C4 CH2 0.000000 14.0270 0 - 130 C5A 26 C5A C5 CH3 0.000000 15.0350 0 - 131 C5A 27 C5A C3 CH2 0.000000 14.0270 0 - 132 C5A 27 C5A C2 CH2 0.000000 14.0270 0 - 133 C5A 27 C5A C1 CH3 0.000000 15.0350 0 - 134 C5A 27 C5A C4 CH2 0.000000 14.0270 0 - 135 C5A 27 C5A C5 CH3 0.000000 15.0350 0 - 136 C5A 28 C5A C3 CH2 0.000000 14.0270 0 - 137 C5A 28 C5A C2 CH2 0.000000 14.0270 0 - 138 C5A 28 C5A C1 CH3 0.000000 15.0350 0 - 139 C5A 28 C5A C4 CH2 0.000000 14.0270 0 - 140 C5A 28 C5A C5 CH3 0.000000 15.0350 0 - 141 C5A 29 C5A C3 CH2 0.000000 14.0270 0 - 142 C5A 29 C5A C2 CH2 0.000000 14.0270 0 - 143 C5A 29 C5A C1 CH3 0.000000 15.0350 0 - 144 C5A 29 C5A C4 CH2 0.000000 14.0270 0 - 145 C5A 29 C5A C5 CH3 0.000000 15.0350 0 - 146 C5A 30 C5A C3 CH2 0.000000 14.0270 0 - 147 C5A 30 C5A C2 CH2 0.000000 14.0270 0 - 148 C5A 30 C5A C1 CH3 0.000000 15.0350 0 - 149 C5A 30 C5A C4 CH2 0.000000 14.0270 0 - 150 C5A 30 C5A C5 CH3 0.000000 15.0350 0 - 151 C5A 31 C5A C3 CH2 0.000000 14.0270 0 - 152 C5A 31 C5A C2 CH2 0.000000 14.0270 0 - 153 C5A 31 C5A C1 CH3 0.000000 15.0350 0 - 154 C5A 31 C5A C4 CH2 0.000000 14.0270 0 - 155 C5A 31 C5A C5 CH3 0.000000 15.0350 0 - 156 C5A 32 C5A C3 CH2 0.000000 14.0270 0 - 157 C5A 32 C5A C2 CH2 0.000000 14.0270 0 - 158 C5A 32 C5A C1 CH3 0.000000 15.0350 0 - 159 C5A 32 C5A C4 CH2 0.000000 14.0270 0 - 160 C5A 32 C5A C5 CH3 0.000000 15.0350 0 - 161 C5A 33 C5A C3 CH2 0.000000 14.0270 0 - 162 C5A 33 C5A C2 CH2 0.000000 14.0270 0 - 163 C5A 33 C5A C1 CH3 0.000000 15.0350 0 - 164 C5A 33 C5A C4 CH2 0.000000 14.0270 0 - 165 C5A 33 C5A C5 CH3 0.000000 15.0350 0 - 166 C5A 34 C5A C3 CH2 0.000000 14.0270 0 - 167 C5A 34 C5A C2 CH2 0.000000 14.0270 0 - 168 C5A 34 C5A C1 CH3 0.000000 15.0350 0 - 169 C5A 34 C5A C4 CH2 0.000000 14.0270 0 - 170 C5A 34 C5A C5 CH3 0.000000 15.0350 0 - 171 C5A 35 C5A C3 CH2 0.000000 14.0270 0 - 172 C5A 35 C5A C2 CH2 0.000000 14.0270 0 - 173 C5A 35 C5A C1 CH3 0.000000 15.0350 0 - 174 C5A 35 C5A C4 CH2 0.000000 14.0270 0 - 175 C5A 35 C5A C5 CH3 0.000000 15.0350 0 - 176 C5A 36 C5A C3 CH2 0.000000 14.0270 0 - 177 C5A 36 C5A C2 CH2 0.000000 14.0270 0 - 178 C5A 36 C5A C1 CH3 0.000000 15.0350 0 - 179 C5A 36 C5A C4 CH2 0.000000 14.0270 0 - 180 C5A 36 C5A C5 CH3 0.000000 15.0350 0 - 181 C5A 37 C5A C3 CH2 0.000000 14.0270 0 - 182 C5A 37 C5A C2 CH2 0.000000 14.0270 0 - 183 C5A 37 C5A C1 CH3 0.000000 15.0350 0 - 184 C5A 37 C5A C4 CH2 0.000000 14.0270 0 - 185 C5A 37 C5A C5 CH3 0.000000 15.0350 0 - 186 C5A 38 C5A C3 CH2 0.000000 14.0270 0 - 187 C5A 38 C5A C2 CH2 0.000000 14.0270 0 - 188 C5A 38 C5A C1 CH3 0.000000 15.0350 0 - 189 C5A 38 C5A C4 CH2 0.000000 14.0270 0 - 190 C5A 38 C5A C5 CH3 0.000000 15.0350 0 - 191 C5A 39 C5A C3 CH2 0.000000 14.0270 0 - 192 C5A 39 C5A C2 CH2 0.000000 14.0270 0 - 193 C5A 39 C5A C1 CH3 0.000000 15.0350 0 - 194 C5A 39 C5A C4 CH2 0.000000 14.0270 0 - 195 C5A 39 C5A C5 CH3 0.000000 15.0350 0 - 196 C5A 40 C5A C3 CH2 0.000000 14.0270 0 - 197 C5A 40 C5A C2 CH2 0.000000 14.0270 0 - 198 C5A 40 C5A C1 CH3 0.000000 15.0350 0 - 199 C5A 40 C5A C4 CH2 0.000000 14.0270 0 - 200 C5A 40 C5A C5 CH3 0.000000 15.0350 0 - 201 C5A 41 C5A C3 CH2 0.000000 14.0270 0 - 202 C5A 41 C5A C2 CH2 0.000000 14.0270 0 - 203 C5A 41 C5A C1 CH3 0.000000 15.0350 0 - 204 C5A 41 C5A C4 CH2 0.000000 14.0270 0 - 205 C5A 41 C5A C5 CH3 0.000000 15.0350 0 - 206 C5A 42 C5A C3 CH2 0.000000 14.0270 0 - 207 C5A 42 C5A C2 CH2 0.000000 14.0270 0 - 208 C5A 42 C5A C1 CH3 0.000000 15.0350 0 - 209 C5A 42 C5A C4 CH2 0.000000 14.0270 0 - 210 C5A 42 C5A C5 CH3 0.000000 15.0350 0 - 211 C5A 43 C5A C3 CH2 0.000000 14.0270 0 - 212 C5A 43 C5A C2 CH2 0.000000 14.0270 0 - 213 C5A 43 C5A C1 CH3 0.000000 15.0350 0 - 214 C5A 43 C5A C4 CH2 0.000000 14.0270 0 - 215 C5A 43 C5A C5 CH3 0.000000 15.0350 0 - 216 C5A 44 C5A C3 CH2 0.000000 14.0270 0 - 217 C5A 44 C5A C2 CH2 0.000000 14.0270 0 - 218 C5A 44 C5A C1 CH3 0.000000 15.0350 0 - 219 C5A 44 C5A C4 CH2 0.000000 14.0270 0 - 220 C5A 44 C5A C5 CH3 0.000000 15.0350 0 - 221 C5A 45 C5A C3 CH2 0.000000 14.0270 0 - 222 C5A 45 C5A C2 CH2 0.000000 14.0270 0 - 223 C5A 45 C5A C1 CH3 0.000000 15.0350 0 - 224 C5A 45 C5A C4 CH2 0.000000 14.0270 0 - 225 C5A 45 C5A C5 CH3 0.000000 15.0350 0 - 226 C5A 46 C5A C3 CH2 0.000000 14.0270 0 - 227 C5A 46 C5A C2 CH2 0.000000 14.0270 0 - 228 C5A 46 C5A C1 CH3 0.000000 15.0350 0 - 229 C5A 46 C5A C4 CH2 0.000000 14.0270 0 - 230 C5A 46 C5A C5 CH3 0.000000 15.0350 0 - 231 C5A 47 C5A C3 CH2 0.000000 14.0270 0 - 232 C5A 47 C5A C2 CH2 0.000000 14.0270 0 - 233 C5A 47 C5A C1 CH3 0.000000 15.0350 0 - 234 C5A 47 C5A C4 CH2 0.000000 14.0270 0 - 235 C5A 47 C5A C5 CH3 0.000000 15.0350 0 - 236 C5A 48 C5A C3 CH2 0.000000 14.0270 0 - 237 C5A 48 C5A C2 CH2 0.000000 14.0270 0 - 238 C5A 48 C5A C1 CH3 0.000000 15.0350 0 - 239 C5A 48 C5A C4 CH2 0.000000 14.0270 0 - 240 C5A 48 C5A C5 CH3 0.000000 15.0350 0 - 241 C5A 49 C5A C3 CH2 0.000000 14.0270 0 - 242 C5A 49 C5A C2 CH2 0.000000 14.0270 0 - 243 C5A 49 C5A C1 CH3 0.000000 15.0350 0 - 244 C5A 49 C5A C4 CH2 0.000000 14.0270 0 - 245 C5A 49 C5A C5 CH3 0.000000 15.0350 0 - 246 C5A 50 C5A C3 CH2 0.000000 14.0270 0 - 247 C5A 50 C5A C2 CH2 0.000000 14.0270 0 - 248 C5A 50 C5A C1 CH3 0.000000 15.0350 0 - 249 C5A 50 C5A C4 CH2 0.000000 14.0270 0 - 250 C5A 50 C5A C5 CH3 0.000000 15.0350 0 - 251 C5A 51 C5A C3 CH2 0.000000 14.0270 0 - 252 C5A 51 C5A C2 CH2 0.000000 14.0270 0 - 253 C5A 51 C5A C1 CH3 0.000000 15.0350 0 - 254 C5A 51 C5A C4 CH2 0.000000 14.0270 0 - 255 C5A 51 C5A C5 CH3 0.000000 15.0350 0 - 256 C5A 52 C5A C3 CH2 0.000000 14.0270 0 - 257 C5A 52 C5A C2 CH2 0.000000 14.0270 0 - 258 C5A 52 C5A C1 CH3 0.000000 15.0350 0 - 259 C5A 52 C5A C4 CH2 0.000000 14.0270 0 - 260 C5A 52 C5A C5 CH3 0.000000 15.0350 0 - 261 C5A 53 C5A C3 CH2 0.000000 14.0270 0 - 262 C5A 53 C5A C2 CH2 0.000000 14.0270 0 - 263 C5A 53 C5A C1 CH3 0.000000 15.0350 0 - 264 C5A 53 C5A C4 CH2 0.000000 14.0270 0 - 265 C5A 53 C5A C5 CH3 0.000000 15.0350 0 - 266 C5A 54 C5A C3 CH2 0.000000 14.0270 0 - 267 C5A 54 C5A C2 CH2 0.000000 14.0270 0 - 268 C5A 54 C5A C1 CH3 0.000000 15.0350 0 - 269 C5A 54 C5A C4 CH2 0.000000 14.0270 0 - 270 C5A 54 C5A C5 CH3 0.000000 15.0350 0 - 271 C5A 55 C5A C3 CH2 0.000000 14.0270 0 - 272 C5A 55 C5A C2 CH2 0.000000 14.0270 0 - 273 C5A 55 C5A C1 CH3 0.000000 15.0350 0 - 274 C5A 55 C5A C4 CH2 0.000000 14.0270 0 - 275 C5A 55 C5A C5 CH3 0.000000 15.0350 0 - 276 C5A 56 C5A C3 CH2 0.000000 14.0270 0 - 277 C5A 56 C5A C2 CH2 0.000000 14.0270 0 - 278 C5A 56 C5A C1 CH3 0.000000 15.0350 0 - 279 C5A 56 C5A C4 CH2 0.000000 14.0270 0 - 280 C5A 56 C5A C5 CH3 0.000000 15.0350 0 - 281 C5A 57 C5A C3 CH2 0.000000 14.0270 0 - 282 C5A 57 C5A C2 CH2 0.000000 14.0270 0 - 283 C5A 57 C5A C1 CH3 0.000000 15.0350 0 - 284 C5A 57 C5A C4 CH2 0.000000 14.0270 0 - 285 C5A 57 C5A C5 CH3 0.000000 15.0350 0 - 286 C5A 58 C5A C3 CH2 0.000000 14.0270 0 - 287 C5A 58 C5A C2 CH2 0.000000 14.0270 0 - 288 C5A 58 C5A C1 CH3 0.000000 15.0350 0 - 289 C5A 58 C5A C4 CH2 0.000000 14.0270 0 - 290 C5A 58 C5A C5 CH3 0.000000 15.0350 0 - 291 C5A 59 C5A C3 CH2 0.000000 14.0270 0 - 292 C5A 59 C5A C2 CH2 0.000000 14.0270 0 - 293 C5A 59 C5A C1 CH3 0.000000 15.0350 0 - 294 C5A 59 C5A C4 CH2 0.000000 14.0270 0 - 295 C5A 59 C5A C5 CH3 0.000000 15.0350 0 - 296 C5A 60 C5A C3 CH2 0.000000 14.0270 0 - 297 C5A 60 C5A C2 CH2 0.000000 14.0270 0 - 298 C5A 60 C5A C1 CH3 0.000000 15.0350 0 - 299 C5A 60 C5A C4 CH2 0.000000 14.0270 0 - 300 C5A 60 C5A C5 CH3 0.000000 15.0350 0 - 301 C5A 61 C5A C3 CH2 0.000000 14.0270 0 - 302 C5A 61 C5A C2 CH2 0.000000 14.0270 0 - 303 C5A 61 C5A C1 CH3 0.000000 15.0350 0 - 304 C5A 61 C5A C4 CH2 0.000000 14.0270 0 - 305 C5A 61 C5A C5 CH3 0.000000 15.0350 0 - 306 C5A 62 C5A C3 CH2 0.000000 14.0270 0 - 307 C5A 62 C5A C2 CH2 0.000000 14.0270 0 - 308 C5A 62 C5A C1 CH3 0.000000 15.0350 0 - 309 C5A 62 C5A C4 CH2 0.000000 14.0270 0 - 310 C5A 62 C5A C5 CH3 0.000000 15.0350 0 - 311 C5A 63 C5A C3 CH2 0.000000 14.0270 0 - 312 C5A 63 C5A C2 CH2 0.000000 14.0270 0 - 313 C5A 63 C5A C1 CH3 0.000000 15.0350 0 - 314 C5A 63 C5A C4 CH2 0.000000 14.0270 0 - 315 C5A 63 C5A C5 CH3 0.000000 15.0350 0 - 316 C5A 64 C5A C3 CH2 0.000000 14.0270 0 - 317 C5A 64 C5A C2 CH2 0.000000 14.0270 0 - 318 C5A 64 C5A C1 CH3 0.000000 15.0350 0 - 319 C5A 64 C5A C4 CH2 0.000000 14.0270 0 - 320 C5A 64 C5A C5 CH3 0.000000 15.0350 0 - 321 C5A 65 C5A C3 CH2 0.000000 14.0270 0 - 322 C5A 65 C5A C2 CH2 0.000000 14.0270 0 - 323 C5A 65 C5A C1 CH3 0.000000 15.0350 0 - 324 C5A 65 C5A C4 CH2 0.000000 14.0270 0 - 325 C5A 65 C5A C5 CH3 0.000000 15.0350 0 - 326 C5A 66 C5A C3 CH2 0.000000 14.0270 0 - 327 C5A 66 C5A C2 CH2 0.000000 14.0270 0 - 328 C5A 66 C5A C1 CH3 0.000000 15.0350 0 - 329 C5A 66 C5A C4 CH2 0.000000 14.0270 0 - 330 C5A 66 C5A C5 CH3 0.000000 15.0350 0 - 331 C5A 67 C5A C3 CH2 0.000000 14.0270 0 - 332 C5A 67 C5A C2 CH2 0.000000 14.0270 0 - 333 C5A 67 C5A C1 CH3 0.000000 15.0350 0 - 334 C5A 67 C5A C4 CH2 0.000000 14.0270 0 - 335 C5A 67 C5A C5 CH3 0.000000 15.0350 0 - 336 C5A 68 C5A C3 CH2 0.000000 14.0270 0 - 337 C5A 68 C5A C2 CH2 0.000000 14.0270 0 - 338 C5A 68 C5A C1 CH3 0.000000 15.0350 0 - 339 C5A 68 C5A C4 CH2 0.000000 14.0270 0 - 340 C5A 68 C5A C5 CH3 0.000000 15.0350 0 - 341 C5A 69 C5A C3 CH2 0.000000 14.0270 0 - 342 C5A 69 C5A C2 CH2 0.000000 14.0270 0 - 343 C5A 69 C5A C1 CH3 0.000000 15.0350 0 - 344 C5A 69 C5A C4 CH2 0.000000 14.0270 0 - 345 C5A 69 C5A C5 CH3 0.000000 15.0350 0 - 346 C5A 70 C5A C3 CH2 0.000000 14.0270 0 - 347 C5A 70 C5A C2 CH2 0.000000 14.0270 0 - 348 C5A 70 C5A C1 CH3 0.000000 15.0350 0 - 349 C5A 70 C5A C4 CH2 0.000000 14.0270 0 - 350 C5A 70 C5A C5 CH3 0.000000 15.0350 0 - 351 C5A 71 C5A C3 CH2 0.000000 14.0270 0 - 352 C5A 71 C5A C2 CH2 0.000000 14.0270 0 - 353 C5A 71 C5A C1 CH3 0.000000 15.0350 0 - 354 C5A 71 C5A C4 CH2 0.000000 14.0270 0 - 355 C5A 71 C5A C5 CH3 0.000000 15.0350 0 - 356 C5A 72 C5A C3 CH2 0.000000 14.0270 0 - 357 C5A 72 C5A C2 CH2 0.000000 14.0270 0 - 358 C5A 72 C5A C1 CH3 0.000000 15.0350 0 - 359 C5A 72 C5A C4 CH2 0.000000 14.0270 0 - 360 C5A 72 C5A C5 CH3 0.000000 15.0350 0 - 361 C5A 73 C5A C3 CH2 0.000000 14.0270 0 - 362 C5A 73 C5A C2 CH2 0.000000 14.0270 0 - 363 C5A 73 C5A C1 CH3 0.000000 15.0350 0 - 364 C5A 73 C5A C4 CH2 0.000000 14.0270 0 - 365 C5A 73 C5A C5 CH3 0.000000 15.0350 0 - 366 C5A 74 C5A C3 CH2 0.000000 14.0270 0 - 367 C5A 74 C5A C2 CH2 0.000000 14.0270 0 - 368 C5A 74 C5A C1 CH3 0.000000 15.0350 0 - 369 C5A 74 C5A C4 CH2 0.000000 14.0270 0 - 370 C5A 74 C5A C5 CH3 0.000000 15.0350 0 - 371 C5A 75 C5A C3 CH2 0.000000 14.0270 0 - 372 C5A 75 C5A C2 CH2 0.000000 14.0270 0 - 373 C5A 75 C5A C1 CH3 0.000000 15.0350 0 - 374 C5A 75 C5A C4 CH2 0.000000 14.0270 0 - 375 C5A 75 C5A C5 CH3 0.000000 15.0350 0 - 376 C5A 76 C5A C3 CH2 0.000000 14.0270 0 - 377 C5A 76 C5A C2 CH2 0.000000 14.0270 0 - 378 C5A 76 C5A C1 CH3 0.000000 15.0350 0 - 379 C5A 76 C5A C4 CH2 0.000000 14.0270 0 - 380 C5A 76 C5A C5 CH3 0.000000 15.0350 0 - 381 C5A 77 C5A C3 CH2 0.000000 14.0270 0 - 382 C5A 77 C5A C2 CH2 0.000000 14.0270 0 - 383 C5A 77 C5A C1 CH3 0.000000 15.0350 0 - 384 C5A 77 C5A C4 CH2 0.000000 14.0270 0 - 385 C5A 77 C5A C5 CH3 0.000000 15.0350 0 - 386 C5A 78 C5A C3 CH2 0.000000 14.0270 0 - 387 C5A 78 C5A C2 CH2 0.000000 14.0270 0 - 388 C5A 78 C5A C1 CH3 0.000000 15.0350 0 - 389 C5A 78 C5A C4 CH2 0.000000 14.0270 0 - 390 C5A 78 C5A C5 CH3 0.000000 15.0350 0 - 391 C5A 79 C5A C3 CH2 0.000000 14.0270 0 - 392 C5A 79 C5A C2 CH2 0.000000 14.0270 0 - 393 C5A 79 C5A C1 CH3 0.000000 15.0350 0 - 394 C5A 79 C5A C4 CH2 0.000000 14.0270 0 - 395 C5A 79 C5A C5 CH3 0.000000 15.0350 0 - 396 C5A 80 C5A C3 CH2 0.000000 14.0270 0 - 397 C5A 80 C5A C2 CH2 0.000000 14.0270 0 - 398 C5A 80 C5A C1 CH3 0.000000 15.0350 0 - 399 C5A 80 C5A C4 CH2 0.000000 14.0270 0 - 400 C5A 80 C5A C5 CH3 0.000000 15.0350 0 - 401 C5A 81 C5A C3 CH2 0.000000 14.0270 0 - 402 C5A 81 C5A C2 CH2 0.000000 14.0270 0 - 403 C5A 81 C5A C1 CH3 0.000000 15.0350 0 - 404 C5A 81 C5A C4 CH2 0.000000 14.0270 0 - 405 C5A 81 C5A C5 CH3 0.000000 15.0350 0 - 406 C5A 82 C5A C3 CH2 0.000000 14.0270 0 - 407 C5A 82 C5A C2 CH2 0.000000 14.0270 0 - 408 C5A 82 C5A C1 CH3 0.000000 15.0350 0 - 409 C5A 82 C5A C4 CH2 0.000000 14.0270 0 - 410 C5A 82 C5A C5 CH3 0.000000 15.0350 0 - 411 C5A 83 C5A C3 CH2 0.000000 14.0270 0 - 412 C5A 83 C5A C2 CH2 0.000000 14.0270 0 - 413 C5A 83 C5A C1 CH3 0.000000 15.0350 0 - 414 C5A 83 C5A C4 CH2 0.000000 14.0270 0 - 415 C5A 83 C5A C5 CH3 0.000000 15.0350 0 - 416 C5A 84 C5A C3 CH2 0.000000 14.0270 0 - 417 C5A 84 C5A C2 CH2 0.000000 14.0270 0 - 418 C5A 84 C5A C1 CH3 0.000000 15.0350 0 - 419 C5A 84 C5A C4 CH2 0.000000 14.0270 0 - 420 C5A 84 C5A C5 CH3 0.000000 15.0350 0 - 421 C5A 85 C5A C3 CH2 0.000000 14.0270 0 - 422 C5A 85 C5A C2 CH2 0.000000 14.0270 0 - 423 C5A 85 C5A C1 CH3 0.000000 15.0350 0 - 424 C5A 85 C5A C4 CH2 0.000000 14.0270 0 - 425 C5A 85 C5A C5 CH3 0.000000 15.0350 0 - 426 C5A 86 C5A C3 CH2 0.000000 14.0270 0 - 427 C5A 86 C5A C2 CH2 0.000000 14.0270 0 - 428 C5A 86 C5A C1 CH3 0.000000 15.0350 0 - 429 C5A 86 C5A C4 CH2 0.000000 14.0270 0 - 430 C5A 86 C5A C5 CH3 0.000000 15.0350 0 - 431 C5A 87 C5A C3 CH2 0.000000 14.0270 0 - 432 C5A 87 C5A C2 CH2 0.000000 14.0270 0 - 433 C5A 87 C5A C1 CH3 0.000000 15.0350 0 - 434 C5A 87 C5A C4 CH2 0.000000 14.0270 0 - 435 C5A 87 C5A C5 CH3 0.000000 15.0350 0 - 436 C5A 88 C5A C3 CH2 0.000000 14.0270 0 - 437 C5A 88 C5A C2 CH2 0.000000 14.0270 0 - 438 C5A 88 C5A C1 CH3 0.000000 15.0350 0 - 439 C5A 88 C5A C4 CH2 0.000000 14.0270 0 - 440 C5A 88 C5A C5 CH3 0.000000 15.0350 0 - 441 C5A 89 C5A C3 CH2 0.000000 14.0270 0 - 442 C5A 89 C5A C2 CH2 0.000000 14.0270 0 - 443 C5A 89 C5A C1 CH3 0.000000 15.0350 0 - 444 C5A 89 C5A C4 CH2 0.000000 14.0270 0 - 445 C5A 89 C5A C5 CH3 0.000000 15.0350 0 - 446 C5A 90 C5A C3 CH2 0.000000 14.0270 0 - 447 C5A 90 C5A C2 CH2 0.000000 14.0270 0 - 448 C5A 90 C5A C1 CH3 0.000000 15.0350 0 - 449 C5A 90 C5A C4 CH2 0.000000 14.0270 0 - 450 C5A 90 C5A C5 CH3 0.000000 15.0350 0 - 451 C5A 91 C5A C3 CH2 0.000000 14.0270 0 - 452 C5A 91 C5A C2 CH2 0.000000 14.0270 0 - 453 C5A 91 C5A C1 CH3 0.000000 15.0350 0 - 454 C5A 91 C5A C4 CH2 0.000000 14.0270 0 - 455 C5A 91 C5A C5 CH3 0.000000 15.0350 0 - 456 C5A 92 C5A C3 CH2 0.000000 14.0270 0 - 457 C5A 92 C5A C2 CH2 0.000000 14.0270 0 - 458 C5A 92 C5A C1 CH3 0.000000 15.0350 0 - 459 C5A 92 C5A C4 CH2 0.000000 14.0270 0 - 460 C5A 92 C5A C5 CH3 0.000000 15.0350 0 - 461 C5A 93 C5A C3 CH2 0.000000 14.0270 0 - 462 C5A 93 C5A C2 CH2 0.000000 14.0270 0 - 463 C5A 93 C5A C1 CH3 0.000000 15.0350 0 - 464 C5A 93 C5A C4 CH2 0.000000 14.0270 0 - 465 C5A 93 C5A C5 CH3 0.000000 15.0350 0 - 466 C5A 94 C5A C3 CH2 0.000000 14.0270 0 - 467 C5A 94 C5A C2 CH2 0.000000 14.0270 0 - 468 C5A 94 C5A C1 CH3 0.000000 15.0350 0 - 469 C5A 94 C5A C4 CH2 0.000000 14.0270 0 - 470 C5A 94 C5A C5 CH3 0.000000 15.0350 0 - 471 C5A 95 C5A C3 CH2 0.000000 14.0270 0 - 472 C5A 95 C5A C2 CH2 0.000000 14.0270 0 - 473 C5A 95 C5A C1 CH3 0.000000 15.0350 0 - 474 C5A 95 C5A C4 CH2 0.000000 14.0270 0 - 475 C5A 95 C5A C5 CH3 0.000000 15.0350 0 - 476 C5A 96 C5A C3 CH2 0.000000 14.0270 0 - 477 C5A 96 C5A C2 CH2 0.000000 14.0270 0 - 478 C5A 96 C5A C1 CH3 0.000000 15.0350 0 - 479 C5A 96 C5A C4 CH2 0.000000 14.0270 0 - 480 C5A 96 C5A C5 CH3 0.000000 15.0350 0 - 481 C5A 97 C5A C3 CH2 0.000000 14.0270 0 - 482 C5A 97 C5A C2 CH2 0.000000 14.0270 0 - 483 C5A 97 C5A C1 CH3 0.000000 15.0350 0 - 484 C5A 97 C5A C4 CH2 0.000000 14.0270 0 - 485 C5A 97 C5A C5 CH3 0.000000 15.0350 0 - 486 C5A 98 C5A C3 CH2 0.000000 14.0270 0 - 487 C5A 98 C5A C2 CH2 0.000000 14.0270 0 - 488 C5A 98 C5A C1 CH3 0.000000 15.0350 0 - 489 C5A 98 C5A C4 CH2 0.000000 14.0270 0 - 490 C5A 98 C5A C5 CH3 0.000000 15.0350 0 - 491 C5A 99 C5A C3 CH2 0.000000 14.0270 0 - 492 C5A 99 C5A C2 CH2 0.000000 14.0270 0 - 493 C5A 99 C5A C1 CH3 0.000000 15.0350 0 - 494 C5A 99 C5A C4 CH2 0.000000 14.0270 0 - 495 C5A 99 C5A C5 CH3 0.000000 15.0350 0 - 496 C5A 100 C5A C3 CH2 0.000000 14.0270 0 - 497 C5A 100 C5A C2 CH2 0.000000 14.0270 0 - 498 C5A 100 C5A C1 CH3 0.000000 15.0350 0 - 499 C5A 100 C5A C4 CH2 0.000000 14.0270 0 - 500 C5A 100 C5A C5 CH3 0.000000 15.0350 0 - 501 C5A 101 C5A C3 CH2 0.000000 14.0270 0 - 502 C5A 101 C5A C2 CH2 0.000000 14.0270 0 - 503 C5A 101 C5A C1 CH3 0.000000 15.0350 0 - 504 C5A 101 C5A C4 CH2 0.000000 14.0270 0 - 505 C5A 101 C5A C5 CH3 0.000000 15.0350 0 - 506 C5A 102 C5A C3 CH2 0.000000 14.0270 0 - 507 C5A 102 C5A C2 CH2 0.000000 14.0270 0 - 508 C5A 102 C5A C1 CH3 0.000000 15.0350 0 - 509 C5A 102 C5A C4 CH2 0.000000 14.0270 0 - 510 C5A 102 C5A C5 CH3 0.000000 15.0350 0 - 511 C5A 103 C5A C3 CH2 0.000000 14.0270 0 - 512 C5A 103 C5A C2 CH2 0.000000 14.0270 0 - 513 C5A 103 C5A C1 CH3 0.000000 15.0350 0 - 514 C5A 103 C5A C4 CH2 0.000000 14.0270 0 - 515 C5A 103 C5A C5 CH3 0.000000 15.0350 0 - 516 C5A 104 C5A C3 CH2 0.000000 14.0270 0 - 517 C5A 104 C5A C2 CH2 0.000000 14.0270 0 - 518 C5A 104 C5A C1 CH3 0.000000 15.0350 0 - 519 C5A 104 C5A C4 CH2 0.000000 14.0270 0 - 520 C5A 104 C5A C5 CH3 0.000000 15.0350 0 - 521 C5A 105 C5A C3 CH2 0.000000 14.0270 0 - 522 C5A 105 C5A C2 CH2 0.000000 14.0270 0 - 523 C5A 105 C5A C1 CH3 0.000000 15.0350 0 - 524 C5A 105 C5A C4 CH2 0.000000 14.0270 0 - 525 C5A 105 C5A C5 CH3 0.000000 15.0350 0 - 526 C5A 106 C5A C3 CH2 0.000000 14.0270 0 - 527 C5A 106 C5A C2 CH2 0.000000 14.0270 0 - 528 C5A 106 C5A C1 CH3 0.000000 15.0350 0 - 529 C5A 106 C5A C4 CH2 0.000000 14.0270 0 - 530 C5A 106 C5A C5 CH3 0.000000 15.0350 0 - 531 C5A 107 C5A C3 CH2 0.000000 14.0270 0 - 532 C5A 107 C5A C2 CH2 0.000000 14.0270 0 - 533 C5A 107 C5A C1 CH3 0.000000 15.0350 0 - 534 C5A 107 C5A C4 CH2 0.000000 14.0270 0 - 535 C5A 107 C5A C5 CH3 0.000000 15.0350 0 - 536 C5A 108 C5A C3 CH2 0.000000 14.0270 0 - 537 C5A 108 C5A C2 CH2 0.000000 14.0270 0 - 538 C5A 108 C5A C1 CH3 0.000000 15.0350 0 - 539 C5A 108 C5A C4 CH2 0.000000 14.0270 0 - 540 C5A 108 C5A C5 CH3 0.000000 15.0350 0 - 541 C5A 109 C5A C3 CH2 0.000000 14.0270 0 - 542 C5A 109 C5A C2 CH2 0.000000 14.0270 0 - 543 C5A 109 C5A C1 CH3 0.000000 15.0350 0 - 544 C5A 109 C5A C4 CH2 0.000000 14.0270 0 - 545 C5A 109 C5A C5 CH3 0.000000 15.0350 0 - 546 C5A 110 C5A C3 CH2 0.000000 14.0270 0 - 547 C5A 110 C5A C2 CH2 0.000000 14.0270 0 - 548 C5A 110 C5A C1 CH3 0.000000 15.0350 0 - 549 C5A 110 C5A C4 CH2 0.000000 14.0270 0 - 550 C5A 110 C5A C5 CH3 0.000000 15.0350 0 - 551 C5A 111 C5A C3 CH2 0.000000 14.0270 0 - 552 C5A 111 C5A C2 CH2 0.000000 14.0270 0 - 553 C5A 111 C5A C1 CH3 0.000000 15.0350 0 - 554 C5A 111 C5A C4 CH2 0.000000 14.0270 0 - 555 C5A 111 C5A C5 CH3 0.000000 15.0350 0 - 556 C5A 112 C5A C3 CH2 0.000000 14.0270 0 - 557 C5A 112 C5A C2 CH2 0.000000 14.0270 0 - 558 C5A 112 C5A C1 CH3 0.000000 15.0350 0 - 559 C5A 112 C5A C4 CH2 0.000000 14.0270 0 - 560 C5A 112 C5A C5 CH3 0.000000 15.0350 0 - 561 C5A 113 C5A C3 CH2 0.000000 14.0270 0 - 562 C5A 113 C5A C2 CH2 0.000000 14.0270 0 - 563 C5A 113 C5A C1 CH3 0.000000 15.0350 0 - 564 C5A 113 C5A C4 CH2 0.000000 14.0270 0 - 565 C5A 113 C5A C5 CH3 0.000000 15.0350 0 - 566 C5A 114 C5A C3 CH2 0.000000 14.0270 0 - 567 C5A 114 C5A C2 CH2 0.000000 14.0270 0 - 568 C5A 114 C5A C1 CH3 0.000000 15.0350 0 - 569 C5A 114 C5A C4 CH2 0.000000 14.0270 0 - 570 C5A 114 C5A C5 CH3 0.000000 15.0350 0 - 571 C5A 115 C5A C3 CH2 0.000000 14.0270 0 - 572 C5A 115 C5A C2 CH2 0.000000 14.0270 0 - 573 C5A 115 C5A C1 CH3 0.000000 15.0350 0 - 574 C5A 115 C5A C4 CH2 0.000000 14.0270 0 - 575 C5A 115 C5A C5 CH3 0.000000 15.0350 0 - 576 C5A 116 C5A C3 CH2 0.000000 14.0270 0 - 577 C5A 116 C5A C2 CH2 0.000000 14.0270 0 - 578 C5A 116 C5A C1 CH3 0.000000 15.0350 0 - 579 C5A 116 C5A C4 CH2 0.000000 14.0270 0 - 580 C5A 116 C5A C5 CH3 0.000000 15.0350 0 - 581 C5A 117 C5A C3 CH2 0.000000 14.0270 0 - 582 C5A 117 C5A C2 CH2 0.000000 14.0270 0 - 583 C5A 117 C5A C1 CH3 0.000000 15.0350 0 - 584 C5A 117 C5A C4 CH2 0.000000 14.0270 0 - 585 C5A 117 C5A C5 CH3 0.000000 15.0350 0 - 586 C5A 118 C5A C3 CH2 0.000000 14.0270 0 - 587 C5A 118 C5A C2 CH2 0.000000 14.0270 0 - 588 C5A 118 C5A C1 CH3 0.000000 15.0350 0 - 589 C5A 118 C5A C4 CH2 0.000000 14.0270 0 - 590 C5A 118 C5A C5 CH3 0.000000 15.0350 0 - 591 C5A 119 C5A C3 CH2 0.000000 14.0270 0 - 592 C5A 119 C5A C2 CH2 0.000000 14.0270 0 - 593 C5A 119 C5A C1 CH3 0.000000 15.0350 0 - 594 C5A 119 C5A C4 CH2 0.000000 14.0270 0 - 595 C5A 119 C5A C5 CH3 0.000000 15.0350 0 - 596 C5A 120 C5A C3 CH2 0.000000 14.0270 0 - 597 C5A 120 C5A C2 CH2 0.000000 14.0270 0 - 598 C5A 120 C5A C1 CH3 0.000000 15.0350 0 - 599 C5A 120 C5A C4 CH2 0.000000 14.0270 0 - 600 C5A 120 C5A C5 CH3 0.000000 15.0350 0 - 601 C5A 121 C5A C3 CH2 0.000000 14.0270 0 - 602 C5A 121 C5A C2 CH2 0.000000 14.0270 0 - 603 C5A 121 C5A C1 CH3 0.000000 15.0350 0 - 604 C5A 121 C5A C4 CH2 0.000000 14.0270 0 - 605 C5A 121 C5A C5 CH3 0.000000 15.0350 0 - 606 C5A 122 C5A C3 CH2 0.000000 14.0270 0 - 607 C5A 122 C5A C2 CH2 0.000000 14.0270 0 - 608 C5A 122 C5A C1 CH3 0.000000 15.0350 0 - 609 C5A 122 C5A C4 CH2 0.000000 14.0270 0 - 610 C5A 122 C5A C5 CH3 0.000000 15.0350 0 - 611 C5A 123 C5A C3 CH2 0.000000 14.0270 0 - 612 C5A 123 C5A C2 CH2 0.000000 14.0270 0 - 613 C5A 123 C5A C1 CH3 0.000000 15.0350 0 - 614 C5A 123 C5A C4 CH2 0.000000 14.0270 0 - 615 C5A 123 C5A C5 CH3 0.000000 15.0350 0 - 616 C5A 124 C5A C3 CH2 0.000000 14.0270 0 - 617 C5A 124 C5A C2 CH2 0.000000 14.0270 0 - 618 C5A 124 C5A C1 CH3 0.000000 15.0350 0 - 619 C5A 124 C5A C4 CH2 0.000000 14.0270 0 - 620 C5A 124 C5A C5 CH3 0.000000 15.0350 0 - 621 C5A 125 C5A C3 CH2 0.000000 14.0270 0 - 622 C5A 125 C5A C2 CH2 0.000000 14.0270 0 - 623 C5A 125 C5A C1 CH3 0.000000 15.0350 0 - 624 C5A 125 C5A C4 CH2 0.000000 14.0270 0 - 625 C5A 125 C5A C5 CH3 0.000000 15.0350 0 - 626 C5A 126 C5A C3 CH2 0.000000 14.0270 0 - 627 C5A 126 C5A C2 CH2 0.000000 14.0270 0 - 628 C5A 126 C5A C1 CH3 0.000000 15.0350 0 - 629 C5A 126 C5A C4 CH2 0.000000 14.0270 0 - 630 C5A 126 C5A C5 CH3 0.000000 15.0350 0 - 631 C5A 127 C5A C3 CH2 0.000000 14.0270 0 - 632 C5A 127 C5A C2 CH2 0.000000 14.0270 0 - 633 C5A 127 C5A C1 CH3 0.000000 15.0350 0 - 634 C5A 127 C5A C4 CH2 0.000000 14.0270 0 - 635 C5A 127 C5A C5 CH3 0.000000 15.0350 0 - 636 C5A 128 C5A C3 CH2 0.000000 14.0270 0 - 637 C5A 128 C5A C2 CH2 0.000000 14.0270 0 - 638 C5A 128 C5A C1 CH3 0.000000 15.0350 0 - 639 C5A 128 C5A C4 CH2 0.000000 14.0270 0 - 640 C5A 128 C5A C5 CH3 0.000000 15.0350 0 - 641 C5A 129 C5A C3 CH2 0.000000 14.0270 0 - 642 C5A 129 C5A C2 CH2 0.000000 14.0270 0 - 643 C5A 129 C5A C1 CH3 0.000000 15.0350 0 - 644 C5A 129 C5A C4 CH2 0.000000 14.0270 0 - 645 C5A 129 C5A C5 CH3 0.000000 15.0350 0 - 646 C5A 130 C5A C3 CH2 0.000000 14.0270 0 - 647 C5A 130 C5A C2 CH2 0.000000 14.0270 0 - 648 C5A 130 C5A C1 CH3 0.000000 15.0350 0 - 649 C5A 130 C5A C4 CH2 0.000000 14.0270 0 - 650 C5A 130 C5A C5 CH3 0.000000 15.0350 0 - 651 C5A 131 C5A C3 CH2 0.000000 14.0270 0 - 652 C5A 131 C5A C2 CH2 0.000000 14.0270 0 - 653 C5A 131 C5A C1 CH3 0.000000 15.0350 0 - 654 C5A 131 C5A C4 CH2 0.000000 14.0270 0 - 655 C5A 131 C5A C5 CH3 0.000000 15.0350 0 - 656 C5A 132 C5A C3 CH2 0.000000 14.0270 0 - 657 C5A 132 C5A C2 CH2 0.000000 14.0270 0 - 658 C5A 132 C5A C1 CH3 0.000000 15.0350 0 - 659 C5A 132 C5A C4 CH2 0.000000 14.0270 0 - 660 C5A 132 C5A C5 CH3 0.000000 15.0350 0 - 661 C5A 133 C5A C3 CH2 0.000000 14.0270 0 - 662 C5A 133 C5A C2 CH2 0.000000 14.0270 0 - 663 C5A 133 C5A C1 CH3 0.000000 15.0350 0 - 664 C5A 133 C5A C4 CH2 0.000000 14.0270 0 - 665 C5A 133 C5A C5 CH3 0.000000 15.0350 0 - 666 C5A 134 C5A C3 CH2 0.000000 14.0270 0 - 667 C5A 134 C5A C2 CH2 0.000000 14.0270 0 - 668 C5A 134 C5A C1 CH3 0.000000 15.0350 0 - 669 C5A 134 C5A C4 CH2 0.000000 14.0270 0 - 670 C5A 134 C5A C5 CH3 0.000000 15.0350 0 - 671 C5A 135 C5A C3 CH2 0.000000 14.0270 0 - 672 C5A 135 C5A C2 CH2 0.000000 14.0270 0 - 673 C5A 135 C5A C1 CH3 0.000000 15.0350 0 - 674 C5A 135 C5A C4 CH2 0.000000 14.0270 0 - 675 C5A 135 C5A C5 CH3 0.000000 15.0350 0 - 676 C5A 136 C5A C3 CH2 0.000000 14.0270 0 - 677 C5A 136 C5A C2 CH2 0.000000 14.0270 0 - 678 C5A 136 C5A C1 CH3 0.000000 15.0350 0 - 679 C5A 136 C5A C4 CH2 0.000000 14.0270 0 - 680 C5A 136 C5A C5 CH3 0.000000 15.0350 0 - 681 C5A 137 C5A C3 CH2 0.000000 14.0270 0 - 682 C5A 137 C5A C2 CH2 0.000000 14.0270 0 - 683 C5A 137 C5A C1 CH3 0.000000 15.0350 0 - 684 C5A 137 C5A C4 CH2 0.000000 14.0270 0 - 685 C5A 137 C5A C5 CH3 0.000000 15.0350 0 - 686 C5A 138 C5A C3 CH2 0.000000 14.0270 0 - 687 C5A 138 C5A C2 CH2 0.000000 14.0270 0 - 688 C5A 138 C5A C1 CH3 0.000000 15.0350 0 - 689 C5A 138 C5A C4 CH2 0.000000 14.0270 0 - 690 C5A 138 C5A C5 CH3 0.000000 15.0350 0 - 691 C5A 139 C5A C3 CH2 0.000000 14.0270 0 - 692 C5A 139 C5A C2 CH2 0.000000 14.0270 0 - 693 C5A 139 C5A C1 CH3 0.000000 15.0350 0 - 694 C5A 139 C5A C4 CH2 0.000000 14.0270 0 - 695 C5A 139 C5A C5 CH3 0.000000 15.0350 0 - 696 C5A 140 C5A C3 CH2 0.000000 14.0270 0 - 697 C5A 140 C5A C2 CH2 0.000000 14.0270 0 - 698 C5A 140 C5A C1 CH3 0.000000 15.0350 0 - 699 C5A 140 C5A C4 CH2 0.000000 14.0270 0 - 700 C5A 140 C5A C5 CH3 0.000000 15.0350 0 - 701 C5A 141 C5A C3 CH2 0.000000 14.0270 0 - 702 C5A 141 C5A C2 CH2 0.000000 14.0270 0 - 703 C5A 141 C5A C1 CH3 0.000000 15.0350 0 - 704 C5A 141 C5A C4 CH2 0.000000 14.0270 0 - 705 C5A 141 C5A C5 CH3 0.000000 15.0350 0 - 706 C5A 142 C5A C3 CH2 0.000000 14.0270 0 - 707 C5A 142 C5A C2 CH2 0.000000 14.0270 0 - 708 C5A 142 C5A C1 CH3 0.000000 15.0350 0 - 709 C5A 142 C5A C4 CH2 0.000000 14.0270 0 - 710 C5A 142 C5A C5 CH3 0.000000 15.0350 0 - 711 C5A 143 C5A C3 CH2 0.000000 14.0270 0 - 712 C5A 143 C5A C2 CH2 0.000000 14.0270 0 - 713 C5A 143 C5A C1 CH3 0.000000 15.0350 0 - 714 C5A 143 C5A C4 CH2 0.000000 14.0270 0 - 715 C5A 143 C5A C5 CH3 0.000000 15.0350 0 - 716 C5A 144 C5A C3 CH2 0.000000 14.0270 0 - 717 C5A 144 C5A C2 CH2 0.000000 14.0270 0 - 718 C5A 144 C5A C1 CH3 0.000000 15.0350 0 - 719 C5A 144 C5A C4 CH2 0.000000 14.0270 0 - 720 C5A 144 C5A C5 CH3 0.000000 15.0350 0 - 721 C5A 145 C5A C3 CH2 0.000000 14.0270 0 - 722 C5A 145 C5A C2 CH2 0.000000 14.0270 0 - 723 C5A 145 C5A C1 CH3 0.000000 15.0350 0 - 724 C5A 145 C5A C4 CH2 0.000000 14.0270 0 - 725 C5A 145 C5A C5 CH3 0.000000 15.0350 0 - 726 C5A 146 C5A C3 CH2 0.000000 14.0270 0 - 727 C5A 146 C5A C2 CH2 0.000000 14.0270 0 - 728 C5A 146 C5A C1 CH3 0.000000 15.0350 0 - 729 C5A 146 C5A C4 CH2 0.000000 14.0270 0 - 730 C5A 146 C5A C5 CH3 0.000000 15.0350 0 - 731 C5A 147 C5A C3 CH2 0.000000 14.0270 0 - 732 C5A 147 C5A C2 CH2 0.000000 14.0270 0 - 733 C5A 147 C5A C1 CH3 0.000000 15.0350 0 - 734 C5A 147 C5A C4 CH2 0.000000 14.0270 0 - 735 C5A 147 C5A C5 CH3 0.000000 15.0350 0 - 736 C5A 148 C5A C3 CH2 0.000000 14.0270 0 - 737 C5A 148 C5A C2 CH2 0.000000 14.0270 0 - 738 C5A 148 C5A C1 CH3 0.000000 15.0350 0 - 739 C5A 148 C5A C4 CH2 0.000000 14.0270 0 - 740 C5A 148 C5A C5 CH3 0.000000 15.0350 0 - 741 C5A 149 C5A C3 CH2 0.000000 14.0270 0 - 742 C5A 149 C5A C2 CH2 0.000000 14.0270 0 - 743 C5A 149 C5A C1 CH3 0.000000 15.0350 0 - 744 C5A 149 C5A C4 CH2 0.000000 14.0270 0 - 745 C5A 149 C5A C5 CH3 0.000000 15.0350 0 - 746 C5A 150 C5A C3 CH2 0.000000 14.0270 0 - 747 C5A 150 C5A C2 CH2 0.000000 14.0270 0 - 748 C5A 150 C5A C1 CH3 0.000000 15.0350 0 - 749 C5A 150 C5A C4 CH2 0.000000 14.0270 0 - 750 C5A 150 C5A C5 CH3 0.000000 15.0350 0 - 751 C1A 1 C1A C1 CH4 0.000000 16.0430 0 - 752 C1A 2 C1A C1 CH4 0.000000 16.0430 0 - - 600 !NBOND: bonds - 1 4 2 1 3 2 4 5 - 6 9 7 6 8 7 9 10 - 11 14 12 11 13 12 14 15 - 16 19 17 16 18 17 19 20 - 21 24 22 21 23 22 24 25 - 26 29 27 26 28 27 29 30 - 31 34 32 31 33 32 34 35 - 36 39 37 36 38 37 39 40 - 41 44 42 41 43 42 44 45 - 46 49 47 46 48 47 49 50 - 51 54 52 51 53 52 54 55 - 56 59 57 56 58 57 59 60 - 61 64 62 61 63 62 64 65 - 66 69 67 66 68 67 69 70 - 71 74 72 71 73 72 74 75 - 76 79 77 76 78 77 79 80 - 81 84 82 81 83 82 84 85 - 86 89 87 86 88 87 89 90 - 91 94 92 91 93 92 94 95 - 96 99 97 96 98 97 99 100 - 101 104 102 101 103 102 104 105 - 106 109 107 106 108 107 109 110 - 111 114 112 111 113 112 114 115 - 116 119 117 116 118 117 119 120 - 121 124 122 121 123 122 124 125 - 126 129 127 126 128 127 129 130 - 131 134 132 131 133 132 134 135 - 136 139 137 136 138 137 139 140 - 141 144 142 141 143 142 144 145 - 146 149 147 146 148 147 149 150 - 151 154 152 151 153 152 154 155 - 156 159 157 156 158 157 159 160 - 161 164 162 161 163 162 164 165 - 166 169 167 166 168 167 169 170 - 171 174 172 171 173 172 174 175 - 176 179 177 176 178 177 179 180 - 181 184 182 181 183 182 184 185 - 186 189 187 186 188 187 189 190 - 191 194 192 191 193 192 194 195 - 196 199 197 196 198 197 199 200 - 201 204 202 201 203 202 204 205 - 206 209 207 206 208 207 209 210 - 211 214 212 211 213 212 214 215 - 216 219 217 216 218 217 219 220 - 221 224 222 221 223 222 224 225 - 226 229 227 226 228 227 229 230 - 231 234 232 231 233 232 234 235 - 236 239 237 236 238 237 239 240 - 241 244 242 241 243 242 244 245 - 246 249 247 246 248 247 249 250 - 251 254 252 251 253 252 254 255 - 256 259 257 256 258 257 259 260 - 261 264 262 261 263 262 264 265 - 266 269 267 266 268 267 269 270 - 271 274 272 271 273 272 274 275 - 276 279 277 276 278 277 279 280 - 281 284 282 281 283 282 284 285 - 286 289 287 286 288 287 289 290 - 291 294 292 291 293 292 294 295 - 296 299 297 296 298 297 299 300 - 301 304 302 301 303 302 304 305 - 306 309 307 306 308 307 309 310 - 311 314 312 311 313 312 314 315 - 316 319 317 316 318 317 319 320 - 321 324 322 321 323 322 324 325 - 326 329 327 326 328 327 329 330 - 331 334 332 331 333 332 334 335 - 336 339 337 336 338 337 339 340 - 341 344 342 341 343 342 344 345 - 346 349 347 346 348 347 349 350 - 351 354 352 351 353 352 354 355 - 356 359 357 356 358 357 359 360 - 361 364 362 361 363 362 364 365 - 366 369 367 366 368 367 369 370 - 371 374 372 371 373 372 374 375 - 376 379 377 376 378 377 379 380 - 381 384 382 381 383 382 384 385 - 386 389 387 386 388 387 389 390 - 391 394 392 391 393 392 394 395 - 396 399 397 396 398 397 399 400 - 401 404 402 401 403 402 404 405 - 406 409 407 406 408 407 409 410 - 411 414 412 411 413 412 414 415 - 416 419 417 416 418 417 419 420 - 421 424 422 421 423 422 424 425 - 426 429 427 426 428 427 429 430 - 431 434 432 431 433 432 434 435 - 436 439 437 436 438 437 439 440 - 441 444 442 441 443 442 444 445 - 446 449 447 446 448 447 449 450 - 451 454 452 451 453 452 454 455 - 456 459 457 456 458 457 459 460 - 461 464 462 461 463 462 464 465 - 466 469 467 466 468 467 469 470 - 471 474 472 471 473 472 474 475 - 476 479 477 476 478 477 479 480 - 481 484 482 481 483 482 484 485 - 486 489 487 486 488 487 489 490 - 491 494 492 491 493 492 494 495 - 496 499 497 496 498 497 499 500 - 501 504 502 501 503 502 504 505 - 506 509 507 506 508 507 509 510 - 511 514 512 511 513 512 514 515 - 516 519 517 516 518 517 519 520 - 521 524 522 521 523 522 524 525 - 526 529 527 526 528 527 529 530 - 531 534 532 531 533 532 534 535 - 536 539 537 536 538 537 539 540 - 541 544 542 541 543 542 544 545 - 546 549 547 546 548 547 549 550 - 551 554 552 551 553 552 554 555 - 556 559 557 556 558 557 559 560 - 561 564 562 561 563 562 564 565 - 566 569 567 566 568 567 569 570 - 571 574 572 571 573 572 574 575 - 576 579 577 576 578 577 579 580 - 581 584 582 581 583 582 584 585 - 586 589 587 586 588 587 589 590 - 591 594 592 591 593 592 594 595 - 596 599 597 596 598 597 599 600 - 601 604 602 601 603 602 604 605 - 606 609 607 606 608 607 609 610 - 611 614 612 611 613 612 614 615 - 616 619 617 616 618 617 619 620 - 621 624 622 621 623 622 624 625 - 626 629 627 626 628 627 629 630 - 631 634 632 631 633 632 634 635 - 636 639 637 636 638 637 639 640 - 641 644 642 641 643 642 644 645 - 646 649 647 646 648 647 649 650 - 651 654 652 651 653 652 654 655 - 656 659 657 656 658 657 659 660 - 661 664 662 661 663 662 664 665 - 666 669 667 666 668 667 669 670 - 671 674 672 671 673 672 674 675 - 676 679 677 676 678 677 679 680 - 681 684 682 681 683 682 684 685 - 686 689 687 686 688 687 689 690 - 691 694 692 691 693 692 694 695 - 696 699 697 696 698 697 699 700 - 701 704 702 701 703 702 704 705 - 706 709 707 706 708 707 709 710 - 711 714 712 711 713 712 714 715 - 716 719 717 716 718 717 719 720 - 721 724 722 721 723 722 724 725 - 726 729 727 726 728 727 729 730 - 731 734 732 731 733 732 734 735 - 736 739 737 736 738 737 739 740 - 741 744 742 741 743 742 744 745 - 746 749 747 746 748 747 749 750 - - 450 !NTHETA: angles - 1 4 5 2 1 4 3 2 1 - 6 9 10 7 6 9 8 7 6 - 11 14 15 12 11 14 13 12 11 - 16 19 20 17 16 19 18 17 16 - 21 24 25 22 21 24 23 22 21 - 26 29 30 27 26 29 28 27 26 - 31 34 35 32 31 34 33 32 31 - 36 39 40 37 36 39 38 37 36 - 41 44 45 42 41 44 43 42 41 - 46 49 50 47 46 49 48 47 46 - 51 54 55 52 51 54 53 52 51 - 56 59 60 57 56 59 58 57 56 - 61 64 65 62 61 64 63 62 61 - 66 69 70 67 66 69 68 67 66 - 71 74 75 72 71 74 73 72 71 - 76 79 80 77 76 79 78 77 76 - 81 84 85 82 81 84 83 82 81 - 86 89 90 87 86 89 88 87 86 - 91 94 95 92 91 94 93 92 91 - 96 99 100 97 96 99 98 97 96 - 101 104 105 102 101 104 103 102 101 - 106 109 110 107 106 109 108 107 106 - 111 114 115 112 111 114 113 112 111 - 116 119 120 117 116 119 118 117 116 - 121 124 125 122 121 124 123 122 121 - 126 129 130 127 126 129 128 127 126 - 131 134 135 132 131 134 133 132 131 - 136 139 140 137 136 139 138 137 136 - 141 144 145 142 141 144 143 142 141 - 146 149 150 147 146 149 148 147 146 - 151 154 155 152 151 154 153 152 151 - 156 159 160 157 156 159 158 157 156 - 161 164 165 162 161 164 163 162 161 - 166 169 170 167 166 169 168 167 166 - 171 174 175 172 171 174 173 172 171 - 176 179 180 177 176 179 178 177 176 - 181 184 185 182 181 184 183 182 181 - 186 189 190 187 186 189 188 187 186 - 191 194 195 192 191 194 193 192 191 - 196 199 200 197 196 199 198 197 196 - 201 204 205 202 201 204 203 202 201 - 206 209 210 207 206 209 208 207 206 - 211 214 215 212 211 214 213 212 211 - 216 219 220 217 216 219 218 217 216 - 221 224 225 222 221 224 223 222 221 - 226 229 230 227 226 229 228 227 226 - 231 234 235 232 231 234 233 232 231 - 236 239 240 237 236 239 238 237 236 - 241 244 245 242 241 244 243 242 241 - 246 249 250 247 246 249 248 247 246 - 251 254 255 252 251 254 253 252 251 - 256 259 260 257 256 259 258 257 256 - 261 264 265 262 261 264 263 262 261 - 266 269 270 267 266 269 268 267 266 - 271 274 275 272 271 274 273 272 271 - 276 279 280 277 276 279 278 277 276 - 281 284 285 282 281 284 283 282 281 - 286 289 290 287 286 289 288 287 286 - 291 294 295 292 291 294 293 292 291 - 296 299 300 297 296 299 298 297 296 - 301 304 305 302 301 304 303 302 301 - 306 309 310 307 306 309 308 307 306 - 311 314 315 312 311 314 313 312 311 - 316 319 320 317 316 319 318 317 316 - 321 324 325 322 321 324 323 322 321 - 326 329 330 327 326 329 328 327 326 - 331 334 335 332 331 334 333 332 331 - 336 339 340 337 336 339 338 337 336 - 341 344 345 342 341 344 343 342 341 - 346 349 350 347 346 349 348 347 346 - 351 354 355 352 351 354 353 352 351 - 356 359 360 357 356 359 358 357 356 - 361 364 365 362 361 364 363 362 361 - 366 369 370 367 366 369 368 367 366 - 371 374 375 372 371 374 373 372 371 - 376 379 380 377 376 379 378 377 376 - 381 384 385 382 381 384 383 382 381 - 386 389 390 387 386 389 388 387 386 - 391 394 395 392 391 394 393 392 391 - 396 399 400 397 396 399 398 397 396 - 401 404 405 402 401 404 403 402 401 - 406 409 410 407 406 409 408 407 406 - 411 414 415 412 411 414 413 412 411 - 416 419 420 417 416 419 418 417 416 - 421 424 425 422 421 424 423 422 421 - 426 429 430 427 426 429 428 427 426 - 431 434 435 432 431 434 433 432 431 - 436 439 440 437 436 439 438 437 436 - 441 444 445 442 441 444 443 442 441 - 446 449 450 447 446 449 448 447 446 - 451 454 455 452 451 454 453 452 451 - 456 459 460 457 456 459 458 457 456 - 461 464 465 462 461 464 463 462 461 - 466 469 470 467 466 469 468 467 466 - 471 474 475 472 471 474 473 472 471 - 476 479 480 477 476 479 478 477 476 - 481 484 485 482 481 484 483 482 481 - 486 489 490 487 486 489 488 487 486 - 491 494 495 492 491 494 493 492 491 - 496 499 500 497 496 499 498 497 496 - 501 504 505 502 501 504 503 502 501 - 506 509 510 507 506 509 508 507 506 - 511 514 515 512 511 514 513 512 511 - 516 519 520 517 516 519 518 517 516 - 521 524 525 522 521 524 523 522 521 - 526 529 530 527 526 529 528 527 526 - 531 534 535 532 531 534 533 532 531 - 536 539 540 537 536 539 538 537 536 - 541 544 545 542 541 544 543 542 541 - 546 549 550 547 546 549 548 547 546 - 551 554 555 552 551 554 553 552 551 - 556 559 560 557 556 559 558 557 556 - 561 564 565 562 561 564 563 562 561 - 566 569 570 567 566 569 568 567 566 - 571 574 575 572 571 574 573 572 571 - 576 579 580 577 576 579 578 577 576 - 581 584 585 582 581 584 583 582 581 - 586 589 590 587 586 589 588 587 586 - 591 594 595 592 591 594 593 592 591 - 596 599 600 597 596 599 598 597 596 - 601 604 605 602 601 604 603 602 601 - 606 609 610 607 606 609 608 607 606 - 611 614 615 612 611 614 613 612 611 - 616 619 620 617 616 619 618 617 616 - 621 624 625 622 621 624 623 622 621 - 626 629 630 627 626 629 628 627 626 - 631 634 635 632 631 634 633 632 631 - 636 639 640 637 636 639 638 637 636 - 641 644 645 642 641 644 643 642 641 - 646 649 650 647 646 649 648 647 646 - 651 654 655 652 651 654 653 652 651 - 656 659 660 657 656 659 658 657 656 - 661 664 665 662 661 664 663 662 661 - 666 669 670 667 666 669 668 667 666 - 671 674 675 672 671 674 673 672 671 - 676 679 680 677 676 679 678 677 676 - 681 684 685 682 681 684 683 682 681 - 686 689 690 687 686 689 688 687 686 - 691 694 695 692 691 694 693 692 691 - 696 699 700 697 696 699 698 697 696 - 701 704 705 702 701 704 703 702 701 - 706 709 710 707 706 709 708 707 706 - 711 714 715 712 711 714 713 712 711 - 716 719 720 717 716 719 718 717 716 - 721 724 725 722 721 724 723 722 721 - 726 729 730 727 726 729 728 727 726 - 731 734 735 732 731 734 733 732 731 - 736 739 740 737 736 739 738 737 736 - 741 744 745 742 741 744 743 742 741 - 746 749 750 747 746 749 748 747 746 - - 300 !NPHI: dihedrals - 2 1 4 5 3 2 1 4 - 7 6 9 10 8 7 6 9 - 12 11 14 15 13 12 11 14 - 17 16 19 20 18 17 16 19 - 22 21 24 25 23 22 21 24 - 27 26 29 30 28 27 26 29 - 32 31 34 35 33 32 31 34 - 37 36 39 40 38 37 36 39 - 42 41 44 45 43 42 41 44 - 47 46 49 50 48 47 46 49 - 52 51 54 55 53 52 51 54 - 57 56 59 60 58 57 56 59 - 62 61 64 65 63 62 61 64 - 67 66 69 70 68 67 66 69 - 72 71 74 75 73 72 71 74 - 77 76 79 80 78 77 76 79 - 82 81 84 85 83 82 81 84 - 87 86 89 90 88 87 86 89 - 92 91 94 95 93 92 91 94 - 97 96 99 100 98 97 96 99 - 102 101 104 105 103 102 101 104 - 107 106 109 110 108 107 106 109 - 112 111 114 115 113 112 111 114 - 117 116 119 120 118 117 116 119 - 122 121 124 125 123 122 121 124 - 127 126 129 130 128 127 126 129 - 132 131 134 135 133 132 131 134 - 137 136 139 140 138 137 136 139 - 142 141 144 145 143 142 141 144 - 147 146 149 150 148 147 146 149 - 152 151 154 155 153 152 151 154 - 157 156 159 160 158 157 156 159 - 162 161 164 165 163 162 161 164 - 167 166 169 170 168 167 166 169 - 172 171 174 175 173 172 171 174 - 177 176 179 180 178 177 176 179 - 182 181 184 185 183 182 181 184 - 187 186 189 190 188 187 186 189 - 192 191 194 195 193 192 191 194 - 197 196 199 200 198 197 196 199 - 202 201 204 205 203 202 201 204 - 207 206 209 210 208 207 206 209 - 212 211 214 215 213 212 211 214 - 217 216 219 220 218 217 216 219 - 222 221 224 225 223 222 221 224 - 227 226 229 230 228 227 226 229 - 232 231 234 235 233 232 231 234 - 237 236 239 240 238 237 236 239 - 242 241 244 245 243 242 241 244 - 247 246 249 250 248 247 246 249 - 252 251 254 255 253 252 251 254 - 257 256 259 260 258 257 256 259 - 262 261 264 265 263 262 261 264 - 267 266 269 270 268 267 266 269 - 272 271 274 275 273 272 271 274 - 277 276 279 280 278 277 276 279 - 282 281 284 285 283 282 281 284 - 287 286 289 290 288 287 286 289 - 292 291 294 295 293 292 291 294 - 297 296 299 300 298 297 296 299 - 302 301 304 305 303 302 301 304 - 307 306 309 310 308 307 306 309 - 312 311 314 315 313 312 311 314 - 317 316 319 320 318 317 316 319 - 322 321 324 325 323 322 321 324 - 327 326 329 330 328 327 326 329 - 332 331 334 335 333 332 331 334 - 337 336 339 340 338 337 336 339 - 342 341 344 345 343 342 341 344 - 347 346 349 350 348 347 346 349 - 352 351 354 355 353 352 351 354 - 357 356 359 360 358 357 356 359 - 362 361 364 365 363 362 361 364 - 367 366 369 370 368 367 366 369 - 372 371 374 375 373 372 371 374 - 377 376 379 380 378 377 376 379 - 382 381 384 385 383 382 381 384 - 387 386 389 390 388 387 386 389 - 392 391 394 395 393 392 391 394 - 397 396 399 400 398 397 396 399 - 402 401 404 405 403 402 401 404 - 407 406 409 410 408 407 406 409 - 412 411 414 415 413 412 411 414 - 417 416 419 420 418 417 416 419 - 422 421 424 425 423 422 421 424 - 427 426 429 430 428 427 426 429 - 432 431 434 435 433 432 431 434 - 437 436 439 440 438 437 436 439 - 442 441 444 445 443 442 441 444 - 447 446 449 450 448 447 446 449 - 452 451 454 455 453 452 451 454 - 457 456 459 460 458 457 456 459 - 462 461 464 465 463 462 461 464 - 467 466 469 470 468 467 466 469 - 472 471 474 475 473 472 471 474 - 477 476 479 480 478 477 476 479 - 482 481 484 485 483 482 481 484 - 487 486 489 490 488 487 486 489 - 492 491 494 495 493 492 491 494 - 497 496 499 500 498 497 496 499 - 502 501 504 505 503 502 501 504 - 507 506 509 510 508 507 506 509 - 512 511 514 515 513 512 511 514 - 517 516 519 520 518 517 516 519 - 522 521 524 525 523 522 521 524 - 527 526 529 530 528 527 526 529 - 532 531 534 535 533 532 531 534 - 537 536 539 540 538 537 536 539 - 542 541 544 545 543 542 541 544 - 547 546 549 550 548 547 546 549 - 552 551 554 555 553 552 551 554 - 557 556 559 560 558 557 556 559 - 562 561 564 565 563 562 561 564 - 567 566 569 570 568 567 566 569 - 572 571 574 575 573 572 571 574 - 577 576 579 580 578 577 576 579 - 582 581 584 585 583 582 581 584 - 587 586 589 590 588 587 586 589 - 592 591 594 595 593 592 591 594 - 597 596 599 600 598 597 596 599 - 602 601 604 605 603 602 601 604 - 607 606 609 610 608 607 606 609 - 612 611 614 615 613 612 611 614 - 617 616 619 620 618 617 616 619 - 622 621 624 625 623 622 621 624 - 627 626 629 630 628 627 626 629 - 632 631 634 635 633 632 631 634 - 637 636 639 640 638 637 636 639 - 642 641 644 645 643 642 641 644 - 647 646 649 650 648 647 646 649 - 652 651 654 655 653 652 651 654 - 657 656 659 660 658 657 656 659 - 662 661 664 665 663 662 661 664 - 667 666 669 670 668 667 666 669 - 672 671 674 675 673 672 671 674 - 677 676 679 680 678 677 676 679 - 682 681 684 685 683 682 681 684 - 687 686 689 690 688 687 686 689 - 692 691 694 695 693 692 691 694 - 697 696 699 700 698 697 696 699 - 702 701 704 705 703 702 701 704 - 707 706 709 710 708 707 706 709 - 712 711 714 715 713 712 711 714 - 717 716 719 720 718 717 716 719 - 722 721 724 725 723 722 721 724 - 727 726 729 730 728 727 726 729 - 732 731 734 735 733 732 731 734 - 737 736 739 740 738 737 736 739 - 742 741 744 745 743 742 741 744 - 747 746 749 750 748 747 746 749 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - - - 1 0 !NGRP - 0 0 0 - diff --git a/example_file/methane_pentane/setup_box_1.pdb b/example_file/methane_pentane/setup_box_1.pdb deleted file mode 100644 index d0625ff38..000000000 --- a/example_file/methane_pentane/setup_box_1.pdb +++ /dev/null @@ -1,750 +0,0 @@ -REMARK 30.000 30.000 30.000 STEP: 2000000 -ATOM 1 C3 C5A A 1 17.646 18.454 5.274 0.00 0.00 -ATOM 2 C2 C5A A 1 16.683 17.826 4.249 0.00 0.00 -ATOM 3 C1 C5A A 1 16.812 18.295 2.788 0.00 0.00 -ATOM 4 C4 C5A A 1 17.733 17.764 6.648 0.00 0.00 -ATOM 5 C5 C5A A 1 16.426 17.416 7.383 0.00 0.00 -ATOM 6 C3 C5A A 2 24.179 22.336 18.886 0.00 0.00 -ATOM 7 C2 C5A A 2 25.436 21.449 18.832 0.00 0.00 -ATOM 8 C1 C5A A 2 25.377 20.202 19.733 0.00 0.00 -ATOM 9 C4 C5A A 2 22.891 21.565 18.542 0.00 0.00 -ATOM 10 C5 C5A A 2 21.618 22.420 18.396 0.00 0.00 -ATOM 11 C3 C5A A 3 21.884 21.178 25.304 0.00 0.00 -ATOM 12 C2 C5A A 3 22.537 19.913 24.717 0.00 0.00 -ATOM 13 C1 C5A A 3 23.347 20.178 23.435 0.00 0.00 -ATOM 14 C4 C5A A 3 21.006 20.775 26.503 0.00 0.00 -ATOM 15 C5 C5A A 3 19.593 20.272 26.152 0.00 0.00 -ATOM 16 C3 C5A A 4 13.691 21.459 14.730 0.00 0.00 -ATOM 17 C2 C5A A 4 14.963 21.327 13.873 0.00 0.00 -ATOM 18 C1 C5A A 4 14.450 21.064 12.445 0.00 0.00 -ATOM 19 C4 C5A A 4 12.748 22.422 13.985 0.00 0.00 -ATOM 20 C5 C5A A 4 11.327 22.582 14.555 0.00 0.00 -ATOM 21 C3 C5A A 5 21.944 4.832 19.054 0.00 0.00 -ATOM 22 C2 C5A A 5 20.952 4.921 20.228 0.00 0.00 -ATOM 23 C1 C5A A 5 21.279 5.983 21.295 0.00 0.00 -ATOM 24 C4 C5A A 5 21.849 3.503 18.281 0.00 0.00 -ATOM 25 C5 C5A A 5 22.895 3.497 17.150 0.00 0.00 -ATOM 26 C3 C5A A 6 9.728 25.367 21.219 0.00 0.00 -ATOM 27 C2 C5A A 6 10.051 24.389 22.365 0.00 0.00 -ATOM 28 C1 C5A A 6 9.632 24.881 23.763 0.00 0.00 -ATOM 29 C4 C5A A 6 8.240 25.541 20.861 0.00 0.00 -ATOM 30 C5 C5A A 6 8.003 26.610 19.778 0.00 0.00 -ATOM 31 C3 C5A A 7 8.796 18.763 16.137 0.00 0.00 -ATOM 32 C2 C5A A 7 9.049 20.270 16.331 0.00 0.00 -ATOM 33 C1 C5A A 7 8.026 21.298 15.813 0.00 0.00 -ATOM 34 C4 C5A A 7 9.666 17.945 17.110 0.00 0.00 -ATOM 35 C5 C5A A 7 9.400 16.433 17.220 0.00 0.00 -ATOM 36 C3 C5A A 8 29.576 27.870 17.219 0.00 0.00 -ATOM 37 C2 C5A A 8 29.325 29.171 16.433 0.00 0.00 -ATOM 38 C1 C5A A 8 28.559 29.001 15.108 0.00 0.00 -ATOM 39 C4 C5A A 8 30.294 28.186 18.544 0.00 0.00 -ATOM 40 C5 C5A A 8 30.791 26.978 19.360 0.00 0.00 -ATOM 41 C3 C5A A 9 28.750 23.594 10.459 0.00 0.00 -ATOM 42 C2 C5A A 9 29.601 22.906 11.542 0.00 0.00 -ATOM 43 C1 C5A A 9 29.696 23.636 12.894 0.00 0.00 -ATOM 44 C4 C5A A 9 28.459 22.672 9.261 0.00 0.00 -ATOM 45 C5 C5A A 9 27.522 23.235 8.176 0.00 0.00 -ATOM 46 C3 C5A A 10 9.301 22.818 5.738 0.00 0.00 -ATOM 47 C2 C5A A 10 10.229 21.722 5.185 0.00 0.00 -ATOM 48 C1 C5A A 10 10.317 20.478 6.089 0.00 0.00 -ATOM 49 C4 C5A A 10 9.643 23.377 7.132 0.00 0.00 -ATOM 50 C5 C5A A 10 8.527 24.288 7.676 0.00 0.00 -ATOM 51 C3 C5A A 11 25.837 7.467 18.679 0.00 0.00 -ATOM 52 C2 C5A A 11 25.763 8.484 19.834 0.00 0.00 -ATOM 53 C1 C5A A 11 24.896 8.166 21.067 0.00 0.00 -ATOM 54 C4 C5A A 11 26.066 5.989 19.045 0.00 0.00 -ATOM 55 C5 C5A A 11 26.270 5.041 17.848 0.00 0.00 -ATOM 56 C3 C5A A 12 5.396 16.249 2.494 0.00 0.00 -ATOM 57 C2 C5A A 12 4.768 16.449 3.886 0.00 0.00 -ATOM 58 C1 C5A A 12 3.531 17.365 3.829 0.00 0.00 -ATOM 59 C4 C5A A 12 5.594 17.561 1.713 0.00 0.00 -ATOM 60 C5 C5A A 12 6.231 17.428 0.317 0.00 0.00 -ATOM 61 C3 C5A A 13 4.513 23.648 19.755 0.00 0.00 -ATOM 62 C2 C5A A 13 2.987 23.439 19.722 0.00 0.00 -ATOM 63 C1 C5A A 13 2.386 23.143 21.108 0.00 0.00 -ATOM 64 C4 C5A A 13 5.064 23.632 18.317 0.00 0.00 -ATOM 65 C5 C5A A 13 4.848 22.330 17.524 0.00 0.00 -ATOM 66 C3 C5A A 14 10.398 7.748 23.436 0.00 0.00 -ATOM 67 C2 C5A A 14 10.627 6.227 23.355 0.00 0.00 -ATOM 68 C1 C5A A 14 11.781 5.984 22.364 0.00 0.00 -ATOM 69 C4 C5A A 14 9.671 8.326 24.665 0.00 0.00 -ATOM 70 C5 C5A A 14 9.781 9.858 24.776 0.00 0.00 -ATOM 71 C3 C5A A 15 29.337 10.370 4.731 0.00 0.00 -ATOM 72 C2 C5A A 15 29.789 9.546 5.951 0.00 0.00 -ATOM 73 C1 C5A A 15 31.282 9.727 6.283 0.00 0.00 -ATOM 74 C4 C5A A 15 27.881 10.114 4.299 0.00 0.00 -ATOM 75 C5 C5A A 15 27.443 11.175 3.271 0.00 0.00 -ATOM 76 C3 C5A A 16 20.968 27.150 20.009 0.00 0.00 -ATOM 77 C2 C5A A 16 20.425 28.554 19.687 0.00 0.00 -ATOM 78 C1 C5A A 16 21.403 29.678 19.297 0.00 0.00 -ATOM 79 C4 C5A A 16 19.879 26.063 20.076 0.00 0.00 -ATOM 80 C5 C5A A 16 19.205 25.779 18.721 0.00 0.00 -ATOM 81 C3 C5A A 17 27.517 19.059 24.107 0.00 0.00 -ATOM 82 C2 C5A A 17 27.037 20.518 23.993 0.00 0.00 -ATOM 83 C1 C5A A 17 27.880 21.478 24.853 0.00 0.00 -ATOM 84 C4 C5A A 17 28.990 18.935 23.677 0.00 0.00 -ATOM 85 C5 C5A A 17 29.540 17.507 23.501 0.00 0.00 -ATOM 86 C3 C5A A 18 14.714 11.060 7.090 0.00 0.00 -ATOM 87 C2 C5A A 18 14.389 12.465 6.551 0.00 0.00 -ATOM 88 C1 C5A A 18 15.488 13.526 6.747 0.00 0.00 -ATOM 89 C4 C5A A 18 15.798 10.238 6.367 0.00 0.00 -ATOM 90 C5 C5A A 18 16.129 9.002 7.223 0.00 0.00 -ATOM 91 C3 C5A A 19 17.931 15.694 16.660 0.00 0.00 -ATOM 92 C2 C5A A 19 17.938 15.633 18.198 0.00 0.00 -ATOM 93 C1 C5A A 19 17.132 16.783 18.831 0.00 0.00 -ATOM 94 C4 C5A A 19 18.834 14.642 15.989 0.00 0.00 -ATOM 95 C5 C5A A 19 20.209 14.317 16.601 0.00 0.00 -ATOM 96 C3 C5A A 20 21.802 30.491 14.867 0.00 0.00 -ATOM 97 C2 C5A A 20 22.057 30.211 13.374 0.00 0.00 -ATOM 98 C1 C5A A 20 23.540 30.231 12.957 0.00 0.00 -ATOM 99 C4 C5A A 20 22.246 29.309 15.749 0.00 0.00 -ATOM 100 C5 C5A A 20 21.350 28.083 15.493 0.00 0.00 -ATOM 101 C3 C5A A 21 4.818 10.602 27.496 0.00 0.00 -ATOM 102 C2 C5A A 21 5.924 11.450 28.151 0.00 0.00 -ATOM 103 C1 C5A A 21 7.111 11.798 27.233 0.00 0.00 -ATOM 104 C4 C5A A 21 3.966 9.973 28.614 0.00 0.00 -ATOM 105 C5 C5A A 21 2.689 9.276 28.109 0.00 0.00 -ATOM 106 C3 C5A A 22 23.870 21.310 4.702 0.00 0.00 -ATOM 107 C2 C5A A 22 23.804 20.474 3.410 0.00 0.00 -ATOM 108 C1 C5A A 22 23.146 19.082 3.464 0.00 0.00 -ATOM 109 C4 C5A A 22 24.208 22.790 4.443 0.00 0.00 -ATOM 110 C5 C5A A 22 23.100 23.549 3.690 0.00 0.00 -ATOM 111 C3 C5A A 23 22.129 11.647 2.888 0.00 0.00 -ATOM 112 C2 C5A A 23 22.307 12.317 4.264 0.00 0.00 -ATOM 113 C1 C5A A 23 23.769 12.284 4.748 0.00 0.00 -ATOM 114 C4 C5A A 23 22.262 10.117 3.003 0.00 0.00 -ATOM 115 C5 C5A A 23 22.051 9.330 1.697 0.00 0.00 -ATOM 116 C3 C5A A 24 18.556 15.585 26.380 0.00 0.00 -ATOM 117 C2 C5A A 24 19.792 15.220 27.223 0.00 0.00 -ATOM 118 C1 C5A A 24 20.980 16.118 26.833 0.00 0.00 -ATOM 119 C4 C5A A 24 17.325 14.773 26.823 0.00 0.00 -ATOM 120 C5 C5A A 24 16.013 14.935 26.034 0.00 0.00 -ATOM 121 C3 C5A A 25 0.623 22.989 17.047 0.00 0.00 -ATOM 122 C2 C5A A 25 0.617 24.350 16.327 0.00 0.00 -ATOM 123 C1 C5A A 25 2.006 24.845 15.883 0.00 0.00 -ATOM 124 C4 C5A A 25 1.291 21.867 16.230 0.00 0.00 -ATOM 125 C5 C5A A 25 1.056 20.352 16.372 0.00 0.00 -ATOM 126 C3 C5A A 26 10.455 12.917 22.228 0.00 0.00 -ATOM 127 C2 C5A A 26 9.474 14.103 22.171 0.00 0.00 -ATOM 128 C1 C5A A 26 9.455 14.814 20.804 0.00 0.00 -ATOM 129 C4 C5A A 26 11.916 13.295 21.923 0.00 0.00 -ATOM 130 C5 C5A A 26 12.585 11.956 21.561 0.00 0.00 -ATOM 131 C3 C5A A 27 16.768 24.520 28.236 0.00 0.00 -ATOM 132 C2 C5A A 27 15.316 24.394 28.733 0.00 0.00 -ATOM 133 C1 C5A A 27 14.670 25.715 29.191 0.00 0.00 -ATOM 134 C4 C5A A 27 17.586 23.224 28.082 0.00 0.00 -ATOM 135 C5 C5A A 27 19.060 23.597 27.836 0.00 0.00 -ATOM 136 C3 C5A A 28 27.285 28.498 4.423 0.00 0.00 -ATOM 137 C2 C5A A 28 26.465 28.920 5.657 0.00 0.00 -ATOM 138 C1 C5A A 28 27.213 29.614 6.810 0.00 0.00 -ATOM 139 C4 C5A A 28 28.204 27.348 4.876 0.00 0.00 -ATOM 140 C5 C5A A 28 27.621 26.024 5.402 0.00 0.00 -ATOM 141 C3 C5A A 29 22.083 28.715 2.537 0.00 0.00 -ATOM 142 C2 C5A A 29 21.042 28.741 1.402 0.00 0.00 -ATOM 143 C1 C5A A 29 20.793 30.141 0.810 0.00 0.00 -ATOM 144 C4 C5A A 29 22.192 27.390 3.315 0.00 0.00 -ATOM 145 C5 C5A A 29 23.126 27.403 4.540 0.00 0.00 -ATOM 146 C3 C5A A 30 9.193 3.473 14.066 0.00 0.00 -ATOM 147 C2 C5A A 30 10.612 2.892 14.213 0.00 0.00 -ATOM 148 C1 C5A A 30 11.438 3.321 15.440 0.00 0.00 -ATOM 149 C4 C5A A 30 9.036 4.980 13.789 0.00 0.00 -ATOM 150 C5 C5A A 30 7.747 5.512 13.134 0.00 0.00 -ATOM 151 C3 C5A A 31 29.661 15.072 12.803 0.00 0.00 -ATOM 152 C2 C5A A 31 28.720 13.853 12.836 0.00 0.00 -ATOM 153 C1 C5A A 31 29.277 12.614 13.562 0.00 0.00 -ATOM 154 C4 C5A A 31 29.848 15.569 14.248 0.00 0.00 -ATOM 155 C5 C5A A 31 30.503 16.962 14.301 0.00 0.00 -ATOM 156 C3 C5A A 32 0.740 2.184 18.347 0.00 0.00 -ATOM 157 C2 C5A A 32 1.077 3.146 19.501 0.00 0.00 -ATOM 158 C1 C5A A 32 0.470 2.786 20.870 0.00 0.00 -ATOM 159 C4 C5A A 32 1.218 2.729 16.988 0.00 0.00 -ATOM 160 C5 C5A A 32 2.714 3.091 16.939 0.00 0.00 -ATOM 161 C3 C5A A 33 16.170 26.464 21.524 0.00 0.00 -ATOM 162 C2 C5A A 33 15.475 25.926 22.788 0.00 0.00 -ATOM 163 C1 C5A A 33 13.953 25.695 22.836 0.00 0.00 -ATOM 164 C4 C5A A 33 15.342 27.597 20.890 0.00 0.00 -ATOM 165 C5 C5A A 33 16.042 28.269 19.695 0.00 0.00 -ATOM 166 C3 C5A A 34 24.616 22.618 28.589 0.00 0.00 -ATOM 167 C2 C5A A 34 25.756 21.637 28.263 0.00 0.00 -ATOM 168 C1 C5A A 34 25.268 20.450 27.411 0.00 0.00 -ATOM 169 C4 C5A A 34 23.643 21.981 29.598 0.00 0.00 -ATOM 170 C5 C5A A 34 22.264 22.611 29.869 0.00 0.00 -ATOM 171 C3 C5A A 35 11.807 15.828 13.248 0.00 0.00 -ATOM 172 C2 C5A A 35 10.581 14.919 13.454 0.00 0.00 -ATOM 173 C1 C5A A 35 10.731 13.421 13.131 0.00 0.00 -ATOM 174 C4 C5A A 35 11.714 17.145 14.042 0.00 0.00 -ATOM 175 C5 C5A A 35 11.469 18.368 13.139 0.00 0.00 -ATOM 176 C3 C5A A 36 9.864 11.671 18.551 0.00 0.00 -ATOM 177 C2 C5A A 36 10.799 10.455 18.686 0.00 0.00 -ATOM 178 C1 C5A A 36 10.385 9.512 19.831 0.00 0.00 -ATOM 179 C4 C5A A 36 9.916 12.336 17.163 0.00 0.00 -ATOM 180 C5 C5A A 36 9.277 11.463 16.067 0.00 0.00 -ATOM 181 C3 C5A A 37 20.855 29.735 8.443 0.00 0.00 -ATOM 182 C2 C5A A 37 20.719 28.407 9.210 0.00 0.00 -ATOM 183 C1 C5A A 37 20.036 28.467 10.589 0.00 0.00 -ATOM 184 C4 C5A A 37 21.516 29.517 7.069 0.00 0.00 -ATOM 185 C5 C5A A 37 21.891 30.834 6.365 0.00 0.00 -ATOM 186 C3 C5A A 38 17.351 17.592 12.230 0.00 0.00 -ATOM 187 C2 C5A A 38 17.668 16.209 11.631 0.00 0.00 -ATOM 188 C1 C5A A 38 18.215 16.078 10.198 0.00 0.00 -ATOM 189 C4 C5A A 38 16.782 17.604 13.662 0.00 0.00 -ATOM 190 C5 C5A A 38 15.307 17.177 13.778 0.00 0.00 -ATOM 191 C3 C5A A 39 13.022 16.782 7.792 0.00 0.00 -ATOM 192 C2 C5A A 39 12.484 17.275 6.436 0.00 0.00 -ATOM 193 C1 C5A A 39 12.660 16.270 5.283 0.00 0.00 -ATOM 194 C4 C5A A 39 12.947 17.799 8.945 0.00 0.00 -ATOM 195 C5 C5A A 39 13.684 17.237 10.175 0.00 0.00 -ATOM 196 C3 C5A A 40 20.467 15.532 3.442 0.00 0.00 -ATOM 197 C2 C5A A 40 20.360 16.509 2.256 0.00 0.00 -ATOM 198 C1 C5A A 40 19.327 16.001 1.234 0.00 0.00 -ATOM 199 C4 C5A A 40 19.178 15.246 4.235 0.00 0.00 -ATOM 200 C5 C5A A 40 19.289 14.310 5.453 0.00 0.00 -ATOM 201 C3 C5A A 41 9.151 20.677 21.234 0.00 0.00 -ATOM 202 C2 C5A A 41 9.661 19.366 20.608 0.00 0.00 -ATOM 203 C1 C5A A 41 10.631 18.644 21.561 0.00 0.00 -ATOM 204 C4 C5A A 41 7.938 21.188 20.434 0.00 0.00 -ATOM 205 C5 C5A A 41 6.855 20.151 20.080 0.00 0.00 -ATOM 206 C3 C5A A 42 27.227 4.292 8.331 0.00 0.00 -ATOM 207 C2 C5A A 42 27.260 4.747 6.860 0.00 0.00 -ATOM 208 C1 C5A A 42 28.107 3.730 6.073 0.00 0.00 -ATOM 209 C4 C5A A 42 26.301 5.181 9.182 0.00 0.00 -ATOM 210 C5 C5A A 42 26.477 5.188 10.712 0.00 0.00 -ATOM 211 C3 C5A A 43 8.939 13.514 9.639 0.00 0.00 -ATOM 212 C2 C5A A 43 7.668 13.168 10.435 0.00 0.00 -ATOM 213 C1 C5A A 43 6.619 14.293 10.505 0.00 0.00 -ATOM 214 C4 C5A A 43 8.802 13.656 8.112 0.00 0.00 -ATOM 215 C5 C5A A 43 10.036 13.680 7.190 0.00 0.00 -ATOM 216 C3 C5A A 44 27.256 16.957 19.883 0.00 0.00 -ATOM 217 C2 C5A A 44 26.856 15.778 20.789 0.00 0.00 -ATOM 218 C1 C5A A 44 26.174 16.369 22.037 0.00 0.00 -ATOM 219 C4 C5A A 44 28.172 16.565 18.709 0.00 0.00 -ATOM 220 C5 C5A A 44 28.604 17.812 17.915 0.00 0.00 -ATOM 221 C3 C5A A 45 11.073 10.460 11.384 0.00 0.00 -ATOM 222 C2 C5A A 45 11.057 9.550 12.626 0.00 0.00 -ATOM 223 C1 C5A A 45 9.672 8.915 12.844 0.00 0.00 -ATOM 224 C4 C5A A 45 10.792 9.676 10.088 0.00 0.00 -ATOM 225 C5 C5A A 45 11.143 10.435 8.795 0.00 0.00 -ATOM 226 C3 C5A A 46 4.499 20.826 8.804 0.00 0.00 -ATOM 227 C2 C5A A 46 3.148 21.497 8.490 0.00 0.00 -ATOM 228 C1 C5A A 46 1.925 20.862 9.179 0.00 0.00 -ATOM 229 C4 C5A A 46 5.689 21.673 8.317 0.00 0.00 -ATOM 230 C5 C5A A 46 6.990 21.017 8.815 0.00 0.00 -ATOM 231 C3 C5A A 47 7.173 4.362 18.492 0.00 0.00 -ATOM 232 C2 C5A A 47 8.670 4.692 18.338 0.00 0.00 -ATOM 233 C1 C5A A 47 9.310 5.752 19.253 0.00 0.00 -ATOM 234 C4 C5A A 47 6.750 4.049 19.939 0.00 0.00 -ATOM 235 C5 C5A A 47 5.217 3.937 20.035 0.00 0.00 -ATOM 236 C3 C5A A 48 20.055 22.294 13.825 0.00 0.00 -ATOM 237 C2 C5A A 48 21.554 22.493 13.532 0.00 0.00 -ATOM 238 C1 C5A A 48 22.559 22.359 14.692 0.00 0.00 -ATOM 239 C4 C5A A 48 19.464 23.122 14.981 0.00 0.00 -ATOM 240 C5 C5A A 48 19.256 24.621 14.699 0.00 0.00 -ATOM 241 C3 C5A A 49 21.934 9.873 26.210 0.00 0.00 -ATOM 242 C2 C5A A 49 21.153 9.919 27.537 0.00 0.00 -ATOM 243 C1 C5A A 49 20.170 8.737 27.621 0.00 0.00 -ATOM 244 C4 C5A A 49 23.072 10.891 26.016 0.00 0.00 -ATOM 245 C5 C5A A 49 22.515 12.326 26.047 0.00 0.00 -ATOM 246 C3 C5A A 50 23.706 5.118 12.928 0.00 0.00 -ATOM 247 C2 C5A A 50 24.006 5.687 14.327 0.00 0.00 -ATOM 248 C1 C5A A 50 25.378 6.363 14.504 0.00 0.00 -ATOM 249 C4 C5A A 50 22.313 4.462 12.883 0.00 0.00 -ATOM 250 C5 C5A A 50 21.927 3.844 11.527 0.00 0.00 -ATOM 251 C3 C5A A 51 17.512 22.549 10.763 0.00 0.00 -ATOM 252 C2 C5A A 51 17.590 21.089 10.280 0.00 0.00 -ATOM 253 C1 C5A A 51 17.893 20.905 8.781 0.00 0.00 -ATOM 254 C4 C5A A 51 18.794 23.294 10.347 0.00 0.00 -ATOM 255 C5 C5A A 51 19.054 24.745 10.791 0.00 0.00 -ATOM 256 C3 C5A A 52 12.213 1.617 30.115 0.00 0.00 -ATOM 257 C2 C5A A 52 10.855 1.312 30.775 0.00 0.00 -ATOM 258 C1 C5A A 52 11.037 1.606 32.276 0.00 0.00 -ATOM 259 C4 C5A A 52 12.386 1.153 28.657 0.00 0.00 -ATOM 260 C5 C5A A 52 13.601 1.869 28.037 0.00 0.00 -ATOM 261 C3 C5A A 53 27.845 25.022 26.195 0.00 0.00 -ATOM 262 C2 C5A A 53 28.913 25.021 27.305 0.00 0.00 -ATOM 263 C1 C5A A 53 28.540 24.090 28.473 0.00 0.00 -ATOM 264 C4 C5A A 53 26.426 25.420 26.639 0.00 0.00 -ATOM 265 C5 C5A A 53 25.203 25.191 25.731 0.00 0.00 -ATOM 266 C3 C5A A 54 17.449 19.383 22.585 0.00 0.00 -ATOM 267 C2 C5A A 54 17.928 18.226 23.481 0.00 0.00 -ATOM 268 C1 C5A A 54 18.056 16.909 22.692 0.00 0.00 -ATOM 269 C4 C5A A 54 18.369 19.653 21.380 0.00 0.00 -ATOM 270 C5 C5A A 54 19.788 20.139 21.728 0.00 0.00 -ATOM 271 C3 C5A A 55 25.169 27.170 0.247 0.00 0.00 -ATOM 272 C2 C5A A 55 25.635 26.463 1.533 0.00 0.00 -ATOM 273 C1 C5A A 55 25.892 24.945 1.484 0.00 0.00 -ATOM 274 C4 C5A A 55 25.356 28.696 0.337 0.00 0.00 -ATOM 275 C5 C5A A 55 24.777 29.540 -0.814 0.00 0.00 -ATOM 276 C3 C5A A 56 26.805 13.177 23.650 0.00 0.00 -ATOM 277 C2 C5A A 56 26.754 13.200 25.189 0.00 0.00 -ATOM 278 C1 C5A A 56 27.752 14.259 25.693 0.00 0.00 -ATOM 279 C4 C5A A 56 25.953 11.972 23.211 0.00 0.00 -ATOM 280 C5 C5A A 56 25.880 11.774 21.685 0.00 0.00 -ATOM 281 C3 C5A A 57 2.308 20.371 0.076 0.00 0.00 -ATOM 282 C2 C5A A 57 1.489 21.525 0.683 0.00 0.00 -ATOM 283 C1 C5A A 57 2.160 22.905 0.552 0.00 0.00 -ATOM 284 C4 C5A A 57 1.795 18.954 0.398 0.00 0.00 -ATOM 285 C5 C5A A 57 2.525 17.922 -0.481 0.00 0.00 -ATOM 286 C3 C5A A 58 26.802 1.090 10.571 0.00 0.00 -ATOM 287 C2 C5A A 58 25.421 0.816 9.945 0.00 0.00 -ATOM 288 C1 C5A A 58 24.421 1.894 9.488 0.00 0.00 -ATOM 289 C4 C5A A 58 27.641 -0.191 10.731 0.00 0.00 -ATOM 290 C5 C5A A 58 28.900 0.057 11.583 0.00 0.00 -ATOM 291 C3 C5A A 59 4.923 26.619 27.484 0.00 0.00 -ATOM 292 C2 C5A A 59 5.904 27.357 26.553 0.00 0.00 -ATOM 293 C1 C5A A 59 5.302 27.827 25.216 0.00 0.00 -ATOM 294 C4 C5A A 59 3.556 27.204 27.885 0.00 0.00 -ATOM 295 C5 C5A A 59 2.547 26.152 28.384 0.00 0.00 -ATOM 296 C3 C5A A 60 6.133 13.793 18.744 0.00 0.00 -ATOM 297 C2 C5A A 60 5.534 14.989 17.981 0.00 0.00 -ATOM 298 C1 C5A A 60 5.758 16.268 18.809 0.00 0.00 -ATOM 299 C4 C5A A 60 5.670 12.415 18.236 0.00 0.00 -ATOM 300 C5 C5A A 60 6.039 11.195 19.101 0.00 0.00 -ATOM 301 C3 C5A A 61 7.974 -0.309 15.588 0.00 0.00 -ATOM 302 C2 C5A A 61 7.105 0.438 16.617 0.00 0.00 -ATOM 303 C1 C5A A 61 6.140 1.489 16.036 0.00 0.00 -ATOM 304 C4 C5A A 61 9.233 -0.962 16.189 0.00 0.00 -ATOM 305 C5 C5A A 61 10.107 -0.161 17.172 0.00 0.00 -ATOM 306 C3 C5A A 62 9.816 14.750 0.154 0.00 0.00 -ATOM 307 C2 C5A A 62 8.883 14.179 1.239 0.00 0.00 -ATOM 308 C1 C5A A 62 8.168 12.906 0.752 0.00 0.00 -ATOM 309 C4 C5A A 62 10.451 16.126 0.426 0.00 0.00 -ATOM 310 C5 C5A A 62 11.244 16.741 -0.742 0.00 0.00 -ATOM 311 C3 C5A A 63 15.593 10.389 29.677 0.00 0.00 -ATOM 312 C2 C5A A 63 15.391 10.803 28.207 0.00 0.00 -ATOM 313 C1 C5A A 63 16.683 10.631 27.387 0.00 0.00 -ATOM 314 C4 C5A A 63 14.263 10.089 30.393 0.00 0.00 -ATOM 315 C5 C5A A 63 14.466 9.607 31.842 0.00 0.00 -ATOM 316 C3 C5A A 64 3.931 7.038 23.556 0.00 0.00 -ATOM 317 C2 C5A A 64 3.485 7.172 22.088 0.00 0.00 -ATOM 318 C1 C5A A 64 2.448 6.065 21.824 0.00 0.00 -ATOM 319 C4 C5A A 64 5.057 8.024 23.920 0.00 0.00 -ATOM 320 C5 C5A A 64 5.714 7.621 25.253 0.00 0.00 -ATOM 321 C3 C5A A 65 4.588 21.308 12.660 0.00 0.00 -ATOM 322 C2 C5A A 65 3.048 21.312 12.673 0.00 0.00 -ATOM 323 C1 C5A A 65 2.363 19.961 12.946 0.00 0.00 -ATOM 324 C4 C5A A 65 5.248 22.664 12.348 0.00 0.00 -ATOM 325 C5 C5A A 65 6.779 22.569 12.486 0.00 0.00 -ATOM 326 C3 C5A A 66 14.097 5.479 7.401 0.00 0.00 -ATOM 327 C2 C5A A 66 12.989 6.240 8.153 0.00 0.00 -ATOM 328 C1 C5A A 66 11.725 6.535 7.326 0.00 0.00 -ATOM 329 C4 C5A A 66 15.271 5.088 8.318 0.00 0.00 -ATOM 330 C5 C5A A 66 15.770 6.232 9.220 0.00 0.00 -ATOM 331 C3 C5A A 67 10.368 0.279 24.836 0.00 0.00 -ATOM 332 C2 C5A A 67 11.061 1.119 23.746 0.00 0.00 -ATOM 333 C1 C5A A 67 11.177 2.603 24.140 0.00 0.00 -ATOM 334 C4 C5A A 67 10.235 -1.240 24.623 0.00 0.00 -ATOM 335 C5 C5A A 67 8.991 -1.520 23.759 0.00 0.00 -ATOM 336 C3 C5A A 68 14.972 19.199 28.176 0.00 0.00 -ATOM 337 C2 C5A A 68 15.622 20.034 27.058 0.00 0.00 -ATOM 338 C1 C5A A 68 14.620 20.981 26.370 0.00 0.00 -ATOM 339 C4 C5A A 68 16.105 18.288 28.683 0.00 0.00 -ATOM 340 C5 C5A A 68 15.539 17.264 29.684 0.00 0.00 -ATOM 341 C3 C5A A 69 28.600 13.457 8.905 0.00 0.00 -ATOM 342 C2 C5A A 69 29.468 12.938 7.743 0.00 0.00 -ATOM 343 C1 C5A A 69 30.881 13.531 7.898 0.00 0.00 -ATOM 344 C4 C5A A 69 27.193 12.831 8.891 0.00 0.00 -ATOM 345 C5 C5A A 69 26.330 13.507 9.972 0.00 0.00 -ATOM 346 C3 C5A A 70 8.030 5.399 28.695 0.00 0.00 -ATOM 347 C2 C5A A 70 7.450 6.819 28.557 0.00 0.00 -ATOM 348 C1 C5A A 70 8.491 7.911 28.248 0.00 0.00 -ATOM 349 C4 C5A A 70 8.989 5.110 27.526 0.00 0.00 -ATOM 350 C5 C5A A 70 8.980 3.652 27.030 0.00 0.00 -ATOM 351 C3 C5A A 71 23.787 24.926 8.812 0.00 0.00 -ATOM 352 C2 C5A A 71 23.537 23.572 8.121 0.00 0.00 -ATOM 353 C1 C5A A 71 22.863 22.549 9.054 0.00 0.00 -ATOM 354 C4 C5A A 71 24.555 25.963 7.972 0.00 0.00 -ATOM 355 C5 C5A A 71 25.064 27.154 8.805 0.00 0.00 -ATOM 356 C3 C5A A 72 24.831 12.692 29.714 0.00 0.00 -ATOM 357 C2 C5A A 72 23.856 13.822 29.334 0.00 0.00 -ATOM 358 C1 C5A A 72 22.393 13.477 29.667 0.00 0.00 -ATOM 359 C4 C5A A 72 26.249 13.176 30.069 0.00 0.00 -ATOM 360 C5 C5A A 72 27.380 12.231 29.623 0.00 0.00 -ATOM 361 C3 C5A A 73 28.111 3.564 13.732 0.00 0.00 -ATOM 362 C2 C5A A 73 27.826 3.177 15.195 0.00 0.00 -ATOM 363 C1 C5A A 73 26.526 2.360 15.316 0.00 0.00 -ATOM 364 C4 C5A A 73 29.616 3.446 13.426 0.00 0.00 -ATOM 365 C5 C5A A 73 29.948 3.560 11.927 0.00 0.00 -ATOM 366 C3 C5A A 74 27.997 17.138 28.638 0.00 0.00 -ATOM 367 C2 C5A A 74 28.082 17.431 30.147 0.00 0.00 -ATOM 368 C1 C5A A 74 26.774 17.047 30.863 0.00 0.00 -ATOM 369 C4 C5A A 74 29.208 17.587 27.799 0.00 0.00 -ATOM 370 C5 C5A A 74 29.367 19.113 27.667 0.00 0.00 -ATOM 371 C3 C5A A 75 13.468 16.533 22.868 0.00 0.00 -ATOM 372 C2 C5A A 75 13.827 17.305 24.151 0.00 0.00 -ATOM 373 C1 C5A A 75 12.959 16.742 25.292 0.00 0.00 -ATOM 374 C4 C5A A 75 14.112 16.958 21.535 0.00 0.00 -ATOM 375 C5 C5A A 75 13.842 16.125 20.269 0.00 0.00 -ATOM 376 C3 C5A A 76 14.747 0.566 24.413 0.00 0.00 -ATOM 377 C2 C5A A 76 15.140 0.837 22.949 0.00 0.00 -ATOM 378 C1 C5A A 76 14.522 2.151 22.435 0.00 0.00 -ATOM 379 C4 C5A A 76 15.247 -0.796 24.931 0.00 0.00 -ATOM 380 C5 C5A A 76 14.184 -1.590 25.713 0.00 0.00 -ATOM 381 C3 C5A A 77 12.622 26.603 11.785 0.00 0.00 -ATOM 382 C2 C5A A 77 13.783 26.197 12.712 0.00 0.00 -ATOM 383 C1 C5A A 77 14.716 25.158 12.064 0.00 0.00 -ATOM 384 C4 C5A A 77 11.699 27.436 12.695 0.00 0.00 -ATOM 385 C5 C5A A 77 10.499 28.122 12.017 0.00 0.00 -ATOM 386 C3 C5A A 78 29.445 11.325 18.223 0.00 0.00 -ATOM 387 C2 C5A A 78 28.820 12.620 17.670 0.00 0.00 -ATOM 388 C1 C5A A 78 27.401 12.873 18.211 0.00 0.00 -ATOM 389 C4 C5A A 78 29.224 11.223 19.744 0.00 0.00 -ATOM 390 C5 C5A A 78 29.614 9.878 20.384 0.00 0.00 -ATOM 391 C3 C5A A 79 18.713 5.028 6.140 0.00 0.00 -ATOM 392 C2 C5A A 79 19.055 5.333 4.670 0.00 0.00 -ATOM 393 C1 C5A A 79 20.281 6.244 4.469 0.00 0.00 -ATOM 394 C4 C5A A 79 19.816 4.273 6.903 0.00 0.00 -ATOM 395 C5 C5A A 79 19.547 4.177 8.416 0.00 0.00 -ATOM 396 C3 C5A A 80 6.177 25.331 15.100 0.00 0.00 -ATOM 397 C2 C5A A 80 5.958 26.723 14.478 0.00 0.00 -ATOM 398 C1 C5A A 80 4.554 26.912 13.876 0.00 0.00 -ATOM 399 C4 C5A A 80 7.554 25.228 15.782 0.00 0.00 -ATOM 400 C5 C5A A 80 8.504 25.406 14.583 0.00 0.00 -ATOM 401 C3 C5A A 81 2.657 21.155 24.557 0.00 0.00 -ATOM 402 C2 C5A A 81 2.301 20.218 23.388 0.00 0.00 -ATOM 403 C1 C5A A 81 3.394 19.138 23.286 0.00 0.00 -ATOM 404 C4 C5A A 81 1.475 22.057 24.960 0.00 0.00 -ATOM 405 C5 C5A A 81 1.408 22.561 26.413 0.00 0.00 -ATOM 406 C3 C5A A 82 10.717 23.630 1.799 0.00 0.00 -ATOM 407 C2 C5A A 82 12.245 23.808 1.752 0.00 0.00 -ATOM 408 C1 C5A A 82 13.113 22.897 2.640 0.00 0.00 -ATOM 409 C4 C5A A 82 10.024 24.740 0.987 0.00 0.00 -ATOM 410 C5 C5A A 82 8.485 24.693 1.015 0.00 0.00 -ATOM 411 C3 C5A A 83 24.594 15.146 15.699 0.00 0.00 -ATOM 412 C2 C5A A 83 25.618 14.462 14.774 0.00 0.00 -ATOM 413 C1 C5A A 83 25.291 13.011 14.372 0.00 0.00 -ATOM 414 C4 C5A A 83 25.204 16.515 16.054 0.00 0.00 -ATOM 415 C5 C5A A 83 24.369 17.176 17.166 0.00 0.00 -ATOM 416 C3 C5A A 84 20.379 9.671 11.703 0.00 0.00 -ATOM 417 C2 C5A A 84 18.951 9.425 11.183 0.00 0.00 -ATOM 418 C1 C5A A 84 18.859 8.164 10.304 0.00 0.00 -ATOM 419 C4 C5A A 84 20.574 10.970 12.508 0.00 0.00 -ATOM 420 C5 C5A A 84 21.879 11.276 13.266 0.00 0.00 -ATOM 421 C3 C5A A 85 22.023 16.726 22.150 0.00 0.00 -ATOM 422 C2 C5A A 85 21.779 15.418 22.924 0.00 0.00 -ATOM 423 C1 C5A A 85 22.961 14.432 22.983 0.00 0.00 -ATOM 424 C4 C5A A 85 22.373 16.519 20.664 0.00 0.00 -ATOM 425 C5 C5A A 85 21.772 17.668 19.833 0.00 0.00 -ATOM 426 C3 C5A A 86 13.745 22.529 20.244 0.00 0.00 -ATOM 427 C2 C5A A 86 13.060 21.575 21.241 0.00 0.00 -ATOM 428 C1 C5A A 86 14.026 21.045 22.316 0.00 0.00 -ATOM 429 C4 C5A A 86 12.648 23.127 19.344 0.00 0.00 -ATOM 430 C5 C5A A 86 11.691 22.068 18.767 0.00 0.00 -ATOM 431 C3 C5A A 87 17.455 2.516 26.501 0.00 0.00 -ATOM 432 C2 C5A A 87 17.646 2.644 28.024 0.00 0.00 -ATOM 433 C1 C5A A 87 17.537 1.285 28.740 0.00 0.00 -ATOM 434 C4 C5A A 87 17.733 3.760 25.637 0.00 0.00 -ATOM 435 C5 C5A A 87 17.761 3.397 24.140 0.00 0.00 -ATOM 436 C3 C5A A 88 3.843 1.663 0.698 0.00 0.00 -ATOM 437 C2 C5A A 88 4.959 2.436 -0.028 0.00 0.00 -ATOM 438 C1 C5A A 88 6.339 2.341 0.648 0.00 0.00 -ATOM 439 C4 C5A A 88 3.772 0.161 0.366 0.00 0.00 -ATOM 440 C5 C5A A 88 2.566 -0.529 1.031 0.00 0.00 -ATOM 441 C3 C5A A 89 14.533 26.430 16.759 0.00 0.00 -ATOM 442 C2 C5A A 89 14.533 24.912 16.500 0.00 0.00 -ATOM 443 C1 C5A A 89 15.835 24.447 15.824 0.00 0.00 -ATOM 444 C4 C5A A 89 13.268 26.695 17.597 0.00 0.00 -ATOM 445 C5 C5A A 89 11.985 26.181 16.919 0.00 0.00 -ATOM 446 C3 C5A A 90 18.975 19.683 16.846 0.00 0.00 -ATOM 447 C2 C5A A 90 17.545 19.953 16.341 0.00 0.00 -ATOM 448 C1 C5A A 90 16.653 20.599 17.417 0.00 0.00 -ATOM 449 C4 C5A A 90 19.890 18.839 15.940 0.00 0.00 -ATOM 450 C5 C5A A 90 21.368 18.860 16.372 0.00 0.00 -ATOM 451 C3 C5A A 91 14.852 12.548 14.424 0.00 0.00 -ATOM 452 C2 C5A A 91 14.054 11.288 14.039 0.00 0.00 -ATOM 453 C1 C5A A 91 13.313 10.702 15.256 0.00 0.00 -ATOM 454 C4 C5A A 91 15.548 13.263 13.252 0.00 0.00 -ATOM 455 C5 C5A A 91 16.524 12.493 12.343 0.00 0.00 -ATOM 456 C3 C5A A 92 28.231 8.798 24.493 0.00 0.00 -ATOM 457 C2 C5A A 92 29.647 9.136 23.993 0.00 0.00 -ATOM 458 C1 C5A A 92 30.095 10.593 24.213 0.00 0.00 -ATOM 459 C4 C5A A 92 27.995 9.175 25.968 0.00 0.00 -ATOM 460 C5 C5A A 92 26.524 9.240 26.419 0.00 0.00 -ATOM 461 C3 C5A A 93 1.979 17.345 20.274 0.00 0.00 -ATOM 462 C2 C5A A 93 1.950 18.818 19.826 0.00 0.00 -ATOM 463 C1 C5A A 93 3.311 19.474 19.528 0.00 0.00 -ATOM 464 C4 C5A A 93 1.874 16.381 19.078 0.00 0.00 -ATOM 465 C5 C5A A 93 1.942 14.858 19.293 0.00 0.00 -ATOM 466 C3 C5A A 94 13.713 22.298 7.071 0.00 0.00 -ATOM 467 C2 C5A A 94 14.278 20.871 6.939 0.00 0.00 -ATOM 468 C1 C5A A 94 14.386 20.412 5.473 0.00 0.00 -ATOM 469 C4 C5A A 94 13.448 22.601 8.558 0.00 0.00 -ATOM 470 C5 C5A A 94 13.213 24.047 9.031 0.00 0.00 -ATOM 471 C3 C5A A 95 30.502 7.861 14.034 0.00 0.00 -ATOM 472 C2 C5A A 95 31.177 6.761 14.873 0.00 0.00 -ATOM 473 C1 C5A A 95 30.194 6.241 15.939 0.00 0.00 -ATOM 474 C4 C5A A 95 29.135 7.414 13.485 0.00 0.00 -ATOM 475 C5 C5A A 95 28.309 8.328 12.561 0.00 0.00 -ATOM 476 C3 C5A A 96 18.126 2.239 18.273 0.00 0.00 -ATOM 477 C2 C5A A 96 17.810 2.569 19.744 0.00 0.00 -ATOM 478 C1 C5A A 96 18.795 1.814 20.656 0.00 0.00 -ATOM 479 C4 C5A A 96 17.781 0.804 17.836 0.00 0.00 -ATOM 480 C5 C5A A 96 18.126 0.355 16.404 0.00 0.00 -ATOM 481 C3 C5A A 97 14.869 9.171 20.603 0.00 0.00 -ATOM 482 C2 C5A A 97 14.720 8.731 22.071 0.00 0.00 -ATOM 483 C1 C5A A 97 15.318 9.831 22.967 0.00 0.00 -ATOM 484 C4 C5A A 97 14.495 8.104 19.557 0.00 0.00 -ATOM 485 C5 C5A A 97 14.521 8.360 18.039 0.00 0.00 -ATOM 486 C3 C5A A 98 22.920 15.592 8.641 0.00 0.00 -ATOM 487 C2 C5A A 98 23.670 15.794 7.311 0.00 0.00 -ATOM 488 C1 C5A A 98 22.739 16.141 6.134 0.00 0.00 -ATOM 489 C4 C5A A 98 21.938 14.408 8.566 0.00 0.00 -ATOM 490 C5 C5A A 98 21.350 14.023 9.936 0.00 0.00 -ATOM 491 C3 C5A A 99 22.338 11.181 18.577 0.00 0.00 -ATOM 492 C2 C5A A 99 22.448 9.794 17.916 0.00 0.00 -ATOM 493 C1 C5A A 99 21.553 8.686 18.501 0.00 0.00 -ATOM 494 C4 C5A A 99 23.381 12.191 18.064 0.00 0.00 -ATOM 495 C5 C5A A 99 23.321 13.569 18.750 0.00 0.00 -ATOM 496 C3 C5A A 100 26.205 25.094 13.005 0.00 0.00 -ATOM 497 C2 C5A A 100 26.264 25.090 14.544 0.00 0.00 -ATOM 498 C1 C5A A 100 25.809 23.772 15.196 0.00 0.00 -ATOM 499 C4 C5A A 100 26.721 26.413 12.400 0.00 0.00 -ATOM 500 C5 C5A A 100 25.899 27.579 12.982 0.00 0.00 -ATOM 501 C1 C1A B 1 10.869 27.532 28.776 0.00 0.00 -ATOM 502 C1 C1A B 2 18.616 1.495 11.989 0.00 0.00 -ATOM 503 C1 C1A B 3 7.563 3.516 23.499 0.00 0.00 -ATOM 504 C1 C1A B 4 27.576 4.885 0.058 0.00 0.00 -ATOM 505 C1 C1A B 5 29.684 6.379 19.545 0.00 0.00 -ATOM 506 C1 C1A B 6 23.763 6.188 2.576 0.00 0.00 -ATOM 507 C1 C1A B 7 6.437 8.372 1.693 0.00 0.00 -ATOM 508 C1 C1A B 8 21.530 0.333 26.754 0.00 0.00 -ATOM 509 C1 C1A B 9 24.806 16.471 25.901 0.00 0.00 -ATOM 510 C1 C1A B 10 14.856 28.698 6.113 0.00 0.00 -ATOM 511 C1 C1A B 11 22.604 25.877 12.487 0.00 0.00 -ATOM 512 C1 C1A B 12 0.043 1.136 4.335 0.00 0.00 -ATOM 513 C1 C1A B 13 16.964 22.535 24.210 0.00 0.00 -ATOM 514 C1 C1A B 14 6.091 11.536 14.049 0.00 0.00 -ATOM 515 C1 C1A B 15 29.806 18.741 3.371 0.00 0.00 -ATOM 516 C1 C1A B 16 20.366 24.747 6.093 0.00 0.00 -ATOM 517 C1 C1A B 17 2.739 10.213 16.397 0.00 0.00 -ATOM 518 C1 C1A B 18 27.280 20.082 15.197 0.00 0.00 -ATOM 519 C1 C1A B 19 3.179 6.921 18.336 0.00 0.00 -ATOM 520 C1 C1A B 20 19.521 24.780 1.569 0.00 0.00 -ATOM 521 C1 C1A B 21 10.037 3.138 6.191 0.00 0.00 -ATOM 522 C1 C1A B 22 18.002 4.931 11.790 0.00 0.00 -ATOM 523 C1 C1A B 23 0.807 15.391 1.989 0.00 0.00 -ATOM 524 C1 C1A B 24 20.998 7.348 14.762 0.00 0.00 -ATOM 525 C1 C1A B 25 12.459 24.278 26.141 0.00 0.00 -ATOM 526 C1 C1A B 26 17.941 11.367 3.573 0.00 0.00 -ATOM 527 C1 C1A B 27 15.941 25.552 3.122 0.00 0.00 -ATOM 528 C1 C1A B 28 29.121 18.831 11.555 0.00 0.00 -ATOM 529 C1 C1A B 29 4.415 27.226 17.750 0.00 0.00 -ATOM 530 C1 C1A B 30 21.231 1.944 23.458 0.00 0.00 -ATOM 531 C1 C1A B 31 5.633 21.972 1.542 0.00 0.00 -ATOM 532 C1 C1A B 32 19.267 3.722 15.148 0.00 0.00 -ATOM 533 C1 C1A B 33 24.294 8.904 11.554 0.00 0.00 -ATOM 534 C1 C1A B 34 25.787 19.987 8.050 0.00 0.00 -ATOM 535 C1 C1A B 35 0.179 1.438 8.065 0.00 0.00 -ATOM 536 C1 C1A B 36 5.003 1.091 8.098 0.00 0.00 -ATOM 537 C1 C1A B 37 8.798 10.745 3.986 0.00 0.00 -ATOM 538 C1 C1A B 38 13.213 8.311 26.059 0.00 0.00 -ATOM 539 C1 C1A B 39 14.608 2.887 12.073 0.00 0.00 -ATOM 540 C1 C1A B 40 13.924 4.783 25.357 0.00 0.00 -ATOM 541 C1 C1A B 41 18.390 10.354 17.438 0.00 0.00 -ATOM 542 C1 C1A B 42 7.303 8.199 20.682 0.00 0.00 -ATOM 543 C1 C1A B 43 27.193 1.725 19.207 0.00 0.00 -ATOM 544 C1 C1A B 44 14.580 2.351 4.616 0.00 0.00 -ATOM 545 C1 C1A B 45 18.466 27.990 5.220 0.00 0.00 -ATOM 546 C1 C1A B 46 5.808 24.526 23.824 0.00 0.00 -ATOM 547 C1 C1A B 47 15.027 12.188 18.470 0.00 0.00 -ATOM 548 C1 C1A B 48 12.372 6.369 29.067 0.00 0.00 -ATOM 549 C1 C1A B 49 16.855 23.707 6.091 0.00 0.00 -ATOM 550 C1 C1A B 50 21.832 26.549 28.254 0.00 0.00 -ATOM 551 C1 C1A B 51 0.687 27.218 12.894 0.00 0.00 -ATOM 552 C1 C1A B 52 24.217 0.124 21.719 0.00 0.00 -ATOM 553 C1 C1A B 53 14.647 9.651 10.627 0.00 0.00 -ATOM 554 C1 C1A B 54 22.071 6.916 8.947 0.00 0.00 -ATOM 555 C1 C1A B 55 4.811 9.440 4.669 0.00 0.00 -ATOM 556 C1 C1A B 56 11.443 27.899 8.443 0.00 0.00 -ATOM 557 C1 C1A B 57 20.263 9.646 5.990 0.00 0.00 -ATOM 558 C1 C1A B 58 13.785 0.194 14.191 0.00 0.00 -ATOM 559 C1 C1A B 59 8.345 7.226 5.387 0.00 0.00 -ATOM 560 C1 C1A B 60 1.919 25.770 23.914 0.00 0.00 -ATOM 561 C1 C1A B 61 11.805 21.326 28.903 0.00 0.00 -ATOM 562 C1 C1A B 62 22.221 9.970 22.363 0.00 0.00 -ATOM 563 C1 C1A B 63 1.190 29.514 22.820 0.00 0.00 -ATOM 564 C1 C1A B 64 3.056 13.020 12.223 0.00 0.00 -ATOM 565 C1 C1A B 65 4.884 18.624 26.646 0.00 0.00 -ATOM 566 C1 C1A B 66 0.077 28.769 27.385 0.00 0.00 -ATOM 567 C1 C1A B 67 11.688 28.696 20.787 0.00 0.00 -ATOM 568 C1 C1A B 68 6.924 29.913 11.676 0.00 0.00 -ATOM 569 C1 C1A B 69 12.543 5.611 3.632 0.00 0.00 -ATOM 570 C1 C1A B 70 11.599 7.649 16.229 0.00 0.00 -ATOM 571 C1 C1A B 71 13.317 28.004 2.130 0.00 0.00 -ATOM 572 C1 C1A B 72 5.223 9.586 10.751 0.00 0.00 -ATOM 573 C1 C1A B 73 11.351 1.483 10.858 0.00 0.00 -ATOM 574 C1 C1A B 74 26.311 9.828 15.802 0.00 0.00 -ATOM 575 C1 C1A B 75 2.890 0.959 26.625 0.00 0.00 -ATOM 576 C1 C1A B 76 17.342 28.609 1.174 0.00 0.00 -ATOM 577 C1 C1A B 77 4.680 4.431 26.537 0.00 0.00 -ATOM 578 C1 C1A B 78 15.910 6.242 28.170 0.00 0.00 -ATOM 579 C1 C1A B 79 25.063 29.064 25.564 0.00 0.00 -ATOM 580 C1 C1A B 80 27.475 1.474 27.136 0.00 0.00 -ATOM 581 C1 C1A B 81 20.036 21.401 3.929 0.00 0.00 -ATOM 582 C1 C1A B 82 2.753 0.070 10.854 0.00 0.00 -ATOM 583 C1 C1A B 83 8.844 26.267 4.502 0.00 0.00 -ATOM 584 C1 C1A B 84 22.546 27.012 23.519 0.00 0.00 -ATOM 585 C1 C1A B 85 8.561 17.371 8.019 0.00 0.00 -ATOM 586 C1 C1A B 86 7.597 8.085 16.954 0.00 0.00 -ATOM 587 C1 C1A B 87 2.863 6.786 11.298 0.00 0.00 -ATOM 588 C1 C1A B 88 0.518 2.941 24.589 0.00 0.00 -ATOM 589 C1 C1A B 89 15.464 3.733 1.201 0.00 0.00 -ATOM 590 C1 C1A B 90 4.876 3.075 12.882 0.00 0.00 -ATOM 591 C1 C1A B 91 6.627 0.958 26.024 0.00 0.00 -ATOM 592 C1 C1A B 92 3.610 2.123 4.625 0.00 0.00 -ATOM 593 C1 C1A B 93 5.998 4.474 6.902 0.00 0.00 -ATOM 594 C1 C1A B 94 23.483 6.703 28.584 0.00 0.00 -ATOM 595 C1 C1A B 95 7.095 0.346 21.152 0.00 0.00 -ATOM 596 C1 C1A B 96 27.573 17.044 8.235 0.00 0.00 -ATOM 597 C1 C1A B 97 20.973 4.656 26.770 0.00 0.00 -ATOM 598 C1 C1A B 98 7.861 3.192 10.145 0.00 0.00 -ATOM 599 C1 C1A B 99 18.600 9.258 21.118 0.00 0.00 -ATOM 600 C1 C1A B 100 6.662 11.508 22.930 0.00 0.00 -ATOM 601 C1 C1A B 101 4.334 18.837 15.821 0.00 0.00 -ATOM 602 C1 C1A B 102 7.067 15.227 14.697 0.00 0.00 -ATOM 603 C1 C1A B 103 13.332 4.699 19.253 0.00 0.00 -ATOM 604 C1 C1A B 104 2.516 13.246 4.649 0.00 0.00 -ATOM 605 C1 C1A B 105 18.661 28.898 23.315 0.00 0.00 -ATOM 606 C1 C1A B 106 28.191 5.586 22.787 0.00 0.00 -ATOM 607 C1 C1A B 107 2.971 10.833 20.826 0.00 0.00 -ATOM 608 C1 C1A B 108 8.586 4.601 2.795 0.00 0.00 -ATOM 609 C1 C1A B 109 8.361 21.513 27.849 0.00 0.00 -ATOM 610 C1 C1A B 110 4.275 15.141 22.525 0.00 0.00 -ATOM 611 C1 C1A B 111 26.071 8.919 0.312 0.00 0.00 -ATOM 612 C1 C1A B 112 15.905 6.649 3.986 0.00 0.00 -ATOM 613 C1 C1A B 113 27.300 24.695 18.367 0.00 0.00 -ATOM 614 C1 C1A B 114 16.548 21.993 1.444 0.00 0.00 -ATOM 615 C1 C1A B 115 13.102 12.345 25.475 0.00 0.00 -ATOM 616 C1 C1A B 116 29.061 0.899 0.844 0.00 0.00 -ATOM 617 C1 C1A B 117 24.629 3.950 21.907 0.00 0.00 -ATOM 618 C1 C1A B 118 29.898 23.485 3.363 0.00 0.00 -ATOM 619 C1 C1A B 119 13.828 14.024 29.083 0.00 0.00 -ATOM 620 C1 C1A B 120 5.080 28.592 3.490 0.00 0.00 -ATOM 621 C1 C1A B 121 13.602 0.747 17.779 0.00 0.00 -ATOM 622 C1 C1A B 122 26.013 27.194 20.849 0.00 0.00 -ATOM 623 C1 C1A B 123 28.379 28.185 24.173 0.00 0.00 -ATOM 624 C1 C1A B 124 1.928 26.700 3.932 0.00 0.00 -ATOM 625 C1 C1A B 125 3.361 11.967 24.363 0.00 0.00 -ATOM 626 C1 C1A B 126 2.770 25.130 10.501 0.00 0.00 -ATOM 627 C1 C1A B 127 13.657 13.370 10.307 0.00 0.00 -ATOM 628 C1 C1A B 128 8.230 28.814 1.228 0.00 0.00 -ATOM 629 C1 C1A B 129 25.388 29.058 17.514 0.00 0.00 -ATOM 630 C1 C1A B 130 4.163 7.559 7.817 0.00 0.00 -ATOM 631 C1 C1A B 131 2.868 28.006 7.497 0.00 0.00 -ATOM 632 C1 C1A B 132 15.480 4.700 16.031 0.00 0.00 -ATOM 633 C1 C1A B 133 16.540 5.503 21.301 0.00 0.00 -ATOM 634 C1 C1A B 134 6.927 21.109 24.213 0.00 0.00 -ATOM 635 C1 C1A B 135 21.523 15.810 13.349 0.00 0.00 -ATOM 636 C1 C1A B 136 2.076 5.090 5.770 0.00 0.00 -ATOM 637 C1 C1A B 137 18.775 8.169 1.697 0.00 0.00 -ATOM 638 C1 C1A B 138 22.978 3.204 29.694 0.00 0.00 -ATOM 639 C1 C1A B 139 27.530 1.599 23.256 0.00 0.00 -ATOM 640 C1 C1A B 140 27.011 8.928 8.748 0.00 0.00 -ATOM 641 C1 C1A B 141 18.998 6.969 24.313 0.00 0.00 -ATOM 642 C1 C1A B 142 23.464 4.045 6.481 0.00 0.00 -ATOM 643 C1 C1A B 143 4.584 27.379 21.399 0.00 0.00 -ATOM 644 C1 C1A B 144 0.450 7.037 8.624 0.00 0.00 -ATOM 645 C1 C1A B 145 13.644 1.883 7.963 0.00 0.00 -ATOM 646 C1 C1A B 146 29.026 24.628 22.028 0.00 0.00 -ATOM 647 C1 C1A B 147 27.570 6.219 3.511 0.00 0.00 -ATOM 648 C1 C1A B 148 18.257 27.941 27.216 0.00 0.00 -ATOM 649 C1 C1A B 149 18.961 12.655 29.647 0.00 0.00 -ATOM 650 C1 C1A B 150 7.855 6.877 9.563 0.00 0.00 -ATOM 651 C1 C1A B 151 12.722 15.034 17.204 0.00 0.00 -ATOM 652 C1 C1A B 152 29.236 26.797 0.808 0.00 0.00 -ATOM 653 C1 C1A B 153 22.047 3.073 3.295 0.00 0.00 -ATOM 654 C1 C1A B 154 9.915 24.166 10.902 0.00 0.00 -ATOM 655 C1 C1A B 155 21.769 19.532 7.336 0.00 0.00 -ATOM 656 C1 C1A B 156 15.807 14.222 2.768 0.00 0.00 -ATOM 657 C1 C1A B 157 24.044 7.226 24.411 0.00 0.00 -ATOM 658 C1 C1A B 158 19.049 25.289 24.028 0.00 0.00 -ATOM 659 C1 C1A B 159 5.567 24.919 5.625 0.00 0.00 -ATOM 660 C1 C1A B 160 28.999 20.951 20.423 0.00 0.00 -ATOM 661 C1 C1A B 161 4.707 16.794 8.265 0.00 0.00 -ATOM 662 C1 C1A B 162 17.408 27.931 13.381 0.00 0.00 -ATOM 663 C1 C1A B 163 4.946 23.007 27.660 0.00 0.00 -ATOM 664 C1 C1A B 164 19.685 4.458 0.576 0.00 0.00 -ATOM 665 C1 C1A B 165 2.833 13.878 15.738 0.00 0.00 -ATOM 666 C1 C1A B 166 19.460 20.257 0.269 0.00 0.00 -ATOM 667 C1 C1A B 167 16.302 13.816 21.839 0.00 0.00 -ATOM 668 C1 C1A B 168 11.393 5.161 11.160 0.00 0.00 -ATOM 669 C1 C1A B 169 12.930 19.316 1.806 0.00 0.00 -ATOM 670 C1 C1A B 170 6.431 13.176 4.779 0.00 0.00 -ATOM 671 C1 C1A B 171 18.067 6.543 18.221 0.00 0.00 -ATOM 672 C1 C1A B 172 29.523 26.754 8.911 0.00 0.00 -ATOM 673 C1 C1A B 173 5.870 15.226 25.739 0.00 0.00 -ATOM 674 C1 C1A B 174 21.461 19.455 11.186 0.00 0.00 -ATOM 675 C1 C1A B 175 21.443 23.356 22.124 0.00 0.00 -ATOM 676 C1 C1A B 176 14.029 7.129 13.239 0.00 0.00 -ATOM 677 C1 C1A B 177 7.539 1.086 4.074 0.00 0.00 -ATOM 678 C1 C1A B 178 2.572 20.751 4.399 0.00 0.00 -ATOM 679 C1 C1A B 179 15.036 29.679 10.410 0.00 0.00 -ATOM 680 C1 C1A B 180 4.847 5.169 3.405 0.00 0.00 -ATOM 681 C1 C1A B 181 18.508 11.927 8.508 0.00 0.00 -ATOM 682 C1 C1A B 182 3.772 14.307 29.199 0.00 0.00 -ATOM 683 C1 C1A B 183 2.772 3.616 9.501 0.00 0.00 -ATOM 684 C1 C1A B 184 19.048 11.921 24.232 0.00 0.00 -ATOM 685 C1 C1A B 185 0.744 10.538 10.073 0.00 0.00 -ATOM 686 C1 C1A B 186 24.353 7.966 6.002 0.00 0.00 -ATOM 687 C1 C1A B 187 5.180 25.640 1.078 0.00 0.00 -ATOM 688 C1 C1A B 188 22.721 17.742 29.625 0.00 0.00 -ATOM 689 C1 C1A B 189 10.757 20.433 10.224 0.00 0.00 -ATOM 690 C1 C1A B 190 0.835 3.315 28.562 0.00 0.00 -ATOM 691 C1 C1A B 191 3.975 2.185 23.137 0.00 0.00 -ATOM 692 C1 C1A B 192 6.708 20.004 5.182 0.00 0.00 -ATOM 693 C1 C1A B 193 4.578 12.343 7.802 0.00 0.00 -ATOM 694 C1 C1A B 194 25.355 21.431 11.837 0.00 0.00 -ATOM 695 C1 C1A B 195 0.740 16.993 6.508 0.00 0.00 -ATOM 696 C1 C1A B 196 23.312 25.645 17.294 0.00 0.00 -ATOM 697 C1 C1A B 197 27.385 21.045 1.724 0.00 0.00 -ATOM 698 C1 C1A B 198 1.035 4.010 2.287 0.00 0.00 -ATOM 699 C1 C1A B 199 18.341 1.520 3.800 0.00 0.00 -ATOM 700 C1 C1A B 200 8.840 20.050 2.115 0.00 0.00 -ATOM 701 C1 C1A B 201 9.807 14.035 26.272 0.00 0.00 -ATOM 702 C1 C1A B 202 8.576 25.191 27.229 0.00 0.00 -ATOM 703 C1 C1A B 203 25.102 16.905 11.475 0.00 0.00 -ATOM 704 C1 C1A B 204 29.742 7.879 29.213 0.00 0.00 -ATOM 705 C1 C1A B 205 4.508 16.859 12.276 0.00 0.00 -ATOM 706 C1 C1A B 206 10.533 8.470 1.636 0.00 0.00 -ATOM 707 C1 C1A B 207 10.905 10.802 28.764 0.00 0.00 -ATOM 708 C1 C1A B 208 0.755 11.328 1.068 0.00 0.00 -ATOM 709 C1 C1A B 209 1.510 16.461 10.059 0.00 0.00 -ATOM 710 C1 C1A B 210 10.683 29.386 5.144 0.00 0.00 -ATOM 711 C1 C1A B 211 24.634 2.909 25.450 0.00 0.00 -ATOM 712 C1 C1A B 212 27.268 5.444 26.240 0.00 0.00 -ATOM 713 C1 C1A B 213 3.881 0.625 19.406 0.00 0.00 -ATOM 714 C1 C1A B 214 0.794 12.599 27.523 0.00 0.00 -ATOM 715 C1 C1A B 215 29.411 20.412 6.613 0.00 0.00 -ATOM 716 C1 C1A B 216 8.679 17.791 26.861 0.00 0.00 -ATOM 717 C1 C1A B 217 25.705 2.007 2.369 0.00 0.00 -ATOM 718 C1 C1A B 218 2.699 29.947 14.520 0.00 0.00 -ATOM 719 C1 C1A B 219 16.584 26.708 8.815 0.00 0.00 -ATOM 720 C1 C1A B 220 4.933 8.008 14.461 0.00 0.00 -ATOM 721 C1 C1A B 221 6.518 26.334 10.686 0.00 0.00 -ATOM 722 C1 C1A B 222 28.260 14.578 4.482 0.00 0.00 -ATOM 723 C1 C1A B 223 11.062 20.249 24.836 0.00 0.00 -ATOM 724 C1 C1A B 224 12.424 12.669 2.815 0.00 0.00 -ATOM 725 C1 C1A B 225 7.656 28.305 7.791 0.00 0.00 -ATOM 726 C1 C1A B 226 17.301 1.170 8.020 0.00 0.00 -ATOM 727 C1 C1A B 227 17.606 23.082 20.494 0.00 0.00 -ATOM 728 C1 C1A B 228 7.171 17.482 22.944 0.00 0.00 -ATOM 729 C1 C1A B 229 26.589 17.933 4.825 0.00 0.00 -ATOM 730 C1 C1A B 230 7.680 18.938 12.226 0.00 0.00 -ATOM 731 C1 C1A B 231 12.159 9.464 4.990 0.00 0.00 -ATOM 732 C1 C1A B 232 1.637 24.331 6.809 0.00 0.00 -ATOM 733 C1 C1A B 233 0.444 13.853 22.385 0.00 0.00 -ATOM 734 C1 C1A B 234 1.682 7.723 2.865 0.00 0.00 -ATOM 735 C1 C1A B 235 3.446 6.269 29.995 0.00 0.00 -ATOM 736 C1 C1A B 236 1.985 15.579 25.851 0.00 0.00 -ATOM 737 C1 C1A B 237 25.277 23.499 22.480 0.00 0.00 -ATOM 738 C1 C1A B 238 1.129 6.494 25.980 0.00 0.00 -ATOM 739 C1 C1A B 239 24.180 15.660 2.823 0.00 0.00 -ATOM 740 C1 C1A B 240 10.862 2.251 20.250 0.00 0.00 -ATOM 741 C1 C1A B 241 13.434 18.989 17.101 0.00 0.00 -ATOM 742 C1 C1A B 242 22.799 10.669 8.532 0.00 0.00 -ATOM 743 C1 C1A B 243 19.841 13.389 20.497 0.00 0.00 -ATOM 744 C1 C1A B 244 17.488 8.313 14.580 0.00 0.00 -ATOM 745 C1 C1A B 245 9.039 17.011 4.493 0.00 0.00 -ATOM 746 C1 C1A B 246 4.265 11.931 1.801 0.00 0.00 -ATOM 747 C1 C1A B 247 7.325 10.210 7.493 0.00 0.00 -ATOM 748 C1 C1A B 248 12.488 25.900 5.505 0.00 0.00 -END diff --git a/example_file/methane_pentane/setup_box_1.psf b/example_file/methane_pentane/setup_box_1.psf deleted file mode 100644 index 093e5b9e5..000000000 --- a/example_file/methane_pentane/setup_box_1.psf +++ /dev/null @@ -1,1173 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology top_mie.inp - REMARKS segment C5A { first NONE; last NONE; auto angles dihedrals } - REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } - - 748 !NATOM - 1 C5A 1 C5A C3 CH2 0.000000 14.0270 0 - 2 C5A 1 C5A C2 CH2 0.000000 14.0270 0 - 3 C5A 1 C5A C1 CH3 0.000000 15.0350 0 - 4 C5A 1 C5A C4 CH2 0.000000 14.0270 0 - 5 C5A 1 C5A C5 CH3 0.000000 15.0350 0 - 6 C5A 2 C5A C3 CH2 0.000000 14.0270 0 - 7 C5A 2 C5A C2 CH2 0.000000 14.0270 0 - 8 C5A 2 C5A C1 CH3 0.000000 15.0350 0 - 9 C5A 2 C5A C4 CH2 0.000000 14.0270 0 - 10 C5A 2 C5A C5 CH3 0.000000 15.0350 0 - 11 C5A 3 C5A C3 CH2 0.000000 14.0270 0 - 12 C5A 3 C5A C2 CH2 0.000000 14.0270 0 - 13 C5A 3 C5A C1 CH3 0.000000 15.0350 0 - 14 C5A 3 C5A C4 CH2 0.000000 14.0270 0 - 15 C5A 3 C5A C5 CH3 0.000000 15.0350 0 - 16 C5A 4 C5A C3 CH2 0.000000 14.0270 0 - 17 C5A 4 C5A C2 CH2 0.000000 14.0270 0 - 18 C5A 4 C5A C1 CH3 0.000000 15.0350 0 - 19 C5A 4 C5A C4 CH2 0.000000 14.0270 0 - 20 C5A 4 C5A C5 CH3 0.000000 15.0350 0 - 21 C5A 5 C5A C3 CH2 0.000000 14.0270 0 - 22 C5A 5 C5A C2 CH2 0.000000 14.0270 0 - 23 C5A 5 C5A C1 CH3 0.000000 15.0350 0 - 24 C5A 5 C5A C4 CH2 0.000000 14.0270 0 - 25 C5A 5 C5A C5 CH3 0.000000 15.0350 0 - 26 C5A 6 C5A C3 CH2 0.000000 14.0270 0 - 27 C5A 6 C5A C2 CH2 0.000000 14.0270 0 - 28 C5A 6 C5A C1 CH3 0.000000 15.0350 0 - 29 C5A 6 C5A C4 CH2 0.000000 14.0270 0 - 30 C5A 6 C5A C5 CH3 0.000000 15.0350 0 - 31 C5A 7 C5A C3 CH2 0.000000 14.0270 0 - 32 C5A 7 C5A C2 CH2 0.000000 14.0270 0 - 33 C5A 7 C5A C1 CH3 0.000000 15.0350 0 - 34 C5A 7 C5A C4 CH2 0.000000 14.0270 0 - 35 C5A 7 C5A C5 CH3 0.000000 15.0350 0 - 36 C5A 8 C5A C3 CH2 0.000000 14.0270 0 - 37 C5A 8 C5A C2 CH2 0.000000 14.0270 0 - 38 C5A 8 C5A C1 CH3 0.000000 15.0350 0 - 39 C5A 8 C5A C4 CH2 0.000000 14.0270 0 - 40 C5A 8 C5A C5 CH3 0.000000 15.0350 0 - 41 C5A 9 C5A C3 CH2 0.000000 14.0270 0 - 42 C5A 9 C5A C2 CH2 0.000000 14.0270 0 - 43 C5A 9 C5A C1 CH3 0.000000 15.0350 0 - 44 C5A 9 C5A C4 CH2 0.000000 14.0270 0 - 45 C5A 9 C5A C5 CH3 0.000000 15.0350 0 - 46 C5A 10 C5A C3 CH2 0.000000 14.0270 0 - 47 C5A 10 C5A C2 CH2 0.000000 14.0270 0 - 48 C5A 10 C5A C1 CH3 0.000000 15.0350 0 - 49 C5A 10 C5A C4 CH2 0.000000 14.0270 0 - 50 C5A 10 C5A C5 CH3 0.000000 15.0350 0 - 51 C5A 11 C5A C3 CH2 0.000000 14.0270 0 - 52 C5A 11 C5A C2 CH2 0.000000 14.0270 0 - 53 C5A 11 C5A C1 CH3 0.000000 15.0350 0 - 54 C5A 11 C5A C4 CH2 0.000000 14.0270 0 - 55 C5A 11 C5A C5 CH3 0.000000 15.0350 0 - 56 C5A 12 C5A C3 CH2 0.000000 14.0270 0 - 57 C5A 12 C5A C2 CH2 0.000000 14.0270 0 - 58 C5A 12 C5A C1 CH3 0.000000 15.0350 0 - 59 C5A 12 C5A C4 CH2 0.000000 14.0270 0 - 60 C5A 12 C5A C5 CH3 0.000000 15.0350 0 - 61 C5A 13 C5A C3 CH2 0.000000 14.0270 0 - 62 C5A 13 C5A C2 CH2 0.000000 14.0270 0 - 63 C5A 13 C5A C1 CH3 0.000000 15.0350 0 - 64 C5A 13 C5A C4 CH2 0.000000 14.0270 0 - 65 C5A 13 C5A C5 CH3 0.000000 15.0350 0 - 66 C5A 14 C5A C3 CH2 0.000000 14.0270 0 - 67 C5A 14 C5A C2 CH2 0.000000 14.0270 0 - 68 C5A 14 C5A C1 CH3 0.000000 15.0350 0 - 69 C5A 14 C5A C4 CH2 0.000000 14.0270 0 - 70 C5A 14 C5A C5 CH3 0.000000 15.0350 0 - 71 C5A 15 C5A C3 CH2 0.000000 14.0270 0 - 72 C5A 15 C5A C2 CH2 0.000000 14.0270 0 - 73 C5A 15 C5A C1 CH3 0.000000 15.0350 0 - 74 C5A 15 C5A C4 CH2 0.000000 14.0270 0 - 75 C5A 15 C5A C5 CH3 0.000000 15.0350 0 - 76 C5A 16 C5A C3 CH2 0.000000 14.0270 0 - 77 C5A 16 C5A C2 CH2 0.000000 14.0270 0 - 78 C5A 16 C5A C1 CH3 0.000000 15.0350 0 - 79 C5A 16 C5A C4 CH2 0.000000 14.0270 0 - 80 C5A 16 C5A C5 CH3 0.000000 15.0350 0 - 81 C5A 17 C5A C3 CH2 0.000000 14.0270 0 - 82 C5A 17 C5A C2 CH2 0.000000 14.0270 0 - 83 C5A 17 C5A C1 CH3 0.000000 15.0350 0 - 84 C5A 17 C5A C4 CH2 0.000000 14.0270 0 - 85 C5A 17 C5A C5 CH3 0.000000 15.0350 0 - 86 C5A 18 C5A C3 CH2 0.000000 14.0270 0 - 87 C5A 18 C5A C2 CH2 0.000000 14.0270 0 - 88 C5A 18 C5A C1 CH3 0.000000 15.0350 0 - 89 C5A 18 C5A C4 CH2 0.000000 14.0270 0 - 90 C5A 18 C5A C5 CH3 0.000000 15.0350 0 - 91 C5A 19 C5A C3 CH2 0.000000 14.0270 0 - 92 C5A 19 C5A C2 CH2 0.000000 14.0270 0 - 93 C5A 19 C5A C1 CH3 0.000000 15.0350 0 - 94 C5A 19 C5A C4 CH2 0.000000 14.0270 0 - 95 C5A 19 C5A C5 CH3 0.000000 15.0350 0 - 96 C5A 20 C5A C3 CH2 0.000000 14.0270 0 - 97 C5A 20 C5A C2 CH2 0.000000 14.0270 0 - 98 C5A 20 C5A C1 CH3 0.000000 15.0350 0 - 99 C5A 20 C5A C4 CH2 0.000000 14.0270 0 - 100 C5A 20 C5A C5 CH3 0.000000 15.0350 0 - 101 C5A 21 C5A C3 CH2 0.000000 14.0270 0 - 102 C5A 21 C5A C2 CH2 0.000000 14.0270 0 - 103 C5A 21 C5A C1 CH3 0.000000 15.0350 0 - 104 C5A 21 C5A C4 CH2 0.000000 14.0270 0 - 105 C5A 21 C5A C5 CH3 0.000000 15.0350 0 - 106 C5A 22 C5A C3 CH2 0.000000 14.0270 0 - 107 C5A 22 C5A C2 CH2 0.000000 14.0270 0 - 108 C5A 22 C5A C1 CH3 0.000000 15.0350 0 - 109 C5A 22 C5A C4 CH2 0.000000 14.0270 0 - 110 C5A 22 C5A C5 CH3 0.000000 15.0350 0 - 111 C5A 23 C5A C3 CH2 0.000000 14.0270 0 - 112 C5A 23 C5A C2 CH2 0.000000 14.0270 0 - 113 C5A 23 C5A C1 CH3 0.000000 15.0350 0 - 114 C5A 23 C5A C4 CH2 0.000000 14.0270 0 - 115 C5A 23 C5A C5 CH3 0.000000 15.0350 0 - 116 C5A 24 C5A C3 CH2 0.000000 14.0270 0 - 117 C5A 24 C5A C2 CH2 0.000000 14.0270 0 - 118 C5A 24 C5A C1 CH3 0.000000 15.0350 0 - 119 C5A 24 C5A C4 CH2 0.000000 14.0270 0 - 120 C5A 24 C5A C5 CH3 0.000000 15.0350 0 - 121 C5A 25 C5A C3 CH2 0.000000 14.0270 0 - 122 C5A 25 C5A C2 CH2 0.000000 14.0270 0 - 123 C5A 25 C5A C1 CH3 0.000000 15.0350 0 - 124 C5A 25 C5A C4 CH2 0.000000 14.0270 0 - 125 C5A 25 C5A C5 CH3 0.000000 15.0350 0 - 126 C5A 26 C5A C3 CH2 0.000000 14.0270 0 - 127 C5A 26 C5A C2 CH2 0.000000 14.0270 0 - 128 C5A 26 C5A C1 CH3 0.000000 15.0350 0 - 129 C5A 26 C5A C4 CH2 0.000000 14.0270 0 - 130 C5A 26 C5A C5 CH3 0.000000 15.0350 0 - 131 C5A 27 C5A C3 CH2 0.000000 14.0270 0 - 132 C5A 27 C5A C2 CH2 0.000000 14.0270 0 - 133 C5A 27 C5A C1 CH3 0.000000 15.0350 0 - 134 C5A 27 C5A C4 CH2 0.000000 14.0270 0 - 135 C5A 27 C5A C5 CH3 0.000000 15.0350 0 - 136 C5A 28 C5A C3 CH2 0.000000 14.0270 0 - 137 C5A 28 C5A C2 CH2 0.000000 14.0270 0 - 138 C5A 28 C5A C1 CH3 0.000000 15.0350 0 - 139 C5A 28 C5A C4 CH2 0.000000 14.0270 0 - 140 C5A 28 C5A C5 CH3 0.000000 15.0350 0 - 141 C5A 29 C5A C3 CH2 0.000000 14.0270 0 - 142 C5A 29 C5A C2 CH2 0.000000 14.0270 0 - 143 C5A 29 C5A C1 CH3 0.000000 15.0350 0 - 144 C5A 29 C5A C4 CH2 0.000000 14.0270 0 - 145 C5A 29 C5A C5 CH3 0.000000 15.0350 0 - 146 C5A 30 C5A C3 CH2 0.000000 14.0270 0 - 147 C5A 30 C5A C2 CH2 0.000000 14.0270 0 - 148 C5A 30 C5A C1 CH3 0.000000 15.0350 0 - 149 C5A 30 C5A C4 CH2 0.000000 14.0270 0 - 150 C5A 30 C5A C5 CH3 0.000000 15.0350 0 - 151 C5A 31 C5A C3 CH2 0.000000 14.0270 0 - 152 C5A 31 C5A C2 CH2 0.000000 14.0270 0 - 153 C5A 31 C5A C1 CH3 0.000000 15.0350 0 - 154 C5A 31 C5A C4 CH2 0.000000 14.0270 0 - 155 C5A 31 C5A C5 CH3 0.000000 15.0350 0 - 156 C5A 32 C5A C3 CH2 0.000000 14.0270 0 - 157 C5A 32 C5A C2 CH2 0.000000 14.0270 0 - 158 C5A 32 C5A C1 CH3 0.000000 15.0350 0 - 159 C5A 32 C5A C4 CH2 0.000000 14.0270 0 - 160 C5A 32 C5A C5 CH3 0.000000 15.0350 0 - 161 C5A 33 C5A C3 CH2 0.000000 14.0270 0 - 162 C5A 33 C5A C2 CH2 0.000000 14.0270 0 - 163 C5A 33 C5A C1 CH3 0.000000 15.0350 0 - 164 C5A 33 C5A C4 CH2 0.000000 14.0270 0 - 165 C5A 33 C5A C5 CH3 0.000000 15.0350 0 - 166 C5A 34 C5A C3 CH2 0.000000 14.0270 0 - 167 C5A 34 C5A C2 CH2 0.000000 14.0270 0 - 168 C5A 34 C5A C1 CH3 0.000000 15.0350 0 - 169 C5A 34 C5A C4 CH2 0.000000 14.0270 0 - 170 C5A 34 C5A C5 CH3 0.000000 15.0350 0 - 171 C5A 35 C5A C3 CH2 0.000000 14.0270 0 - 172 C5A 35 C5A C2 CH2 0.000000 14.0270 0 - 173 C5A 35 C5A C1 CH3 0.000000 15.0350 0 - 174 C5A 35 C5A C4 CH2 0.000000 14.0270 0 - 175 C5A 35 C5A C5 CH3 0.000000 15.0350 0 - 176 C5A 36 C5A C3 CH2 0.000000 14.0270 0 - 177 C5A 36 C5A C2 CH2 0.000000 14.0270 0 - 178 C5A 36 C5A C1 CH3 0.000000 15.0350 0 - 179 C5A 36 C5A C4 CH2 0.000000 14.0270 0 - 180 C5A 36 C5A C5 CH3 0.000000 15.0350 0 - 181 C5A 37 C5A C3 CH2 0.000000 14.0270 0 - 182 C5A 37 C5A C2 CH2 0.000000 14.0270 0 - 183 C5A 37 C5A C1 CH3 0.000000 15.0350 0 - 184 C5A 37 C5A C4 CH2 0.000000 14.0270 0 - 185 C5A 37 C5A C5 CH3 0.000000 15.0350 0 - 186 C5A 38 C5A C3 CH2 0.000000 14.0270 0 - 187 C5A 38 C5A C2 CH2 0.000000 14.0270 0 - 188 C5A 38 C5A C1 CH3 0.000000 15.0350 0 - 189 C5A 38 C5A C4 CH2 0.000000 14.0270 0 - 190 C5A 38 C5A C5 CH3 0.000000 15.0350 0 - 191 C5A 39 C5A C3 CH2 0.000000 14.0270 0 - 192 C5A 39 C5A C2 CH2 0.000000 14.0270 0 - 193 C5A 39 C5A C1 CH3 0.000000 15.0350 0 - 194 C5A 39 C5A C4 CH2 0.000000 14.0270 0 - 195 C5A 39 C5A C5 CH3 0.000000 15.0350 0 - 196 C5A 40 C5A C3 CH2 0.000000 14.0270 0 - 197 C5A 40 C5A C2 CH2 0.000000 14.0270 0 - 198 C5A 40 C5A C1 CH3 0.000000 15.0350 0 - 199 C5A 40 C5A C4 CH2 0.000000 14.0270 0 - 200 C5A 40 C5A C5 CH3 0.000000 15.0350 0 - 201 C5A 41 C5A C3 CH2 0.000000 14.0270 0 - 202 C5A 41 C5A C2 CH2 0.000000 14.0270 0 - 203 C5A 41 C5A C1 CH3 0.000000 15.0350 0 - 204 C5A 41 C5A C4 CH2 0.000000 14.0270 0 - 205 C5A 41 C5A C5 CH3 0.000000 15.0350 0 - 206 C5A 42 C5A C3 CH2 0.000000 14.0270 0 - 207 C5A 42 C5A C2 CH2 0.000000 14.0270 0 - 208 C5A 42 C5A C1 CH3 0.000000 15.0350 0 - 209 C5A 42 C5A C4 CH2 0.000000 14.0270 0 - 210 C5A 42 C5A C5 CH3 0.000000 15.0350 0 - 211 C5A 43 C5A C3 CH2 0.000000 14.0270 0 - 212 C5A 43 C5A C2 CH2 0.000000 14.0270 0 - 213 C5A 43 C5A C1 CH3 0.000000 15.0350 0 - 214 C5A 43 C5A C4 CH2 0.000000 14.0270 0 - 215 C5A 43 C5A C5 CH3 0.000000 15.0350 0 - 216 C5A 44 C5A C3 CH2 0.000000 14.0270 0 - 217 C5A 44 C5A C2 CH2 0.000000 14.0270 0 - 218 C5A 44 C5A C1 CH3 0.000000 15.0350 0 - 219 C5A 44 C5A C4 CH2 0.000000 14.0270 0 - 220 C5A 44 C5A C5 CH3 0.000000 15.0350 0 - 221 C5A 45 C5A C3 CH2 0.000000 14.0270 0 - 222 C5A 45 C5A C2 CH2 0.000000 14.0270 0 - 223 C5A 45 C5A C1 CH3 0.000000 15.0350 0 - 224 C5A 45 C5A C4 CH2 0.000000 14.0270 0 - 225 C5A 45 C5A C5 CH3 0.000000 15.0350 0 - 226 C5A 46 C5A C3 CH2 0.000000 14.0270 0 - 227 C5A 46 C5A C2 CH2 0.000000 14.0270 0 - 228 C5A 46 C5A C1 CH3 0.000000 15.0350 0 - 229 C5A 46 C5A C4 CH2 0.000000 14.0270 0 - 230 C5A 46 C5A C5 CH3 0.000000 15.0350 0 - 231 C5A 47 C5A C3 CH2 0.000000 14.0270 0 - 232 C5A 47 C5A C2 CH2 0.000000 14.0270 0 - 233 C5A 47 C5A C1 CH3 0.000000 15.0350 0 - 234 C5A 47 C5A C4 CH2 0.000000 14.0270 0 - 235 C5A 47 C5A C5 CH3 0.000000 15.0350 0 - 236 C5A 48 C5A C3 CH2 0.000000 14.0270 0 - 237 C5A 48 C5A C2 CH2 0.000000 14.0270 0 - 238 C5A 48 C5A C1 CH3 0.000000 15.0350 0 - 239 C5A 48 C5A C4 CH2 0.000000 14.0270 0 - 240 C5A 48 C5A C5 CH3 0.000000 15.0350 0 - 241 C5A 49 C5A C3 CH2 0.000000 14.0270 0 - 242 C5A 49 C5A C2 CH2 0.000000 14.0270 0 - 243 C5A 49 C5A C1 CH3 0.000000 15.0350 0 - 244 C5A 49 C5A C4 CH2 0.000000 14.0270 0 - 245 C5A 49 C5A C5 CH3 0.000000 15.0350 0 - 246 C5A 50 C5A C3 CH2 0.000000 14.0270 0 - 247 C5A 50 C5A C2 CH2 0.000000 14.0270 0 - 248 C5A 50 C5A C1 CH3 0.000000 15.0350 0 - 249 C5A 50 C5A C4 CH2 0.000000 14.0270 0 - 250 C5A 50 C5A C5 CH3 0.000000 15.0350 0 - 251 C5A 51 C5A C3 CH2 0.000000 14.0270 0 - 252 C5A 51 C5A C2 CH2 0.000000 14.0270 0 - 253 C5A 51 C5A C1 CH3 0.000000 15.0350 0 - 254 C5A 51 C5A C4 CH2 0.000000 14.0270 0 - 255 C5A 51 C5A C5 CH3 0.000000 15.0350 0 - 256 C5A 52 C5A C3 CH2 0.000000 14.0270 0 - 257 C5A 52 C5A C2 CH2 0.000000 14.0270 0 - 258 C5A 52 C5A C1 CH3 0.000000 15.0350 0 - 259 C5A 52 C5A C4 CH2 0.000000 14.0270 0 - 260 C5A 52 C5A C5 CH3 0.000000 15.0350 0 - 261 C5A 53 C5A C3 CH2 0.000000 14.0270 0 - 262 C5A 53 C5A C2 CH2 0.000000 14.0270 0 - 263 C5A 53 C5A C1 CH3 0.000000 15.0350 0 - 264 C5A 53 C5A C4 CH2 0.000000 14.0270 0 - 265 C5A 53 C5A C5 CH3 0.000000 15.0350 0 - 266 C5A 54 C5A C3 CH2 0.000000 14.0270 0 - 267 C5A 54 C5A C2 CH2 0.000000 14.0270 0 - 268 C5A 54 C5A C1 CH3 0.000000 15.0350 0 - 269 C5A 54 C5A C4 CH2 0.000000 14.0270 0 - 270 C5A 54 C5A C5 CH3 0.000000 15.0350 0 - 271 C5A 55 C5A C3 CH2 0.000000 14.0270 0 - 272 C5A 55 C5A C2 CH2 0.000000 14.0270 0 - 273 C5A 55 C5A C1 CH3 0.000000 15.0350 0 - 274 C5A 55 C5A C4 CH2 0.000000 14.0270 0 - 275 C5A 55 C5A C5 CH3 0.000000 15.0350 0 - 276 C5A 56 C5A C3 CH2 0.000000 14.0270 0 - 277 C5A 56 C5A C2 CH2 0.000000 14.0270 0 - 278 C5A 56 C5A C1 CH3 0.000000 15.0350 0 - 279 C5A 56 C5A C4 CH2 0.000000 14.0270 0 - 280 C5A 56 C5A C5 CH3 0.000000 15.0350 0 - 281 C5A 57 C5A C3 CH2 0.000000 14.0270 0 - 282 C5A 57 C5A C2 CH2 0.000000 14.0270 0 - 283 C5A 57 C5A C1 CH3 0.000000 15.0350 0 - 284 C5A 57 C5A C4 CH2 0.000000 14.0270 0 - 285 C5A 57 C5A C5 CH3 0.000000 15.0350 0 - 286 C5A 58 C5A C3 CH2 0.000000 14.0270 0 - 287 C5A 58 C5A C2 CH2 0.000000 14.0270 0 - 288 C5A 58 C5A C1 CH3 0.000000 15.0350 0 - 289 C5A 58 C5A C4 CH2 0.000000 14.0270 0 - 290 C5A 58 C5A C5 CH3 0.000000 15.0350 0 - 291 C5A 59 C5A C3 CH2 0.000000 14.0270 0 - 292 C5A 59 C5A C2 CH2 0.000000 14.0270 0 - 293 C5A 59 C5A C1 CH3 0.000000 15.0350 0 - 294 C5A 59 C5A C4 CH2 0.000000 14.0270 0 - 295 C5A 59 C5A C5 CH3 0.000000 15.0350 0 - 296 C5A 60 C5A C3 CH2 0.000000 14.0270 0 - 297 C5A 60 C5A C2 CH2 0.000000 14.0270 0 - 298 C5A 60 C5A C1 CH3 0.000000 15.0350 0 - 299 C5A 60 C5A C4 CH2 0.000000 14.0270 0 - 300 C5A 60 C5A C5 CH3 0.000000 15.0350 0 - 301 C5A 61 C5A C3 CH2 0.000000 14.0270 0 - 302 C5A 61 C5A C2 CH2 0.000000 14.0270 0 - 303 C5A 61 C5A C1 CH3 0.000000 15.0350 0 - 304 C5A 61 C5A C4 CH2 0.000000 14.0270 0 - 305 C5A 61 C5A C5 CH3 0.000000 15.0350 0 - 306 C5A 62 C5A C3 CH2 0.000000 14.0270 0 - 307 C5A 62 C5A C2 CH2 0.000000 14.0270 0 - 308 C5A 62 C5A C1 CH3 0.000000 15.0350 0 - 309 C5A 62 C5A C4 CH2 0.000000 14.0270 0 - 310 C5A 62 C5A C5 CH3 0.000000 15.0350 0 - 311 C5A 63 C5A C3 CH2 0.000000 14.0270 0 - 312 C5A 63 C5A C2 CH2 0.000000 14.0270 0 - 313 C5A 63 C5A C1 CH3 0.000000 15.0350 0 - 314 C5A 63 C5A C4 CH2 0.000000 14.0270 0 - 315 C5A 63 C5A C5 CH3 0.000000 15.0350 0 - 316 C5A 64 C5A C3 CH2 0.000000 14.0270 0 - 317 C5A 64 C5A C2 CH2 0.000000 14.0270 0 - 318 C5A 64 C5A C1 CH3 0.000000 15.0350 0 - 319 C5A 64 C5A C4 CH2 0.000000 14.0270 0 - 320 C5A 64 C5A C5 CH3 0.000000 15.0350 0 - 321 C5A 65 C5A C3 CH2 0.000000 14.0270 0 - 322 C5A 65 C5A C2 CH2 0.000000 14.0270 0 - 323 C5A 65 C5A C1 CH3 0.000000 15.0350 0 - 324 C5A 65 C5A C4 CH2 0.000000 14.0270 0 - 325 C5A 65 C5A C5 CH3 0.000000 15.0350 0 - 326 C5A 66 C5A C3 CH2 0.000000 14.0270 0 - 327 C5A 66 C5A C2 CH2 0.000000 14.0270 0 - 328 C5A 66 C5A C1 CH3 0.000000 15.0350 0 - 329 C5A 66 C5A C4 CH2 0.000000 14.0270 0 - 330 C5A 66 C5A C5 CH3 0.000000 15.0350 0 - 331 C5A 67 C5A C3 CH2 0.000000 14.0270 0 - 332 C5A 67 C5A C2 CH2 0.000000 14.0270 0 - 333 C5A 67 C5A C1 CH3 0.000000 15.0350 0 - 334 C5A 67 C5A C4 CH2 0.000000 14.0270 0 - 335 C5A 67 C5A C5 CH3 0.000000 15.0350 0 - 336 C5A 68 C5A C3 CH2 0.000000 14.0270 0 - 337 C5A 68 C5A C2 CH2 0.000000 14.0270 0 - 338 C5A 68 C5A C1 CH3 0.000000 15.0350 0 - 339 C5A 68 C5A C4 CH2 0.000000 14.0270 0 - 340 C5A 68 C5A C5 CH3 0.000000 15.0350 0 - 341 C5A 69 C5A C3 CH2 0.000000 14.0270 0 - 342 C5A 69 C5A C2 CH2 0.000000 14.0270 0 - 343 C5A 69 C5A C1 CH3 0.000000 15.0350 0 - 344 C5A 69 C5A C4 CH2 0.000000 14.0270 0 - 345 C5A 69 C5A C5 CH3 0.000000 15.0350 0 - 346 C5A 70 C5A C3 CH2 0.000000 14.0270 0 - 347 C5A 70 C5A C2 CH2 0.000000 14.0270 0 - 348 C5A 70 C5A C1 CH3 0.000000 15.0350 0 - 349 C5A 70 C5A C4 CH2 0.000000 14.0270 0 - 350 C5A 70 C5A C5 CH3 0.000000 15.0350 0 - 351 C5A 71 C5A C3 CH2 0.000000 14.0270 0 - 352 C5A 71 C5A C2 CH2 0.000000 14.0270 0 - 353 C5A 71 C5A C1 CH3 0.000000 15.0350 0 - 354 C5A 71 C5A C4 CH2 0.000000 14.0270 0 - 355 C5A 71 C5A C5 CH3 0.000000 15.0350 0 - 356 C5A 72 C5A C3 CH2 0.000000 14.0270 0 - 357 C5A 72 C5A C2 CH2 0.000000 14.0270 0 - 358 C5A 72 C5A C1 CH3 0.000000 15.0350 0 - 359 C5A 72 C5A C4 CH2 0.000000 14.0270 0 - 360 C5A 72 C5A C5 CH3 0.000000 15.0350 0 - 361 C5A 73 C5A C3 CH2 0.000000 14.0270 0 - 362 C5A 73 C5A C2 CH2 0.000000 14.0270 0 - 363 C5A 73 C5A C1 CH3 0.000000 15.0350 0 - 364 C5A 73 C5A C4 CH2 0.000000 14.0270 0 - 365 C5A 73 C5A C5 CH3 0.000000 15.0350 0 - 366 C5A 74 C5A C3 CH2 0.000000 14.0270 0 - 367 C5A 74 C5A C2 CH2 0.000000 14.0270 0 - 368 C5A 74 C5A C1 CH3 0.000000 15.0350 0 - 369 C5A 74 C5A C4 CH2 0.000000 14.0270 0 - 370 C5A 74 C5A C5 CH3 0.000000 15.0350 0 - 371 C5A 75 C5A C3 CH2 0.000000 14.0270 0 - 372 C5A 75 C5A C2 CH2 0.000000 14.0270 0 - 373 C5A 75 C5A C1 CH3 0.000000 15.0350 0 - 374 C5A 75 C5A C4 CH2 0.000000 14.0270 0 - 375 C5A 75 C5A C5 CH3 0.000000 15.0350 0 - 376 C5A 76 C5A C3 CH2 0.000000 14.0270 0 - 377 C5A 76 C5A C2 CH2 0.000000 14.0270 0 - 378 C5A 76 C5A C1 CH3 0.000000 15.0350 0 - 379 C5A 76 C5A C4 CH2 0.000000 14.0270 0 - 380 C5A 76 C5A C5 CH3 0.000000 15.0350 0 - 381 C5A 77 C5A C3 CH2 0.000000 14.0270 0 - 382 C5A 77 C5A C2 CH2 0.000000 14.0270 0 - 383 C5A 77 C5A C1 CH3 0.000000 15.0350 0 - 384 C5A 77 C5A C4 CH2 0.000000 14.0270 0 - 385 C5A 77 C5A C5 CH3 0.000000 15.0350 0 - 386 C5A 78 C5A C3 CH2 0.000000 14.0270 0 - 387 C5A 78 C5A C2 CH2 0.000000 14.0270 0 - 388 C5A 78 C5A C1 CH3 0.000000 15.0350 0 - 389 C5A 78 C5A C4 CH2 0.000000 14.0270 0 - 390 C5A 78 C5A C5 CH3 0.000000 15.0350 0 - 391 C5A 79 C5A C3 CH2 0.000000 14.0270 0 - 392 C5A 79 C5A C2 CH2 0.000000 14.0270 0 - 393 C5A 79 C5A C1 CH3 0.000000 15.0350 0 - 394 C5A 79 C5A C4 CH2 0.000000 14.0270 0 - 395 C5A 79 C5A C5 CH3 0.000000 15.0350 0 - 396 C5A 80 C5A C3 CH2 0.000000 14.0270 0 - 397 C5A 80 C5A C2 CH2 0.000000 14.0270 0 - 398 C5A 80 C5A C1 CH3 0.000000 15.0350 0 - 399 C5A 80 C5A C4 CH2 0.000000 14.0270 0 - 400 C5A 80 C5A C5 CH3 0.000000 15.0350 0 - 401 C5A 81 C5A C3 CH2 0.000000 14.0270 0 - 402 C5A 81 C5A C2 CH2 0.000000 14.0270 0 - 403 C5A 81 C5A C1 CH3 0.000000 15.0350 0 - 404 C5A 81 C5A C4 CH2 0.000000 14.0270 0 - 405 C5A 81 C5A C5 CH3 0.000000 15.0350 0 - 406 C5A 82 C5A C3 CH2 0.000000 14.0270 0 - 407 C5A 82 C5A C2 CH2 0.000000 14.0270 0 - 408 C5A 82 C5A C1 CH3 0.000000 15.0350 0 - 409 C5A 82 C5A C4 CH2 0.000000 14.0270 0 - 410 C5A 82 C5A C5 CH3 0.000000 15.0350 0 - 411 C5A 83 C5A C3 CH2 0.000000 14.0270 0 - 412 C5A 83 C5A C2 CH2 0.000000 14.0270 0 - 413 C5A 83 C5A C1 CH3 0.000000 15.0350 0 - 414 C5A 83 C5A C4 CH2 0.000000 14.0270 0 - 415 C5A 83 C5A C5 CH3 0.000000 15.0350 0 - 416 C5A 84 C5A C3 CH2 0.000000 14.0270 0 - 417 C5A 84 C5A C2 CH2 0.000000 14.0270 0 - 418 C5A 84 C5A C1 CH3 0.000000 15.0350 0 - 419 C5A 84 C5A C4 CH2 0.000000 14.0270 0 - 420 C5A 84 C5A C5 CH3 0.000000 15.0350 0 - 421 C5A 85 C5A C3 CH2 0.000000 14.0270 0 - 422 C5A 85 C5A C2 CH2 0.000000 14.0270 0 - 423 C5A 85 C5A C1 CH3 0.000000 15.0350 0 - 424 C5A 85 C5A C4 CH2 0.000000 14.0270 0 - 425 C5A 85 C5A C5 CH3 0.000000 15.0350 0 - 426 C5A 86 C5A C3 CH2 0.000000 14.0270 0 - 427 C5A 86 C5A C2 CH2 0.000000 14.0270 0 - 428 C5A 86 C5A C1 CH3 0.000000 15.0350 0 - 429 C5A 86 C5A C4 CH2 0.000000 14.0270 0 - 430 C5A 86 C5A C5 CH3 0.000000 15.0350 0 - 431 C5A 87 C5A C3 CH2 0.000000 14.0270 0 - 432 C5A 87 C5A C2 CH2 0.000000 14.0270 0 - 433 C5A 87 C5A C1 CH3 0.000000 15.0350 0 - 434 C5A 87 C5A C4 CH2 0.000000 14.0270 0 - 435 C5A 87 C5A C5 CH3 0.000000 15.0350 0 - 436 C5A 88 C5A C3 CH2 0.000000 14.0270 0 - 437 C5A 88 C5A C2 CH2 0.000000 14.0270 0 - 438 C5A 88 C5A C1 CH3 0.000000 15.0350 0 - 439 C5A 88 C5A C4 CH2 0.000000 14.0270 0 - 440 C5A 88 C5A C5 CH3 0.000000 15.0350 0 - 441 C5A 89 C5A C3 CH2 0.000000 14.0270 0 - 442 C5A 89 C5A C2 CH2 0.000000 14.0270 0 - 443 C5A 89 C5A C1 CH3 0.000000 15.0350 0 - 444 C5A 89 C5A C4 CH2 0.000000 14.0270 0 - 445 C5A 89 C5A C5 CH3 0.000000 15.0350 0 - 446 C5A 90 C5A C3 CH2 0.000000 14.0270 0 - 447 C5A 90 C5A C2 CH2 0.000000 14.0270 0 - 448 C5A 90 C5A C1 CH3 0.000000 15.0350 0 - 449 C5A 90 C5A C4 CH2 0.000000 14.0270 0 - 450 C5A 90 C5A C5 CH3 0.000000 15.0350 0 - 451 C5A 91 C5A C3 CH2 0.000000 14.0270 0 - 452 C5A 91 C5A C2 CH2 0.000000 14.0270 0 - 453 C5A 91 C5A C1 CH3 0.000000 15.0350 0 - 454 C5A 91 C5A C4 CH2 0.000000 14.0270 0 - 455 C5A 91 C5A C5 CH3 0.000000 15.0350 0 - 456 C5A 92 C5A C3 CH2 0.000000 14.0270 0 - 457 C5A 92 C5A C2 CH2 0.000000 14.0270 0 - 458 C5A 92 C5A C1 CH3 0.000000 15.0350 0 - 459 C5A 92 C5A C4 CH2 0.000000 14.0270 0 - 460 C5A 92 C5A C5 CH3 0.000000 15.0350 0 - 461 C5A 93 C5A C3 CH2 0.000000 14.0270 0 - 462 C5A 93 C5A C2 CH2 0.000000 14.0270 0 - 463 C5A 93 C5A C1 CH3 0.000000 15.0350 0 - 464 C5A 93 C5A C4 CH2 0.000000 14.0270 0 - 465 C5A 93 C5A C5 CH3 0.000000 15.0350 0 - 466 C5A 94 C5A C3 CH2 0.000000 14.0270 0 - 467 C5A 94 C5A C2 CH2 0.000000 14.0270 0 - 468 C5A 94 C5A C1 CH3 0.000000 15.0350 0 - 469 C5A 94 C5A C4 CH2 0.000000 14.0270 0 - 470 C5A 94 C5A C5 CH3 0.000000 15.0350 0 - 471 C5A 95 C5A C3 CH2 0.000000 14.0270 0 - 472 C5A 95 C5A C2 CH2 0.000000 14.0270 0 - 473 C5A 95 C5A C1 CH3 0.000000 15.0350 0 - 474 C5A 95 C5A C4 CH2 0.000000 14.0270 0 - 475 C5A 95 C5A C5 CH3 0.000000 15.0350 0 - 476 C5A 96 C5A C3 CH2 0.000000 14.0270 0 - 477 C5A 96 C5A C2 CH2 0.000000 14.0270 0 - 478 C5A 96 C5A C1 CH3 0.000000 15.0350 0 - 479 C5A 96 C5A C4 CH2 0.000000 14.0270 0 - 480 C5A 96 C5A C5 CH3 0.000000 15.0350 0 - 481 C5A 97 C5A C3 CH2 0.000000 14.0270 0 - 482 C5A 97 C5A C2 CH2 0.000000 14.0270 0 - 483 C5A 97 C5A C1 CH3 0.000000 15.0350 0 - 484 C5A 97 C5A C4 CH2 0.000000 14.0270 0 - 485 C5A 97 C5A C5 CH3 0.000000 15.0350 0 - 486 C5A 98 C5A C3 CH2 0.000000 14.0270 0 - 487 C5A 98 C5A C2 CH2 0.000000 14.0270 0 - 488 C5A 98 C5A C1 CH3 0.000000 15.0350 0 - 489 C5A 98 C5A C4 CH2 0.000000 14.0270 0 - 490 C5A 98 C5A C5 CH3 0.000000 15.0350 0 - 491 C5A 99 C5A C3 CH2 0.000000 14.0270 0 - 492 C5A 99 C5A C2 CH2 0.000000 14.0270 0 - 493 C5A 99 C5A C1 CH3 0.000000 15.0350 0 - 494 C5A 99 C5A C4 CH2 0.000000 14.0270 0 - 495 C5A 99 C5A C5 CH3 0.000000 15.0350 0 - 496 C5A 100 C5A C3 CH2 0.000000 14.0270 0 - 497 C5A 100 C5A C2 CH2 0.000000 14.0270 0 - 498 C5A 100 C5A C1 CH3 0.000000 15.0350 0 - 499 C5A 100 C5A C4 CH2 0.000000 14.0270 0 - 500 C5A 100 C5A C5 CH3 0.000000 15.0350 0 - 501 C1A 1 C1A C1 CH4 0.000000 16.0430 0 - 502 C1A 2 C1A C1 CH4 0.000000 16.0430 0 - 503 C1A 3 C1A C1 CH4 0.000000 16.0430 0 - 504 C1A 4 C1A C1 CH4 0.000000 16.0430 0 - 505 C1A 5 C1A C1 CH4 0.000000 16.0430 0 - 506 C1A 6 C1A C1 CH4 0.000000 16.0430 0 - 507 C1A 7 C1A C1 CH4 0.000000 16.0430 0 - 508 C1A 8 C1A C1 CH4 0.000000 16.0430 0 - 509 C1A 9 C1A C1 CH4 0.000000 16.0430 0 - 510 C1A 10 C1A C1 CH4 0.000000 16.0430 0 - 511 C1A 11 C1A C1 CH4 0.000000 16.0430 0 - 512 C1A 12 C1A C1 CH4 0.000000 16.0430 0 - 513 C1A 13 C1A C1 CH4 0.000000 16.0430 0 - 514 C1A 14 C1A C1 CH4 0.000000 16.0430 0 - 515 C1A 15 C1A C1 CH4 0.000000 16.0430 0 - 516 C1A 16 C1A C1 CH4 0.000000 16.0430 0 - 517 C1A 17 C1A C1 CH4 0.000000 16.0430 0 - 518 C1A 18 C1A C1 CH4 0.000000 16.0430 0 - 519 C1A 19 C1A C1 CH4 0.000000 16.0430 0 - 520 C1A 20 C1A C1 CH4 0.000000 16.0430 0 - 521 C1A 21 C1A C1 CH4 0.000000 16.0430 0 - 522 C1A 22 C1A C1 CH4 0.000000 16.0430 0 - 523 C1A 23 C1A C1 CH4 0.000000 16.0430 0 - 524 C1A 24 C1A C1 CH4 0.000000 16.0430 0 - 525 C1A 25 C1A C1 CH4 0.000000 16.0430 0 - 526 C1A 26 C1A C1 CH4 0.000000 16.0430 0 - 527 C1A 27 C1A C1 CH4 0.000000 16.0430 0 - 528 C1A 28 C1A C1 CH4 0.000000 16.0430 0 - 529 C1A 29 C1A C1 CH4 0.000000 16.0430 0 - 530 C1A 30 C1A C1 CH4 0.000000 16.0430 0 - 531 C1A 31 C1A C1 CH4 0.000000 16.0430 0 - 532 C1A 32 C1A C1 CH4 0.000000 16.0430 0 - 533 C1A 33 C1A C1 CH4 0.000000 16.0430 0 - 534 C1A 34 C1A C1 CH4 0.000000 16.0430 0 - 535 C1A 35 C1A C1 CH4 0.000000 16.0430 0 - 536 C1A 36 C1A C1 CH4 0.000000 16.0430 0 - 537 C1A 37 C1A C1 CH4 0.000000 16.0430 0 - 538 C1A 38 C1A C1 CH4 0.000000 16.0430 0 - 539 C1A 39 C1A C1 CH4 0.000000 16.0430 0 - 540 C1A 40 C1A C1 CH4 0.000000 16.0430 0 - 541 C1A 41 C1A C1 CH4 0.000000 16.0430 0 - 542 C1A 42 C1A C1 CH4 0.000000 16.0430 0 - 543 C1A 43 C1A C1 CH4 0.000000 16.0430 0 - 544 C1A 44 C1A C1 CH4 0.000000 16.0430 0 - 545 C1A 45 C1A C1 CH4 0.000000 16.0430 0 - 546 C1A 46 C1A C1 CH4 0.000000 16.0430 0 - 547 C1A 47 C1A C1 CH4 0.000000 16.0430 0 - 548 C1A 48 C1A C1 CH4 0.000000 16.0430 0 - 549 C1A 49 C1A C1 CH4 0.000000 16.0430 0 - 550 C1A 50 C1A C1 CH4 0.000000 16.0430 0 - 551 C1A 51 C1A C1 CH4 0.000000 16.0430 0 - 552 C1A 52 C1A C1 CH4 0.000000 16.0430 0 - 553 C1A 53 C1A C1 CH4 0.000000 16.0430 0 - 554 C1A 54 C1A C1 CH4 0.000000 16.0430 0 - 555 C1A 55 C1A C1 CH4 0.000000 16.0430 0 - 556 C1A 56 C1A C1 CH4 0.000000 16.0430 0 - 557 C1A 57 C1A C1 CH4 0.000000 16.0430 0 - 558 C1A 58 C1A C1 CH4 0.000000 16.0430 0 - 559 C1A 59 C1A C1 CH4 0.000000 16.0430 0 - 560 C1A 60 C1A C1 CH4 0.000000 16.0430 0 - 561 C1A 61 C1A C1 CH4 0.000000 16.0430 0 - 562 C1A 62 C1A C1 CH4 0.000000 16.0430 0 - 563 C1A 63 C1A C1 CH4 0.000000 16.0430 0 - 564 C1A 64 C1A C1 CH4 0.000000 16.0430 0 - 565 C1A 65 C1A C1 CH4 0.000000 16.0430 0 - 566 C1A 66 C1A C1 CH4 0.000000 16.0430 0 - 567 C1A 67 C1A C1 CH4 0.000000 16.0430 0 - 568 C1A 68 C1A C1 CH4 0.000000 16.0430 0 - 569 C1A 69 C1A C1 CH4 0.000000 16.0430 0 - 570 C1A 70 C1A C1 CH4 0.000000 16.0430 0 - 571 C1A 71 C1A C1 CH4 0.000000 16.0430 0 - 572 C1A 72 C1A C1 CH4 0.000000 16.0430 0 - 573 C1A 73 C1A C1 CH4 0.000000 16.0430 0 - 574 C1A 74 C1A C1 CH4 0.000000 16.0430 0 - 575 C1A 75 C1A C1 CH4 0.000000 16.0430 0 - 576 C1A 76 C1A C1 CH4 0.000000 16.0430 0 - 577 C1A 77 C1A C1 CH4 0.000000 16.0430 0 - 578 C1A 78 C1A C1 CH4 0.000000 16.0430 0 - 579 C1A 79 C1A C1 CH4 0.000000 16.0430 0 - 580 C1A 80 C1A C1 CH4 0.000000 16.0430 0 - 581 C1A 81 C1A C1 CH4 0.000000 16.0430 0 - 582 C1A 82 C1A C1 CH4 0.000000 16.0430 0 - 583 C1A 83 C1A C1 CH4 0.000000 16.0430 0 - 584 C1A 84 C1A C1 CH4 0.000000 16.0430 0 - 585 C1A 85 C1A C1 CH4 0.000000 16.0430 0 - 586 C1A 86 C1A C1 CH4 0.000000 16.0430 0 - 587 C1A 87 C1A C1 CH4 0.000000 16.0430 0 - 588 C1A 88 C1A C1 CH4 0.000000 16.0430 0 - 589 C1A 89 C1A C1 CH4 0.000000 16.0430 0 - 590 C1A 90 C1A C1 CH4 0.000000 16.0430 0 - 591 C1A 91 C1A C1 CH4 0.000000 16.0430 0 - 592 C1A 92 C1A C1 CH4 0.000000 16.0430 0 - 593 C1A 93 C1A C1 CH4 0.000000 16.0430 0 - 594 C1A 94 C1A C1 CH4 0.000000 16.0430 0 - 595 C1A 95 C1A C1 CH4 0.000000 16.0430 0 - 596 C1A 96 C1A C1 CH4 0.000000 16.0430 0 - 597 C1A 97 C1A C1 CH4 0.000000 16.0430 0 - 598 C1A 98 C1A C1 CH4 0.000000 16.0430 0 - 599 C1A 99 C1A C1 CH4 0.000000 16.0430 0 - 600 C1A 100 C1A C1 CH4 0.000000 16.0430 0 - 601 C1A 101 C1A C1 CH4 0.000000 16.0430 0 - 602 C1A 102 C1A C1 CH4 0.000000 16.0430 0 - 603 C1A 103 C1A C1 CH4 0.000000 16.0430 0 - 604 C1A 104 C1A C1 CH4 0.000000 16.0430 0 - 605 C1A 105 C1A C1 CH4 0.000000 16.0430 0 - 606 C1A 106 C1A C1 CH4 0.000000 16.0430 0 - 607 C1A 107 C1A C1 CH4 0.000000 16.0430 0 - 608 C1A 108 C1A C1 CH4 0.000000 16.0430 0 - 609 C1A 109 C1A C1 CH4 0.000000 16.0430 0 - 610 C1A 110 C1A C1 CH4 0.000000 16.0430 0 - 611 C1A 111 C1A C1 CH4 0.000000 16.0430 0 - 612 C1A 112 C1A C1 CH4 0.000000 16.0430 0 - 613 C1A 113 C1A C1 CH4 0.000000 16.0430 0 - 614 C1A 114 C1A C1 CH4 0.000000 16.0430 0 - 615 C1A 115 C1A C1 CH4 0.000000 16.0430 0 - 616 C1A 116 C1A C1 CH4 0.000000 16.0430 0 - 617 C1A 117 C1A C1 CH4 0.000000 16.0430 0 - 618 C1A 118 C1A C1 CH4 0.000000 16.0430 0 - 619 C1A 119 C1A C1 CH4 0.000000 16.0430 0 - 620 C1A 120 C1A C1 CH4 0.000000 16.0430 0 - 621 C1A 121 C1A C1 CH4 0.000000 16.0430 0 - 622 C1A 122 C1A C1 CH4 0.000000 16.0430 0 - 623 C1A 123 C1A C1 CH4 0.000000 16.0430 0 - 624 C1A 124 C1A C1 CH4 0.000000 16.0430 0 - 625 C1A 125 C1A C1 CH4 0.000000 16.0430 0 - 626 C1A 126 C1A C1 CH4 0.000000 16.0430 0 - 627 C1A 127 C1A C1 CH4 0.000000 16.0430 0 - 628 C1A 128 C1A C1 CH4 0.000000 16.0430 0 - 629 C1A 129 C1A C1 CH4 0.000000 16.0430 0 - 630 C1A 130 C1A C1 CH4 0.000000 16.0430 0 - 631 C1A 131 C1A C1 CH4 0.000000 16.0430 0 - 632 C1A 132 C1A C1 CH4 0.000000 16.0430 0 - 633 C1A 133 C1A C1 CH4 0.000000 16.0430 0 - 634 C1A 134 C1A C1 CH4 0.000000 16.0430 0 - 635 C1A 135 C1A C1 CH4 0.000000 16.0430 0 - 636 C1A 136 C1A C1 CH4 0.000000 16.0430 0 - 637 C1A 137 C1A C1 CH4 0.000000 16.0430 0 - 638 C1A 138 C1A C1 CH4 0.000000 16.0430 0 - 639 C1A 139 C1A C1 CH4 0.000000 16.0430 0 - 640 C1A 140 C1A C1 CH4 0.000000 16.0430 0 - 641 C1A 141 C1A C1 CH4 0.000000 16.0430 0 - 642 C1A 142 C1A C1 CH4 0.000000 16.0430 0 - 643 C1A 143 C1A C1 CH4 0.000000 16.0430 0 - 644 C1A 144 C1A C1 CH4 0.000000 16.0430 0 - 645 C1A 145 C1A C1 CH4 0.000000 16.0430 0 - 646 C1A 146 C1A C1 CH4 0.000000 16.0430 0 - 647 C1A 147 C1A C1 CH4 0.000000 16.0430 0 - 648 C1A 148 C1A C1 CH4 0.000000 16.0430 0 - 649 C1A 149 C1A C1 CH4 0.000000 16.0430 0 - 650 C1A 150 C1A C1 CH4 0.000000 16.0430 0 - 651 C1A 151 C1A C1 CH4 0.000000 16.0430 0 - 652 C1A 152 C1A C1 CH4 0.000000 16.0430 0 - 653 C1A 153 C1A C1 CH4 0.000000 16.0430 0 - 654 C1A 154 C1A C1 CH4 0.000000 16.0430 0 - 655 C1A 155 C1A C1 CH4 0.000000 16.0430 0 - 656 C1A 156 C1A C1 CH4 0.000000 16.0430 0 - 657 C1A 157 C1A C1 CH4 0.000000 16.0430 0 - 658 C1A 158 C1A C1 CH4 0.000000 16.0430 0 - 659 C1A 159 C1A C1 CH4 0.000000 16.0430 0 - 660 C1A 160 C1A C1 CH4 0.000000 16.0430 0 - 661 C1A 161 C1A C1 CH4 0.000000 16.0430 0 - 662 C1A 162 C1A C1 CH4 0.000000 16.0430 0 - 663 C1A 163 C1A C1 CH4 0.000000 16.0430 0 - 664 C1A 164 C1A C1 CH4 0.000000 16.0430 0 - 665 C1A 165 C1A C1 CH4 0.000000 16.0430 0 - 666 C1A 166 C1A C1 CH4 0.000000 16.0430 0 - 667 C1A 167 C1A C1 CH4 0.000000 16.0430 0 - 668 C1A 168 C1A C1 CH4 0.000000 16.0430 0 - 669 C1A 169 C1A C1 CH4 0.000000 16.0430 0 - 670 C1A 170 C1A C1 CH4 0.000000 16.0430 0 - 671 C1A 171 C1A C1 CH4 0.000000 16.0430 0 - 672 C1A 172 C1A C1 CH4 0.000000 16.0430 0 - 673 C1A 173 C1A C1 CH4 0.000000 16.0430 0 - 674 C1A 174 C1A C1 CH4 0.000000 16.0430 0 - 675 C1A 175 C1A C1 CH4 0.000000 16.0430 0 - 676 C1A 176 C1A C1 CH4 0.000000 16.0430 0 - 677 C1A 177 C1A C1 CH4 0.000000 16.0430 0 - 678 C1A 178 C1A C1 CH4 0.000000 16.0430 0 - 679 C1A 179 C1A C1 CH4 0.000000 16.0430 0 - 680 C1A 180 C1A C1 CH4 0.000000 16.0430 0 - 681 C1A 181 C1A C1 CH4 0.000000 16.0430 0 - 682 C1A 182 C1A C1 CH4 0.000000 16.0430 0 - 683 C1A 183 C1A C1 CH4 0.000000 16.0430 0 - 684 C1A 184 C1A C1 CH4 0.000000 16.0430 0 - 685 C1A 185 C1A C1 CH4 0.000000 16.0430 0 - 686 C1A 186 C1A C1 CH4 0.000000 16.0430 0 - 687 C1A 187 C1A C1 CH4 0.000000 16.0430 0 - 688 C1A 188 C1A C1 CH4 0.000000 16.0430 0 - 689 C1A 189 C1A C1 CH4 0.000000 16.0430 0 - 690 C1A 190 C1A C1 CH4 0.000000 16.0430 0 - 691 C1A 191 C1A C1 CH4 0.000000 16.0430 0 - 692 C1A 192 C1A C1 CH4 0.000000 16.0430 0 - 693 C1A 193 C1A C1 CH4 0.000000 16.0430 0 - 694 C1A 194 C1A C1 CH4 0.000000 16.0430 0 - 695 C1A 195 C1A C1 CH4 0.000000 16.0430 0 - 696 C1A 196 C1A C1 CH4 0.000000 16.0430 0 - 697 C1A 197 C1A C1 CH4 0.000000 16.0430 0 - 698 C1A 198 C1A C1 CH4 0.000000 16.0430 0 - 699 C1A 199 C1A C1 CH4 0.000000 16.0430 0 - 700 C1A 200 C1A C1 CH4 0.000000 16.0430 0 - 701 C1A 201 C1A C1 CH4 0.000000 16.0430 0 - 702 C1A 202 C1A C1 CH4 0.000000 16.0430 0 - 703 C1A 203 C1A C1 CH4 0.000000 16.0430 0 - 704 C1A 204 C1A C1 CH4 0.000000 16.0430 0 - 705 C1A 205 C1A C1 CH4 0.000000 16.0430 0 - 706 C1A 206 C1A C1 CH4 0.000000 16.0430 0 - 707 C1A 207 C1A C1 CH4 0.000000 16.0430 0 - 708 C1A 208 C1A C1 CH4 0.000000 16.0430 0 - 709 C1A 209 C1A C1 CH4 0.000000 16.0430 0 - 710 C1A 210 C1A C1 CH4 0.000000 16.0430 0 - 711 C1A 211 C1A C1 CH4 0.000000 16.0430 0 - 712 C1A 212 C1A C1 CH4 0.000000 16.0430 0 - 713 C1A 213 C1A C1 CH4 0.000000 16.0430 0 - 714 C1A 214 C1A C1 CH4 0.000000 16.0430 0 - 715 C1A 215 C1A C1 CH4 0.000000 16.0430 0 - 716 C1A 216 C1A C1 CH4 0.000000 16.0430 0 - 717 C1A 217 C1A C1 CH4 0.000000 16.0430 0 - 718 C1A 218 C1A C1 CH4 0.000000 16.0430 0 - 719 C1A 219 C1A C1 CH4 0.000000 16.0430 0 - 720 C1A 220 C1A C1 CH4 0.000000 16.0430 0 - 721 C1A 221 C1A C1 CH4 0.000000 16.0430 0 - 722 C1A 222 C1A C1 CH4 0.000000 16.0430 0 - 723 C1A 223 C1A C1 CH4 0.000000 16.0430 0 - 724 C1A 224 C1A C1 CH4 0.000000 16.0430 0 - 725 C1A 225 C1A C1 CH4 0.000000 16.0430 0 - 726 C1A 226 C1A C1 CH4 0.000000 16.0430 0 - 727 C1A 227 C1A C1 CH4 0.000000 16.0430 0 - 728 C1A 228 C1A C1 CH4 0.000000 16.0430 0 - 729 C1A 229 C1A C1 CH4 0.000000 16.0430 0 - 730 C1A 230 C1A C1 CH4 0.000000 16.0430 0 - 731 C1A 231 C1A C1 CH4 0.000000 16.0430 0 - 732 C1A 232 C1A C1 CH4 0.000000 16.0430 0 - 733 C1A 233 C1A C1 CH4 0.000000 16.0430 0 - 734 C1A 234 C1A C1 CH4 0.000000 16.0430 0 - 735 C1A 235 C1A C1 CH4 0.000000 16.0430 0 - 736 C1A 236 C1A C1 CH4 0.000000 16.0430 0 - 737 C1A 237 C1A C1 CH4 0.000000 16.0430 0 - 738 C1A 238 C1A C1 CH4 0.000000 16.0430 0 - 739 C1A 239 C1A C1 CH4 0.000000 16.0430 0 - 740 C1A 240 C1A C1 CH4 0.000000 16.0430 0 - 741 C1A 241 C1A C1 CH4 0.000000 16.0430 0 - 742 C1A 242 C1A C1 CH4 0.000000 16.0430 0 - 743 C1A 243 C1A C1 CH4 0.000000 16.0430 0 - 744 C1A 244 C1A C1 CH4 0.000000 16.0430 0 - 745 C1A 245 C1A C1 CH4 0.000000 16.0430 0 - 746 C1A 246 C1A C1 CH4 0.000000 16.0430 0 - 747 C1A 247 C1A C1 CH4 0.000000 16.0430 0 - 748 C1A 248 C1A C1 CH4 0.000000 16.0430 0 - - 400 !NBOND: bonds - 1 4 2 1 3 2 4 5 - 6 9 7 6 8 7 9 10 - 11 14 12 11 13 12 14 15 - 16 19 17 16 18 17 19 20 - 21 24 22 21 23 22 24 25 - 26 29 27 26 28 27 29 30 - 31 34 32 31 33 32 34 35 - 36 39 37 36 38 37 39 40 - 41 44 42 41 43 42 44 45 - 46 49 47 46 48 47 49 50 - 51 54 52 51 53 52 54 55 - 56 59 57 56 58 57 59 60 - 61 64 62 61 63 62 64 65 - 66 69 67 66 68 67 69 70 - 71 74 72 71 73 72 74 75 - 76 79 77 76 78 77 79 80 - 81 84 82 81 83 82 84 85 - 86 89 87 86 88 87 89 90 - 91 94 92 91 93 92 94 95 - 96 99 97 96 98 97 99 100 - 101 104 102 101 103 102 104 105 - 106 109 107 106 108 107 109 110 - 111 114 112 111 113 112 114 115 - 116 119 117 116 118 117 119 120 - 121 124 122 121 123 122 124 125 - 126 129 127 126 128 127 129 130 - 131 134 132 131 133 132 134 135 - 136 139 137 136 138 137 139 140 - 141 144 142 141 143 142 144 145 - 146 149 147 146 148 147 149 150 - 151 154 152 151 153 152 154 155 - 156 159 157 156 158 157 159 160 - 161 164 162 161 163 162 164 165 - 166 169 167 166 168 167 169 170 - 171 174 172 171 173 172 174 175 - 176 179 177 176 178 177 179 180 - 181 184 182 181 183 182 184 185 - 186 189 187 186 188 187 189 190 - 191 194 192 191 193 192 194 195 - 196 199 197 196 198 197 199 200 - 201 204 202 201 203 202 204 205 - 206 209 207 206 208 207 209 210 - 211 214 212 211 213 212 214 215 - 216 219 217 216 218 217 219 220 - 221 224 222 221 223 222 224 225 - 226 229 227 226 228 227 229 230 - 231 234 232 231 233 232 234 235 - 236 239 237 236 238 237 239 240 - 241 244 242 241 243 242 244 245 - 246 249 247 246 248 247 249 250 - 251 254 252 251 253 252 254 255 - 256 259 257 256 258 257 259 260 - 261 264 262 261 263 262 264 265 - 266 269 267 266 268 267 269 270 - 271 274 272 271 273 272 274 275 - 276 279 277 276 278 277 279 280 - 281 284 282 281 283 282 284 285 - 286 289 287 286 288 287 289 290 - 291 294 292 291 293 292 294 295 - 296 299 297 296 298 297 299 300 - 301 304 302 301 303 302 304 305 - 306 309 307 306 308 307 309 310 - 311 314 312 311 313 312 314 315 - 316 319 317 316 318 317 319 320 - 321 324 322 321 323 322 324 325 - 326 329 327 326 328 327 329 330 - 331 334 332 331 333 332 334 335 - 336 339 337 336 338 337 339 340 - 341 344 342 341 343 342 344 345 - 346 349 347 346 348 347 349 350 - 351 354 352 351 353 352 354 355 - 356 359 357 356 358 357 359 360 - 361 364 362 361 363 362 364 365 - 366 369 367 366 368 367 369 370 - 371 374 372 371 373 372 374 375 - 376 379 377 376 378 377 379 380 - 381 384 382 381 383 382 384 385 - 386 389 387 386 388 387 389 390 - 391 394 392 391 393 392 394 395 - 396 399 397 396 398 397 399 400 - 401 404 402 401 403 402 404 405 - 406 409 407 406 408 407 409 410 - 411 414 412 411 413 412 414 415 - 416 419 417 416 418 417 419 420 - 421 424 422 421 423 422 424 425 - 426 429 427 426 428 427 429 430 - 431 434 432 431 433 432 434 435 - 436 439 437 436 438 437 439 440 - 441 444 442 441 443 442 444 445 - 446 449 447 446 448 447 449 450 - 451 454 452 451 453 452 454 455 - 456 459 457 456 458 457 459 460 - 461 464 462 461 463 462 464 465 - 466 469 467 466 468 467 469 470 - 471 474 472 471 473 472 474 475 - 476 479 477 476 478 477 479 480 - 481 484 482 481 483 482 484 485 - 486 489 487 486 488 487 489 490 - 491 494 492 491 493 492 494 495 - 496 499 497 496 498 497 499 500 - - 300 !NTHETA: angles - 1 4 5 2 1 4 3 2 1 - 6 9 10 7 6 9 8 7 6 - 11 14 15 12 11 14 13 12 11 - 16 19 20 17 16 19 18 17 16 - 21 24 25 22 21 24 23 22 21 - 26 29 30 27 26 29 28 27 26 - 31 34 35 32 31 34 33 32 31 - 36 39 40 37 36 39 38 37 36 - 41 44 45 42 41 44 43 42 41 - 46 49 50 47 46 49 48 47 46 - 51 54 55 52 51 54 53 52 51 - 56 59 60 57 56 59 58 57 56 - 61 64 65 62 61 64 63 62 61 - 66 69 70 67 66 69 68 67 66 - 71 74 75 72 71 74 73 72 71 - 76 79 80 77 76 79 78 77 76 - 81 84 85 82 81 84 83 82 81 - 86 89 90 87 86 89 88 87 86 - 91 94 95 92 91 94 93 92 91 - 96 99 100 97 96 99 98 97 96 - 101 104 105 102 101 104 103 102 101 - 106 109 110 107 106 109 108 107 106 - 111 114 115 112 111 114 113 112 111 - 116 119 120 117 116 119 118 117 116 - 121 124 125 122 121 124 123 122 121 - 126 129 130 127 126 129 128 127 126 - 131 134 135 132 131 134 133 132 131 - 136 139 140 137 136 139 138 137 136 - 141 144 145 142 141 144 143 142 141 - 146 149 150 147 146 149 148 147 146 - 151 154 155 152 151 154 153 152 151 - 156 159 160 157 156 159 158 157 156 - 161 164 165 162 161 164 163 162 161 - 166 169 170 167 166 169 168 167 166 - 171 174 175 172 171 174 173 172 171 - 176 179 180 177 176 179 178 177 176 - 181 184 185 182 181 184 183 182 181 - 186 189 190 187 186 189 188 187 186 - 191 194 195 192 191 194 193 192 191 - 196 199 200 197 196 199 198 197 196 - 201 204 205 202 201 204 203 202 201 - 206 209 210 207 206 209 208 207 206 - 211 214 215 212 211 214 213 212 211 - 216 219 220 217 216 219 218 217 216 - 221 224 225 222 221 224 223 222 221 - 226 229 230 227 226 229 228 227 226 - 231 234 235 232 231 234 233 232 231 - 236 239 240 237 236 239 238 237 236 - 241 244 245 242 241 244 243 242 241 - 246 249 250 247 246 249 248 247 246 - 251 254 255 252 251 254 253 252 251 - 256 259 260 257 256 259 258 257 256 - 261 264 265 262 261 264 263 262 261 - 266 269 270 267 266 269 268 267 266 - 271 274 275 272 271 274 273 272 271 - 276 279 280 277 276 279 278 277 276 - 281 284 285 282 281 284 283 282 281 - 286 289 290 287 286 289 288 287 286 - 291 294 295 292 291 294 293 292 291 - 296 299 300 297 296 299 298 297 296 - 301 304 305 302 301 304 303 302 301 - 306 309 310 307 306 309 308 307 306 - 311 314 315 312 311 314 313 312 311 - 316 319 320 317 316 319 318 317 316 - 321 324 325 322 321 324 323 322 321 - 326 329 330 327 326 329 328 327 326 - 331 334 335 332 331 334 333 332 331 - 336 339 340 337 336 339 338 337 336 - 341 344 345 342 341 344 343 342 341 - 346 349 350 347 346 349 348 347 346 - 351 354 355 352 351 354 353 352 351 - 356 359 360 357 356 359 358 357 356 - 361 364 365 362 361 364 363 362 361 - 366 369 370 367 366 369 368 367 366 - 371 374 375 372 371 374 373 372 371 - 376 379 380 377 376 379 378 377 376 - 381 384 385 382 381 384 383 382 381 - 386 389 390 387 386 389 388 387 386 - 391 394 395 392 391 394 393 392 391 - 396 399 400 397 396 399 398 397 396 - 401 404 405 402 401 404 403 402 401 - 406 409 410 407 406 409 408 407 406 - 411 414 415 412 411 414 413 412 411 - 416 419 420 417 416 419 418 417 416 - 421 424 425 422 421 424 423 422 421 - 426 429 430 427 426 429 428 427 426 - 431 434 435 432 431 434 433 432 431 - 436 439 440 437 436 439 438 437 436 - 441 444 445 442 441 444 443 442 441 - 446 449 450 447 446 449 448 447 446 - 451 454 455 452 451 454 453 452 451 - 456 459 460 457 456 459 458 457 456 - 461 464 465 462 461 464 463 462 461 - 466 469 470 467 466 469 468 467 466 - 471 474 475 472 471 474 473 472 471 - 476 479 480 477 476 479 478 477 476 - 481 484 485 482 481 484 483 482 481 - 486 489 490 487 486 489 488 487 486 - 491 494 495 492 491 494 493 492 491 - 496 499 500 497 496 499 498 497 496 - - 200 !NPHI: dihedrals - 2 1 4 5 3 2 1 4 - 7 6 9 10 8 7 6 9 - 12 11 14 15 13 12 11 14 - 17 16 19 20 18 17 16 19 - 22 21 24 25 23 22 21 24 - 27 26 29 30 28 27 26 29 - 32 31 34 35 33 32 31 34 - 37 36 39 40 38 37 36 39 - 42 41 44 45 43 42 41 44 - 47 46 49 50 48 47 46 49 - 52 51 54 55 53 52 51 54 - 57 56 59 60 58 57 56 59 - 62 61 64 65 63 62 61 64 - 67 66 69 70 68 67 66 69 - 72 71 74 75 73 72 71 74 - 77 76 79 80 78 77 76 79 - 82 81 84 85 83 82 81 84 - 87 86 89 90 88 87 86 89 - 92 91 94 95 93 92 91 94 - 97 96 99 100 98 97 96 99 - 102 101 104 105 103 102 101 104 - 107 106 109 110 108 107 106 109 - 112 111 114 115 113 112 111 114 - 117 116 119 120 118 117 116 119 - 122 121 124 125 123 122 121 124 - 127 126 129 130 128 127 126 129 - 132 131 134 135 133 132 131 134 - 137 136 139 140 138 137 136 139 - 142 141 144 145 143 142 141 144 - 147 146 149 150 148 147 146 149 - 152 151 154 155 153 152 151 154 - 157 156 159 160 158 157 156 159 - 162 161 164 165 163 162 161 164 - 167 166 169 170 168 167 166 169 - 172 171 174 175 173 172 171 174 - 177 176 179 180 178 177 176 179 - 182 181 184 185 183 182 181 184 - 187 186 189 190 188 187 186 189 - 192 191 194 195 193 192 191 194 - 197 196 199 200 198 197 196 199 - 202 201 204 205 203 202 201 204 - 207 206 209 210 208 207 206 209 - 212 211 214 215 213 212 211 214 - 217 216 219 220 218 217 216 219 - 222 221 224 225 223 222 221 224 - 227 226 229 230 228 227 226 229 - 232 231 234 235 233 232 231 234 - 237 236 239 240 238 237 236 239 - 242 241 244 245 243 242 241 244 - 247 246 249 250 248 247 246 249 - 252 251 254 255 253 252 251 254 - 257 256 259 260 258 257 256 259 - 262 261 264 265 263 262 261 264 - 267 266 269 270 268 267 266 269 - 272 271 274 275 273 272 271 274 - 277 276 279 280 278 277 276 279 - 282 281 284 285 283 282 281 284 - 287 286 289 290 288 287 286 289 - 292 291 294 295 293 292 291 294 - 297 296 299 300 298 297 296 299 - 302 301 304 305 303 302 301 304 - 307 306 309 310 308 307 306 309 - 312 311 314 315 313 312 311 314 - 317 316 319 320 318 317 316 319 - 322 321 324 325 323 322 321 324 - 327 326 329 330 328 327 326 329 - 332 331 334 335 333 332 331 334 - 337 336 339 340 338 337 336 339 - 342 341 344 345 343 342 341 344 - 347 346 349 350 348 347 346 349 - 352 351 354 355 353 352 351 354 - 357 356 359 360 358 357 356 359 - 362 361 364 365 363 362 361 364 - 367 366 369 370 368 367 366 369 - 372 371 374 375 373 372 371 374 - 377 376 379 380 378 377 376 379 - 382 381 384 385 383 382 381 384 - 387 386 389 390 388 387 386 389 - 392 391 394 395 393 392 391 394 - 397 396 399 400 398 397 396 399 - 402 401 404 405 403 402 401 404 - 407 406 409 410 408 407 406 409 - 412 411 414 415 413 412 411 414 - 417 416 419 420 418 417 416 419 - 422 421 424 425 423 422 421 424 - 427 426 429 430 428 427 426 429 - 432 431 434 435 433 432 431 434 - 437 436 439 440 438 437 436 439 - 442 441 444 445 443 442 441 444 - 447 446 449 450 448 447 446 449 - 452 451 454 455 453 452 451 454 - 457 456 459 460 458 457 456 459 - 462 461 464 465 463 462 461 464 - 467 466 469 470 468 467 466 469 - 472 471 474 475 473 472 471 474 - 477 476 479 480 478 477 476 479 - 482 481 484 485 483 482 481 484 - 487 486 489 490 488 487 486 489 - 492 491 494 495 493 492 491 494 - 497 496 499 500 498 497 496 499 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 - - 1 0 !NGRP - 0 0 0 - diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 2efdf352a..e50bf3e2a 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -6,7 +6,6 @@ #include "TrialMol.h" #include "GeomLib.h" #include "MoleculeExchange1.h" -#include "MoleculeExchange2.h" #include using std::vector; From eed0a3447e1c7ddaefe5359752ba0d9e794f4660 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 18 Jun 2018 14:53:13 -0400 Subject: [PATCH 032/199] Implementing Intra-MEMC move. --- CMake/FileLists.cmake | 3 + src/ConfigSetup.cpp | 89 ++++-- src/ConfigSetup.h | 4 +- src/ConsoleOutput.cpp | 9 + src/Ewald.cpp | 20 +- src/IntraMoleculeExchange1.h | 514 +++++++++++++++++++++++++++++++++++ src/IntraMoleculeExchange2.h | 348 ++++++++++++++++++++++++ src/IntraMoleculeExchange3.h | 329 ++++++++++++++++++++++ src/MoleculeExchange1.h | 36 ++- src/MoleculeExchange2.h | 161 +++++------ src/MoleculeExchange3.h | 182 +++++-------- src/MoveConst.h | 41 +-- src/StaticVals.cpp | 6 +- src/StaticVals.h | 3 +- src/System.cpp | 13 + 15 files changed, 1479 insertions(+), 279 deletions(-) create mode 100644 src/IntraMoleculeExchange1.h create mode 100644 src/IntraMoleculeExchange2.h create mode 100644 src/IntraMoleculeExchange3.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 6ea1f6cfb..5324d7870 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -84,6 +84,9 @@ set(headers src/HistOutput.h src/InputAbstracts.h src/InputFileReader.h + src/IntraMoleculeExchange1.h + src/IntraMoleculeExchange2.h + src/IntraMoleculeExchange3.h src/IntraSwap.h src/MersenneTwister.h src/MoleculeExchange1.h diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 2a82c4ff4..3ea9ae141 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -48,6 +48,7 @@ ConfigSetup::ConfigSetup(void) sys.elect.oneFourScale = DBL_MAX; sys.elect.dielectric = DBL_MAX; sys.memcVal.enable = false; + sys.intraMemcVal.enable = false; sys.step.total = ULONG_MAX; sys.step.equil = ULONG_MAX; sys.step.adjustment = ULONG_MAX; @@ -254,29 +255,37 @@ void ConfigSetup::Init(const char *fileName) temp.y = stringtod(line[2]); temp.z = stringtod(line[3]); sys.memcVal.subVol = temp; + sys.intraMemcVal.subVol = temp; printf("%-40s %-4.3f %-4.3f %-4.3f A\n", "Info: Exchange Sub-Volume Dimensions", temp.x, temp.y, temp.z); sys.memcVal.readVol = true; + sys.intraMemcVal.readVol = true; } } else if(line[0] == "ExchangeRatio") { if(line.size() == 2) { uint val = stringtoi(line[1]); sys.memcVal.exchangeRatio = val; + sys.intraMemcVal.exchangeRatio = val; sys.memcVal.readRatio = true; + sys.intraMemcVal.readRatio = true; printf("%-40s %-d \n", "Info: ExchangeRatio", val); } } else if(line[0] == "ExchangeLargeKind") { if(line.size() == 2) { std::string resName = line[1]; sys.memcVal.largeKind = resName; + sys.intraMemcVal.largeKind = resName; sys.memcVal.readLK = true; + sys.intraMemcVal.readLK = true; printf("%-40s %-s \n", "Info: Exchange Large Kind", resName.c_str()); } } else if(line[0] == "ExchangeSmallKind") { if(line.size() == 2) { std::string resName = line[1]; sys.memcVal.smallKind = resName; + sys.intraMemcVal.smallKind = resName; sys.memcVal.readSK = true; + sys.intraMemcVal.readSK = true; printf("%-40s %-s \n", "Info: Exchange Small Kind", resName.c_str()); } } else if(line[0] == "SmallKindBackBone") { @@ -286,6 +295,9 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.smallBBAtom1 = atom1; sys.memcVal.smallBBAtom2 = atom2; sys.memcVal.readSmallBB = true; + sys.intraMemcVal.smallBBAtom1 = atom1; + sys.intraMemcVal.smallBBAtom2 = atom2; + sys.intraMemcVal.readSmallBB = true; printf("%-40s %-s - %-s \n", "Info: Atom Names in Small Kind BackBone", atom1.c_str(), atom2.c_str()); } @@ -296,6 +308,9 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.largeBBAtom1 = atom1; sys.memcVal.largeBBAtom2 = atom2; sys.memcVal.readLargeBB = true; + sys.intraMemcVal.largeBBAtom1 = atom1; + sys.intraMemcVal.largeBBAtom2 = atom2; + sys.intraMemcVal.readLargeBB = true; printf("%-40s %-s - %-s \n", "Info: Atom Names in Large Kind BackBone", atom1.c_str(), atom2.c_str()); } @@ -389,6 +404,30 @@ void ConfigSetup::Init(const char *fileName) sys.moves.rotate = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Rotation move frequency", sys.moves.rotate); + }else if(line[0] == "IntraMEMC-1Freq") { + sys.moves.intraMemc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: IntraMEMC-1 move frequency", + sys.moves.intraMemc); + if(sys.moves.intraMemc > 0.0) { + sys.intraMemcVal.enable = true; + sys.intraMemcVal.MEMC1 = true; + } + } else if(line[0] == "IntraMEMC-2Freq") { + sys.moves.intraMemc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: IntraMEMC-2 move frequency", + sys.moves.intraMemc); + if(sys.moves.intraMemc > 0.0) { + sys.intraMemcVal.enable = true; + sys.intraMemcVal.MEMC2 = true; + } + } else if(line[0] == "IntraMEMC-3Freq") { + sys.moves.intraMemc = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: IntraMEMC-3 move frequency", + sys.moves.intraMemc); + if(sys.moves.intraMemc > 0.0) { + sys.intraMemcVal.enable = true; + sys.intraMemcVal.MEMC3 = true; + } } #ifdef VARIABLE_VOLUME else if(line[0] == "VolFreq") { @@ -421,24 +460,24 @@ void ConfigSetup::Init(const char *fileName) printf("%-40s %-4.4f \n", "Info: MEMC-1 move frequency", sys.moves.memc); if(sys.moves.memc > 0.0) { - sys.memcVal.enable = true; - sys.memcVal.MEMC1 = true; + sys.memcVal.enable = true; + sys.memcVal.MEMC1 = true; } } else if(line[0] == "MEMC-2Freq") { sys.moves.memc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: MEMC-2 move frequency", sys.moves.memc); if(sys.moves.memc > 0.0) { - sys.memcVal.enable = true; - sys.memcVal.MEMC2 = true; + sys.memcVal.enable = true; + sys.memcVal.MEMC2 = true; } } else if(line[0] == "MEMC-3Freq") { sys.moves.memc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: MEMC-3 move frequency", sys.moves.memc); if(sys.moves.memc > 0.0) { - sys.memcVal.enable = true; - sys.memcVal.MEMC3 = true; + sys.memcVal.enable = true; + sys.memcVal.MEMC3 = true; } } #endif @@ -683,6 +722,13 @@ void ConfigSetup::fillDefaults(void) sys.moves.intraSwap); } + if(sys.moves.intraMemc == DBL_MAX) + { + sys.moves.intraMemc = 0.0; + printf("%-40s %-4.4f \n", "Default: Intra-MEMC move frequency", + sys.moves.intraMemc); + } + if(sys.moves.regrowth == DBL_MAX) { sys.moves.regrowth = 0.000; printf("%-40s %-4.4f \n", "Default: Regrowth move frequency", @@ -905,7 +951,7 @@ void ConfigSetup::verifyInputs(void) } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.transfer + sys.moves.intraSwap + sys.moves.volume + sys.moves.regrowth + - sys.moves.memc - 1.0) > 0.01) { + sys.moves.memc + sys.moves.intraMemc - 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!\n"; exit(EXIT_FAILURE); } @@ -915,7 +961,7 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.volume + sys.moves.regrowth - 1.0) > 0.01) { + sys.moves.volume + sys.moves.regrowth + sys.moves.intraMemc - 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!\n"; exit(EXIT_FAILURE); } @@ -926,13 +972,14 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.transfer + sys.moves.regrowth +sys.moves.memc- 1.0) > 0.01) { + sys.moves.transfer + sys.moves.regrowth + sys.moves.memc + + sys.moves.intraMemc - 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!!\n"; exit(EXIT_FAILURE); } #else if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.regrowth - 1.0) > 0.01) { + sys.moves.regrowth + sys.moves.intraMemc - 1.0) > 0.01) { std::cout << "Error: Sum of move frequncies are not equal to one!!\n"; exit(EXIT_FAILURE); } @@ -988,30 +1035,36 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: CBMC number of nth site trials is not specified!\n"; exit(EXIT_FAILURE); } - if(sys.memcVal.enable) { + if(sys.memcVal.enable || sys.intraMemcVal.enable) { if((sys.memcVal.MEMC1 && sys.memcVal.MEMC2) || (sys.memcVal.MEMC1 && sys.memcVal.MEMC3) || (sys.memcVal.MEMC2 && sys.memcVal.MEMC3)) { std::cout << "Error: Multiple MEMC methods are specified!\n"; exit(EXIT_FAILURE); } - if(!sys.memcVal.readVol) { + if((sys.intraMemcVal.MEMC1 && sys.intraMemcVal.MEMC2) || + (sys.intraMemcVal.MEMC1 && sys.intraMemcVal.MEMC3) || + (sys.intraMemcVal.MEMC2 && sys.intraMemcVal.MEMC3)) { + std::cout << "Error: Multiple Intra-MEMC methods are specified!\n"; + exit(EXIT_FAILURE); + } + if(!sys.memcVal.readVol || !sys.intraMemcVal.readVol) { std::cout << "Error: In MEMC method, Sub-Volume is not specified!\n"; exit(EXIT_FAILURE); } - if(!sys.memcVal.readRatio) { + if(!sys.memcVal.readRatio || !sys.intraMemcVal.readRatio) { std::cout << "Error: In MEMC method, Exchange Ratio is not specified!\n"; exit(EXIT_FAILURE); } - if(!sys.memcVal.readSK) { + if(!sys.memcVal.readSK || !sys.intraMemcVal.readSK) { std::cout << "Error: In MEMC method, Small Kind is not specified!\n"; exit(EXIT_FAILURE); } - if(!sys.memcVal.readLK) { + if(!sys.memcVal.readLK || !sys.intraMemcVal.readLK) { std::cout << "Error: In MEMC method, Large Kind is not specified!\n"; exit(EXIT_FAILURE); } - if(!sys.memcVal.readLargeBB) { + if(!sys.memcVal.readLargeBB || !sys.intraMemcVal.readLargeBB) { std::cout << "Error: In MEMC method, Large Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } @@ -1019,6 +1072,10 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: In MEMC method, Small Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } + if(sys.intraMemcVal.MEMC2 && !sys.intraMemcVal.readSmallBB) { + std::cout << "Error: In Intra-MEMC method, Small Kind BackBone is not specified!\n"; + exit(EXIT_FAILURE); + } } #endif diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index 20084f842..d6bba15f9 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -155,7 +155,7 @@ struct Step { //Holds the percentage of each kind of move for this ensemble. struct MovePercents { - double displace, rotate, intraSwap, regrowth; + double displace, rotate, intraSwap, intraMemc, regrowth; #ifdef VARIABLE_VOLUME double volume; #endif @@ -239,7 +239,7 @@ struct SystemVals { MovePercents moves; Volume volume; //May go unused CBMC cbmcTrials; - MEMCVal memcVal; + MEMCVal memcVal, intraMemcVal; #if ENSEMBLE == GCMC ChemicalPotential chemPot; #elif ENSEMBLE == GEMC || ENSEMBLE == NPT diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 3ab771176..c27d97295 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -114,6 +114,11 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const printElement(var->GetAccepted(sub), elementWidth); printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::GetMoveSubIndex(mv::INTRA_MEMC, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + #if ENSEMBLE == GCMC } #endif @@ -294,6 +299,10 @@ void ConsoleOutput::PrintMoveTitle() printElement("REGROWACCEPT", elementWidth); printElement("REGROWACCEPT%", elementWidth); + printElement("INTRAMOLEXCHANGE", elementWidth); + printElement("INTMOLEXCACCEPT", elementWidth); + printElement("INTMOLEXACCEPT%", elementWidth); + #if ENSEMBLE == GEMC || ENSEMBLE == GCMC printElement("TRANSFER", elementWidth); printElement("TRANACCEPT", elementWidth); diff --git a/src/Ewald.cpp b/src/Ewald.cpp index 92cbbc596..599fa3948 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -490,9 +490,8 @@ double Ewald::SwapRecip(const std::vector &newMol, double energyRecipOld = 0.0; uint box = newMol[0].GetBox(); - if (box < BOXES_WITH_U_NB) - { - uint p, i, m, lengthNew, lengthOld; + if (box < BOXES_WITH_U_NB) { + int p, i, m, lengthNew, lengthOld; MoleculeKind const& thisKindNew = newMol[0].GetKind(); MoleculeKind const& thisKindOld = oldMol[0].GetKind(); double dotProductNew, sumRealNew, sumImaginaryNew; @@ -502,16 +501,13 @@ double Ewald::SwapRecip(const std::vector &newMol, #ifdef _OPENMP #pragma omp parallel for default(shared) private(i, p, dotProductNew, sumRealNew, sumImaginaryNew) reduction(+:energyRecipNew) #endif - for (i = 0; i < imageSizeRef[box]; i++) - { + for (i = 0; i < imageSizeRef[box]; i++) { sumRealNew = 0.0; sumImaginaryNew = 0.0; dotProductNew = 0.0; - for (m = 0; m < newMol.size(); m++) - { - for (p = 0; p < lengthNew; ++p) - { + for (m = 0; m < newMol.size(); m++) { + for (p = 0; p < lengthNew; ++p) { dotProductNew = Dot(p, kxRef[box][i], kyRef[box][i],kzRef[box][i], newMol[m].GetCoords()); @@ -520,10 +516,8 @@ double Ewald::SwapRecip(const std::vector &newMol, } } - for (m = 0; m < oldMol.size(); m++) - { - for (p = 0; p < lengthOld; ++p) - { + for (m = 0; m < oldMol.size(); m++) { + for (p = 0; p < lengthOld; ++p) { dotProductNew = Dot(p, kxRef[box][i], kyRef[box][i],kzRef[box][i], oldMol[m].GetCoords()); diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h new file mode 100644 index 000000000..16cbb94a2 --- /dev/null +++ b/src/IntraMoleculeExchange1.h @@ -0,0 +1,514 @@ +#ifndef INTRAMOLECULEEXCHANGE1_H +#define INTRAMOLECULEEXCHANGE1_H + +#include "MoveBase.h" +#include "TrialMol.h" +#include "GeomLib.h" +#include + +using std::vector; +using namespace geom; + +// Intra Molecule Exchange Move: +// KindA is small kind. KindB is large kind +// Orientation center of cavA is random. +// Orientation center of cavB is on COM of kindL, aligned with kindL backbon. +// Delete the exchangeRatio kindS from cavA, and 1 kindL from cavB. +// Insert the exchangeRatio kindS to cavB and 1 kindL inside the cavA. + +class IntraMoleculeExchange1 : public MoveBase +{ + public: + + IntraMoleculeExchange1(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), + cavity(statV.intraMemcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + perAdjust(statV.GetPerAdjust()), cavB(3), invCavB(3) + { + enableID = statV.intraMemcVal.enable; + largeBB[0] = -1; + largeBB[1] = -1; + + if(enableID) { + if(molLookRef.GetNumCanSwapKind() < 2) { + std::cout << "Error: MEMC move cannot be applied to pure systems or"<< + " systems, where only one molecule type is allowed to be swapped.\n"; + exit(EXIT_FAILURE); + } + + if(cavity.x >= cavity.y) + cavity.y = cavity.x; + else + cavity.x = cavity.y; + + volCav = cavity.x * cavity.y * cavity.z; + exchangeRatio = statV.intraMemcVal.exchangeRatio; + + SetMEMC(statV); + + //checking the acceptance statistic for each kind + counter = 0; + molInCavCount = 0; + lastAccept = 0.0; + exDiff = 1; + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + protected: + + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + void ShiftMol(const uint n, const bool kindA); + void RecoverMol(const uint n, const bool kindA); + virtual uint PickMolInCav(); + double GetCoeff() const; + uint GetBoxPairAndMol(const double subDraw, const double movPerc); + + bool enableID; + uint sourceBox; + uint largeBB[2]; + uint perAdjust, molInCavCount, counter; + uint numInCavA, numInCavB, numSCavA, numSCavB, kindS, kindL; + vector pStartA, pLenA, pStartB, pLenB; + vector molIndexA, kindIndexA, molIndexB, kindIndexB; + vector oldMolA, newMolA, oldMolB, newMolB; + vector< vector > molInCav; + + int exDiff, exchangeRatio; + double volCav, lastAccept; + double W_recip, recipDiffA, recipDiffB, correctDiff; + + XYZ centerA, centerB, cavity; + XYZArray cavA, invCavA, cavB, invCavB; + + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { + kindL = molLookRef.GetCanSwapKind(k); + } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { + kindS = molLookRef.GetCanSwapKind(k); + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + statV.intraMemcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ + largeBB[1] = i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.intraMemcVal.largeBBAtom1.c_str(), + statV.intraMemcVal.largeBBAtom2.c_str(), + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } +} + +inline void IntraMoleculeExchange1::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = ceil((float)exMax / 2.0); + if(exMin == 0) + exMin = 1; + + subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { + if(currAccept > lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + printf("Average Mol In Cavity: %d. Exchange Ratio: %d \n", exMax, + exchangeRatio); + } +} + +inline uint IntraMoleculeExchange1::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random location in source box + XYZ axis = boxDimRef.GetAxis(sourceBox); + XYZ temp(prng.randExc(axis.x), prng.randExc(axis.y), prng.randExc(axis.z)); + //Use to find small molecule + centerA = temp; + //Pick random vector and find two vectors that are perpendicular to V1 + SetBasis(cavA, prng.RandomUnitVect()); + //Calculate inverse matrix for cav, here Inv = transpose + TransposeMatrix(invCavA, cavA); + //Find the small molecule kind in the cavityA + if(calcEnRef.FindMolInCavity(molInCav, centerA, cavity, invCavA, + sourceBox, kindS, exchangeRatio)) { + //printf("MolS in cav: %d.\n", molInCav[kindS].size()); + //Find the exchangeRatio number of molecules kindS in cavity + numInCavA = exchangeRatio; + numSCavA = molInCav[kindS].size(); + for(uint n = 0; n < numInCavA; n++) { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from kindL in the same box + numInCavB = 1; + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, sourceBox); + } else { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + //keep track of number of small molecule in cavity + molInCavCount += numSCavA; + counter++; + + //After picking a large molecule, set the cavityB, and count kindS in cavityB + if(state == mv::fail_state::NO_FAIL) { + //Use to insert kindS in this centerB + centerB = comCurrRef.Get(molIndexB[0]); + //Set the V1 to the the backbone of the large molecule + if(molRef.NumAtoms(kindL) == 1) { + SetBasis(cavB, prng.RandomUnitVect()); + } else { + uint start = molRef.MolStart(molIndexB[0]) + largeBB[0]; + uint end = molRef.MolStart(molIndexB[0]) + largeBB[1]; + SetBasis(cavB, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); + } + //Calculate inverse matrix for cav. Here Inv = Transpose + TransposeMatrix(invCavB, cavB); + //find how many of KindS exist in this centerB (COM of kindL) + calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, + sourceBox, kindS, exchangeRatio); + numSCavB = molInCav[kindS].size(); + } + return state; +} + + +inline uint IntraMoleculeExchange1::GetBoxPairAndMol(const double subDraw, + const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + +#if ENSEMBLE == GCMC + sourceBox = 0; +#else + prng.PickBox(sourceBox, subDraw, movPerc); +#endif + + molIndexA.clear(); + kindIndexA.clear(); + molIndexB.clear(); + kindIndexB.clear(); + + newMolA.clear(); + oldMolA.clear(); + newMolB.clear(); + oldMolB.clear(); + + //Pick the exchange number of kindS in cavity and a molecule of kindL + //kindA = kindS, kindB = kindL + state = PickMolInCav(); + + if(state == mv::fail_state::NO_FAIL) + { + pStartA.clear(); + pStartB.clear(); + pStartA.resize(numInCavA); + pStartB.resize(numInCavB); + pLenA.clear(); + pLenB.clear(); + pLenA.resize(numInCavA); + pLenB.resize(numInCavB); + + for(uint n = 0; n < numInCavA; n++) { + pStartA[n] = pLenA[n] = 0; + molRef.GetRangeStartLength(pStartA[n], pLenA[n], molIndexA[n]); + } + + for(uint n = 0; n < numInCavB; n++) { + pStartB[n] = pLenB[n] = 0; + molRef.GetRangeStartLength(pStartB[n], pLenB[n], molIndexB[n]); + } + } + + return state; +} + + +inline uint IntraMoleculeExchange1::Prep(const double subDraw, + const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) { + //transfering type A from source + for(uint n = 0; n < numInCavA; n++) { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) { + //transfering type B from source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + //set coordinate of moleA to newMolA, later it will shift to centerB + newMolA[n].SetCoords(molA, 0); + //copy cavB matrix to slant the new trial of molA + newMolA[n].SetCavMatrix(cavB); + } + + for(uint n = 0; n < numInCavB; n++) { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, sourceBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //copy cavB matrix to slant the old trial of molB + oldMolB[n].SetCavMatrix(cavB); + //set coordinate of moleB to newMolB, later it will shift to centerA + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + for(uint n = 0; n < numInCavB; n++) { + //Inserting molB from centerB to the centerA + newMolB[n].SetSeed(centerA, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move for oldMolB + oldMolB[n].SetSeed(centerB, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolB[n].SetBackBone(largeBB); + } + + for(uint n = 0; n < numInCavA; n++) { + //Inserting molA from cavity(centerA) to the cavityB(centerB) + newMolA[n].SetSeed(centerB, cavity, true, false, false); + //perform trial move in cavity in sourceBox for oldMolA + oldMolA[n].SetSeed(centerA, cavity, true, false, false); + } + } + + return state; +} + + +inline uint IntraMoleculeExchange1::Transform() +{ + //Calc old energy before deleting + for(uint n = 0; n < numInCavA; n++) { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + } + + //Calc old energy before deleting + for(uint n = 0; n < numInCavB; n++) { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert kindL to cavity of center A + for(uint n = 0; n < numInCavB; n++) { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(n, false); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + //Insert kindS to cavity of center B + for(uint n = 0; n < numInCavA; n++) { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(n, true); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + return mv::fail_state::NO_FAIL; +} + + +inline void IntraMoleculeExchange1::CalcEn() +{ + W_recip = 1.0; + recipDiffA = 0.0, recipDiffB = 0.0; + correctDiff = 0.0; + + recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); + recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); + + //No need to contribute the self and correction energy since insertion + //and deletion are rigid body + W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB)); + +} + +inline double IntraMoleculeExchange1::GetCoeff() const +{ + double ratioF = num::Factorial(numSCavA) * num::Factorial(numSCavB) / + (num::Factorial(numSCavA - exchangeRatio) * + num::Factorial(numSCavB + exchangeRatio)); + + return ratioF; +} + +inline void IntraMoleculeExchange1::ShiftMol(const uint n, const bool typeA) +{ + if(typeA) { + //update coordinate of molecule typeA + newMolA[n].GetCoords().CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], sourceBox); + } else { + //update coordinate of molecule typeA + newMolB[n].GetCoords().CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], sourceBox); + } +} + +inline void IntraMoleculeExchange1::RecoverMol(const uint n, const bool typeA) +{ + if(typeA) { + XYZArray molA(pLenA[n]); + oldMolA[n].GetCoords().CopyRange(molA, 0, 0, pLenA[n]); + boxDimRef.WrapPBC(molA, sourceBox); + + molA.CopyRange(coordCurrRef, 0, pStartA[n], pLenA[n]); + comCurrRef.SetNew(molIndexA[n], sourceBox); + } else { + XYZArray molB(pLenB[n]); + oldMolB[n].GetCoords().CopyRange(molB, 0, 0, pLenB[n]); + boxDimRef.WrapPBC(molB, sourceBox); + + molB.CopyRange(coordCurrRef, 0, pStartB[n], pLenB[n]); + comCurrRef.SetNew(molIndexB[n], sourceBox); + } +} + +inline void IntraMoleculeExchange1::Accept(const uint rejectState, + const uint step) +{ + bool result; + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) { + double molTransCoeff = GetCoeff(); + double Wrat = W_recip; + + for(uint n = 0; n < numInCavA; n++) { + Wrat *= newMolA[n].GetWeight() / oldMolA[n].GetWeight(); + } + + for(uint n = 0; n < numInCavB; n++) { + Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); + } + + result = prng() < molTransCoeff * Wrat; + + if(result) { + //Add rest of energy. + for(uint n = 0; n < numInCavB; n++) { + sysPotRef.boxEnergy[sourceBox] += newMolB[n].GetEnergy(); + sysPotRef.boxEnergy[sourceBox] -= oldMolB[n].GetEnergy(); + } + + for(uint n = 0; n < numInCavA; n++) { + sysPotRef.boxEnergy[sourceBox] -= oldMolA[n].GetEnergy(); + sysPotRef.boxEnergy[sourceBox] += newMolA[n].GetEnergy(); + } + + //Add Reciprocal energy + sysPotRef.boxEnergy[sourceBox].recip += recipDiffA + recipDiffB; + + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction += correctDiff; + + //Update reciprocal + calcEwald->UpdateRecip(sourceBox); + + //molA and molB already added to cellist + + //Retotal + sysPotRef.Total(); + } else { + //transfer molA + for(uint n = 0; n < numInCavA; n++) { + cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); + RecoverMol(n, true); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + } + //transfer molB + for(uint n = 0; n < numInCavB; n++) { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + RecoverMol(n, false); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + } + } + } else { + //else we didn't even try because we knew it would fail + result = false; + } + + subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); + moveSetRef.Update(result, subPick, step); + +} + +#endif diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h new file mode 100644 index 000000000..5d856c0cc --- /dev/null +++ b/src/IntraMoleculeExchange2.h @@ -0,0 +1,348 @@ +#ifndef INTRAMOLECULEEXCHANGE2_H +#define INTRAMOLECULEEXCHANGE2_H + +#include "TrialMol.h" +#include "GeomLib.h" +#include "IntraMoleculeExchange1.h" +#include + +using std::vector; +using namespace geom; + +// Intra Molecule Exchange Move: +// KindA is small kind. KindB is large kind +// Orientation center of cavA is on COM of kindS, aligned with kindS backbone. +// Orientation center of cavB is on COM of kindL, aligned with kindL backbon. +// Delete the exchangeRatio kindS from cavA, and 1 kindL from cavB. +// Insert the exchangeRatio kindS to cavB and 1 kindL inside the cavA. + +class IntraMoleculeExchange2 : public IntraMoleculeExchange1 +{ + public: + + IntraMoleculeExchange2(System &sys, StaticVals const& statV) : + IntraMoleculeExchange1(sys, statV) + { + smallBB[0] = -1; + smallBB[1] = -1; + if(enableID) { + SetMEMC(statV); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + protected: + + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + virtual uint PickMolInCav(); + + uint smallBB[2]; +}; + +inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { + kindL = molLookRef.GetCanSwapKind(k); + } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { + kindS = molLookRef.GetCanSwapKind(k); + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + statV.intraMemcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ + largeBB[1] = i; + } + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.intraMemcVal.largeBBAtom1.c_str(), + statV.intraMemcVal.largeBBAtom2.c_str(), + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } + + for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { + if(molRef.kinds[kindS].atomNames[i] == statV.intraMemcVal.smallBBAtom1) { + smallBB[0] = i; + } + if(molRef.kinds[kindS].atomNames[i] ==statV.intraMemcVal.smallBBAtom2){ + smallBB[1] = i; + } + } + + for(uint i = 0; i < 2; i++) { + if(smallBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.intraMemcVal.smallBBAtom1.c_str(), + statV.intraMemcVal.smallBBAtom2.c_str(), + statV.intraMemcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } + } +} + +inline void IntraMoleculeExchange2::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + + subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { + if(currAccept > lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + } +} + +inline uint IntraMoleculeExchange2::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random small kind in dense phase and use the COM as cavity center + uint pickedS, pickedKS; + state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); + if(state == mv::fail_state::NO_FAIL) { + centerA = comCurrRef.Get(pickedS); + //If we want to orient the cavity with backbone of picked small mol + if(molRef.NumAtoms(kindS) == 1) { + SetBasis(cavA, prng.RandomUnitVect()); + } else { + uint start = molRef.MolStart(pickedS) + smallBB[0]; + uint end = molRef.MolStart(pickedS) + smallBB[1]; + SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); + } + //Calculate inverse matrix for cav here Inv = transpose + TransposeMatrix(invCavA, cavA); + + //Find the small molecule kind in the cavityA + if(calcEnRef.FindMolInCavity(molInCav, centerA, cavity, invCavA, + sourceBox, kindS, exchangeRatio)) { + //Find the exchangeRatio number of molecules kindS in cavity + numInCavA = exchangeRatio; + //add the random picked small molecule to the list. + molIndexA.push_back(pickedS); + kindIndexA.push_back(pickedKS); + numSCavA = molInCav[kindS].size(); + //delete the picked small molecule from list + for(uint s = 0; s < numSCavA; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + + for(uint n = 1; n < numInCavA; n++) { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from kindL in the same box + numInCavB = 1; + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, sourceBox); + } else { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + //keep track of number of small molecule in cavity + molInCavCount += numSCavA; + counter++; + } + + //After picking a large molecule, set the cavityB, and count kindS in cavityB + if(state == mv::fail_state::NO_FAIL) { + //Use to insert kindS in this centerB + centerB = comCurrRef.Get(molIndexB[0]); + //Set the V1 to the the backbone of the large molecule + if(molRef.NumAtoms(kindL) == 1) { + SetBasis(cavB, prng.RandomUnitVect()); + } else { + uint start = molRef.MolStart(molIndexB[0]) + largeBB[0]; + uint end = molRef.MolStart(molIndexB[0]) + largeBB[1]; + SetBasis(cavB, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); + } + //Calculate inverse matrix for cav. Here Inv = Transpose + TransposeMatrix(invCavB, cavB); + //find how many of KindS exist in this centerB (COM of kindL) + calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, + sourceBox, kindS, exchangeRatio); + numSCavB = molInCav[kindS].size(); + } + return state; +} + + +inline uint IntraMoleculeExchange2::Prep(const double subDraw, + const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) { + //transfering type A from source + for(uint n = 0; n < numInCavA; n++) { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) { + //transfering type B from source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + //set coordinate of moleA to newMolA, later it will shift to centerB + newMolA[n].SetCoords(molA, 0); + //copy cavB matrix to slant the new trial of molA + newMolA[n].SetCavMatrix(cavB); + } + + for(uint n = 0; n < numInCavB; n++) { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, sourceBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //copy cavB matrix to slant the old trial of molB + oldMolB[n].SetCavMatrix(cavB); + //set coordinate of moleB to newMolB, later it will shift to centerA + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + for(uint n = 0; n < numInCavB; n++) { + //Inserting molB from centerB to the centerA + newMolB[n].SetSeed(centerA, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move for oldMolB + oldMolB[n].SetSeed(centerB, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolB[n].SetBackBone(largeBB); + } + + for(uint n = 0; n < numInCavA; n++) { + if(n == 0) { + //Inserting molA from cavity(centerA) to the cavityB(centerB) + //COM is fixed, rotation around backboe + newMolA[n].SetSeed(centerB, cavity, true, true, true); + // Set the Backbone of small molecule to be inserted + newMolA[n].SetBackBone(smallBB); + //perform trial move in cavity in sourceBox for oldMolA + //COM is fixed, rotation around backboe + oldMolA[n].SetSeed(centerA, cavity, true, true, true); + // Set the Backbone of small molecule to be deleted + oldMolA[n].SetBackBone(smallBB); + } else { + //Inserting molA from cavity(centerA) to the cavityB(centerB) + newMolA[n].SetSeed(centerB, cavity, true, false, false); + //perform trial move in cavity in sourceBox for oldMolA + oldMolA[n].SetSeed(centerA, cavity, true, false, false); + } + } + } + + return state; +} + + +inline uint IntraMoleculeExchange2::Transform() +{ + ///Remove the fixed COM kindS at the end because we insert it at first + for(uint n = numInCavA; n > 0; n--) { + cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + } + + //Calc old energy before deleting + for(uint n = 0; n < numInCavB; n++) { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + } + + //Insert kindL to cavity of center A + for(uint n = 0; n < numInCavB; n++) { + molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); + ShiftMol(n, false); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + } + + //Insert kindS to cavity of center B + for(uint n = 0; n < numInCavA; n++) { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(n, true); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void IntraMoleculeExchange2::CalcEn() +{ + IntraMoleculeExchange1::CalcEn(); +} + + +inline void IntraMoleculeExchange2::Accept(const uint rejectState, + const uint step) +{ + IntraMoleculeExchange1::Accept(rejectState, step); +} + +#endif diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h new file mode 100644 index 000000000..9acad907d --- /dev/null +++ b/src/IntraMoleculeExchange3.h @@ -0,0 +1,329 @@ +#ifndef INTRAMOLECULEEXCHANGE3_H +#define INTRAMOLECULEEXCHANGE3_H + +#include "TrialMol.h" +#include "GeomLib.h" +#include "IntraMoleculeExchange1.h" +#include + +using std::vector; +using namespace geom; + +// Intra Molecule Exchange Move: +// KindA is small kind. KindB is large kind +// Orientation center of cavA is on COM of kindS, random orientation. +// Orientation center of cavB is on COM of kindL, aligned with kindL backbon. +// Delete the exchangeRatio kindS from cavA, and 1 kindL from cavB. +// Insert the exchangeRatio kindS to cavB and 1 kindL inside the cavA. +//Use CD-CBMC to build kindL + +class IntraMoleculeExchange3 : public IntraMoleculeExchange1 +{ + public: + + IntraMoleculeExchange3(System &sys, StaticVals const& statV) : + IntraMoleculeExchange1(sys, statV) + { + if(enableID) { + SetMEMC(statV); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + + protected: + + virtual void AdjustExRatio(); + virtual void SetMEMC(StaticVals const& statV); + virtual uint PickMolInCav(); +}; + +inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) +{ + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { + kindL = molLookRef.GetCanSwapKind(k); + } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { + kindS = molLookRef.GetCanSwapKind(k); + } + } + + if(kindS == -1) { + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + statV.intraMemcVal.smallKind.c_str()); + exit(EXIT_FAILURE); + } + + if(kindL == -1) { + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { + largeBB[0] = i; + } + if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ + largeBB[1] = i; + } + } + + if(largeBB[0] != largeBB[1]) { + printf("Error: In ME-3 move, atom name of backbone should be same.\n"); + printf("Atom names in backbone was set to %s or %s in %s residue.\n", + statV.intraMemcVal.largeBBAtom1.c_str(), + statV.intraMemcVal.largeBBAtom2.c_str(), + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + + for(uint i = 0; i < 2; i++) { + if(largeBB[i] == -1) { + printf("Error: Atom name %s or %s was not found in %s residue.\n", + statV.intraMemcVal.largeBBAtom1.c_str(), + statV.intraMemcVal.largeBBAtom2.c_str(), + statV.intraMemcVal.largeKind.c_str()); + exit(EXIT_FAILURE); + } + } +} + +inline void IntraMoleculeExchange3::AdjustExRatio() +{ + if(((counter + 1) % perAdjust) == 0) { + uint exMax = ceil((float)molInCavCount / (float)perAdjust); + uint exMin = 1; + + subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); + double currAccept = moveSetRef.GetAccept(subPick); + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { + if(currAccept > lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; + } + lastAccept = currAccept; + if(exchangeRatio < exMin) + exchangeRatio = exMin; + if(exchangeRatio > exMax) + exchangeRatio = exMax; + } + molInCavCount = 0; + counter = 0; + } +} + +inline uint IntraMoleculeExchange3::PickMolInCav() +{ + uint state = mv::fail_state::NO_FAIL; + //pick a random small kind in dense phase and use the COM as cavity center + uint pickedS, pickedKS; + state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); + if(state == mv::fail_state::NO_FAIL) { + centerA = comCurrRef.Get(pickedS); + //Pick random vector and find two vectors that are perpendicular to V1 + SetBasis(cavA, prng.RandomUnitVect()); + //Calculate inverse matrix for cav here Inv = transpose + TransposeMatrix(invCavA, cavA); + + //Find the small molecule kind in the cavityA + if(calcEnRef.FindMolInCavity(molInCav, centerA, cavity, invCavA, + sourceBox, kindS, exchangeRatio)) { + //Find the exchangeRatio number of molecules kindS in cavity + numInCavA = exchangeRatio; + //add the random picked small molecule to the list. + molIndexA.push_back(pickedS); + kindIndexA.push_back(pickedKS); + numSCavA = molInCav[kindS].size(); + //delete the picked small molecule from list + for(uint s = 0; s < numSCavA; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + + for(uint n = 1; n < numInCavA; n++) { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); + } + + //pick a molecule from kindL in the same box + numInCavB = 1; + state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, sourceBox); + } else { + //reject the move + state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; + } + + //keep track of number of small molecule in cavity + molInCavCount += numSCavA; + counter++; + } + + //After picking a large molecule, set the cavityB, and count kindS in cavityB + if(state == mv::fail_state::NO_FAIL) { + //use the predefine atom in kindL as the centerB + uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; + centerB = coordCurrRef.Get(start); + //Set V1 to a random vector and calculate two vector perpendicular to V1 + SetBasis(cavB, prng.RandomUnitVect()); + //Calculate inverse matrix for cav. Here Inv = Transpose + TransposeMatrix(invCavB, cavB); + //find how many of KindS exist in this centerB (COM of kindL) + calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, + sourceBox, kindS, exchangeRatio); + numSCavB = molInCav[kindS].size(); + } + return state; +} + + +inline uint IntraMoleculeExchange3::Prep(const double subDraw, + const double movPerc) +{ + uint state = GetBoxPairAndMol(subDraw, movPerc); + if(state == mv::fail_state::NO_FAIL) { + //transfering type A from source + for(uint n = 0; n < numInCavA; n++) { + newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, + sourceBox)); + } + + for(uint n = 0; n < numInCavB; n++) { + //transfering type B from source + newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + oldMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, + sourceBox)); + } + + //set the old coordinate after unwrap them + for(uint n = 0; n < numInCavA; n++) { + XYZArray molA(pLenA[n]); + coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); + boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); + oldMolA[n].SetCoords(molA, 0); + //copy cavA matrix to slant the old trial of molA + oldMolA[n].SetCavMatrix(cavA); + //set coordinate of moleA to newMolA, later it will shift to centerB + newMolA[n].SetCoords(molA, 0); + //copy cavB matrix to slant the new trial of molA + newMolA[n].SetCavMatrix(cavB); + } + + for(uint n = 0; n < numInCavB; n++) { + XYZArray molB(pLenB[n]); + coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); + boxDimRef.UnwrapPBC(molB, sourceBox, comCurrRef.Get(molIndexB[n])); + oldMolB[n].SetCoords(molB, 0); + //copy cavB matrix to slant the old trial of molB + oldMolB[n].SetCavMatrix(cavB); + //set coordinate of moleB to newMolB, later it will shift to centerA + newMolB[n].SetCoords(molB, 0); + //copy cavA matrix to slant the new trial of molB + newMolB[n].SetCavMatrix(cavA); + } + + //SetSeed(has cavity, COM is fixed, rotate around Backbone) + for(uint n = 0; n < numInCavB; n++) { + //Inserting molB from centerB to the centerA + newMolB[n].SetSeed(centerA, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move for oldMolB + oldMolB[n].SetSeed(centerB, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolB[n].SetBackBone(largeBB); + } + + for(uint n = 0; n < numInCavA; n++) { + if(n == 0) { + //Inserting molA from cavity(centerA) to the cavityB(centerB) + //COM is fixed, rotation around sphere + newMolA[n].SetSeed(centerB, cavity, true, true, false); + //perform trial move in cavity in sourceBox for oldMolA + //COM is fixed, rotation around sphere + oldMolA[n].SetSeed(centerA, cavity, true, true, false); + } else { + //Inserting molA from cavity(centerA) to the cavityB(centerB) + newMolA[n].SetSeed(centerB, cavity, true, false, false); + //perform trial move in cavity in sourceBox for oldMolA + oldMolA[n].SetSeed(centerA, cavity, true, false, false); + } + } + } + + return state; +} + + +inline uint IntraMoleculeExchange3::Transform() +{ + ///Remove the fixed COM kindS at the end because we insert it at first + for(uint n = numInCavA; n > 0; n--) { + cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); + molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + } + + //Calc old energy before deleting + for(uint n = 0; n < numInCavB; n++) { + cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); + molRef.kinds[kindIndexB[n]].BuildGrowOld(oldMolB[n], molIndexB[n]); + } + + //Insert kindL to cavity of center A using CD-CBMC + for(uint n = 0; n < numInCavB; n++) { + molRef.kinds[kindIndexB[n]].BuildGrowNew(newMolB[n], molIndexB[n]); + ShiftMol(n, false); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + } + + //Insert kindS to cavity of center B + for(uint n = 0; n < numInCavA; n++) { + molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); + ShiftMol(n, true); + cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); + //Add bonded energy because we dont considered in DCRotate.cpp + calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + } + + return mv::fail_state::NO_FAIL; +} + +inline void IntraMoleculeExchange3::CalcEn() +{ + W_recip = 1.0; + recipDiffA = 0.0, recipDiffB = 0.0; + correctDiff = 0.0; + //No need to calculate the correction term for kindS since it is + // inserted rigid body. We just need it for kindL + for(uint n = 0; n < numInCavB; n++) { + correctDiff += calcEwald->SwapCorrection(newMolB[n]); + correctDiff -= calcEwald->SwapCorrection(oldMolB[n]); + } + recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); + recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); + + W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB + + correctDiff)); +} + + +inline void IntraMoleculeExchange3::Accept(const uint rejectState, + const uint step) +{ + IntraMoleculeExchange1::Accept(rejectState, step); +} + +#endif diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index e8d885faa..05034022b 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -15,7 +15,9 @@ using namespace geom; // // Swapping one Large molecule with one or more small molecules in dense phase // and vice versa. -// Sub-Volume location and orientation is random. +// Sub-Volume location and orientation is random for kindL insertion. +// Sub-Volume center and orientation is on COM of kindL and aligned with +// backbone of kindL for kindL deletion. class MoleculeExchange1 : public MoveBase { @@ -139,8 +141,7 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) inline void MoleculeExchange1::AdjustExRatio() { - if(((counter + 1) % perAdjust) == 0) - { + if(((counter + 1) % perAdjust) == 0) { uint exMax = ceil((float)molInCavCount / (float)perAdjust); uint exMin = ceil((float)exMax / 2.0); if(exMin == 0) @@ -148,22 +149,18 @@ inline void MoleculeExchange1::AdjustExRatio() subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) - { - if(currAccept > lastAccept) - { - exchangeRatio += exDiff; - } - else - { - exDiff *= -1; - exchangeRatio += exDiff; + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { + if(currAccept > lastAccept) { + exchangeRatio += exDiff; + } else { + exDiff *= -1; + exchangeRatio += exDiff; } lastAccept = currAccept; if(exchangeRatio < exMin) - exchangeRatio = exMin; + exchangeRatio = exMin; if(exchangeRatio > exMax) - exchangeRatio = exMax; + exchangeRatio = exMax; } molInCavCount = 0; counter = 0; @@ -223,7 +220,7 @@ inline uint MoleculeExchange1::PickMolInCav() //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, kindS, exchangeRatio)) { - //Find the exchangeRatio number of molecules kind 0 in cavity + //Find the exchangeRatio number of molecules kindS in cavity numInCavA = exchangeRatio; totMolInCav = molInCav[kindS].size(); for(uint n = 0; n < numInCavA; n++) { @@ -485,6 +482,7 @@ inline void MoleculeExchange1::CalcTc() W_tc = exp(-1.0 * ffRef.beta * delTC); } } + inline void MoleculeExchange1::CalcEn() { W_recip = 1.0; @@ -683,15 +681,13 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) sysPotRef.Total(); } else { //transfer molA from destBox to source - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { cellList.RemoveMol(molIndexA[n], destBox, coordCurrRef); RecoverMol(true, n, destBox, sourceBox); cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); } //transfer molB from sourceBox to dest - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); RecoverMol(false, n, sourceBox, destBox); cellList.AddMol(molIndexB[n], destBox, coordCurrRef); diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index d652f00b4..1b97b1b81 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -115,7 +115,7 @@ inline void MoleculeExchange2::AdjustExRatio() uint exMin = 1; subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) { + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept >= lastAccept) { exchangeRatio += exDiff; } else { @@ -139,16 +139,12 @@ inline uint MoleculeExchange2::PickMolInCav() //pick a random small kind in dense phase and use the COM as cavity center uint pickedS, pickedKS; state = prng.PickMol(kindS, pickedKS, pickedS, sourceBox); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { center = comCurrRef.Get(pickedS); //If we want to orient the cavity with backbone of picked small mol - if(molRef.NumAtoms(kindS) == 1) - { + if(molRef.NumAtoms(kindS) == 1) { SetBasis(cavA, prng.RandomUnitVect()); - } - else - { + } else { uint start = molRef.MolStart(pickedS) + smallBB[0]; uint end = molRef.MolStart(pickedS) + smallBB[1]; SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); @@ -158,34 +154,30 @@ inline uint MoleculeExchange2::PickMolInCav() //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio)) - { + kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); totMolInCav = molInCav[kindS].size(); - for(uint s = 0; s < totMolInCav; s++) - { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); + //delete the picked small molecule from list + for(uint s = 0; s < totMolInCav; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); } - for(uint n = 1; n < numInCavA; n++) - { - //pick random exchangeRatio number of kindS in cavity - uint picked = prng.randIntExc(molInCav[kindS].size()); - molIndexA.push_back(molInCav[kindS][picked]); - kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); - molInCav[kindS].erase(molInCav[kindS].begin() + picked); + for(uint n = 1; n < numInCavA; n++) { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); } //pick a molecule from Large kind in destBox numInCavB = 1; state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); - } - else - { + } else { //reject the move state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; } @@ -206,15 +198,11 @@ inline uint MoleculeExchange2::ReplaceMolecule() //pick a random molecule of Large kind in dens box state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { //Set the V1 to the backbone of the large molecule - if(molRef.NumAtoms(kindL) == 1) - { + if(molRef.NumAtoms(kindL) == 1) { SetBasis(cavA, prng.RandomUnitVect()); - } - else - { + } else { uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; uint end = molRef.MolStart(molIndexA[0]) + largeBB[1]; SetBasis(cavA, boxDimRef.MinImage(coordCurrRef.Difference(start, end), sourceBox)); @@ -237,23 +225,20 @@ inline uint MoleculeExchange2::ReplaceMolecule() inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); numTypeBDest =(double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); //transfering type A from source to dest - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, destBox)); oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, sourceBox)); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //transfering type B from dest to source newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, sourceBox)); @@ -262,8 +247,7 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) } //set the old coordinate after unwrap them - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { XYZArray molA(pLenA[n]); coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); @@ -274,8 +258,7 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) oldMolA[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { XYZArray molB(pLenB[n]); coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); @@ -286,64 +269,50 @@ inline uint MoleculeExchange2::Prep(const double subDraw, const double movPerc) newMolB[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //SetSeed(has cavity, COM is fixed, rotate around Backbone) - if(insertL) - { - //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of large molecule to be inserted - newMolB[n].SetBackBone(largeBB); - //perform rotational trial move in destBox for L oldMol - oldMolB[n].SetSeed(false, false, false); - } - else - { - if(n == 0) - { - //Inserting Small from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of small molecule to be inserted - newMolB[n].SetBackBone(smallBB); - } - else - { - //Inserting S mol from destBox to the cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, false, false); - } - //perform trial move in destBox for S oldMol - oldMolB[n].SetSeed(false, false, false); + if(insertL) { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be inserted + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } else { + if(n == 0) { + //Inserting Small from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of small molecule to be inserted + newMolB[n].SetBackBone(smallBB); + } else { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + } + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); } } - for(uint n = 0; n < numInCavA; n++) - { - if(insertL) - { - //Inserting S mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - if(n == 0) - { - //perform trial move in cavity with fix COM for S oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of small molecule to be deleted - oldMolA[n].SetBackBone(smallBB); - } - else - { - //perform trial move in cavity in sourceBox for S oldMol - oldMolA[n].SetSeed(center, cavity, true, false, false); - } - } - else - { - //Inserting L mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - // Set the Backbone of large molecule to be deleted - oldMolA[n].SetBackBone(largeBB); + for(uint n = 0; n < numInCavA; n++) { + if(insertL) { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + if(n == 0) { + //perform trial move in cavity with fix COM for S oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of small molecule to be deleted + oldMolA[n].SetBackBone(smallBB); + } else { + //perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + } else { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the Backbone of large molecule to be deleted + oldMolA[n].SetBackBone(largeBB); } } } @@ -359,7 +328,7 @@ inline uint MoleculeExchange2::Transform() //Calc Old energy and delete A from source if(insertL) { - //Remove the fixed COM small mol at the end because we insert it at fist + //Remove the fixed COM small mol at the end because we insert it at first for(uint n = numInCavA; n > 0; n--) { cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index e50bf3e2a..100be89a9 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -26,10 +26,6 @@ class MoleculeExchange3 : public MoleculeExchange1 MoleculeExchange3(System &sys, StaticVals const& statV) : MoleculeExchange1(sys, statV) { - enableID = statV.memcVal.enable; - largeBB[0] = -1; - largeBB[1] = -1; - if(enableID) { SetMEMC(statV); } @@ -40,7 +36,7 @@ class MoleculeExchange3 : public MoleculeExchange1 virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); - private: + protected: virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); @@ -51,7 +47,7 @@ class MoleculeExchange3 : public MoleculeExchange1 inline void MoleculeExchange3::SetMEMC(StaticVals const& statV) { - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind) { kindL = molLookRef.GetCanSwapKind(k); } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { @@ -106,7 +102,7 @@ inline void MoleculeExchange3::AdjustExRatio() uint exMin = 1; subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); double currAccept = moveSetRef.GetAccept(subPick); - if(abs(currAccept - lastAccept) > 0.05 * currAccept) { + if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept >= lastAccept) { exchangeRatio += exDiff; } else { @@ -140,34 +136,30 @@ inline uint MoleculeExchange3::PickMolInCav() //Find the molecule kind 0 in the cavity if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio)) - { + kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); totMolInCav = molInCav[kindS].size(); - for(uint s = 0; s < totMolInCav; s++) - { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); + for(uint s = 0; s < totMolInCav; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); } - for(uint n = 1; n < numInCavA; n++) - { - //pick random exchangeRatio number of kindS in cavity - uint picked = prng.randIntExc(molInCav[kindS].size()); - molIndexA.push_back(molInCav[kindS][picked]); - kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); - molInCav[kindS].erase(molInCav[kindS].begin() + picked); + + for(uint n = 1; n < numInCavA; n++) { + //pick random exchangeRatio number of kindS in cavity + uint picked = prng.randIntExc(molInCav[kindS].size()); + molIndexA.push_back(molInCav[kindS][picked]); + kindIndexA.push_back(molRef.GetMolKind(molIndexA[n])); + molInCav[kindS].erase(molInCav[kindS].begin() + picked); } //pick a molecule from Large kind in destBox numInCavB = 1; state = prng.PickMol(kindL, kindIndexB, molIndexB, numInCavB, destBox); - } - else - { + } else { //reject the move state = mv::fail_state::NO_MOL_OF_KIND_IN_BOX; } @@ -188,13 +180,12 @@ inline uint MoleculeExchange3::ReplaceMolecule() //pick a random molecule of Large kind in dens box state = prng.PickMol(kindL, kindIndexA, molIndexA, numInCavA, sourceBox); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { //Set V1 to a random vector and calculate two vector perpendicular to V1 SetBasis(cavA, prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); - //use the first atom in molecule as the center + //use the predefine atom in kindL as the center uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; center = coordCurrRef.Get(start); //find how many of KindS exist in this center @@ -211,23 +202,20 @@ inline uint MoleculeExchange3::ReplaceMolecule() inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); - if(state == mv::fail_state::NO_FAIL) - { + if(state == mv::fail_state::NO_FAIL) { numTypeASource =(double)(molLookRef.NumKindInBox(kindIndexA[0],sourceBox)); numTypeADest = (double)(molLookRef.NumKindInBox(kindIndexA[0], destBox)); numTypeBSource =(double)(molLookRef.NumKindInBox(kindIndexB[0],sourceBox)); numTypeBDest = (double)(molLookRef.NumKindInBox(kindIndexB[0], destBox)); //transfering type A from source to dest - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { newMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, destBox)); oldMolA.push_back(cbmc::TrialMol(molRef.kinds[kindIndexA[n]], boxDimRef, sourceBox)); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //transfering type B from dest to source newMolB.push_back(cbmc::TrialMol(molRef.kinds[kindIndexB[n]], boxDimRef, sourceBox)); @@ -236,8 +224,7 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) } //set the old coordinate after unwrap them - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { XYZArray molA(pLenA[n]); coordCurrRef.CopyRange(molA, pStartA[n], 0, pLenA[n]); boxDimRef.UnwrapPBC(molA, sourceBox, comCurrRef.Get(molIndexA[n])); @@ -248,8 +235,7 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) oldMolA[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { XYZArray molB(pLenB[n]); coordCurrRef.CopyRange(molB, pStartB[n], 0, pLenB[n]); boxDimRef.UnwrapPBC(molB, destBox, comCurrRef.Get(molIndexB[n])); @@ -260,60 +246,46 @@ inline uint MoleculeExchange3::Prep(const double subDraw, const double movPerc) newMolB[n].SetCavMatrix(cavA); } - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { //SetSeed(has cavity, COM is fixed, rotate around Backbone) - if(insertL) - { - //Inserting Lmol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, true); - // Set the a otom of large molecule to be inserted in COM of cavity - newMolB[n].SetBackBone(largeBB); - //perform rotational trial move in destBox for L oldMol - oldMolB[n].SetSeed(false, false, false); - } - else - { - if(n == 0) - { - //Inserting Smol from destBox to the center of cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, true, false); - } - else - { - //Inserting S mol from destBox to the cavity in sourceBox - newMolB[n].SetSeed(center, cavity, true, false, false); - } - //perform trial move in destBox for S oldMol - oldMolB[n].SetSeed(false, false, false); + if(insertL) { + //Inserting Lmol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, true); + // Set the a otom of large molecule to be inserted in COM of cavity + newMolB[n].SetBackBone(largeBB); + //perform rotational trial move in destBox for L oldMol + oldMolB[n].SetSeed(false, false, false); + } else { + if(n == 0) { + //Inserting Smol from destBox to the center of cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, true, false); + } else { + //Inserting S mol from destBox to the cavity in sourceBox + newMolB[n].SetSeed(center, cavity, true, false, false); + } + //perform trial move in destBox for S oldMol + oldMolB[n].SetSeed(false, false, false); } } - for(uint n = 0; n < numInCavA; n++) - { - if(insertL) - { - //Inserting S mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - if(n == 0) - { - //perform trial move in cavity with fix COM for S oldMol - oldMolA[n].SetSeed(center, cavity, true, true, false); - } - else - { - //perform trial move in cavity in sourceBox for S oldMol - oldMolA[n].SetSeed(center, cavity, true, false, false); - } - } - else - { - //Inserting L mol from sourceBox to destBox - newMolA[n].SetSeed(false, false, false); - //perform rotational trial move on COM for L oldMol - oldMolA[n].SetSeed(center, cavity, true, true, true); - // Set the atom of the large molecule to be inserted in COM - oldMolA[n].SetBackBone(largeBB); + for(uint n = 0; n < numInCavA; n++) { + if(insertL) { + //Inserting S mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + if(n == 0) { + //perform trial move in cavity with fix COM for S oldMol + oldMolA[n].SetSeed(center, cavity, true, true, false); + } else { + //perform trial move in cavity in sourceBox for S oldMol + oldMolA[n].SetSeed(center, cavity, true, false, false); + } + } else { + //Inserting L mol from sourceBox to destBox + newMolA[n].SetSeed(false, false, false); + //perform rotational trial move on COM for L oldMol + oldMolA[n].SetSeed(center, cavity, true, true, true); + // Set the atom of the large molecule to be inserted in COM + oldMolA[n].SetBackBone(largeBB); } } } @@ -327,34 +299,27 @@ inline uint MoleculeExchange3::Transform() CalcTc(); //Deleting A, B from their box - if(insertL) - { + if(insertL) { //Remove the fixed COM small mol at the end because we insert it at first - for(uint n = numInCavA; n > 0; n--) - { + for(uint n = numInCavA; n > 0; n--) { cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); //Add bonded energy because we dont considered in DCRotate.cpp calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); } //Calc old energy and delete Large kind from dest box - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildOld(oldMolB[n], molIndexB[n]); } - } - else - { + } else { //Calc old energy and delete Large kind from source box - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n]].BuildGrowOld(oldMolA[n], molIndexA[n]); } //Calc old energy and delete Small kind from dest box - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); @@ -362,36 +327,29 @@ inline uint MoleculeExchange3::Transform() } //Inserting A, B to new box - if(insertL) - { + if(insertL) { //Insert Small kind to destBox - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); } //Insert Large kind to sourceBox - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { molRef.kinds[kindIndexB[n]].BuildGrowNew(newMolB[n], molIndexB[n]); ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); } - } - else - { + } else { //Insert Large kind to destBox - for(uint n = 0; n < numInCavA; n++) - { + for(uint n = 0; n < numInCavA; n++) { molRef.kinds[kindIndexA[n]].BuildNew(newMolA[n], molIndexA[n]); ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); } //Insert Small kind to sourceBox - for(uint n = 0; n < numInCavB; n++) - { + for(uint n = 0; n < numInCavB; n++) { molRef.kinds[kindIndexB[n]].BuildIDNew(newMolB[n], molIndexB[n]); ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); diff --git a/src/MoveConst.h b/src/MoveConst.h index 62661d928..44ca0f947 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -31,25 +31,29 @@ const uint ROTATE = 1; #if ENSEMBLE == NVT const uint INTRA_SWAP = 2; const uint REGROWTH = 3; -const uint MOVE_KINDS_TOTAL = 4; +const uint INTRA_MEMC = 4; +const uint MOVE_KINDS_TOTAL = 5; #elif ENSEMBLE == GCMC const uint INTRA_SWAP = 2; const uint REGROWTH = 3; -const uint MEMC = 4; -const uint MOL_TRANSFER = 5; -const uint MOVE_KINDS_TOTAL = 6; +const uint INTRA_MEMC = 4; +const uint MEMC = 5; +const uint MOL_TRANSFER = 6; +const uint MOVE_KINDS_TOTAL = 7; #elif ENSEMBLE == GEMC const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; const uint REGROWTH = 4; -const uint MEMC = 5; -const uint MOL_TRANSFER = 6; -const uint MOVE_KINDS_TOTAL = 7; +const uint INTRA_MEMC = 5; +const uint MEMC = 6; +const uint MOL_TRANSFER = 7; +const uint MOVE_KINDS_TOTAL = 8; #elif ENSEMBLE == NPT const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; const uint REGROWTH = 4; -const uint MOVE_KINDS_TOTAL = 5; +const uint INTRA_MEMC = 5; +const uint MOVE_KINDS_TOTAL = 6; #endif const uint BOX0 = 0; @@ -105,34 +109,35 @@ const uint IT_KINDS_TOTAL = 2; ////////////////////////////////////////////////////////// //NVT : 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) +// 4. Regrowth (box 0) 5. IntraMEMC (box 0) // //GCMC: 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) 5. MEMC (box 0) 6. Deletion (box 0) -// 7. Insertion (box 0) +// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. MEMC (box 0) +// 7. Deletion (box 0) 8. Insertion (box 0) // //GEMC: 1. Disp (box 0) 2. Disp (box 1) // 3. Rotate (box 0) 4. Rotate (box 1) // 5. Vol. (b0->b1) 6. Vol. (b1->b0) // 7. IntraSwap (box 0) 8. IntraSwap (box 1) // 9. Regrowth (box 0) 10. Regrowth (box 1) -// 11. MEMC (box 0) 12. MEMC (box 1) -// 13. Mol Trans (b0->b1), 14. Mol Trans (b1->b0) +// 11. IntraMEMC (box 0) 12. IntraMEMC (box 1) +// 13. MEMC (box 0) 14. MEMC (box 1) +// 15. Mol Trans (b0->b1), 16. Mol Trans (b1->b0) // //NPT : 1. Disp (box 0) 2. Rotate (box 0) 3. Vol. (box 0) -// 4. IntraSwap (box 0) 5. Regrowth (box 0) +// 4. IntraSwap (box 0) 5. Regrowth (box 0) 6. IntraMEMC (box 0) #if ENSEMBLE == NVT -const uint COUNT = 4; +const uint COUNT = 5; const uint SCALEABLE = 2; #elif ENSEMBLE == GCMC -const uint COUNT = 7; +const uint COUNT = 8; const uint SCALEABLE = 2; #elif ENSEMBLE == GEMC -const uint COUNT = 14; +const uint COUNT = 16; const uint SCALEABLE = 6; #elif ENSEMBLE == NPT -const uint COUNT = 5; +const uint COUNT = 6; const uint SCALEABLE = 3; #endif diff --git a/src/StaticVals.cpp b/src/StaticVals.cpp index dc8bf46e7..0c2fd8d6f 100644 --- a/src/StaticVals.cpp +++ b/src/StaticVals.cpp @@ -55,6 +55,9 @@ void StaticVals::InitMovePercents(config_setup::MovePercents const& perc) case mv::REGROWTH: movePerc[m] = perc.regrowth; break; + case mv::INTRA_MEMC: + movePerc[m] = perc.intraMemc; + break; #ifdef VARIABLE_VOLUME case mv::VOL_TRANSFER : movePerc[m] = perc.volume; @@ -106,7 +109,8 @@ void StaticVals::IsBoxOrthogonal(config_setup::Volume const& vol) } -StaticVals::StaticVals(Setup & set) : memcVal(set.config.sys.memcVal) +StaticVals::StaticVals(Setup & set) : memcVal(set.config.sys.memcVal), + intraMemcVal(set.config.sys.intraMemcVal) { isOrthogonal = true; IsBoxOrthogonal(set.config.sys.volume); diff --git a/src/StaticVals.h b/src/StaticVals.h index 7de26ef43..8364a6f8d 100644 --- a/src/StaticVals.h +++ b/src/StaticVals.h @@ -54,6 +54,7 @@ class StaticVals double movePerc[mv::MOVE_KINDS_TOTAL]; double totalPerc; + config_setup::MEMCVal intraMemcVal; //Only include these variables if they're static for this ensemble... #ifndef VARIABLE_VOLUME @@ -62,7 +63,7 @@ class StaticVals #ifndef VARIABLE_PARTICLE_NUMBER MoleculeLookup molLookup; #endif -#ifdef VARIABLE_PARTICLE_NUMBER +#ifdef VARIABLE_PARTICLE_NUMBER config_setup::MEMCVal memcVal; #endif diff --git a/src/System.cpp b/src/System.cpp index 55da65858..a45054f09 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -24,6 +24,9 @@ along with this program, also can be found at . #include "MoleculeExchange1.h" #include "MoleculeExchange2.h" #include "MoleculeExchange3.h" +#include "IntraMoleculeExchange1.h" +#include "IntraMoleculeExchange2.h" +#include "IntraMoleculeExchange3.h" System::System(StaticVals& statics) : statV(statics), @@ -58,6 +61,7 @@ System::~System() delete moves[mv::ROTATE]; delete moves[mv::INTRA_SWAP]; delete moves[mv::REGROWTH]; + delete moves[mv::INTRA_MEMC]; #if ENSEMBLE == GEMC || ENSEMBLE == NPT delete moves[mv::VOL_TRANSFER]; #endif @@ -120,6 +124,14 @@ void System::InitMoves(Setup const& set) moves[mv::ROTATE] = new Rotate(*this, statV); moves[mv::INTRA_SWAP] = new IntraSwap(*this, statV); moves[mv::REGROWTH] = new Regrowth(*this, statV); + if(set.config.sys.intraMemcVal.MEMC1) { + moves[mv::INTRA_MEMC] = new IntraMoleculeExchange1(*this, statV); + } else if (set.config.sys.memcVal.MEMC2) { + moves[mv::INTRA_MEMC] = new IntraMoleculeExchange2(*this, statV); + } else { + moves[mv::INTRA_MEMC] = new IntraMoleculeExchange3(*this, statV); + } + #if ENSEMBLE == GEMC || ENSEMBLE == NPT moves[mv::VOL_TRANSFER] = new VolumeTransfer(*this, statV); #endif @@ -196,6 +208,7 @@ void System::PrintTime() printf("%-30s %10.4f sec.\n", "Rotation:", moveTime[mv::ROTATE]); printf("%-30s %10.4f sec.\n", "Intra-Swap:", moveTime[mv::INTRA_SWAP]); printf("%-30s %10.4f sec.\n", "Regrowth:", moveTime[mv::REGROWTH]); + printf("%-30s %10.4f sec.\n", "Intra-MEMC:", moveTime[mv::INTRA_MEMC]); #if ENSEMBLE == GEMC || ENSEMBLE == GCMC printf("%-30s %10.4f sec.\n", "Molecule-Transfer:", From 206784844b2ea3d5c539280ac31026c36c3c3de0 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 18 Jun 2018 16:10:00 -0400 Subject: [PATCH 033/199] Fix bug in IntraMEMC. --- src/IntraMoleculeExchange3.h | 2 +- src/System.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 9acad907d..372522769 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -170,7 +170,7 @@ inline uint IntraMoleculeExchange3::PickMolInCav() //After picking a large molecule, set the cavityB, and count kindS in cavityB if(state == mv::fail_state::NO_FAIL) { //use the predefine atom in kindL as the centerB - uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; + uint start = molRef.MolStart(molIndexB[0]) + largeBB[0]; centerB = coordCurrRef.Get(start); //Set V1 to a random vector and calculate two vector perpendicular to V1 SetBasis(cavB, prng.RandomUnitVect()); diff --git a/src/System.cpp b/src/System.cpp index a45054f09..6ab4cee75 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -126,7 +126,7 @@ void System::InitMoves(Setup const& set) moves[mv::REGROWTH] = new Regrowth(*this, statV); if(set.config.sys.intraMemcVal.MEMC1) { moves[mv::INTRA_MEMC] = new IntraMoleculeExchange1(*this, statV); - } else if (set.config.sys.memcVal.MEMC2) { + } else if (set.config.sys.intraMemcVal.MEMC2) { moves[mv::INTRA_MEMC] = new IntraMoleculeExchange2(*this, statV); } else { moves[mv::INTRA_MEMC] = new IntraMoleculeExchange3(*this, statV); From 39f8ae54c1e9f811f67189b513143a47d07bd7a6 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 18 Jun 2018 16:59:52 -0400 Subject: [PATCH 034/199] Fix bug in IntraMEMC cont. --- src/ConfigSetup.cpp | 8 ++++++++ src/IntraMoleculeExchange1.h | 7 +++++++ src/IntraMoleculeExchange2.h | 14 ++++++++++++++ src/MoleculeExchange1.h | 7 +++++++ src/MoleculeExchange2.h | 14 ++++++++++++++ 5 files changed, 50 insertions(+) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 3ea9ae141..2fd84dc0f 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -1076,6 +1076,14 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: In Intra-MEMC method, Small Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } + if(sys.memcVal.enable && sys.intraMemcVal.enable) { + if((sys.memcVal.MEMC1 && !sys.intraMemcVal.MEMC1) || + (sys.memcVal.MEMC2 && !sys.intraMemcVal.MEMC2) || + (sys.memcVal.MEMC3 && !sys.intraMemcVal.MEMC3)) { + std::cout << "Error: Intra-MEMC method is not same as MEMC method!\n"; + exit(EXIT_FAILURE); + } + } } #endif diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 16cbb94a2..17f9c6d92 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -130,6 +130,13 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) exit(EXIT_FAILURE); } } + + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } inline void IntraMoleculeExchange1::AdjustExRatio() diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 5d856c0cc..60fe64174 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -103,6 +103,20 @@ inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) exit(EXIT_FAILURE); } } + + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } + + if(molRef.kinds[kindS].NumAtoms() > 1) { + if(smallBB[0] == smallBB[1]) { + printf("Error: Atom names in small molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } inline void IntraMoleculeExchange2::AdjustExRatio() diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 05034022b..b6a36858b 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -137,6 +137,13 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) exit(EXIT_FAILURE); } } + + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } inline void MoleculeExchange1::AdjustExRatio() diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 1b97b1b81..787d81677 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -105,6 +105,20 @@ inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) exit(EXIT_FAILURE); } } + + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } + + if(molRef.kinds[kindS].NumAtoms() > 1) { + if(smallBB[0] == smallBB[1]) { + printf("Error: Atom names in small molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } inline void MoleculeExchange2::AdjustExRatio() From bfd844aca21b0efc7455ff4ccad4b11f1387b1af Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 18 Jun 2018 17:21:33 -0400 Subject: [PATCH 035/199] Fix bug in IntraMEMC cont. --- src/IntraMoleculeExchange1.h | 14 ++++++------ src/IntraMoleculeExchange2.h | 39 ---------------------------------- src/IntraMoleculeExchange3.h | 41 +----------------------------------- src/MoleculeExchange1.h | 20 +++++++++++------- src/MoleculeExchange2.h | 37 -------------------------------- src/MoleculeExchange3.h | 37 -------------------------------- 6 files changed, 21 insertions(+), 167 deletions(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 17f9c6d92..700d8e08a 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -116,7 +116,7 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { largeBB[0] = i; } - if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom2){ largeBB[1] = i; } } @@ -131,11 +131,13 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) } } - if(molRef.kinds[kindL].NumAtoms() > 1) { - if(largeBB[0] == largeBB[1]) { - printf("Error: Atom names in large molecule backbone cannot be same!\n"); - exit(EXIT_FAILURE); - } + if(statV.intraMemcVal.MEMC1 || statV.intraMemcVal.MEMC2) { + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } } diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 60fe64174..b6e0359fa 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -46,45 +46,6 @@ class IntraMoleculeExchange2 : public IntraMoleculeExchange1 inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) { - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { - kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { - kindS = molLookRef.GetCanSwapKind(k); - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", - statV.intraMemcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", - statV.intraMemcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ - largeBB[1] = i; - } - } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.intraMemcVal.largeBBAtom1.c_str(), - statV.intraMemcVal.largeBBAtom2.c_str(), - statV.intraMemcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } - for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { if(molRef.kinds[kindS].atomNames[i] == statV.intraMemcVal.smallBBAtom1) { smallBB[0] = i; diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 372522769..8ea9051a9 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -43,35 +43,6 @@ class IntraMoleculeExchange3 : public IntraMoleculeExchange1 inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) { - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { - kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { - kindS = molLookRef.GetCanSwapKind(k); - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", - statV.intraMemcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", - statV.intraMemcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.intraMemcVal.largeBBAtom2){ - largeBB[1] = i; - } - } - if(largeBB[0] != largeBB[1]) { printf("Error: In ME-3 move, atom name of backbone should be same.\n"); printf("Atom names in backbone was set to %s or %s in %s residue.\n", @@ -79,17 +50,7 @@ inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) statV.intraMemcVal.largeBBAtom2.c_str(), statV.intraMemcVal.largeKind.c_str()); exit(EXIT_FAILURE); - } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.intraMemcVal.largeBBAtom1.c_str(), - statV.intraMemcVal.largeBBAtom2.c_str(), - statV.intraMemcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } + } } inline void IntraMoleculeExchange3::AdjustExRatio() diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index b6a36858b..a091f5343 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -110,12 +110,14 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + statV.memcVal.smallKind.c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } @@ -123,7 +125,7 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { largeBB[0] = i; } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom2){ largeBB[1] = i; } } @@ -138,11 +140,13 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) } } - if(molRef.kinds[kindL].NumAtoms() > 1) { - if(largeBB[0] == largeBB[1]) { - printf("Error: Atom names in large molecule backbone cannot be same!\n"); - exit(EXIT_FAILURE); - } + if(statV.memcVal.MEMC1 || statV.memcVal.MEMC2) { + if(molRef.kinds[kindL].NumAtoms() > 1) { + if(largeBB[0] == largeBB[1]) { + printf("Error: Atom names in large molecule backbone cannot be same!\n"); + exit(EXIT_FAILURE); + } + } } } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 787d81677..3e2bd5c68 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -50,43 +50,6 @@ class MoleculeExchange2 : public MoleculeExchange1 inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) { - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = molLookRef.GetCanSwapKind(k); - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] = i; - } - } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } - for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { smallBB[0] = i; diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 100be89a9..f968992c9 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -47,33 +47,6 @@ class MoleculeExchange3 : public MoleculeExchange1 inline void MoleculeExchange3::SetMEMC(StaticVals const& statV) { - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind) { - kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { - kindS = molLookRef.GetCanSwapKind(k); - } - } - - if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", statV.memcVal.smallKind.c_str()); - exit(EXIT_FAILURE); - } - - if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - - for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { - largeBB[0] = i; - } - if(molRef.kinds[kindL].atomNames[i] ==statV.memcVal.largeBBAtom2){ - largeBB[1] = i; - } - } - if(largeBB[0] != largeBB[1]) { printf("Error: In ME-3 move, atom name of backbone should be same.\n"); printf("Atom names in backbone was set to %s or %s in %s residue.\n", @@ -82,16 +55,6 @@ inline void MoleculeExchange3::SetMEMC(StaticVals const& statV) statV.memcVal.largeKind.c_str()); exit(EXIT_FAILURE); } - - for(uint i = 0; i < 2; i++) { - if(largeBB[i] == -1) { - printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } - } } inline void MoleculeExchange3::AdjustExRatio() From 08a0b7ce3835bb6c1a96ba5da3de3718eb2330e8 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 19 Jun 2018 15:57:08 -0400 Subject: [PATCH 036/199] Add auto adjust exchange ratio function to IntraMEMC move --- src/IntraMoleculeExchange1.h | 1 + src/IntraMoleculeExchange2.h | 3 +++ src/IntraMoleculeExchange3.h | 3 +++ 3 files changed, 7 insertions(+) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 700d8e08a..5861e6070 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -287,6 +287,7 @@ inline uint IntraMoleculeExchange1::GetBoxPairAndMol(const double subDraw, inline uint IntraMoleculeExchange1::Prep(const double subDraw, const double movPerc) { + //AdjustExRatio(); uint state = GetBoxPairAndMol(subDraw, movPerc); if(state == mv::fail_state::NO_FAIL) { //transfering type A from source diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index b6e0359fa..0aafefcc7 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -103,6 +103,8 @@ inline void IntraMoleculeExchange2::AdjustExRatio() } molInCavCount = 0; counter = 0; + printf("ExchangeRatio: %d, Average kindS in cavity: %d \n", exchangeRatio, + exMax); } } @@ -187,6 +189,7 @@ inline uint IntraMoleculeExchange2::PickMolInCav() inline uint IntraMoleculeExchange2::Prep(const double subDraw, const double movPerc) { + //AdjustExRatio(); uint state = GetBoxPairAndMol(subDraw, movPerc); if(state == mv::fail_state::NO_FAIL) { //transfering type A from source diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 8ea9051a9..e8fbfeb9c 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -76,6 +76,8 @@ inline void IntraMoleculeExchange3::AdjustExRatio() } molInCavCount = 0; counter = 0; + printf("ExchangeRatio: %d, Average kindS in cavity: %d \n", exchangeRatio, + exMax); } } @@ -149,6 +151,7 @@ inline uint IntraMoleculeExchange3::PickMolInCav() inline uint IntraMoleculeExchange3::Prep(const double subDraw, const double movPerc) { + //AdjustExRatio(); uint state = GetBoxPairAndMol(subDraw, movPerc); if(state == mv::fail_state::NO_FAIL) { //transfering type A from source From cf899bc9ab1ffdabb95ec1e1a8629e24611fb972 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 11:13:24 -0400 Subject: [PATCH 037/199] Fix to the issue #94. --- src/BoxDimensions.cpp | 11 +++++++++++ src/BoxDimensions.h | 3 +++ src/MoveSettings.cpp | 13 +++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index 2ba021532..aa5bffebb 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -189,6 +189,17 @@ double BoxDimensions::GetTotVolume() const return sum; } +double BoxDimensions::MinVolume() const +{ + double minVol = volume[mv::BOX0]; + for(uint b = 1; b < BOX_TOTAL; b++) { + if(volume[b] < minVol) { + minVol = volume[b]; + } + } + return minVol; +} + void BoxDimensions::SetVolume(const uint b, const double vol) { if(constArea) { diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index ce7ccbee9..5ffe2ec53 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -47,6 +47,9 @@ class BoxDimensions double GetTotVolume() const; + //Return minimum volume of simulation boxes. + double MinVolume() const; + virtual void SetVolume(const uint b, const double vol); virtual uint ShiftVolume(BoxDimensions & newDim, XYZ & scale, diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index ed8daac24..0dfcbe489 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -116,10 +116,7 @@ void MoveSettings::Adjust(const uint majMoveKind, accepted[moveIndex] += tempAccepted[moveIndex]; tries[moveIndex] += tempTries[moveIndex]; -#if 0 - if (majMoveKind == mv::VOL_TRANSFER) - std::cout << "scale[moveIndex]: " << scale[moveIndex] << std::endl; -#endif + } tempAccepted[moveIndex] = tempTries[moveIndex] = 0; //Bound our values to prevent to big or too small a move. @@ -131,6 +128,14 @@ void MoveSettings::Adjust(const uint majMoveKind, case mv::ROTATE : num::Bound(scale[moveIndex], 0.000001, M_PI - TINY_AMOUNT); break; +#if ENSEMBLE == NPT || ENSEMBLE == GEMC + case mv::VOL_TRANSFER : { + //Warning: This will lead to have acceptance > %50 + double maxVolExchange = boxDimRef.MinVolume() - boxDimRef.minVol; + num::Bound(scale[moveIndex], 0.001, maxVolExchange - 0.001); + break; + } +#endif default: break; } From 0c3fb4d67e7086633d71babb404a22490512ae4d Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 12:00:38 -0400 Subject: [PATCH 038/199] Fix to the Issue #86 --- src/CalculateEnergy.cpp | 6 +++--- src/Simulation.cpp | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 868670476..e6f9afcbf 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -124,9 +124,9 @@ SystemPotential CalculateEnergy::SystemTotal() if(pot.totalEnergy.total > 1.0e12) { std::cout << "\nWarning: Large energy detected due to the overlap in " "initial configuration.\n" - " Total energy calculation will be perform at EqStep to " - "preserve the\n" - " energy information.\n"; + " The total energy will be recalculated at EqStep to " + "ensure the accuracy \n" + " of the computed running energies.\n"; } return pot; diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 6379d19a6..cd363133c 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -60,8 +60,9 @@ void Simulation::RunSimulation(void) if((step + 1) == cpu->equilSteps) { double currEnergy = system->potential.totalEnergy.total; if(abs(currEnergy - startEnergy) > 1.0e+10) { - printf("Info: Performing total energy calculation to preserve the" - " energy information.\n\n"); + printf("Info: Recalculating the total energies to insure the accuracy" + " of the computed \n" + " running energies.\n\n"); system->calcEwald->Init(); system->potential = system->calcEnergy.SystemTotal(); } From 655a31ffd2652e6d5b2618a79f5bcab72bea3893 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 18:50:04 -0400 Subject: [PATCH 039/199] Fix to the problem when using restart and EqSteps is less that AdjSteps. --- src/ConfigSetup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 89bef6ea1..b4e539ab0 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -786,7 +786,7 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: Total run steps is not specified!" << std::endl; exit(EXIT_FAILURE); } - if(sys.step.adjustment > sys.step.equil) { + if(sys.step.adjustment > sys.step.equil && !in.restart.enable) { std::cout << "Error: Move adjustment frequency should be smaller " << "than Equilibration steps!" << std::endl; exit(EXIT_FAILURE); From 781e2dd1cbff9273dfb80048e772b8943144bf10 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 19:07:45 -0400 Subject: [PATCH 040/199] Turn off the Block average when recalculating the frames --- .vscode/settings.json | 3 ++- src/ConfigSetup.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3ec87ace0..f743dd9aa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.associations": { - "__tree": "cpp" + "__tree": "cpp", + "ios": "cpp" } } \ No newline at end of file diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index b4e539ab0..6de485dde 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -658,6 +658,11 @@ void ConfigSetup::fillDefaults(void) printf("%-40s %-4.4f \n", "Default: Short Range Cutoff", sys.ff.cutoffLow); } + if(out.statistics.settings.block.enable && in.restart.recalcTrajectory) { + out.statistics.settings.block.enable = false; + printf("%-40s \n", "Warning: Average output is activated but it will be ignored."); + } + out.state.files.psf.name = out.statistics.settings.uniqueStr.val + "_merged.psf"; for(int i = 0; i < BOX_TOTAL; i++) { @@ -786,7 +791,8 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: Total run steps is not specified!" << std::endl; exit(EXIT_FAILURE); } - if(sys.step.adjustment > sys.step.equil && !in.restart.enable) { + if(sys.step.adjustment > sys.step.equil && !in.restart.enable && + !in.restart.recalcTrajectory) { std::cout << "Error: Move adjustment frequency should be smaller " << "than Equilibration steps!" << std::endl; exit(EXIT_FAILURE); From 2004d7888dcc831cf8da3b668c3a5f86d46066f1 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 22:35:13 -0400 Subject: [PATCH 041/199] Turn off printing Move statistic when recalculate frame is on --- src/ConsoleOutput.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 1f3a98d57..31dd4bbe1 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -45,8 +45,10 @@ void ConsoleOutput::DoOutput(const ulong step) std::cout << "############################# STARTING SIMULATION ##############################" << std::endl << std::endl; - PrintMoveTitle(); - std::cout << std::endl; + if(!forceOutput) { + PrintMoveTitle(); + std::cout << std::endl; + } if(enableEnergy) { PrintEnergyTitle(); @@ -59,8 +61,10 @@ void ConsoleOutput::DoOutput(const ulong step) } } else { for(uint b = 0; b < BOX_TOTAL; b++) { - PrintMove(b, step); - std::cout << std::endl; + if(!forceOutput) { + PrintMove(b, step); + std::cout << std::endl; + } if(enableEnergy) { PrintEnergy(b, var->energyRef[b], var->virialRef[b], step); From d311db95bf1a39a970b88ec0c6af3b5b160ee1b0 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 21 Jun 2018 22:41:23 -0400 Subject: [PATCH 042/199] Turn off the printing coordinate and restart coordinate when recalculating the frames --- src/ConfigSetup.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 6de485dde..8f28c4e18 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -663,6 +663,16 @@ void ConfigSetup::fillDefaults(void) printf("%-40s \n", "Warning: Average output is activated but it will be ignored."); } + if(out.restart.settings.enable && in.restart.recalcTrajectory) { + out.restart.settings.enable = false; + printf("%-40s \n", "Warning: Printing restart coordinate is activated but it will be ignored."); + } + + if(out.state.settings.enable && in.restart.recalcTrajectory) { + out.state.settings.enable = false; + printf("%-40s \n", "Warning: Printing coordinate is activated but it will be ignored."); + } + out.state.files.psf.name = out.statistics.settings.uniqueStr.val + "_merged.psf"; for(int i = 0; i < BOX_TOTAL; i++) { From 7955acd292a4fccf17e4a3b53a012338f2e87c1d Mon Sep 17 00:00:00 2001 From: YounesN Date: Fri, 22 Jun 2018 15:28:21 -0400 Subject: [PATCH 043/199] print frame numbers to console --- src/PDBSetup.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/PDBSetup.cpp b/src/PDBSetup.cpp index f412a339a..155c9c8ce 100644 --- a/src/PDBSetup.cpp +++ b/src/PDBSetup.cpp @@ -13,6 +13,7 @@ along with this program, also can be found at . #include "ConfigSetup.h" //For restart info #include "MoveConst.h" #include //for exit +#include // for to_string #if BOX_TOTAL == 1 const std::string PDBSetup::pdbAlias[] = {"system PDB coordinate file"}; @@ -199,7 +200,17 @@ void PDBSetup::Init(config_setup::RestartSettings const& restart, remarks.SetFrameNumber(b, frameNum); cryst.SetBox(b); atoms.SetBox(b); - FixedWidthReader pdb(name[b], pdbAlias[b]); + std::string alias; + if(remarks.recalcTrajectory) { + sstrm::Converter toStr; + std::string numStr = ""; + toStr << frameNum; + toStr >> numStr; + alias = pdbAlias[b] + " frame " + numStr; + } else { + alias = pdbAlias[b]; + } + FixedWidthReader pdb(name[b], alias); pdb.open(); while (pdb.Read(varName, pdb_entry::label::POS)) { //If end of frame, and this is the frame we wanted, From c7aa12af68495818e97227d6baac24e0a46316bf Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 5 Jul 2018 11:33:47 -0400 Subject: [PATCH 044/199] This branch is made to implement crank shaft move. --- example_file/methane_butane/in.conf | 162 - example_file/methane_butane/par_mie.inp | 166 - example_file/methane_butane/setup_box_0.pdb | 372 --- example_file/methane_butane/setup_box_0.psf | 621 ---- example_file/methane_butane/setup_box_1.pdb | 962 ------ example_file/methane_butane/setup_box_1.psf | 1457 --------- example_file/perfluorobutane_butane/in.conf | 163 - .../perfluorobutane_butane/par_mie.inp | 166 - .../perfluorobutane_butane/setup_box_0.pdb | 602 ---- .../perfluorobutane_butane/setup_box_0.psf | 994 ------ .../perfluorobutane_butane/setup_box_1.pdb | 1650 ---------- .../perfluorobutane_butane/setup_box_1.psf | 2676 ----------------- 12 files changed, 9991 deletions(-) delete mode 100644 example_file/methane_butane/in.conf delete mode 100644 example_file/methane_butane/par_mie.inp delete mode 100644 example_file/methane_butane/setup_box_0.pdb delete mode 100644 example_file/methane_butane/setup_box_0.psf delete mode 100644 example_file/methane_butane/setup_box_1.pdb delete mode 100644 example_file/methane_butane/setup_box_1.psf delete mode 100644 example_file/perfluorobutane_butane/in.conf delete mode 100644 example_file/perfluorobutane_butane/par_mie.inp delete mode 100644 example_file/perfluorobutane_butane/setup_box_0.pdb delete mode 100644 example_file/perfluorobutane_butane/setup_box_0.psf delete mode 100644 example_file/perfluorobutane_butane/setup_box_1.pdb delete mode 100644 example_file/perfluorobutane_butane/setup_box_1.psf diff --git a/example_file/methane_butane/in.conf b/example_file/methane_butane/in.conf deleted file mode 100644 index fa0bd502e..000000000 --- a/example_file/methane_butane/in.conf +++ /dev/null @@ -1,162 +0,0 @@ -######################## -## Init File -## -## IMPROVEMENTS -## - Compacts inputs into one line -## - Suggestion: edit inline with (insert key) -## -## To-Do -## (make editor + XML version) -######################## - -############################################################################ -# ========-------------------- INPUT --------------------------=========== -############################################################################ - -######################### -# enable, step -######################### -Restart false - -#################################### -# kind {RESTART, RANDOM, INTSEED} -#################################### -PRNG RANDOM - -#################################### -# FORCE FIELD -#################################### -ParaTypeEXOTIC true -Parameters ./par_mie.inp - -#################################### -# INPUT PDB FILES -#################################### -Coordinates 0 ./setup_box_0.pdb -Coordinates 1 ./setup_box_1.pdb - - -#################################### -# INPUT PSF FILES -#################################### -Structure 0 ./setup_box_0.psf -Structure 1 ./setup_box_1.psf - - -############################################################################ -# =======--------------------- SYSTEM --------------------------=========== -############################################################################ - -################################## -# GEMC TYPE (DEFULT IS NVT_GEMC) -################################## - - -############################# -# SIMULATION CONDITION -############################# -Temperature 255.00 -Potential VDW -LRC true -Rcut 10 -Exclude 1-4 - -############################# -# ELECTROSTATIC -############################# -Ewald false -ElectroStatic false - -############################### -# PRESSURE CALCULATION -################################ -PressureCalc false - -################################ -# STEPS -################################ -RunSteps 20000000 -EqSteps 1000 -AdjSteps 1000 - -################################ -# MOVE FREQUENCY -################################ -DisFreq 0.20 -RotFreq 0.10 -SwapFreq 0.30 -RegrowthFreq 0.10 -MEMC-1Freq 0.30 - -############################### -# MEMC PARAMETER -############################### -ExchangeVolumeDim 8.8 8.8 11.8 -ExchangeRatio 2 -ExchangeLargeKind C4A -ExchangeSmallKind C1A -LargeKindBackBone C1 C4 - - -################################ -# BOX DIMENSION #, X, Y, Z -################################ -CellBasisVector1 0 30.0 0.0 0.0 -CellBasisVector2 0 0.0 30.0 0.0 -CellBasisVector3 0 0.0 0.0 30.0 - -CellBasisVector1 1 35.0 0.0 0.0 -CellBasisVector2 1 0.0 35.0 0.0 -CellBasisVector3 1 0.0 0.0 35.0 - - -############################## -# CBMC TRIALS -############################## -CBMC_First 8 -CBMC_Nth 6 -CBMC_Ang 100 -CBMC_Dih 100 - -#################################### -# Mol. Name Chem. Pot. -#################################### -ChemPot C4A -2845 -ChemPot C1A -1720 - -############################################################################ -# =======-------------------- OUTPUT --------------------------=========== -############################################################################ - -########################## -# statistics filename add -########################## -OutputName C4A_C1A - -##################################### -# enable, frequency -##################################### -CoordinatesFreq true 10000000 -RestartFreq true 1000000 -ConsoleFreq true 100000 -BlockAverageFreq true 100000 -HistogramFreq true 100000 - - -################################ -# OutHistSettings -################################ -DistName dis -HistName his -RunNumber 1 -RunLetter a -SampleFreq 200 - -################################## -# enable: blk avg., fluct. -################################## -OutEnergy true true -OutPressure false false -OutMolNum true true -OutDensity true true - diff --git a/example_file/methane_butane/par_mie.inp b/example_file/methane_butane/par_mie.inp deleted file mode 100644 index 7d1324bec..000000000 --- a/example_file/methane_butane/par_mie.inp +++ /dev/null @@ -1,166 +0,0 @@ -* -* Topology File for Mie General model (Mick, Soroush Barhaghi, and Potoff) United Atom Force Field -* -* Parameters From: -* -* "Mie potentials for phase equilibria calculations: Application to alkanes and perfluoroalkanes." -* Potoff, Jeffrey J., and Damien A. Bernard-Brunel. -* The Journal of Physical Chemistry B 113.44 (2009): 14725-14731. -* -* -* "Optimized Mie Potentials for Phase Equilibria: Understanding the limits of transferability in branched alkanes" -* Jason R. Mick, Mohammad Soroush Barhaghi, Jeffrey J. Potoff. -* -* - - -BONDS -! -!V(bond) = Kb(b - b0)**2 -! -!Kb: kcal/mole/A**2 -!b0: A -! -! Kb (kcal/mol) = Kb (K) * Boltz. const.; (9999999999 if no stretching) -! -!atom type Kb b0 description -CH3 CH3 9999999999 1.540 ! (ethane) -CH3 CH2 9999999999 1.540 ! (ex. propane) -CH2 CH2 9999999999 1.540 ! (ex. n-butane) -CH3 CHS 9999999999 1.540 ! (ex. 2-methylpropane) -CH3 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH3 CTS 9999999999 1.540 ! (ex. 2,2-dimethylpropane) -CH3 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CH2 CHS 9999999999 1.540 ! (ex. 2-methylbutane) -CH2 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH2 CTS 9999999999 1.540 ! (ex. 2,2-dimethylbutane) -CH2 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CHS CHS 9999999999 1.540 ! (ex. 2,3-dimethylbutane) -CHL CHL 9999999999 1.540 ! (ex. 2,3-dimethylpentane) -CHS CTS 9999999999 1.540 ! (ex. 2,2,3-trimethylbutane) -CHL CTL 9999999999 1.540 ! (ex. 2,2,3-trimethylpentane) -CTT CTT 9999999999 1.580 ! (2,2,3,3-tetramethylbutane) -CF3 CF3 9999999999 1.540 ! -CF3 CF2 9999999999 1.540 ! -CF2 CF2 9999999999 1.540 ! - - - -ANGLES -! -!V(angle) = Ktheta(Theta - Theta0)**2 -! -!Ktheta: kcal/mole/rad**2 -!Theta0: degrees -! -! Ktheta (kcal/mol) = Ktheta (K) * Boltz. const. -! -!atom types Ktheta Theta0 -CH3 CH2 CH3 31250 114.00 ! (propane only) -CH3 CH2 CH2 31250 114.00 ! (ex. n-butane) -CH3 CH2 CHS 31250 114.00 ! (ex. 2-methylbutane) -CH3 CH2 CHL 31250 114.00 ! (ex. 3-methylpentane) -CH3 CH2 CTS 31250 114.00 ! (ex. 2,2-dimethylbutane) -CH3 CH2 CTL 31250 114.00 ! (ex. 3,3-dimethylhexane) -CH2 CH2 CH2 31250 114.00 ! (ex. n-pentane) -CH2 CH2 CHL 31250 114.00 ! (ex. 2-methylpentane) -CH2 CH2 CTL 31250 114.00 ! (ex. 2,2-dimethylpentane) -CHL CH2 CHL 31250 114.00 ! (ex. 2,4-dimethylpentane) -CHL CH2 CTL 31250 114.00 ! (ex. 2,2,4-trimethylpentane) -CH3 CHS CH3 31250 112.00 ! (ex. isobutane) -CH3 CHL CH3 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CH2 31250 112.00 ! (ex. 2-methylbutane) -CH3 CHL CH2 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CHS 31250 112.00 ! (2,3-dimethylbutane only) -CH3 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH3 CHS CTS 31250 112.00 ! (2,2,3-trimethylbutane only) -CH3 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CH2 CHL CH2 31250 112.00 ! (ex. 3-methylpentane) -CH2 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH2 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CHL CHL CHL 31250 112.00 ! (ex. 2,3,4-trimethylpentane) -CH3 CTS CH3 31250 109.47 ! (ex. 2,2-dimethylpropane) -CH3 CTL CH3 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CH2 31250 109.47 ! (ex. 2,2-dimethylbutane) -CH3 CTL CH2 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CHS 31250 109.47 ! (ex. 2,2,3-trimethylbutane) -CH3 CTL CHL 31250 109.47 ! (ex. 2,2,3-trimethylpentane) -CH2 CTL CH2 31250 109.47 ! (ex. 3,3-dimethylpentane) -CH3 CTT CTT 31250 111.00 ! (2,2,3,3-tetramethylbutane) -CH3 CTT CH3 31250 107.00 ! (2,2,3,3-tetramethylbutane) -CF3 CF2 CF3 31250 114.00 ! perfluorocarbons -CF2 CF2 CF3 31250 114.00 ! -CF2 CF2 CF2 31250 114.00 ! - - -DIHEDRALS -! -!V(dihedral) = Kchi(1 + cos(n(chi) - delta)) -! -!Kchi: kcal/mole -!n: multiplicity -!delta: degrees -! -! Kchi (kcal/mol) = Kchi (K) * Boltz. const. -! Boltzmann = 0.0019872041 kcal / (mol * K) -! -! TraPPE Inherits most of its dihedrals from OPLS UA -! X-CT-CH1-X fitted to QM data in this work -! -!atom types Kchi n delta description -X CH2 CH2 X 0.000000 0 0.0 ! OPLS (ex. n-butane) -X CH2 CH2 X 355.029964 1 0.0 ! "" -X CH2 CH2 X -68.189775 2 180.0 ! "" -X CH2 CH2 X 791.317812 3 0.0 ! "" -X CH2 CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2-methylbutane) -X CH2 CHS X 428.729993 1 0.0 ! "" -X CH2 CHS X -111.850111 2 180.0 ! "" -X CH2 CHS X 441.270224 3 0.0 ! "" -X CH2 CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CH2 CHL X 428.729993 1 0.0 ! "" -X CH2 CHL X -111.850111 2 180.0 ! "" -X CH2 CHL X 441.270224 3 0.0 ! "" -X CHS CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2,3-dimethylbutane) -X CHS CHS X 428.729993 1 0.0 ! "" -X CHS CHS X -111.850111 2 180.0 ! "" -X CHS CHS X 441.270224 3 0.0 ! "" -X CHL CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CHL CHL X 428.729993 1 0.0 ! "" -X CHL CHL X -111.850111 2 180.0 ! "" -X CHL CHL X 441.270224 3 0.0 ! "" -X CTS CH2 X 461.289809 3 0.0 ! OPLS -- short backbone (ex. 2,2-DMBut) -X CTL CH2 X 461.289809 3 0.0 ! (same as prev., but for long backbone) -X CTS CHS X 1369.00000 3 0.0 ! this work -- short backbone (ex. 2,2,3-TriMBut) -X CTL CHL X 1369.00000 3 0.0 ! this work -- long backbone (ex. 2,2,3-TriMPen) -X CTS CTS X 2950.910000 0 0.0 ! this work -- from QM -X CTS CTS X -2047.060000 3 0.0 ! (ex. 2,2,3,3-tetramethylbutane) -X CTS CTS X 529.250000 6 180.0 ! "" -X CTS CTS X 150.160000 12 0.0 ! "" -! perfluorocarbons: use wacky seven term torsion -X CF2 CF2 X -1577.68 0 0.0 ! Fit to MP2/6-31+g(d,p) data for perfluorobutane -X CF2 CF2 X 791.61 1 0.0 ! -X CF2 CF2 X 333.65 2 0.0 ! -X CF2 CF2 X 854.01 3 0.0 ! -X CF2 CF2 X 349.25 4 0.0 ! -X CF2 CF2 X 211.51 5 0.0 ! -X CF2 CF2 X 117.66 6 0.0 ! -X CF2 CF2 X -83.44 7 0.0 ! - - -NONBONDED_MIE -! -!V(mie) = 4*eps*((sig_ij/r_ij)^n-(sig_ij/r_ij)^6) -! -!atom eps sig_ij n description -CH4 161.00 3.740 14 ! Potoff, 2009 -CH3 121.25 3.783 16 ! Potoff, 2009 -CH2 61.00 3.990 16 ! Potoff, 2009 -CHS 15.00 4.700 16 ! alkanes w/ 4 or less carbons in backbone -CHL 14.00 4.700 16 ! alkanes w/ 5 or more carbons in backbone -CTS 1.45 6.100 16 ! alkanes w/ 4 or less carbons in backbone -CTL 1.20 6.200 16 ! alkanes w/ 5 or more carbons in backbone -CTT 1.45 6.100 16 ! 2,2,3,3-tetramethylbutane (same as CTS) -CF4 269.00 4.355 36 ! Potoff, 2009 -CF3 155.75 4.475 36 ! Potoff, 2009 -CF2 72.20 4.75 44 ! Potoff, 2009; modified for new torsion - diff --git a/example_file/methane_butane/setup_box_0.pdb b/example_file/methane_butane/setup_box_0.pdb deleted file mode 100644 index ad3731f45..000000000 --- a/example_file/methane_butane/setup_box_0.pdb +++ /dev/null @@ -1,372 +0,0 @@ -REMARK 25.000 25.000 25.000 STEP: 2000000 -ATOM 1 C1 C4A A 1 19.250 5.219 20.802 0.00 0.00 -ATOM 2 C2 C4A A 1 19.295 6.591 21.500 0.00 0.00 -ATOM 3 C3 C4A A 1 17.900 4.495 20.648 0.00 0.00 -ATOM 4 C4 C4A A 1 17.311 4.163 22.031 0.00 0.00 -ATOM 5 C1 C4A A 2 8.955 14.143 14.860 0.00 0.00 -ATOM 6 C2 C4A A 2 9.871 12.906 14.837 0.00 0.00 -ATOM 7 C3 C4A A 2 7.938 14.204 16.015 0.00 0.00 -ATOM 8 C4 C4A A 2 7.014 15.433 15.920 0.00 0.00 -ATOM 9 C1 C4A A 3 1.840 9.776 1.079 0.00 0.00 -ATOM 10 C2 C4A A 3 1.917 8.312 1.550 0.00 0.00 -ATOM 11 C3 C4A A 3 1.959 9.992 -0.441 0.00 0.00 -ATOM 12 C4 C4A A 3 1.742 11.468 -0.822 0.00 0.00 -ATOM 13 C1 C4A A 4 1.829 10.541 18.683 0.00 0.00 -ATOM 14 C2 C4A A 4 1.397 10.502 20.160 0.00 0.00 -ATOM 15 C3 C4A A 4 0.744 10.188 17.647 0.00 0.00 -ATOM 16 C4 C4A A 4 1.002 10.358 16.139 0.00 0.00 -ATOM 17 C1 C4A A 5 6.282 4.333 2.665 0.00 0.00 -ATOM 18 C2 C4A A 5 6.517 2.901 2.151 0.00 0.00 -ATOM 19 C3 C4A A 5 7.518 5.184 2.318 0.00 0.00 -ATOM 20 C4 C4A A 5 7.368 6.679 2.656 0.00 0.00 -ATOM 21 C1 C4A A 6 12.874 16.157 4.100 0.00 0.00 -ATOM 22 C2 C4A A 6 11.585 16.416 3.298 0.00 0.00 -ATOM 23 C3 C4A A 6 13.803 15.072 3.524 0.00 0.00 -ATOM 24 C4 C4A A 6 15.280 15.267 3.912 0.00 0.00 -ATOM 25 C1 C4A A 7 1.968 19.247 16.592 0.00 0.00 -ATOM 26 C2 C4A A 7 1.167 19.667 17.838 0.00 0.00 -ATOM 27 C3 C4A A 7 1.762 19.947 15.236 0.00 0.00 -ATOM 28 C4 C4A A 7 2.385 19.279 13.997 0.00 0.00 -ATOM 29 C1 C4A A 8 23.469 0.446 11.320 0.00 0.00 -ATOM 30 C2 C4A A 8 24.275 -0.044 12.538 0.00 0.00 -ATOM 31 C3 C4A A 8 23.774 1.834 10.726 0.00 0.00 -ATOM 32 C4 C4A A 8 22.704 2.352 9.747 0.00 0.00 -ATOM 33 C1 C4A A 9 2.924 9.180 12.683 0.00 0.00 -ATOM 34 C2 C4A A 9 4.210 8.647 13.341 0.00 0.00 -ATOM 35 C3 C4A A 9 3.008 9.270 11.148 0.00 0.00 -ATOM 36 C4 C4A A 9 1.870 10.121 10.553 0.00 0.00 -ATOM 37 C1 C4A A 10 15.220 7.850 0.082 0.00 0.00 -ATOM 38 C2 C4A A 10 16.738 7.790 -0.170 0.00 0.00 -ATOM 39 C3 C4A A 10 14.685 7.714 1.520 0.00 0.00 -ATOM 40 C4 C4A A 10 13.155 7.592 1.643 0.00 0.00 -ATOM 41 C1 C4A A 11 21.300 9.475 19.139 0.00 0.00 -ATOM 42 C2 C4A A 11 22.431 8.851 19.978 0.00 0.00 -ATOM 43 C3 C4A A 11 21.146 11.005 19.232 0.00 0.00 -ATOM 44 C4 C4A A 11 20.043 11.659 18.380 0.00 0.00 -ATOM 45 C1 C4A A 12 1.421 24.225 17.229 0.00 0.00 -ATOM 46 C2 C4A A 12 0.392 23.574 16.286 0.00 0.00 -ATOM 47 C3 C4A A 12 1.537 23.375 18.508 0.00 0.00 -ATOM 48 C4 C4A A 12 2.607 23.898 19.484 0.00 0.00 -ATOM 49 C1 C4A A 13 16.273 6.731 13.921 0.00 0.00 -ATOM 50 C2 C4A A 13 16.469 8.147 14.494 0.00 0.00 -ATOM 51 C3 C4A A 13 17.462 6.431 12.990 0.00 0.00 -ATOM 52 C4 C4A A 13 17.370 5.000 12.428 0.00 0.00 -ATOM 53 C1 C4A A 14 13.991 11.085 7.730 0.00 0.00 -ATOM 54 C2 C4A A 14 14.611 10.391 6.503 0.00 0.00 -ATOM 55 C3 C4A A 14 12.787 11.965 7.344 0.00 0.00 -ATOM 56 C4 C4A A 14 11.521 11.203 6.912 0.00 0.00 -ATOM 57 C1 C4A A 15 7.354 4.902 16.217 0.00 0.00 -ATOM 58 C2 C4A A 15 8.463 4.517 15.221 0.00 0.00 -ATOM 59 C3 C4A A 15 6.548 6.190 15.964 0.00 0.00 -ATOM 60 C4 C4A A 15 5.766 6.590 17.229 0.00 0.00 -ATOM 61 C1 C4A A 16 17.952 12.403 1.629 0.00 0.00 -ATOM 62 C2 C4A A 16 17.466 11.277 0.697 0.00 0.00 -ATOM 63 C3 C4A A 16 17.439 12.056 3.039 0.00 0.00 -ATOM 64 C4 C4A A 16 18.063 12.992 4.091 0.00 0.00 -ATOM 65 C1 C4A A 17 7.471 24.556 5.377 0.00 0.00 -ATOM 66 C2 C4A A 17 6.234 25.414 5.702 0.00 0.00 -ATOM 67 C3 C4A A 17 7.227 23.076 5.725 0.00 0.00 -ATOM 68 C4 C4A A 17 8.507 22.357 6.189 0.00 0.00 -ATOM 69 C1 C4A A 18 11.468 8.900 22.159 0.00 0.00 -ATOM 70 C2 C4A A 18 12.642 7.960 21.828 0.00 0.00 -ATOM 71 C3 C4A A 18 11.754 10.369 22.524 0.00 0.00 -ATOM 72 C4 C4A A 18 10.478 11.230 22.515 0.00 0.00 -ATOM 73 C1 C4A A 19 21.405 21.784 17.826 0.00 0.00 -ATOM 74 C2 C4A A 19 22.829 21.483 18.328 0.00 0.00 -ATOM 75 C3 C4A A 19 21.060 23.186 18.363 0.00 0.00 -ATOM 76 C4 C4A A 19 19.643 23.672 18.005 0.00 0.00 -ATOM 77 C1 C4A A 20 15.062 18.943 9.949 0.00 0.00 -ATOM 78 C2 C4A A 20 14.098 19.045 11.146 0.00 0.00 -ATOM 79 C3 C4A A 20 15.928 17.681 10.119 0.00 0.00 -ATOM 80 C4 C4A A 20 16.857 17.451 8.912 0.00 0.00 -ATOM 81 C1 C4A A 21 19.785 11.679 13.029 0.00 0.00 -ATOM 82 C2 C4A A 21 19.027 11.077 14.227 0.00 0.00 -ATOM 83 C3 C4A A 21 18.826 12.246 11.965 0.00 0.00 -ATOM 84 C4 C4A A 21 17.865 11.169 11.427 0.00 0.00 -ATOM 85 C1 C4A A 22 22.404 20.323 12.945 0.00 0.00 -ATOM 86 C2 C4A A 22 23.146 21.304 13.871 0.00 0.00 -ATOM 87 C3 C4A A 22 21.011 19.994 13.513 0.00 0.00 -ATOM 88 C4 C4A A 22 21.035 19.325 14.900 0.00 0.00 -ATOM 89 C1 C4A A 23 14.710 13.494 11.479 0.00 0.00 -ATOM 90 C2 C4A A 23 14.008 14.094 10.247 0.00 0.00 -ATOM 91 C3 C4A A 23 13.723 12.921 12.513 0.00 0.00 -ATOM 92 C4 C4A A 23 14.436 12.249 13.701 0.00 0.00 -ATOM 93 C1 C4A A 24 15.434 1.058 4.198 0.00 0.00 -ATOM 94 C2 C4A A 24 15.293 -0.325 4.861 0.00 0.00 -ATOM 95 C3 C4A A 24 15.108 0.977 2.695 0.00 0.00 -ATOM 96 C4 C4A A 24 16.149 0.187 1.881 0.00 0.00 -ATOM 97 C1 C4A A 25 1.864 9.566 4.982 0.00 0.00 -ATOM 98 C2 C4A A 25 0.653 9.325 5.902 0.00 0.00 -ATOM 99 C3 C4A A 25 2.987 10.354 5.681 0.00 0.00 -ATOM 100 C4 C4A A 25 2.685 11.786 6.161 0.00 0.00 -ATOM 101 C1 C4A A 26 21.672 4.124 25.119 0.00 0.00 -ATOM 102 C2 C4A A 26 21.764 5.303 26.105 0.00 0.00 -ATOM 103 C3 C4A A 26 20.310 3.535 24.709 0.00 0.00 -ATOM 104 C4 C4A A 26 20.431 2.225 23.908 0.00 0.00 -ATOM 105 C1 C4A A 27 24.687 5.555 5.883 0.00 0.00 -ATOM 106 C2 C4A A 27 23.876 5.545 4.575 0.00 0.00 -ATOM 107 C3 C4A A 27 24.449 4.298 6.740 0.00 0.00 -ATOM 108 C4 C4A A 27 24.695 2.941 6.053 0.00 0.00 -ATOM 109 C1 C4A A 28 17.964 14.077 20.959 0.00 0.00 -ATOM 110 C2 C4A A 28 19.015 14.892 21.735 0.00 0.00 -ATOM 111 C3 C4A A 28 17.157 13.207 21.940 0.00 0.00 -ATOM 112 C4 C4A A 28 16.047 12.438 21.199 0.00 0.00 -ATOM 113 C1 C4A A 29 20.484 5.361 7.419 0.00 0.00 -ATOM 114 C2 C4A A 29 19.649 4.398 6.555 0.00 0.00 -ATOM 115 C3 C4A A 29 19.731 5.614 8.738 0.00 0.00 -ATOM 116 C4 C4A A 29 20.448 6.739 9.510 0.00 0.00 -ATOM 117 C1 C4A A 30 9.192 9.943 1.216 0.00 0.00 -ATOM 118 C2 C4A A 30 10.616 10.514 1.345 0.00 0.00 -ATOM 119 C3 C4A A 30 8.013 10.917 1.029 0.00 0.00 -ATOM 120 C4 C4A A 30 6.600 10.325 0.874 0.00 0.00 -ATOM 121 C1 C4A A 31 1.237 4.621 10.429 0.00 0.00 -ATOM 122 C2 C4A A 31 0.628 5.499 11.538 0.00 0.00 -ATOM 123 C3 C4A A 31 2.607 3.979 10.718 0.00 0.00 -ATOM 124 C4 C4A A 31 3.258 3.052 9.674 0.00 0.00 -ATOM 125 C1 C4A A 32 18.099 24.560 10.963 0.00 0.00 -ATOM 126 C2 C4A A 32 16.862 25.276 11.536 0.00 0.00 -ATOM 127 C3 C4A A 32 19.122 24.085 12.012 0.00 0.00 -ATOM 128 C4 C4A A 32 19.692 25.161 12.954 0.00 0.00 -ATOM 129 C1 C4A A 33 18.707 17.867 1.235 0.00 0.00 -ATOM 130 C2 C4A A 33 17.170 17.801 1.168 0.00 0.00 -ATOM 131 C3 C4A A 33 19.388 17.427 -0.075 0.00 0.00 -ATOM 132 C4 C4A A 33 20.923 17.304 -0.038 0.00 0.00 -ATOM 133 C1 C4A A 34 23.073 13.256 4.702 0.00 0.00 -ATOM 134 C2 C4A A 34 24.513 13.086 4.185 0.00 0.00 -ATOM 135 C3 C4A A 34 22.977 13.932 6.083 0.00 0.00 -ATOM 136 C4 C4A A 34 23.664 13.177 7.236 0.00 0.00 -ATOM 137 C1 C4A A 35 21.516 0.634 3.466 0.00 0.00 -ATOM 138 C2 C4A A 35 22.932 1.175 3.194 0.00 0.00 -ATOM 139 C3 C4A A 35 20.887 1.146 4.776 0.00 0.00 -ATOM 140 C4 C4A A 35 19.432 0.644 4.809 0.00 0.00 -ATOM 141 C1 C4A A 36 18.081 15.994 14.016 0.00 0.00 -ATOM 142 C2 C4A A 36 18.402 16.498 12.596 0.00 0.00 -ATOM 143 C3 C4A A 36 19.277 15.778 14.962 0.00 0.00 -ATOM 144 C4 C4A A 36 18.958 15.338 16.403 0.00 0.00 -ATOM 145 C1 C4A A 37 17.698 20.497 4.366 0.00 0.00 -ATOM 146 C2 C4A A 37 16.191 20.482 4.048 0.00 0.00 -ATOM 147 C3 C4A A 37 18.566 21.432 3.504 0.00 0.00 -ATOM 148 C4 C4A A 37 20.053 21.567 3.879 0.00 0.00 -ATOM 149 C1 C4A A 38 11.151 7.134 6.241 0.00 0.00 -ATOM 150 C2 C4A A 38 10.384 7.895 5.143 0.00 0.00 -ATOM 151 C3 C4A A 38 10.639 7.395 7.669 0.00 0.00 -ATOM 152 C4 C4A A 38 11.393 6.715 8.827 0.00 0.00 -ATOM 153 C1 C4A A 39 21.883 21.911 23.059 0.00 0.00 -ATOM 154 C2 C4A A 39 21.915 20.458 22.549 0.00 0.00 -ATOM 155 C3 C4A A 39 20.913 22.255 24.205 0.00 0.00 -ATOM 156 C4 C4A A 39 21.214 23.657 24.766 0.00 0.00 -ATOM 157 C1 C4A A 40 22.780 2.842 17.930 0.00 0.00 -ATOM 158 C2 C4A A 40 23.557 3.164 16.640 0.00 0.00 -ATOM 159 C3 C4A A 40 23.614 2.036 18.943 0.00 0.00 -ATOM 160 C4 C4A A 40 22.720 1.423 20.038 0.00 0.00 -ATOM 161 C1 C4A A 41 22.383 6.391 13.489 0.00 0.00 -ATOM 162 C2 C4A A 41 21.035 5.670 13.308 0.00 0.00 -ATOM 163 C3 C4A A 41 22.325 7.663 14.355 0.00 0.00 -ATOM 164 C4 C4A A 41 23.573 8.563 14.283 0.00 0.00 -ATOM 165 C1 C4A A 42 7.396 24.231 21.425 0.00 0.00 -ATOM 166 C2 C4A A 42 6.102 24.331 20.596 0.00 0.00 -ATOM 167 C3 C4A A 42 7.508 25.172 22.639 0.00 0.00 -ATOM 168 C4 C4A A 42 8.868 25.069 23.355 0.00 0.00 -ATOM 169 C1 C4A A 43 6.784 7.798 22.745 0.00 0.00 -ATOM 170 C2 C4A A 43 7.336 6.816 23.795 0.00 0.00 -ATOM 171 C3 C4A A 43 5.255 7.927 22.873 0.00 0.00 -ATOM 172 C4 C4A A 43 4.494 8.429 21.631 0.00 0.00 -ATOM 173 C1 C4A A 44 18.068 21.332 8.078 0.00 0.00 -ATOM 174 C2 C4A A 44 16.744 22.118 8.053 0.00 0.00 -ATOM 175 C3 C4A A 44 18.543 20.999 9.505 0.00 0.00 -ATOM 176 C4 C4A A 44 19.789 20.095 9.501 0.00 0.00 -ATOM 177 C1 C4A A 45 1.282 23.537 24.363 0.00 0.00 -ATOM 178 C2 C4A A 45 0.112 24.030 25.235 0.00 0.00 -ATOM 179 C3 C4A A 45 2.630 24.220 24.661 0.00 0.00 -ATOM 180 C4 C4A A 45 3.559 23.917 23.471 0.00 0.00 -ATOM 181 C1 C4A A 46 5.396 24.193 11.699 0.00 0.00 -ATOM 182 C2 C4A A 46 6.403 23.208 11.076 0.00 0.00 -ATOM 183 C3 C4A A 46 4.119 23.469 12.163 0.00 0.00 -ATOM 184 C4 C4A A 46 3.231 22.960 11.012 0.00 0.00 -ATOM 185 C1 C4A A 47 21.176 9.820 7.327 0.00 0.00 -ATOM 186 C2 C4A A 47 22.495 9.181 7.800 0.00 0.00 -ATOM 187 C3 C4A A 47 20.506 10.855 8.249 0.00 0.00 -ATOM 188 C4 C4A A 47 19.350 11.583 7.537 0.00 0.00 -ATOM 189 C1 C4A A 48 13.009 1.026 15.974 0.00 0.00 -ATOM 190 C2 C4A A 48 13.535 1.071 14.528 0.00 0.00 -ATOM 191 C3 C4A A 48 11.519 0.700 16.187 0.00 0.00 -ATOM 192 C4 C4A A 48 10.662 1.498 15.186 0.00 0.00 -ATOM 193 C1 C4A A 49 3.859 15.607 1.616 0.00 0.00 -ATOM 194 C2 C4A A 49 3.675 14.317 0.795 0.00 0.00 -ATOM 195 C3 C4A A 49 4.037 15.477 3.140 0.00 0.00 -ATOM 196 C4 C4A A 49 2.692 14.913 3.632 0.00 0.00 -ATOM 197 C1 C4A A 50 8.531 19.113 12.784 0.00 0.00 -ATOM 198 C2 C4A A 50 8.548 20.314 11.821 0.00 0.00 -ATOM 199 C3 C4A A 50 7.168 18.589 13.274 0.00 0.00 -ATOM 200 C4 C4A A 50 6.463 19.384 14.389 0.00 0.00 -ATOM 201 C1 C4A A 51 23.080 12.930 23.431 0.00 0.00 -ATOM 202 C2 C4A A 51 22.944 12.958 24.965 0.00 0.00 -ATOM 203 C3 C4A A 51 22.302 11.774 22.776 0.00 0.00 -ATOM 204 C4 C4A A 51 20.806 11.665 23.127 0.00 0.00 -ATOM 205 C1 C4A A 52 0.823 16.985 21.761 0.00 0.00 -ATOM 206 C2 C4A A 52 1.628 15.672 21.745 0.00 0.00 -ATOM 207 C3 C4A A 52 1.316 18.047 22.760 0.00 0.00 -ATOM 208 C4 C4A A 52 0.609 19.414 22.704 0.00 0.00 -ATOM 209 C1 C4A A 53 17.558 18.955 19.494 0.00 0.00 -ATOM 210 C2 C4A A 53 18.013 18.587 18.069 0.00 0.00 -ATOM 211 C3 C4A A 53 18.210 20.225 20.071 0.00 0.00 -ATOM 212 C4 C4A A 53 17.852 20.596 21.522 0.00 0.00 -ATOM 213 C1 C4A A 54 12.986 16.769 19.852 0.00 0.00 -ATOM 214 C2 C4A A 54 14.192 17.137 20.736 0.00 0.00 -ATOM 215 C3 C4A A 54 12.331 15.437 20.261 0.00 0.00 -ATOM 216 C4 C4A A 54 11.002 15.292 19.496 0.00 0.00 -ATOM 217 C1 C4A A 55 13.880 9.468 17.916 0.00 0.00 -ATOM 218 C2 C4A A 55 14.696 8.621 18.909 0.00 0.00 -ATOM 219 C3 C4A A 55 13.417 10.860 18.385 0.00 0.00 -ATOM 220 C4 C4A A 55 12.593 11.714 17.404 0.00 0.00 -ATOM 221 C1 C4A A 56 24.380 20.540 9.000 0.00 0.00 -ATOM 222 C2 C4A A 56 25.691 20.014 9.614 0.00 0.00 -ATOM 223 C3 C4A A 56 24.375 22.016 8.562 0.00 0.00 -ATOM 224 C4 C4A A 56 22.967 22.598 8.339 0.00 0.00 -ATOM 225 C1 C4A A 57 2.396 20.062 5.442 0.00 0.00 -ATOM 226 C2 C4A A 57 2.027 18.879 6.357 0.00 0.00 -ATOM 227 C3 C4A A 57 3.147 21.229 6.108 0.00 0.00 -ATOM 228 C4 C4A A 57 3.506 22.346 5.111 0.00 0.00 -ATOM 229 C1 C4A A 58 6.632 11.292 5.298 0.00 0.00 -ATOM 230 C2 C4A A 58 7.200 9.899 4.966 0.00 0.00 -ATOM 231 C3 C4A A 58 7.693 12.388 5.087 0.00 0.00 -ATOM 232 C4 C4A A 58 7.329 13.861 5.345 0.00 0.00 -ATOM 233 C1 C4A A 59 5.955 21.413 -0.258 0.00 0.00 -ATOM 234 C2 C4A A 59 7.423 21.538 -0.706 0.00 0.00 -ATOM 235 C3 C4A A 59 5.609 20.483 0.919 0.00 0.00 -ATOM 236 C4 C4A A 59 4.178 19.916 0.955 0.00 0.00 -ATOM 237 C1 C4A A 60 11.456 20.398 16.545 0.00 0.00 -ATOM 238 C2 C4A A 60 10.572 21.356 15.725 0.00 0.00 -ATOM 239 C3 C4A A 60 12.945 20.767 16.405 0.00 0.00 -ATOM 240 C4 C4A A 60 13.746 19.814 17.311 0.00 0.00 -ATOM 241 C1 C4A A 61 10.640 1.401 4.306 0.00 0.00 -ATOM 242 C2 C4A A 61 11.126 2.857 4.175 0.00 0.00 -ATOM 243 C3 C4A A 61 11.408 0.628 5.394 0.00 0.00 -ATOM 244 C4 C4A A 61 10.892 0.911 6.817 0.00 0.00 -ATOM 245 C1 C4A A 62 9.096 15.789 10.695 0.00 0.00 -ATOM 246 C2 C4A A 62 7.904 14.871 11.026 0.00 0.00 -ATOM 247 C3 C4A A 62 9.808 15.589 9.345 0.00 0.00 -ATOM 248 C4 C4A A 62 11.098 16.406 9.146 0.00 0.00 -ATOM 249 C1 C4A A 63 8.155 5.967 10.983 0.00 0.00 -ATOM 250 C2 C4A A 63 9.128 4.955 11.617 0.00 0.00 -ATOM 251 C3 C4A A 63 6.912 6.315 11.822 0.00 0.00 -ATOM 252 C4 C4A A 63 6.018 5.081 12.052 0.00 0.00 -ATOM 253 C1 C4A A 64 5.881 19.127 8.815 0.00 0.00 -ATOM 254 C2 C4A A 64 7.350 19.272 8.378 0.00 0.00 -ATOM 255 C3 C4A A 64 5.679 17.849 9.651 0.00 0.00 -ATOM 256 C4 C4A A 64 4.212 17.600 10.049 0.00 0.00 -ATOM 257 C1 C4A A 65 1.383 5.089 21.124 0.00 0.00 -ATOM 258 C2 C4A A 65 0.521 4.784 22.363 0.00 0.00 -ATOM 259 C3 C4A A 65 0.916 6.295 20.287 0.00 0.00 -ATOM 260 C4 C4A A 65 1.974 6.691 19.240 0.00 0.00 -ATOM 261 C1 C4A A 66 23.982 19.229 1.268 0.00 0.00 -ATOM 262 C2 C4A A 66 24.074 20.414 2.248 0.00 0.00 -ATOM 263 C3 C4A A 66 24.690 17.925 1.678 0.00 0.00 -ATOM 264 C4 C4A A 66 24.011 16.923 2.630 0.00 0.00 -ATOM 265 C1 C4A A 67 17.603 6.416 3.521 0.00 0.00 -ATOM 266 C2 C4A A 67 16.890 7.341 4.525 0.00 0.00 -ATOM 267 C3 C4A A 67 17.182 4.943 3.677 0.00 0.00 -ATOM 268 C4 C4A A 67 17.819 3.976 2.661 0.00 0.00 -ATOM 269 C1 C4A A 68 8.405 11.238 10.144 0.00 0.00 -ATOM 270 C2 C4A A 68 9.918 11.397 10.380 0.00 0.00 -ATOM 271 C3 C4A A 68 8.055 9.981 9.327 0.00 0.00 -ATOM 272 C4 C4A A 68 6.536 9.837 9.117 0.00 0.00 -ATOM 273 C1 C4A A 69 9.317 14.873 0.070 0.00 0.00 -ATOM 274 C2 C4A A 69 10.102 15.102 -1.235 0.00 0.00 -ATOM 275 C3 C4A A 69 8.646 16.190 0.504 0.00 0.00 -ATOM 276 C4 C4A A 69 8.155 16.035 1.955 0.00 0.00 -ATOM 277 C1 C4A A 70 22.168 15.134 10.432 0.00 0.00 -ATOM 278 C2 C4A A 70 20.853 15.397 9.674 0.00 0.00 -ATOM 279 C3 C4A A 70 23.279 16.094 9.969 0.00 0.00 -ATOM 280 C4 C4A A 70 24.617 16.050 10.731 0.00 0.00 -ATOM 281 C1 C4A A 71 21.920 17.523 5.751 0.00 0.00 -ATOM 282 C2 C4A A 71 22.741 18.814 5.583 0.00 0.00 -ATOM 283 C3 C4A A 71 20.702 17.422 4.814 0.00 0.00 -ATOM 284 C4 C4A A 71 19.626 16.363 5.114 0.00 0.00 -ATOM 285 C1 C4A A 72 6.176 23.570 16.781 0.00 0.00 -ATOM 286 C2 C4A A 72 6.845 22.428 17.569 0.00 0.00 -ATOM 287 C3 C4A A 72 6.954 24.818 16.324 0.00 0.00 -ATOM 288 C4 C4A A 72 6.125 25.885 15.584 0.00 0.00 -ATOM 289 C1 C4A A 73 12.935 21.753 8.664 0.00 0.00 -ATOM 290 C2 C4A A 73 12.779 22.747 9.830 0.00 0.00 -ATOM 291 C3 C4A A 73 12.180 22.101 7.367 0.00 0.00 -ATOM 292 C4 C4A A 73 12.379 21.143 6.178 0.00 0.00 -ATOM 293 C1 C4A A 74 10.887 4.967 19.011 0.00 0.00 -ATOM 294 C2 C4A A 74 10.967 3.432 18.921 0.00 0.00 -ATOM 295 C3 C4A A 74 9.485 5.497 19.363 0.00 0.00 -ATOM 296 C4 C4A A 74 9.401 7.034 19.384 0.00 0.00 -ATOM 297 C1 C4A A 75 5.720 5.293 6.187 0.00 0.00 -ATOM 298 C2 C4A A 75 4.937 6.601 5.966 0.00 0.00 -ATOM 299 C3 C4A A 75 6.842 5.459 7.228 0.00 0.00 -ATOM 300 C4 C4A A 75 7.982 4.437 7.063 0.00 0.00 -ATOM 301 C1 C4A A 76 14.245 15.674 15.450 0.00 0.00 -ATOM 302 C2 C4A A 76 14.983 15.495 16.790 0.00 0.00 -ATOM 303 C3 C4A A 76 12.798 16.201 15.443 0.00 0.00 -ATOM 304 C4 C4A A 76 12.244 16.875 14.173 0.00 0.00 -ATOM 305 C1 C4A A 77 4.955 3.040 18.942 0.00 0.00 -ATOM 306 C2 C4A A 77 3.764 2.232 18.394 0.00 0.00 -ATOM 307 C3 C4A A 77 4.895 3.202 20.472 0.00 0.00 -ATOM 308 C4 C4A A 77 6.136 4.003 20.909 0.00 0.00 -ATOM 309 C1 C4A A 78 10.777 21.669 2.584 0.00 0.00 -ATOM 310 C2 C4A A 78 10.450 20.250 2.081 0.00 0.00 -ATOM 311 C3 C4A A 78 11.486 22.741 1.735 0.00 0.00 -ATOM 312 C4 C4A A 78 13.011 22.544 1.661 0.00 0.00 -ATOM 313 C1 C4A A 79 2.775 3.745 14.621 0.00 0.00 -ATOM 314 C2 C4A A 79 2.118 4.922 15.367 0.00 0.00 -ATOM 315 C3 C4A A 79 2.130 2.351 14.734 0.00 0.00 -ATOM 316 C4 C4A A 79 2.610 1.368 13.650 0.00 0.00 -ATOM 317 C1 C4A A 80 10.832 8.756 14.281 0.00 0.00 -ATOM 318 C2 C4A A 80 10.524 8.906 15.782 0.00 0.00 -ATOM 319 C3 C4A A 80 12.156 8.015 14.013 0.00 0.00 -ATOM 320 C4 C4A A 80 12.377 7.822 12.502 0.00 0.00 -ATOM 321 C1 C4A A 81 16.377 25.084 20.799 0.00 0.00 -ATOM 322 C2 C4A A 81 17.875 25.222 21.132 0.00 0.00 -ATOM 323 C3 C4A A 81 15.805 23.711 20.399 0.00 0.00 -ATOM 324 C4 C4A A 81 14.803 23.766 19.231 0.00 0.00 -ATOM 325 C1 C4A A 82 17.307 3.036 16.108 0.00 0.00 -ATOM 326 C2 C4A A 82 18.689 2.366 16.233 0.00 0.00 -ATOM 327 C3 C4A A 82 16.923 3.973 17.268 0.00 0.00 -ATOM 328 C4 C4A A 82 15.425 4.328 17.273 0.00 0.00 -ATOM 329 C1 C4A A 83 22.474 16.480 19.635 0.00 0.00 -ATOM 330 C2 C4A A 83 21.136 17.233 19.750 0.00 0.00 -ATOM 331 C3 C4A A 83 22.472 15.424 18.514 0.00 0.00 -ATOM 332 C4 C4A A 83 23.883 14.809 18.474 0.00 0.00 -ATOM 333 C1 C4A A 84 10.896 4.240 24.148 0.00 0.00 -ATOM 334 C2 C4A A 84 10.019 3.982 22.908 0.00 0.00 -ATOM 335 C3 C4A A 84 12.409 4.179 23.869 0.00 0.00 -ATOM 336 C4 C4A A 84 13.172 3.982 25.193 0.00 0.00 -ATOM 337 C1 C4A A 85 5.485 12.728 19.963 0.00 0.00 -ATOM 338 C2 C4A A 85 5.218 12.039 21.313 0.00 0.00 -ATOM 339 C3 C4A A 85 6.418 13.954 19.973 0.00 0.00 -ATOM 340 C4 C4A A 85 7.732 13.565 20.676 0.00 0.00 -ATOM 341 C1 C4A A 86 2.946 15.019 17.457 0.00 0.00 -ATOM 342 C2 C4A A 86 3.739 16.202 18.041 0.00 0.00 -ATOM 343 C3 C4A A 86 1.836 15.267 16.418 0.00 0.00 -ATOM 344 C4 C4A A 86 2.340 15.483 14.979 0.00 0.00 -ATOM 345 C1 C4A A 87 6.399 19.214 20.032 0.00 0.00 -ATOM 346 C2 C4A A 87 5.119 20.066 20.104 0.00 0.00 -ATOM 347 C3 C4A A 87 7.094 19.031 21.394 0.00 0.00 -ATOM 348 C4 C4A A 87 8.406 18.249 21.198 0.00 0.00 -ATOM 349 C1 C4A A 88 16.838 22.671 14.418 0.00 0.00 -ATOM 350 C2 C4A A 88 16.641 23.754 15.496 0.00 0.00 -ATOM 351 C3 C4A A 88 17.087 21.378 15.216 0.00 0.00 -ATOM 352 C4 C4A A 88 17.204 20.072 14.409 0.00 0.00 -ATOM 353 C1 C4A A 89 11.041 20.604 22.064 0.00 0.00 -ATOM 354 C2 C4A A 89 12.565 20.387 22.094 0.00 0.00 -ATOM 355 C3 C4A A 89 10.819 22.114 21.860 0.00 0.00 -ATOM 356 C4 C4A A 89 11.661 22.818 20.780 0.00 0.00 -ATOM 357 C1 C4A A 90 1.915 3.043 2.798 0.00 0.00 -ATOM 358 C2 C4A A 90 2.244 4.512 3.121 0.00 0.00 -ATOM 359 C3 C4A A 90 2.683 2.166 3.805 0.00 0.00 -ATOM 360 C4 C4A A 90 2.307 0.673 3.831 0.00 0.00 -ATOM 361 C1 C1A B 1 14.152 13.247 0.006 0.00 0.00 -ATOM 362 C1 C1A B 2 15.353 6.782 9.635 0.00 0.00 -ATOM 363 C1 C1A B 3 4.521 13.443 10.051 0.00 0.00 -ATOM 364 C1 C1A B 4 1.775 0.007 7.771 0.00 0.00 -ATOM 365 C1 C1A B 5 24.724 23.099 4.902 0.00 0.00 -ATOM 366 C1 C1A B 6 16.166 21.644 24.594 0.00 0.00 -ATOM 367 C1 C1A B 7 22.864 8.674 2.739 0.00 0.00 -ATOM 368 C1 C1A B 8 22.892 15.995 14.187 0.00 0.00 -ATOM 369 C1 C1A B 9 9.687 24.822 10.024 0.00 0.00 -ATOM 370 C1 C1A B 10 3.748 3.433 24.333 0.00 0.00 -END diff --git a/example_file/methane_butane/setup_box_0.psf b/example_file/methane_butane/setup_box_0.psf deleted file mode 100644 index f74ec7598..000000000 --- a/example_file/methane_butane/setup_box_0.psf +++ /dev/null @@ -1,621 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology ./top_mie.inp - REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } - REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } - - 370 !NATOM - 1 C4A 1 C4A C1 CH2 0.000000 14.0270 0 - 2 C4A 1 C4A C2 CH3 0.000000 15.0350 0 - 3 C4A 1 C4A C3 CH2 0.000000 14.0270 0 - 4 C4A 1 C4A C4 CH3 0.000000 15.0350 0 - 5 C4A 2 C4A C1 CH2 0.000000 14.0270 0 - 6 C4A 2 C4A C2 CH3 0.000000 15.0350 0 - 7 C4A 2 C4A C3 CH2 0.000000 14.0270 0 - 8 C4A 2 C4A C4 CH3 0.000000 15.0350 0 - 9 C4A 3 C4A C1 CH2 0.000000 14.0270 0 - 10 C4A 3 C4A C2 CH3 0.000000 15.0350 0 - 11 C4A 3 C4A C3 CH2 0.000000 14.0270 0 - 12 C4A 3 C4A C4 CH3 0.000000 15.0350 0 - 13 C4A 4 C4A C1 CH2 0.000000 14.0270 0 - 14 C4A 4 C4A C2 CH3 0.000000 15.0350 0 - 15 C4A 4 C4A C3 CH2 0.000000 14.0270 0 - 16 C4A 4 C4A C4 CH3 0.000000 15.0350 0 - 17 C4A 5 C4A C1 CH2 0.000000 14.0270 0 - 18 C4A 5 C4A C2 CH3 0.000000 15.0350 0 - 19 C4A 5 C4A C3 CH2 0.000000 14.0270 0 - 20 C4A 5 C4A C4 CH3 0.000000 15.0350 0 - 21 C4A 6 C4A C1 CH2 0.000000 14.0270 0 - 22 C4A 6 C4A C2 CH3 0.000000 15.0350 0 - 23 C4A 6 C4A C3 CH2 0.000000 14.0270 0 - 24 C4A 6 C4A C4 CH3 0.000000 15.0350 0 - 25 C4A 7 C4A C1 CH2 0.000000 14.0270 0 - 26 C4A 7 C4A C2 CH3 0.000000 15.0350 0 - 27 C4A 7 C4A C3 CH2 0.000000 14.0270 0 - 28 C4A 7 C4A C4 CH3 0.000000 15.0350 0 - 29 C4A 8 C4A C1 CH2 0.000000 14.0270 0 - 30 C4A 8 C4A C2 CH3 0.000000 15.0350 0 - 31 C4A 8 C4A C3 CH2 0.000000 14.0270 0 - 32 C4A 8 C4A C4 CH3 0.000000 15.0350 0 - 33 C4A 9 C4A C1 CH2 0.000000 14.0270 0 - 34 C4A 9 C4A C2 CH3 0.000000 15.0350 0 - 35 C4A 9 C4A C3 CH2 0.000000 14.0270 0 - 36 C4A 9 C4A C4 CH3 0.000000 15.0350 0 - 37 C4A 10 C4A C1 CH2 0.000000 14.0270 0 - 38 C4A 10 C4A C2 CH3 0.000000 15.0350 0 - 39 C4A 10 C4A C3 CH2 0.000000 14.0270 0 - 40 C4A 10 C4A C4 CH3 0.000000 15.0350 0 - 41 C4A 11 C4A C1 CH2 0.000000 14.0270 0 - 42 C4A 11 C4A C2 CH3 0.000000 15.0350 0 - 43 C4A 11 C4A C3 CH2 0.000000 14.0270 0 - 44 C4A 11 C4A C4 CH3 0.000000 15.0350 0 - 45 C4A 12 C4A C1 CH2 0.000000 14.0270 0 - 46 C4A 12 C4A C2 CH3 0.000000 15.0350 0 - 47 C4A 12 C4A C3 CH2 0.000000 14.0270 0 - 48 C4A 12 C4A C4 CH3 0.000000 15.0350 0 - 49 C4A 13 C4A C1 CH2 0.000000 14.0270 0 - 50 C4A 13 C4A C2 CH3 0.000000 15.0350 0 - 51 C4A 13 C4A C3 CH2 0.000000 14.0270 0 - 52 C4A 13 C4A C4 CH3 0.000000 15.0350 0 - 53 C4A 14 C4A C1 CH2 0.000000 14.0270 0 - 54 C4A 14 C4A C2 CH3 0.000000 15.0350 0 - 55 C4A 14 C4A C3 CH2 0.000000 14.0270 0 - 56 C4A 14 C4A C4 CH3 0.000000 15.0350 0 - 57 C4A 15 C4A C1 CH2 0.000000 14.0270 0 - 58 C4A 15 C4A C2 CH3 0.000000 15.0350 0 - 59 C4A 15 C4A C3 CH2 0.000000 14.0270 0 - 60 C4A 15 C4A C4 CH3 0.000000 15.0350 0 - 61 C4A 16 C4A C1 CH2 0.000000 14.0270 0 - 62 C4A 16 C4A C2 CH3 0.000000 15.0350 0 - 63 C4A 16 C4A C3 CH2 0.000000 14.0270 0 - 64 C4A 16 C4A C4 CH3 0.000000 15.0350 0 - 65 C4A 17 C4A C1 CH2 0.000000 14.0270 0 - 66 C4A 17 C4A C2 CH3 0.000000 15.0350 0 - 67 C4A 17 C4A C3 CH2 0.000000 14.0270 0 - 68 C4A 17 C4A C4 CH3 0.000000 15.0350 0 - 69 C4A 18 C4A C1 CH2 0.000000 14.0270 0 - 70 C4A 18 C4A C2 CH3 0.000000 15.0350 0 - 71 C4A 18 C4A C3 CH2 0.000000 14.0270 0 - 72 C4A 18 C4A C4 CH3 0.000000 15.0350 0 - 73 C4A 19 C4A C1 CH2 0.000000 14.0270 0 - 74 C4A 19 C4A C2 CH3 0.000000 15.0350 0 - 75 C4A 19 C4A C3 CH2 0.000000 14.0270 0 - 76 C4A 19 C4A C4 CH3 0.000000 15.0350 0 - 77 C4A 20 C4A C1 CH2 0.000000 14.0270 0 - 78 C4A 20 C4A C2 CH3 0.000000 15.0350 0 - 79 C4A 20 C4A C3 CH2 0.000000 14.0270 0 - 80 C4A 20 C4A C4 CH3 0.000000 15.0350 0 - 81 C4A 21 C4A C1 CH2 0.000000 14.0270 0 - 82 C4A 21 C4A C2 CH3 0.000000 15.0350 0 - 83 C4A 21 C4A C3 CH2 0.000000 14.0270 0 - 84 C4A 21 C4A C4 CH3 0.000000 15.0350 0 - 85 C4A 22 C4A C1 CH2 0.000000 14.0270 0 - 86 C4A 22 C4A C2 CH3 0.000000 15.0350 0 - 87 C4A 22 C4A C3 CH2 0.000000 14.0270 0 - 88 C4A 22 C4A C4 CH3 0.000000 15.0350 0 - 89 C4A 23 C4A C1 CH2 0.000000 14.0270 0 - 90 C4A 23 C4A C2 CH3 0.000000 15.0350 0 - 91 C4A 23 C4A C3 CH2 0.000000 14.0270 0 - 92 C4A 23 C4A C4 CH3 0.000000 15.0350 0 - 93 C4A 24 C4A C1 CH2 0.000000 14.0270 0 - 94 C4A 24 C4A C2 CH3 0.000000 15.0350 0 - 95 C4A 24 C4A C3 CH2 0.000000 14.0270 0 - 96 C4A 24 C4A C4 CH3 0.000000 15.0350 0 - 97 C4A 25 C4A C1 CH2 0.000000 14.0270 0 - 98 C4A 25 C4A C2 CH3 0.000000 15.0350 0 - 99 C4A 25 C4A C3 CH2 0.000000 14.0270 0 - 100 C4A 25 C4A C4 CH3 0.000000 15.0350 0 - 101 C4A 26 C4A C1 CH2 0.000000 14.0270 0 - 102 C4A 26 C4A C2 CH3 0.000000 15.0350 0 - 103 C4A 26 C4A C3 CH2 0.000000 14.0270 0 - 104 C4A 26 C4A C4 CH3 0.000000 15.0350 0 - 105 C4A 27 C4A C1 CH2 0.000000 14.0270 0 - 106 C4A 27 C4A C2 CH3 0.000000 15.0350 0 - 107 C4A 27 C4A C3 CH2 0.000000 14.0270 0 - 108 C4A 27 C4A C4 CH3 0.000000 15.0350 0 - 109 C4A 28 C4A C1 CH2 0.000000 14.0270 0 - 110 C4A 28 C4A C2 CH3 0.000000 15.0350 0 - 111 C4A 28 C4A C3 CH2 0.000000 14.0270 0 - 112 C4A 28 C4A C4 CH3 0.000000 15.0350 0 - 113 C4A 29 C4A C1 CH2 0.000000 14.0270 0 - 114 C4A 29 C4A C2 CH3 0.000000 15.0350 0 - 115 C4A 29 C4A C3 CH2 0.000000 14.0270 0 - 116 C4A 29 C4A C4 CH3 0.000000 15.0350 0 - 117 C4A 30 C4A C1 CH2 0.000000 14.0270 0 - 118 C4A 30 C4A C2 CH3 0.000000 15.0350 0 - 119 C4A 30 C4A C3 CH2 0.000000 14.0270 0 - 120 C4A 30 C4A C4 CH3 0.000000 15.0350 0 - 121 C4A 31 C4A C1 CH2 0.000000 14.0270 0 - 122 C4A 31 C4A C2 CH3 0.000000 15.0350 0 - 123 C4A 31 C4A C3 CH2 0.000000 14.0270 0 - 124 C4A 31 C4A C4 CH3 0.000000 15.0350 0 - 125 C4A 32 C4A C1 CH2 0.000000 14.0270 0 - 126 C4A 32 C4A C2 CH3 0.000000 15.0350 0 - 127 C4A 32 C4A C3 CH2 0.000000 14.0270 0 - 128 C4A 32 C4A C4 CH3 0.000000 15.0350 0 - 129 C4A 33 C4A C1 CH2 0.000000 14.0270 0 - 130 C4A 33 C4A C2 CH3 0.000000 15.0350 0 - 131 C4A 33 C4A C3 CH2 0.000000 14.0270 0 - 132 C4A 33 C4A C4 CH3 0.000000 15.0350 0 - 133 C4A 34 C4A C1 CH2 0.000000 14.0270 0 - 134 C4A 34 C4A C2 CH3 0.000000 15.0350 0 - 135 C4A 34 C4A C3 CH2 0.000000 14.0270 0 - 136 C4A 34 C4A C4 CH3 0.000000 15.0350 0 - 137 C4A 35 C4A C1 CH2 0.000000 14.0270 0 - 138 C4A 35 C4A C2 CH3 0.000000 15.0350 0 - 139 C4A 35 C4A C3 CH2 0.000000 14.0270 0 - 140 C4A 35 C4A C4 CH3 0.000000 15.0350 0 - 141 C4A 36 C4A C1 CH2 0.000000 14.0270 0 - 142 C4A 36 C4A C2 CH3 0.000000 15.0350 0 - 143 C4A 36 C4A C3 CH2 0.000000 14.0270 0 - 144 C4A 36 C4A C4 CH3 0.000000 15.0350 0 - 145 C4A 37 C4A C1 CH2 0.000000 14.0270 0 - 146 C4A 37 C4A C2 CH3 0.000000 15.0350 0 - 147 C4A 37 C4A C3 CH2 0.000000 14.0270 0 - 148 C4A 37 C4A C4 CH3 0.000000 15.0350 0 - 149 C4A 38 C4A C1 CH2 0.000000 14.0270 0 - 150 C4A 38 C4A C2 CH3 0.000000 15.0350 0 - 151 C4A 38 C4A C3 CH2 0.000000 14.0270 0 - 152 C4A 38 C4A C4 CH3 0.000000 15.0350 0 - 153 C4A 39 C4A C1 CH2 0.000000 14.0270 0 - 154 C4A 39 C4A C2 CH3 0.000000 15.0350 0 - 155 C4A 39 C4A C3 CH2 0.000000 14.0270 0 - 156 C4A 39 C4A C4 CH3 0.000000 15.0350 0 - 157 C4A 40 C4A C1 CH2 0.000000 14.0270 0 - 158 C4A 40 C4A C2 CH3 0.000000 15.0350 0 - 159 C4A 40 C4A C3 CH2 0.000000 14.0270 0 - 160 C4A 40 C4A C4 CH3 0.000000 15.0350 0 - 161 C4A 41 C4A C1 CH2 0.000000 14.0270 0 - 162 C4A 41 C4A C2 CH3 0.000000 15.0350 0 - 163 C4A 41 C4A C3 CH2 0.000000 14.0270 0 - 164 C4A 41 C4A C4 CH3 0.000000 15.0350 0 - 165 C4A 42 C4A C1 CH2 0.000000 14.0270 0 - 166 C4A 42 C4A C2 CH3 0.000000 15.0350 0 - 167 C4A 42 C4A C3 CH2 0.000000 14.0270 0 - 168 C4A 42 C4A C4 CH3 0.000000 15.0350 0 - 169 C4A 43 C4A C1 CH2 0.000000 14.0270 0 - 170 C4A 43 C4A C2 CH3 0.000000 15.0350 0 - 171 C4A 43 C4A C3 CH2 0.000000 14.0270 0 - 172 C4A 43 C4A C4 CH3 0.000000 15.0350 0 - 173 C4A 44 C4A C1 CH2 0.000000 14.0270 0 - 174 C4A 44 C4A C2 CH3 0.000000 15.0350 0 - 175 C4A 44 C4A C3 CH2 0.000000 14.0270 0 - 176 C4A 44 C4A C4 CH3 0.000000 15.0350 0 - 177 C4A 45 C4A C1 CH2 0.000000 14.0270 0 - 178 C4A 45 C4A C2 CH3 0.000000 15.0350 0 - 179 C4A 45 C4A C3 CH2 0.000000 14.0270 0 - 180 C4A 45 C4A C4 CH3 0.000000 15.0350 0 - 181 C4A 46 C4A C1 CH2 0.000000 14.0270 0 - 182 C4A 46 C4A C2 CH3 0.000000 15.0350 0 - 183 C4A 46 C4A C3 CH2 0.000000 14.0270 0 - 184 C4A 46 C4A C4 CH3 0.000000 15.0350 0 - 185 C4A 47 C4A C1 CH2 0.000000 14.0270 0 - 186 C4A 47 C4A C2 CH3 0.000000 15.0350 0 - 187 C4A 47 C4A C3 CH2 0.000000 14.0270 0 - 188 C4A 47 C4A C4 CH3 0.000000 15.0350 0 - 189 C4A 48 C4A C1 CH2 0.000000 14.0270 0 - 190 C4A 48 C4A C2 CH3 0.000000 15.0350 0 - 191 C4A 48 C4A C3 CH2 0.000000 14.0270 0 - 192 C4A 48 C4A C4 CH3 0.000000 15.0350 0 - 193 C4A 49 C4A C1 CH2 0.000000 14.0270 0 - 194 C4A 49 C4A C2 CH3 0.000000 15.0350 0 - 195 C4A 49 C4A C3 CH2 0.000000 14.0270 0 - 196 C4A 49 C4A C4 CH3 0.000000 15.0350 0 - 197 C4A 50 C4A C1 CH2 0.000000 14.0270 0 - 198 C4A 50 C4A C2 CH3 0.000000 15.0350 0 - 199 C4A 50 C4A C3 CH2 0.000000 14.0270 0 - 200 C4A 50 C4A C4 CH3 0.000000 15.0350 0 - 201 C4A 51 C4A C1 CH2 0.000000 14.0270 0 - 202 C4A 51 C4A C2 CH3 0.000000 15.0350 0 - 203 C4A 51 C4A C3 CH2 0.000000 14.0270 0 - 204 C4A 51 C4A C4 CH3 0.000000 15.0350 0 - 205 C4A 52 C4A C1 CH2 0.000000 14.0270 0 - 206 C4A 52 C4A C2 CH3 0.000000 15.0350 0 - 207 C4A 52 C4A C3 CH2 0.000000 14.0270 0 - 208 C4A 52 C4A C4 CH3 0.000000 15.0350 0 - 209 C4A 53 C4A C1 CH2 0.000000 14.0270 0 - 210 C4A 53 C4A C2 CH3 0.000000 15.0350 0 - 211 C4A 53 C4A C3 CH2 0.000000 14.0270 0 - 212 C4A 53 C4A C4 CH3 0.000000 15.0350 0 - 213 C4A 54 C4A C1 CH2 0.000000 14.0270 0 - 214 C4A 54 C4A C2 CH3 0.000000 15.0350 0 - 215 C4A 54 C4A C3 CH2 0.000000 14.0270 0 - 216 C4A 54 C4A C4 CH3 0.000000 15.0350 0 - 217 C4A 55 C4A C1 CH2 0.000000 14.0270 0 - 218 C4A 55 C4A C2 CH3 0.000000 15.0350 0 - 219 C4A 55 C4A C3 CH2 0.000000 14.0270 0 - 220 C4A 55 C4A C4 CH3 0.000000 15.0350 0 - 221 C4A 56 C4A C1 CH2 0.000000 14.0270 0 - 222 C4A 56 C4A C2 CH3 0.000000 15.0350 0 - 223 C4A 56 C4A C3 CH2 0.000000 14.0270 0 - 224 C4A 56 C4A C4 CH3 0.000000 15.0350 0 - 225 C4A 57 C4A C1 CH2 0.000000 14.0270 0 - 226 C4A 57 C4A C2 CH3 0.000000 15.0350 0 - 227 C4A 57 C4A C3 CH2 0.000000 14.0270 0 - 228 C4A 57 C4A C4 CH3 0.000000 15.0350 0 - 229 C4A 58 C4A C1 CH2 0.000000 14.0270 0 - 230 C4A 58 C4A C2 CH3 0.000000 15.0350 0 - 231 C4A 58 C4A C3 CH2 0.000000 14.0270 0 - 232 C4A 58 C4A C4 CH3 0.000000 15.0350 0 - 233 C4A 59 C4A C1 CH2 0.000000 14.0270 0 - 234 C4A 59 C4A C2 CH3 0.000000 15.0350 0 - 235 C4A 59 C4A C3 CH2 0.000000 14.0270 0 - 236 C4A 59 C4A C4 CH3 0.000000 15.0350 0 - 237 C4A 60 C4A C1 CH2 0.000000 14.0270 0 - 238 C4A 60 C4A C2 CH3 0.000000 15.0350 0 - 239 C4A 60 C4A C3 CH2 0.000000 14.0270 0 - 240 C4A 60 C4A C4 CH3 0.000000 15.0350 0 - 241 C4A 61 C4A C1 CH2 0.000000 14.0270 0 - 242 C4A 61 C4A C2 CH3 0.000000 15.0350 0 - 243 C4A 61 C4A C3 CH2 0.000000 14.0270 0 - 244 C4A 61 C4A C4 CH3 0.000000 15.0350 0 - 245 C4A 62 C4A C1 CH2 0.000000 14.0270 0 - 246 C4A 62 C4A C2 CH3 0.000000 15.0350 0 - 247 C4A 62 C4A C3 CH2 0.000000 14.0270 0 - 248 C4A 62 C4A C4 CH3 0.000000 15.0350 0 - 249 C4A 63 C4A C1 CH2 0.000000 14.0270 0 - 250 C4A 63 C4A C2 CH3 0.000000 15.0350 0 - 251 C4A 63 C4A C3 CH2 0.000000 14.0270 0 - 252 C4A 63 C4A C4 CH3 0.000000 15.0350 0 - 253 C4A 64 C4A C1 CH2 0.000000 14.0270 0 - 254 C4A 64 C4A C2 CH3 0.000000 15.0350 0 - 255 C4A 64 C4A C3 CH2 0.000000 14.0270 0 - 256 C4A 64 C4A C4 CH3 0.000000 15.0350 0 - 257 C4A 65 C4A C1 CH2 0.000000 14.0270 0 - 258 C4A 65 C4A C2 CH3 0.000000 15.0350 0 - 259 C4A 65 C4A C3 CH2 0.000000 14.0270 0 - 260 C4A 65 C4A C4 CH3 0.000000 15.0350 0 - 261 C4A 66 C4A C1 CH2 0.000000 14.0270 0 - 262 C4A 66 C4A C2 CH3 0.000000 15.0350 0 - 263 C4A 66 C4A C3 CH2 0.000000 14.0270 0 - 264 C4A 66 C4A C4 CH3 0.000000 15.0350 0 - 265 C4A 67 C4A C1 CH2 0.000000 14.0270 0 - 266 C4A 67 C4A C2 CH3 0.000000 15.0350 0 - 267 C4A 67 C4A C3 CH2 0.000000 14.0270 0 - 268 C4A 67 C4A C4 CH3 0.000000 15.0350 0 - 269 C4A 68 C4A C1 CH2 0.000000 14.0270 0 - 270 C4A 68 C4A C2 CH3 0.000000 15.0350 0 - 271 C4A 68 C4A C3 CH2 0.000000 14.0270 0 - 272 C4A 68 C4A C4 CH3 0.000000 15.0350 0 - 273 C4A 69 C4A C1 CH2 0.000000 14.0270 0 - 274 C4A 69 C4A C2 CH3 0.000000 15.0350 0 - 275 C4A 69 C4A C3 CH2 0.000000 14.0270 0 - 276 C4A 69 C4A C4 CH3 0.000000 15.0350 0 - 277 C4A 70 C4A C1 CH2 0.000000 14.0270 0 - 278 C4A 70 C4A C2 CH3 0.000000 15.0350 0 - 279 C4A 70 C4A C3 CH2 0.000000 14.0270 0 - 280 C4A 70 C4A C4 CH3 0.000000 15.0350 0 - 281 C4A 71 C4A C1 CH2 0.000000 14.0270 0 - 282 C4A 71 C4A C2 CH3 0.000000 15.0350 0 - 283 C4A 71 C4A C3 CH2 0.000000 14.0270 0 - 284 C4A 71 C4A C4 CH3 0.000000 15.0350 0 - 285 C4A 72 C4A C1 CH2 0.000000 14.0270 0 - 286 C4A 72 C4A C2 CH3 0.000000 15.0350 0 - 287 C4A 72 C4A C3 CH2 0.000000 14.0270 0 - 288 C4A 72 C4A C4 CH3 0.000000 15.0350 0 - 289 C4A 73 C4A C1 CH2 0.000000 14.0270 0 - 290 C4A 73 C4A C2 CH3 0.000000 15.0350 0 - 291 C4A 73 C4A C3 CH2 0.000000 14.0270 0 - 292 C4A 73 C4A C4 CH3 0.000000 15.0350 0 - 293 C4A 74 C4A C1 CH2 0.000000 14.0270 0 - 294 C4A 74 C4A C2 CH3 0.000000 15.0350 0 - 295 C4A 74 C4A C3 CH2 0.000000 14.0270 0 - 296 C4A 74 C4A C4 CH3 0.000000 15.0350 0 - 297 C4A 75 C4A C1 CH2 0.000000 14.0270 0 - 298 C4A 75 C4A C2 CH3 0.000000 15.0350 0 - 299 C4A 75 C4A C3 CH2 0.000000 14.0270 0 - 300 C4A 75 C4A C4 CH3 0.000000 15.0350 0 - 301 C4A 76 C4A C1 CH2 0.000000 14.0270 0 - 302 C4A 76 C4A C2 CH3 0.000000 15.0350 0 - 303 C4A 76 C4A C3 CH2 0.000000 14.0270 0 - 304 C4A 76 C4A C4 CH3 0.000000 15.0350 0 - 305 C4A 77 C4A C1 CH2 0.000000 14.0270 0 - 306 C4A 77 C4A C2 CH3 0.000000 15.0350 0 - 307 C4A 77 C4A C3 CH2 0.000000 14.0270 0 - 308 C4A 77 C4A C4 CH3 0.000000 15.0350 0 - 309 C4A 78 C4A C1 CH2 0.000000 14.0270 0 - 310 C4A 78 C4A C2 CH3 0.000000 15.0350 0 - 311 C4A 78 C4A C3 CH2 0.000000 14.0270 0 - 312 C4A 78 C4A C4 CH3 0.000000 15.0350 0 - 313 C4A 79 C4A C1 CH2 0.000000 14.0270 0 - 314 C4A 79 C4A C2 CH3 0.000000 15.0350 0 - 315 C4A 79 C4A C3 CH2 0.000000 14.0270 0 - 316 C4A 79 C4A C4 CH3 0.000000 15.0350 0 - 317 C4A 80 C4A C1 CH2 0.000000 14.0270 0 - 318 C4A 80 C4A C2 CH3 0.000000 15.0350 0 - 319 C4A 80 C4A C3 CH2 0.000000 14.0270 0 - 320 C4A 80 C4A C4 CH3 0.000000 15.0350 0 - 321 C4A 81 C4A C1 CH2 0.000000 14.0270 0 - 322 C4A 81 C4A C2 CH3 0.000000 15.0350 0 - 323 C4A 81 C4A C3 CH2 0.000000 14.0270 0 - 324 C4A 81 C4A C4 CH3 0.000000 15.0350 0 - 325 C4A 82 C4A C1 CH2 0.000000 14.0270 0 - 326 C4A 82 C4A C2 CH3 0.000000 15.0350 0 - 327 C4A 82 C4A C3 CH2 0.000000 14.0270 0 - 328 C4A 82 C4A C4 CH3 0.000000 15.0350 0 - 329 C4A 83 C4A C1 CH2 0.000000 14.0270 0 - 330 C4A 83 C4A C2 CH3 0.000000 15.0350 0 - 331 C4A 83 C4A C3 CH2 0.000000 14.0270 0 - 332 C4A 83 C4A C4 CH3 0.000000 15.0350 0 - 333 C4A 84 C4A C1 CH2 0.000000 14.0270 0 - 334 C4A 84 C4A C2 CH3 0.000000 15.0350 0 - 335 C4A 84 C4A C3 CH2 0.000000 14.0270 0 - 336 C4A 84 C4A C4 CH3 0.000000 15.0350 0 - 337 C4A 85 C4A C1 CH2 0.000000 14.0270 0 - 338 C4A 85 C4A C2 CH3 0.000000 15.0350 0 - 339 C4A 85 C4A C3 CH2 0.000000 14.0270 0 - 340 C4A 85 C4A C4 CH3 0.000000 15.0350 0 - 341 C4A 86 C4A C1 CH2 0.000000 14.0270 0 - 342 C4A 86 C4A C2 CH3 0.000000 15.0350 0 - 343 C4A 86 C4A C3 CH2 0.000000 14.0270 0 - 344 C4A 86 C4A C4 CH3 0.000000 15.0350 0 - 345 C4A 87 C4A C1 CH2 0.000000 14.0270 0 - 346 C4A 87 C4A C2 CH3 0.000000 15.0350 0 - 347 C4A 87 C4A C3 CH2 0.000000 14.0270 0 - 348 C4A 87 C4A C4 CH3 0.000000 15.0350 0 - 349 C4A 88 C4A C1 CH2 0.000000 14.0270 0 - 350 C4A 88 C4A C2 CH3 0.000000 15.0350 0 - 351 C4A 88 C4A C3 CH2 0.000000 14.0270 0 - 352 C4A 88 C4A C4 CH3 0.000000 15.0350 0 - 353 C4A 89 C4A C1 CH2 0.000000 14.0270 0 - 354 C4A 89 C4A C2 CH3 0.000000 15.0350 0 - 355 C4A 89 C4A C3 CH2 0.000000 14.0270 0 - 356 C4A 89 C4A C4 CH3 0.000000 15.0350 0 - 357 C4A 90 C4A C1 CH2 0.000000 14.0270 0 - 358 C4A 90 C4A C2 CH3 0.000000 15.0350 0 - 359 C4A 90 C4A C3 CH2 0.000000 14.0270 0 - 360 C4A 90 C4A C4 CH3 0.000000 15.0350 0 - 361 C1A 1 C1A C1 CH4 0.000000 16.0430 0 - 362 C1A 2 C1A C1 CH4 0.000000 16.0430 0 - 363 C1A 3 C1A C1 CH4 0.000000 16.0430 0 - 364 C1A 4 C1A C1 CH4 0.000000 16.0430 0 - 365 C1A 5 C1A C1 CH4 0.000000 16.0430 0 - 366 C1A 6 C1A C1 CH4 0.000000 16.0430 0 - 367 C1A 7 C1A C1 CH4 0.000000 16.0430 0 - 368 C1A 8 C1A C1 CH4 0.000000 16.0430 0 - 369 C1A 9 C1A C1 CH4 0.000000 16.0430 0 - 370 C1A 10 C1A C1 CH4 0.000000 16.0430 0 - - 270 !NBOND: bonds - 1 3 2 1 3 4 5 7 - 6 5 7 8 9 11 10 9 - 11 12 13 15 14 13 15 16 - 17 19 18 17 19 20 21 23 - 22 21 23 24 25 27 26 25 - 27 28 29 31 30 29 31 32 - 33 35 34 33 35 36 37 39 - 38 37 39 40 41 43 42 41 - 43 44 45 47 46 45 47 48 - 49 51 50 49 51 52 53 55 - 54 53 55 56 57 59 58 57 - 59 60 61 63 62 61 63 64 - 65 67 66 65 67 68 69 71 - 70 69 71 72 73 75 74 73 - 75 76 77 79 78 77 79 80 - 81 83 82 81 83 84 85 87 - 86 85 87 88 89 91 90 89 - 91 92 93 95 94 93 95 96 - 97 99 98 97 99 100 101 103 - 102 101 103 104 105 107 106 105 - 107 108 109 111 110 109 111 112 - 113 115 114 113 115 116 117 119 - 118 117 119 120 121 123 122 121 - 123 124 125 127 126 125 127 128 - 129 131 130 129 131 132 133 135 - 134 133 135 136 137 139 138 137 - 139 140 141 143 142 141 143 144 - 145 147 146 145 147 148 149 151 - 150 149 151 152 153 155 154 153 - 155 156 157 159 158 157 159 160 - 161 163 162 161 163 164 165 167 - 166 165 167 168 169 171 170 169 - 171 172 173 175 174 173 175 176 - 177 179 178 177 179 180 181 183 - 182 181 183 184 185 187 186 185 - 187 188 189 191 190 189 191 192 - 193 195 194 193 195 196 197 199 - 198 197 199 200 201 203 202 201 - 203 204 205 207 206 205 207 208 - 209 211 210 209 211 212 213 215 - 214 213 215 216 217 219 218 217 - 219 220 221 223 222 221 223 224 - 225 227 226 225 227 228 229 231 - 230 229 231 232 233 235 234 233 - 235 236 237 239 238 237 239 240 - 241 243 242 241 243 244 245 247 - 246 245 247 248 249 251 250 249 - 251 252 253 255 254 253 255 256 - 257 259 258 257 259 260 261 263 - 262 261 263 264 265 267 266 265 - 267 268 269 271 270 269 271 272 - 273 275 274 273 275 276 277 279 - 278 277 279 280 281 283 282 281 - 283 284 285 287 286 285 287 288 - 289 291 290 289 291 292 293 295 - 294 293 295 296 297 299 298 297 - 299 300 301 303 302 301 303 304 - 305 307 306 305 307 308 309 311 - 310 309 311 312 313 315 314 313 - 315 316 317 319 318 317 319 320 - 321 323 322 321 323 324 325 327 - 326 325 327 328 329 331 330 329 - 331 332 333 335 334 333 335 336 - 337 339 338 337 339 340 341 343 - 342 341 343 344 345 347 346 345 - 347 348 349 351 350 349 351 352 - 353 355 354 353 355 356 357 359 - 358 357 359 360 - - 180 !NTHETA: angles - 1 3 4 2 1 3 5 7 8 - 6 5 7 9 11 12 10 9 11 - 13 15 16 14 13 15 17 19 20 - 18 17 19 21 23 24 22 21 23 - 25 27 28 26 25 27 29 31 32 - 30 29 31 33 35 36 34 33 35 - 37 39 40 38 37 39 41 43 44 - 42 41 43 45 47 48 46 45 47 - 49 51 52 50 49 51 53 55 56 - 54 53 55 57 59 60 58 57 59 - 61 63 64 62 61 63 65 67 68 - 66 65 67 69 71 72 70 69 71 - 73 75 76 74 73 75 77 79 80 - 78 77 79 81 83 84 82 81 83 - 85 87 88 86 85 87 89 91 92 - 90 89 91 93 95 96 94 93 95 - 97 99 100 98 97 99 101 103 104 - 102 101 103 105 107 108 106 105 107 - 109 111 112 110 109 111 113 115 116 - 114 113 115 117 119 120 118 117 119 - 121 123 124 122 121 123 125 127 128 - 126 125 127 129 131 132 130 129 131 - 133 135 136 134 133 135 137 139 140 - 138 137 139 141 143 144 142 141 143 - 145 147 148 146 145 147 149 151 152 - 150 149 151 153 155 156 154 153 155 - 157 159 160 158 157 159 161 163 164 - 162 161 163 165 167 168 166 165 167 - 169 171 172 170 169 171 173 175 176 - 174 173 175 177 179 180 178 177 179 - 181 183 184 182 181 183 185 187 188 - 186 185 187 189 191 192 190 189 191 - 193 195 196 194 193 195 197 199 200 - 198 197 199 201 203 204 202 201 203 - 205 207 208 206 205 207 209 211 212 - 210 209 211 213 215 216 214 213 215 - 217 219 220 218 217 219 221 223 224 - 222 221 223 225 227 228 226 225 227 - 229 231 232 230 229 231 233 235 236 - 234 233 235 237 239 240 238 237 239 - 241 243 244 242 241 243 245 247 248 - 246 245 247 249 251 252 250 249 251 - 253 255 256 254 253 255 257 259 260 - 258 257 259 261 263 264 262 261 263 - 265 267 268 266 265 267 269 271 272 - 270 269 271 273 275 276 274 273 275 - 277 279 280 278 277 279 281 283 284 - 282 281 283 285 287 288 286 285 287 - 289 291 292 290 289 291 293 295 296 - 294 293 295 297 299 300 298 297 299 - 301 303 304 302 301 303 305 307 308 - 306 305 307 309 311 312 310 309 311 - 313 315 316 314 313 315 317 319 320 - 318 317 319 321 323 324 322 321 323 - 325 327 328 326 325 327 329 331 332 - 330 329 331 333 335 336 334 333 335 - 337 339 340 338 337 339 341 343 344 - 342 341 343 345 347 348 346 345 347 - 349 351 352 350 349 351 353 355 356 - 354 353 355 357 359 360 358 357 359 - - 90 !NPHI: dihedrals - 2 1 3 4 6 5 7 8 - 10 9 11 12 14 13 15 16 - 18 17 19 20 22 21 23 24 - 26 25 27 28 30 29 31 32 - 34 33 35 36 38 37 39 40 - 42 41 43 44 46 45 47 48 - 50 49 51 52 54 53 55 56 - 58 57 59 60 62 61 63 64 - 66 65 67 68 70 69 71 72 - 74 73 75 76 78 77 79 80 - 82 81 83 84 86 85 87 88 - 90 89 91 92 94 93 95 96 - 98 97 99 100 102 101 103 104 - 106 105 107 108 110 109 111 112 - 114 113 115 116 118 117 119 120 - 122 121 123 124 126 125 127 128 - 130 129 131 132 134 133 135 136 - 138 137 139 140 142 141 143 144 - 146 145 147 148 150 149 151 152 - 154 153 155 156 158 157 159 160 - 162 161 163 164 166 165 167 168 - 170 169 171 172 174 173 175 176 - 178 177 179 180 182 181 183 184 - 186 185 187 188 190 189 191 192 - 194 193 195 196 198 197 199 200 - 202 201 203 204 206 205 207 208 - 210 209 211 212 214 213 215 216 - 218 217 219 220 222 221 223 224 - 226 225 227 228 230 229 231 232 - 234 233 235 236 238 237 239 240 - 242 241 243 244 246 245 247 248 - 250 249 251 252 254 253 255 256 - 258 257 259 260 262 261 263 264 - 266 265 267 268 270 269 271 272 - 274 273 275 276 278 277 279 280 - 282 281 283 284 286 285 287 288 - 290 289 291 292 294 293 295 296 - 298 297 299 300 302 301 303 304 - 306 305 307 308 310 309 311 312 - 314 313 315 316 318 317 319 320 - 322 321 323 324 326 325 327 328 - 330 329 331 332 334 333 335 336 - 338 337 339 340 342 341 343 344 - 346 345 347 348 350 349 351 352 - 354 353 355 356 358 357 359 360 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 - - 1 0 !NGRP - 0 0 0 - diff --git a/example_file/methane_butane/setup_box_1.pdb b/example_file/methane_butane/setup_box_1.pdb deleted file mode 100644 index 31575ded7..000000000 --- a/example_file/methane_butane/setup_box_1.pdb +++ /dev/null @@ -1,962 +0,0 @@ -REMARK original generated coordinate pdb file -ATOM 1 C1 C4A A 1 7.266 21.883 18.738 1.00 0.00 C4A C -ATOM 2 C2 C4A A 1 6.313 22.281 17.596 1.00 0.00 C4A C -ATOM 3 C3 C4A A 1 8.712 22.244 18.349 1.00 0.00 C4A C -ATOM 4 C4 C4A A 1 9.666 21.846 19.490 1.00 0.00 C4A C -ATOM 5 C1 C4A A 2 13.979 6.979 19.307 1.00 0.00 C4A C -ATOM 6 C2 C4A A 2 12.454 7.093 19.138 1.00 0.00 C4A C -ATOM 7 C3 C4A A 2 14.465 8.040 20.312 1.00 0.00 C4A C -ATOM 8 C4 C4A A 2 15.991 7.926 20.483 1.00 0.00 C4A C -ATOM 9 C1 C4A A 3 12.218 3.000 17.007 1.00 0.00 C4A C -ATOM 10 C2 C4A A 3 12.250 3.177 18.536 1.00 0.00 C4A C -ATOM 11 C3 C4A A 3 13.639 3.177 16.440 1.00 0.00 C4A C -ATOM 12 C4 C4A A 3 13.608 3.000 14.910 1.00 0.00 C4A C -ATOM 13 C1 C4A A 4 11.310 19.746 4.510 1.00 0.00 C4A C -ATOM 14 C2 C4A A 4 10.997 20.103 3.045 1.00 0.00 C4A C -ATOM 15 C3 C4A A 4 11.509 18.224 4.637 1.00 0.00 C4A C -ATOM 16 C4 C4A A 4 11.823 17.867 6.101 1.00 0.00 C4A C -ATOM 17 C1 C4A A 5 17.161 14.968 10.578 1.00 0.00 C4A C -ATOM 18 C2 C4A A 5 18.221 15.631 9.681 1.00 0.00 C4A C -ATOM 19 C3 C4A A 5 17.851 14.302 11.783 1.00 0.00 C4A C -ATOM 20 C4 C4A A 5 16.791 13.639 12.682 1.00 0.00 C4A C -ATOM 21 C1 C4A A 6 8.380 23.567 21.251 1.00 0.00 C4A C -ATOM 22 C2 C4A A 6 7.888 24.241 19.957 1.00 0.00 C4A C -ATOM 23 C3 C4A A 6 7.672 22.210 21.424 1.00 0.00 C4A C -ATOM 24 C4 C4A A 6 8.164 21.535 22.718 1.00 0.00 C4A C -ATOM 25 C1 C4A A 7 4.374 6.675 16.732 1.00 0.00 C4A C -ATOM 26 C2 C4A A 7 4.310 8.156 17.148 1.00 0.00 C4A C -ATOM 27 C3 C4A A 7 3.000 6.232 16.196 1.00 0.00 C4A C -ATOM 28 C4 C4A A 7 3.063 4.751 15.779 1.00 0.00 C4A C -ATOM 29 C1 C4A A 8 4.024 19.092 22.803 1.00 0.00 C4A C -ATOM 30 C2 C4A A 8 3.645 18.800 24.266 1.00 0.00 C4A C -ATOM 31 C3 C4A A 8 3.000 20.067 22.192 1.00 0.00 C4A C -ATOM 32 C4 C4A A 8 3.378 20.359 20.728 1.00 0.00 C4A C -ATOM 33 C1 C4A A 9 19.438 22.848 3.603 1.00 0.00 C4A C -ATOM 34 C2 C4A A 9 19.861 21.496 3.000 1.00 0.00 C4A C -ATOM 35 C3 C4A A 9 20.693 23.648 4.000 1.00 0.00 C4A C -ATOM 36 C4 C4A A 9 20.271 25.001 4.604 1.00 0.00 C4A C -ATOM 37 C1 C4A A 10 25.000 24.256 8.741 1.00 0.00 C4A C -ATOM 38 C2 C4A A 10 24.265 25.000 7.611 1.00 0.00 C4A C -ATOM 39 C3 C4A A 10 24.265 24.492 10.074 1.00 0.00 C4A C -ATOM 40 C4 C4A A 10 25.000 23.748 11.204 1.00 0.00 C4A C -ATOM 41 C1 C4A A 11 10.238 24.331 4.021 1.00 0.00 C4A C -ATOM 42 C2 C4A A 11 11.176 25.000 3.000 1.00 0.00 C4A C -ATOM 43 C3 C4A A 11 8.853 25.000 3.961 1.00 0.00 C4A C -ATOM 44 C4 C4A A 11 7.914 24.331 4.983 1.00 0.00 C4A C -ATOM 45 C1 C4A A 12 21.401 4.658 23.790 1.00 0.00 C4A C -ATOM 46 C2 C4A A 12 20.059 5.336 24.121 1.00 0.00 C4A C -ATOM 47 C3 C4A A 12 21.205 3.679 22.617 1.00 0.00 C4A C -ATOM 48 C4 C4A A 12 22.547 3.000 22.285 1.00 0.00 C4A C -ATOM 49 C1 C4A A 13 17.831 11.280 21.387 1.00 0.00 C4A C -ATOM 50 C2 C4A A 13 18.195 12.101 22.638 1.00 0.00 C4A C -ATOM 51 C3 C4A A 13 18.623 9.959 21.391 1.00 0.00 C4A C -ATOM 52 C4 C4A A 13 18.259 9.138 20.141 1.00 0.00 C4A C -ATOM 53 C1 C4A A 14 8.322 22.036 5.886 1.00 0.00 C4A C -ATOM 54 C2 C4A A 14 7.841 21.045 4.811 1.00 0.00 C4A C -ATOM 55 C3 C4A A 14 9.779 22.443 5.595 1.00 0.00 C4A C -ATOM 56 C4 C4A A 14 10.261 23.434 6.670 1.00 0.00 C4A C -ATOM 57 C1 C4A A 15 12.974 8.168 7.034 1.00 0.00 C4A C -ATOM 58 C2 C4A A 15 12.693 6.952 6.133 1.00 0.00 C4A C -ATOM 59 C3 C4A A 15 14.255 8.877 6.556 1.00 0.00 C4A C -ATOM 60 C4 C4A A 15 14.537 10.094 7.456 1.00 0.00 C4A C -ATOM 61 C1 C4A A 16 21.453 3.200 17.547 1.00 0.00 C4A C -ATOM 62 C2 C4A A 16 22.673 4.103 17.292 1.00 0.00 C4A C -ATOM 63 C3 C4A A 16 20.487 3.904 18.519 1.00 0.00 C4A C -ATOM 64 C4 C4A A 16 19.266 3.001 18.774 1.00 0.00 C4A C -ATOM 65 C1 C4A A 17 9.453 3.767 4.752 1.00 0.00 C4A C -ATOM 66 C2 C4A A 17 10.196 3.035 5.884 1.00 0.00 C4A C -ATOM 67 C3 C4A A 17 8.163 3.000 4.405 1.00 0.00 C4A C -ATOM 68 C4 C4A A 17 7.419 3.731 3.272 1.00 0.00 C4A C -ATOM 69 C1 C4A A 18 10.945 10.113 25.000 1.00 0.00 C4A C -ATOM 70 C2 C4A A 18 12.315 9.645 24.474 1.00 0.00 C4A C -ATOM 71 C3 C4A A 18 10.574 11.456 24.344 1.00 0.00 C4A C -ATOM 72 C4 C4A A 18 9.205 11.924 24.869 1.00 0.00 C4A C -ATOM 73 C1 C4A A 19 25.000 25.000 19.956 1.00 0.00 C4A C -ATOM 74 C2 C4A A 19 24.999 24.982 18.417 1.00 0.00 C4A C -ATOM 75 C3 C4A A 19 24.999 23.554 20.486 1.00 0.00 C4A C -ATOM 76 C4 C4A A 19 25.000 23.571 22.026 1.00 0.00 C4A C -ATOM 77 C1 C4A A 20 20.581 11.589 22.093 1.00 0.00 C4A C -ATOM 78 C2 C4A A 20 21.878 10.806 22.365 1.00 0.00 C4A C -ATOM 79 C3 C4A A 20 20.863 12.713 21.079 1.00 0.00 C4A C -ATOM 80 C4 C4A A 20 19.566 13.498 20.806 1.00 0.00 C4A C -ATOM 81 C1 C4A A 21 19.184 18.164 12.487 1.00 0.00 C4A C -ATOM 82 C2 C4A A 21 18.438 17.170 13.395 1.00 0.00 C4A C -ATOM 83 C3 C4A A 21 20.692 18.111 12.798 1.00 0.00 C4A C -ATOM 84 C4 C4A A 21 21.439 19.105 11.890 1.00 0.00 C4A C -ATOM 85 C1 C4A A 22 23.888 23.307 16.930 1.00 0.00 C4A C -ATOM 86 C2 C4A A 22 23.105 23.358 18.255 1.00 0.00 C4A C -ATOM 87 C3 C4A A 22 23.151 22.394 15.933 1.00 0.00 C4A C -ATOM 88 C4 C4A A 22 23.933 22.342 14.608 1.00 0.00 C4A C -ATOM 89 C1 C4A A 23 23.617 5.367 2.998 1.00 0.00 C4A C -ATOM 90 C2 C4A A 23 22.358 6.253 2.999 1.00 0.00 C4A C -ATOM 91 C3 C4A A 23 23.203 3.887 3.098 1.00 0.00 C4A C -ATOM 92 C4 C4A A 23 24.461 3.000 3.097 1.00 0.00 C4A C -ATOM 93 C1 C4A A 24 12.698 15.191 24.773 1.00 0.00 C4A C -ATOM 94 C2 C4A A 24 14.211 15.019 25.000 1.00 0.00 C4A C -ATOM 95 C3 C4A A 24 12.049 13.808 24.572 1.00 0.00 C4A C -ATOM 96 C4 C4A A 24 10.536 13.979 24.345 1.00 0.00 C4A C -ATOM 97 C1 C4A A 25 16.029 8.415 14.692 1.00 0.00 C4A C -ATOM 98 C2 C4A A 25 16.861 9.314 15.624 1.00 0.00 C4A C -ATOM 99 C3 C4A A 25 16.103 6.957 15.183 1.00 0.00 C4A C -ATOM 100 C4 C4A A 25 15.271 6.058 14.251 1.00 0.00 C4A C -ATOM 101 C1 C4A A 26 17.366 5.968 21.207 1.00 0.00 C4A C -ATOM 102 C2 C4A A 26 16.415 5.289 20.203 1.00 0.00 C4A C -ATOM 103 C3 C4A A 26 18.824 5.638 20.836 1.00 0.00 C4A C -ATOM 104 C4 C4A A 26 19.775 6.316 21.839 1.00 0.00 C4A C -ATOM 105 C1 C4A A 27 3.000 5.295 6.791 1.00 0.00 C4A C -ATOM 106 C2 C4A A 27 3.279 5.131 8.296 1.00 0.00 C4A C -ATOM 107 C3 C4A A 27 3.616 4.111 6.023 1.00 0.00 C4A C -ATOM 108 C4 C4A A 27 3.337 4.275 4.517 1.00 0.00 C4A C -ATOM 109 C1 C4A A 28 21.971 3.062 13.597 1.00 0.00 C4A C -ATOM 110 C2 C4A A 28 22.068 2.999 15.132 1.00 0.00 C4A C -ATOM 111 C3 C4A A 28 20.511 3.325 13.185 1.00 0.00 C4A C -ATOM 112 C4 C4A A 28 20.414 3.388 11.649 1.00 0.00 C4A C -ATOM 113 C1 C4A A 29 6.931 7.313 3.028 1.00 0.00 C4A C -ATOM 114 C2 C4A A 29 5.741 6.336 3.055 1.00 0.00 C4A C -ATOM 115 C3 C4A A 29 8.249 6.516 3.027 1.00 0.00 C4A C -ATOM 116 C4 C4A A 29 9.440 7.493 3.000 1.00 0.00 C4A C -ATOM 117 C1 C4A A 30 16.031 3.000 19.276 1.00 0.00 C4A C -ATOM 118 C2 C4A A 30 16.668 3.505 17.968 1.00 0.00 C4A C -ATOM 119 C3 C4A A 30 14.582 3.513 19.372 1.00 0.00 C4A C -ATOM 120 C4 C4A A 30 13.944 3.009 20.679 1.00 0.00 C4A C -ATOM 121 C1 C4A A 31 5.087 18.634 19.552 1.00 0.00 C4A C -ATOM 122 C2 C4A A 31 5.375 20.098 19.173 1.00 0.00 C4A C -ATOM 123 C3 C4A A 31 5.580 17.706 18.427 1.00 0.00 C4A C -ATOM 124 C4 C4A A 31 5.292 16.241 18.805 1.00 0.00 C4A C -ATOM 125 C1 C4A A 32 16.232 13.845 8.278 1.00 0.00 C4A C -ATOM 126 C2 C4A A 32 16.602 14.573 6.973 1.00 0.00 C4A C -ATOM 127 C3 C4A A 32 17.432 13.007 8.757 1.00 0.00 C4A C -ATOM 128 C4 C4A A 32 17.063 12.279 10.062 1.00 0.00 C4A C -ATOM 129 C1 C4A A 33 12.285 7.592 21.887 1.00 0.00 C4A C -ATOM 130 C2 C4A A 33 13.116 7.557 23.182 1.00 0.00 C4A C -ATOM 131 C3 C4A A 33 10.985 6.792 22.090 1.00 0.00 C4A C -ATOM 132 C4 C4A A 33 10.153 6.826 20.794 1.00 0.00 C4A C -ATOM 133 C1 C4A A 34 10.705 21.638 10.218 1.00 0.00 C4A C -ATOM 134 C2 C4A A 34 9.461 20.936 10.792 1.00 0.00 C4A C -ATOM 135 C3 C4A A 34 10.797 21.365 8.705 1.00 0.00 C4A C -ATOM 136 C4 C4A A 34 12.041 22.067 8.130 1.00 0.00 C4A C -ATOM 137 C1 C4A A 35 21.121 24.776 23.480 1.00 0.00 C4A C -ATOM 138 C2 C4A A 35 21.021 25.000 25.000 1.00 0.00 C4A C -ATOM 139 C3 C4A A 35 22.574 25.000 23.022 1.00 0.00 C4A C -ATOM 140 C4 C4A A 35 22.674 24.776 21.502 1.00 0.00 C4A C -ATOM 141 C1 C4A A 36 23.220 6.566 14.143 1.00 0.00 C4A C -ATOM 142 C2 C4A A 36 23.311 5.064 14.469 1.00 0.00 C4A C -ATOM 143 C3 C4A A 36 22.278 7.253 15.149 1.00 0.00 C4A C -ATOM 144 C4 C4A A 36 22.186 8.756 14.823 1.00 0.00 C4A C -ATOM 145 C1 C4A A 37 17.646 20.114 13.755 1.00 0.00 C4A C -ATOM 146 C2 C4A A 37 18.862 19.668 14.587 1.00 0.00 C4A C -ATOM 147 C3 C4A A 37 17.301 21.576 14.092 1.00 0.00 C4A C -ATOM 148 C4 C4A A 37 16.084 22.022 13.260 1.00 0.00 C4A C -ATOM 149 C1 C4A A 38 4.003 22.864 3.797 1.00 0.00 C4A C -ATOM 150 C2 C4A A 38 3.806 21.561 3.000 1.00 0.00 C4A C -ATOM 151 C3 C4A A 38 4.981 22.612 4.959 1.00 0.00 C4A C -ATOM 152 C4 C4A A 38 5.179 23.914 5.756 1.00 0.00 C4A C -ATOM 153 C1 C4A A 39 20.700 14.223 7.901 1.00 0.00 C4A C -ATOM 154 C2 C4A A 39 19.190 14.424 7.677 1.00 0.00 C4A C -ATOM 155 C3 C4A A 39 21.470 14.681 6.648 1.00 0.00 C4A C -ATOM 156 C4 C4A A 39 22.980 14.480 6.871 1.00 0.00 C4A C -ATOM 157 C1 C4A A 40 10.636 25.000 13.519 1.00 0.00 C4A C -ATOM 158 C2 C4A A 40 10.863 24.529 14.967 1.00 0.00 C4A C -ATOM 159 C3 C4A A 40 9.297 24.443 13.002 1.00 0.00 C4A C -ATOM 160 C4 C4A A 40 9.069 24.914 11.553 1.00 0.00 C4A C -ATOM 161 C1 C4A A 41 23.734 19.437 10.956 1.00 0.00 C4A C -ATOM 162 C2 C4A A 41 24.135 18.257 10.052 1.00 0.00 C4A C -ATOM 163 C3 C4A A 41 25.000 20.083 11.549 1.00 0.00 C4A C -ATOM 164 C4 C4A A 41 24.600 21.263 12.453 1.00 0.00 C4A C -ATOM 165 C1 C4A A 42 16.948 18.279 25.000 1.00 0.00 C4A C -ATOM 166 C2 C4A A 42 15.412 18.357 24.946 1.00 0.00 C4A C -ATOM 167 C3 C4A A 42 17.537 19.701 24.941 1.00 0.00 C4A C -ATOM 168 C4 C4A A 42 19.074 19.623 24.995 1.00 0.00 C4A C -ATOM 169 C1 C4A A 43 12.362 23.133 22.470 1.00 0.00 C4A C -ATOM 170 C2 C4A A 43 12.682 24.613 22.196 1.00 0.00 C4A C -ATOM 171 C3 C4A A 43 11.156 22.700 21.615 1.00 0.00 C4A C -ATOM 172 C4 C4A A 43 10.836 21.219 21.889 1.00 0.00 C4A C -ATOM 173 C1 C4A A 44 4.939 25.000 14.331 1.00 0.00 C4A C -ATOM 174 C2 C4A A 44 3.634 24.391 14.875 1.00 0.00 C4A C -ATOM 175 C3 C4A A 44 5.255 24.391 12.952 1.00 0.00 C4A C -ATOM 176 C4 C4A A 44 6.560 25.000 12.408 1.00 0.00 C4A C -ATOM 177 C1 C4A A 45 11.404 9.241 14.139 1.00 0.00 C4A C -ATOM 178 C2 C4A A 45 10.144 9.912 14.716 1.00 0.00 C4A C -ATOM 179 C3 C4A A 45 12.285 10.305 13.458 1.00 0.00 C4A C -ATOM 180 C4 C4A A 45 13.546 9.635 12.881 1.00 0.00 C4A C -ATOM 181 C1 C4A A 46 7.154 12.174 10.831 1.00 0.00 C4A C -ATOM 182 C2 C4A A 46 8.215 13.196 11.278 1.00 0.00 C4A C -ATOM 183 C3 C4A A 46 6.693 12.505 9.399 1.00 0.00 C4A C -ATOM 184 C4 C4A A 46 5.632 11.484 8.951 1.00 0.00 C4A C -ATOM 185 C1 C4A A 47 3.815 19.502 7.630 1.00 0.00 C4A C -ATOM 186 C2 C4A A 47 4.314 19.191 6.207 1.00 0.00 C4A C -ATOM 187 C3 C4A A 47 3.550 21.013 7.762 1.00 0.00 C4A C -ATOM 188 C4 C4A A 47 3.052 21.325 9.185 1.00 0.00 C4A C -ATOM 189 C1 C4A A 48 14.585 19.351 6.629 1.00 0.00 C4A C -ATOM 190 C2 C4A A 48 13.235 19.798 7.221 1.00 0.00 C4A C -ATOM 191 C3 C4A A 48 14.545 19.490 5.096 1.00 0.00 C4A C -ATOM 192 C4 C4A A 48 15.894 19.044 4.504 1.00 0.00 C4A C -ATOM 193 C1 C4A A 49 14.623 23.739 14.683 1.00 0.00 C4A C -ATOM 194 C2 C4A A 49 15.279 25.000 14.091 1.00 0.00 C4A C -ATOM 195 C3 C4A A 49 13.130 23.711 14.304 1.00 0.00 C4A C -ATOM 196 C4 C4A A 49 12.474 22.450 14.896 1.00 0.00 C4A C -ATOM 197 C1 C4A A 50 10.018 10.735 4.522 1.00 0.00 C4A C -ATOM 198 C2 C4A A 50 9.858 10.900 3.000 1.00 0.00 C4A C -ATOM 199 C3 C4A A 50 9.607 9.308 4.929 1.00 0.00 C4A C -ATOM 200 C4 C4A A 50 9.767 9.141 6.452 1.00 0.00 C4A C -ATOM 201 C1 C4A A 51 21.237 19.409 3.000 1.00 0.00 C4A C -ATOM 202 C2 C4A A 51 22.528 19.298 3.831 1.00 0.00 C4A C -ATOM 203 C3 C4A A 51 20.036 18.966 3.856 1.00 0.00 C4A C -ATOM 204 C4 C4A A 51 18.744 19.077 3.025 1.00 0.00 C4A C -ATOM 205 C1 C4A A 52 23.539 17.590 17.330 1.00 0.00 C4A C -ATOM 206 C2 C4A A 52 23.321 18.478 18.569 1.00 0.00 C4A C -ATOM 207 C3 C4A A 52 24.771 18.088 16.552 1.00 0.00 C4A C -ATOM 208 C4 C4A A 52 24.990 17.201 15.312 1.00 0.00 C4A C -ATOM 209 C1 C4A A 53 20.045 12.889 15.683 1.00 0.00 C4A C -ATOM 210 C2 C4A A 53 19.223 13.233 16.938 1.00 0.00 C4A C -ATOM 211 C3 C4A A 53 20.476 11.412 15.739 1.00 0.00 C4A C -ATOM 212 C4 C4A A 53 21.299 11.068 14.484 1.00 0.00 C4A C -ATOM 213 C1 C4A A 54 5.335 13.656 7.583 1.00 0.00 C4A C -ATOM 214 C2 C4A A 54 5.507 12.690 6.397 1.00 0.00 C4A C -ATOM 215 C3 C4A A 54 6.446 14.722 7.542 1.00 0.00 C4A C -ATOM 216 C4 C4A A 54 6.275 15.689 8.729 1.00 0.00 C4A C -ATOM 217 C1 C4A A 55 4.883 10.276 3.000 1.00 0.00 C4A C -ATOM 218 C2 C4A A 55 4.728 8.745 3.005 1.00 0.00 C4A C -ATOM 219 C3 C4A A 55 3.495 10.933 3.105 1.00 0.00 C4A C -ATOM 220 C4 C4A A 55 3.649 12.466 3.101 1.00 0.00 C4A C -ATOM 221 C1 C4A A 56 24.668 10.251 11.597 1.00 0.00 C4A C -ATOM 222 C2 C4A A 56 23.899 9.633 10.415 1.00 0.00 C4A C -ATOM 223 C3 C4A A 56 24.232 11.716 11.783 1.00 0.00 C4A C -ATOM 224 C4 C4A A 56 25.000 12.335 12.965 1.00 0.00 C4A C -ATOM 225 C1 C4A A 57 3.000 10.045 12.598 1.00 0.00 C4A C -ATOM 226 C2 C4A A 57 3.125 8.785 11.723 1.00 0.00 C4A C -ATOM 227 C3 C4A A 57 3.125 11.300 11.713 1.00 0.00 C4A C -ATOM 228 C4 C4A A 57 3.000 12.561 12.588 1.00 0.00 C4A C -ATOM 229 C1 C4A A 58 4.807 13.074 10.938 1.00 0.00 C4A C -ATOM 230 C2 C4A A 58 5.478 14.260 11.654 1.00 0.00 C4A C -ATOM 231 C3 C4A A 58 3.725 13.600 9.976 1.00 0.00 C4A C -ATOM 232 C4 C4A A 58 3.054 12.414 9.260 1.00 0.00 C4A C -ATOM 233 C1 C4A A 59 19.703 10.886 24.326 1.00 0.00 C4A C -ATOM 234 C2 C4A A 59 18.242 10.863 24.809 1.00 0.00 C4A C -ATOM 235 C3 C4A A 59 20.448 12.053 25.000 1.00 0.00 C4A C -ATOM 236 C4 C4A A 59 21.910 12.078 24.517 1.00 0.00 C4A C -ATOM 237 C1 C4A A 60 7.001 23.367 10.057 1.00 0.00 C4A C -ATOM 238 C2 C4A A 60 7.651 22.861 11.357 1.00 0.00 C4A C -ATOM 239 C3 C4A A 60 5.783 22.488 9.715 1.00 0.00 C4A C -ATOM 240 C4 C4A A 60 5.132 22.994 8.415 1.00 0.00 C4A C -ATOM 241 C1 C4A A 61 10.767 18.672 10.030 1.00 0.00 C4A C -ATOM 242 C2 C4A A 61 10.881 18.462 8.509 1.00 0.00 C4A C -ATOM 243 C3 C4A A 61 11.881 17.884 10.743 1.00 0.00 C4A C -ATOM 244 C4 C4A A 61 11.767 18.094 12.264 1.00 0.00 C4A C -ATOM 245 C1 C4A A 62 14.802 13.869 14.546 1.00 0.00 C4A C -ATOM 246 C2 C4A A 62 13.912 13.314 15.673 1.00 0.00 C4A C -ATOM 247 C3 C4A A 62 14.463 15.352 14.308 1.00 0.00 C4A C -ATOM 248 C4 C4A A 62 15.353 15.908 13.181 1.00 0.00 C4A C -ATOM 249 C1 C4A A 63 24.944 7.873 16.774 1.00 0.00 C4A C -ATOM 250 C2 C4A A 63 25.000 9.071 15.809 1.00 0.00 C4A C -ATOM 251 C3 C4A A 63 25.000 6.561 15.969 1.00 0.00 C4A C -ATOM 252 C4 C4A A 63 24.944 5.363 16.934 1.00 0.00 C4A C -ATOM 253 C1 C4A A 64 3.000 16.446 19.796 1.00 0.00 C4A C -ATOM 254 C2 C4A A 64 3.102 17.433 18.620 1.00 0.00 C4A C -ATOM 255 C3 C4A A 64 3.201 17.203 21.122 1.00 0.00 C4A C -ATOM 256 C4 C4A A 64 3.099 16.215 22.299 1.00 0.00 C4A C -ATOM 257 C1 C4A A 65 12.536 23.853 4.883 1.00 0.00 C4A C -ATOM 258 C2 C4A A 65 12.867 24.053 6.373 1.00 0.00 C4A C -ATOM 259 C3 C4A A 65 12.795 22.386 4.492 1.00 0.00 C4A C -ATOM 260 C4 C4A A 65 12.465 22.185 3.002 1.00 0.00 C4A C -ATOM 261 C1 C4A A 66 10.398 3.227 8.443 1.00 0.00 C4A C -ATOM 262 C2 C4A A 66 9.305 3.000 9.503 1.00 0.00 C4A C -ATOM 263 C3 C4A A 66 10.370 4.696 7.982 1.00 0.00 C4A C -ATOM 264 C4 C4A A 66 11.463 4.923 6.922 1.00 0.00 C4A C -ATOM 265 C1 C4A A 67 24.425 14.389 8.912 1.00 0.00 C4A C -ATOM 266 C2 C4A A 67 25.000 15.733 9.396 1.00 0.00 C4A C -ATOM 267 C3 C4A A 67 25.000 13.246 9.769 1.00 0.00 C4A C -ATOM 268 C4 C4A A 67 24.426 11.902 9.286 1.00 0.00 C4A C -ATOM 269 C1 C4A A 68 19.322 6.042 10.365 1.00 0.00 C4A C -ATOM 270 C2 C4A A 68 18.532 4.936 11.089 1.00 0.00 C4A C -ATOM 271 C3 C4A A 68 18.398 7.247 10.108 1.00 0.00 C4A C -ATOM 272 C4 C4A A 68 19.187 8.354 9.384 1.00 0.00 C4A C -ATOM 273 C1 C4A A 69 5.575 4.693 18.576 1.00 0.00 C4A C -ATOM 274 C2 C4A A 69 5.389 5.182 20.024 1.00 0.00 C4A C -ATOM 275 C3 C4A A 69 7.076 4.512 18.284 1.00 0.00 C4A C -ATOM 276 C4 C4A A 69 7.263 4.023 16.836 1.00 0.00 C4A C -ATOM 277 C1 C4A A 70 14.630 16.568 7.169 1.00 0.00 C4A C -ATOM 278 C2 C4A A 70 13.499 17.255 7.956 1.00 0.00 C4A C -ATOM 279 C3 C4A A 70 14.081 16.055 5.824 1.00 0.00 C4A C -ATOM 280 C4 C4A A 70 15.211 15.367 5.036 1.00 0.00 C4A C -ATOM 281 C1 C4A A 71 9.312 12.470 15.334 1.00 0.00 C4A C -ATOM 282 C2 C4A A 71 10.170 13.599 14.734 1.00 0.00 C4A C -ATOM 283 C3 C4A A 71 8.272 13.072 16.297 1.00 0.00 C4A C -ATOM 284 C4 C4A A 71 7.414 11.943 16.897 1.00 0.00 C4A C -ATOM 285 C1 C4A A 72 7.528 13.298 4.193 1.00 0.00 C4A C -ATOM 286 C2 C4A A 72 6.267 12.430 4.029 1.00 0.00 C4A C -ATOM 287 C3 C4A A 72 8.508 13.004 3.043 1.00 0.00 C4A C -ATOM 288 C4 C4A A 72 9.769 13.872 3.206 1.00 0.00 C4A C -ATOM 289 C1 C4A A 73 7.640 16.959 15.334 1.00 0.00 C4A C -ATOM 290 C2 C4A A 73 6.474 17.691 16.024 1.00 0.00 C4A C -ATOM 291 C3 C4A A 73 8.851 17.904 15.232 1.00 0.00 C4A C -ATOM 292 C4 C4A A 73 10.017 17.173 14.541 1.00 0.00 C4A C -ATOM 293 C1 C4A A 74 13.698 3.000 6.316 1.00 0.00 C4A C -ATOM 294 C2 C4A A 74 12.610 3.167 5.239 1.00 0.00 C4A C -ATOM 295 C3 C4A A 74 13.071 3.179 7.711 1.00 0.00 C4A C -ATOM 296 C4 C4A A 74 14.158 3.012 8.789 1.00 0.00 C4A C -ATOM 297 C1 C4A A 75 15.268 3.669 13.165 1.00 0.00 C4A C -ATOM 298 C2 C4A A 75 15.545 3.000 11.807 1.00 0.00 C4A C -ATOM 299 C3 C4A A 75 16.200 3.067 14.233 1.00 0.00 C4A C -ATOM 300 C4 C4A A 75 15.924 3.735 15.593 1.00 0.00 C4A C -ATOM 301 C1 C4A A 76 17.248 14.918 23.229 1.00 0.00 C4A C -ATOM 302 C2 C4A A 76 16.069 14.240 22.506 1.00 0.00 C4A C -ATOM 303 C3 C4A A 76 17.832 13.953 24.277 1.00 0.00 C4A C -ATOM 304 C4 C4A A 76 19.010 14.631 25.000 1.00 0.00 C4A C -ATOM 305 C1 C4A A 77 8.032 16.717 22.707 1.00 0.00 C4A C -ATOM 306 C2 C4A A 77 9.366 16.008 22.408 1.00 0.00 C4A C -ATOM 307 C3 C4A A 77 6.869 15.725 22.517 1.00 0.00 C4A C -ATOM 308 C4 C4A A 77 5.535 16.434 22.816 1.00 0.00 C4A C -ATOM 309 C1 C4A A 78 6.077 9.508 12.576 1.00 0.00 C4A C -ATOM 310 C2 C4A A 78 5.351 10.202 11.409 1.00 0.00 C4A C -ATOM 311 C3 C4A A 78 5.041 9.006 13.599 1.00 0.00 C4A C -ATOM 312 C4 C4A A 78 5.767 8.312 14.767 1.00 0.00 C4A C -ATOM 313 C1 C4A A 79 14.592 12.815 6.357 1.00 0.00 C4A C -ATOM 314 C2 C4A A 79 14.428 11.596 5.432 1.00 0.00 C4A C -ATOM 315 C3 C4A A 79 13.316 12.997 7.199 1.00 0.00 C4A C -ATOM 316 C4 C4A A 79 13.479 14.216 8.125 1.00 0.00 C4A C -ATOM 317 C1 C4A A 80 5.882 17.400 5.440 1.00 0.00 C4A C -ATOM 318 C2 C4A A 80 6.876 18.568 5.298 1.00 0.00 C4A C -ATOM 319 C3 C4A A 80 6.581 16.082 5.060 1.00 0.00 C4A C -ATOM 320 C4 C4A A 80 5.587 14.914 5.202 1.00 0.00 C4A C -ATOM 321 C1 C4A A 81 3.519 8.147 5.879 1.00 0.00 C4A C -ATOM 322 C2 C4A A 81 3.028 9.127 4.797 1.00 0.00 C4A C -ATOM 323 C3 C4A A 81 3.000 8.601 7.256 1.00 0.00 C4A C -ATOM 324 C4 C4A A 81 3.490 7.622 8.339 1.00 0.00 C4A C -ATOM 325 C1 C4A A 82 15.672 19.018 9.109 1.00 0.00 C4A C -ATOM 326 C2 C4A A 82 16.612 18.287 8.134 1.00 0.00 C4A C -ATOM 327 C3 C4A A 82 16.470 20.070 9.902 1.00 0.00 C4A C -ATOM 328 C4 C4A A 82 15.529 20.801 10.877 1.00 0.00 C4A C -ATOM 329 C1 C4A A 83 24.839 13.332 4.470 1.00 0.00 C4A C -ATOM 330 C2 C4A A 83 25.000 14.172 3.190 1.00 0.00 C4A C -ATOM 331 C3 C4A A 83 25.002 11.839 4.127 1.00 0.00 C4A C -ATOM 332 C4 C4A A 83 24.841 10.998 5.407 1.00 0.00 C4A C -ATOM 333 C1 C4A A 84 20.725 21.975 15.314 1.00 0.00 C4A C -ATOM 334 C2 C4A A 84 21.313 22.627 14.049 1.00 0.00 C4A C -ATOM 335 C3 C4A A 84 21.422 20.626 15.567 1.00 0.00 C4A C -ATOM 336 C4 C4A A 84 20.835 19.973 16.832 1.00 0.00 C4A C -ATOM 337 C1 C4A A 85 5.424 23.970 22.430 1.00 0.00 C4A C -ATOM 338 C2 C4A A 85 6.437 25.000 21.897 1.00 0.00 C4A C -ATOM 339 C3 C4A A 85 4.014 24.588 22.429 1.00 0.00 C4A C -ATOM 340 C4 C4A A 85 3.000 23.559 22.961 1.00 0.00 C4A C -ATOM 341 C1 C4A A 86 3.000 17.501 4.915 1.00 0.00 C4A C -ATOM 342 C2 C4A A 86 3.627 16.366 5.744 1.00 0.00 C4A C -ATOM 343 C3 C4A A 86 3.996 17.955 3.831 1.00 0.00 C4A C -ATOM 344 C4 C4A A 86 3.370 19.091 3.001 1.00 0.00 C4A C -ATOM 345 C1 C4A A 87 7.247 11.909 21.720 1.00 0.00 C4A C -ATOM 346 C2 C4A A 87 8.579 12.138 22.457 1.00 0.00 C4A C -ATOM 347 C3 C4A A 87 6.169 11.475 22.730 1.00 0.00 C4A C -ATOM 348 C4 C4A A 87 4.836 11.247 21.994 1.00 0.00 C4A C -ATOM 349 C1 C4A A 88 7.137 9.025 6.020 1.00 0.00 C4A C -ATOM 350 C2 C4A A 88 7.853 7.685 5.767 1.00 0.00 C4A C -ATOM 351 C3 C4A A 88 5.813 9.055 5.236 1.00 0.00 C4A C -ATOM 352 C4 C4A A 88 5.096 10.394 5.488 1.00 0.00 C4A C -ATOM 353 C1 C4A A 89 22.719 15.893 10.406 1.00 0.00 C4A C -ATOM 354 C2 C4A A 89 22.733 14.428 10.879 1.00 0.00 C4A C -ATOM 355 C3 C4A A 89 22.465 15.940 8.888 1.00 0.00 C4A C -ATOM 356 C4 C4A A 89 22.450 17.405 8.414 1.00 0.00 C4A C -ATOM 357 C1 C4A A 90 19.080 4.120 16.047 1.00 0.00 C4A C -ATOM 358 C2 C4A A 90 18.843 3.000 15.018 1.00 0.00 C4A C -ATOM 359 C3 C4A A 90 20.442 4.785 15.778 1.00 0.00 C4A C -ATOM 360 C4 C4A A 90 20.680 5.906 16.807 1.00 0.00 C4A C -ATOM 361 C1 C4A A 91 17.645 17.143 21.183 1.00 0.00 C4A C -ATOM 362 C2 C4A A 91 16.989 17.315 22.565 1.00 0.00 C4A C -ATOM 363 C3 C4A A 91 17.990 15.659 20.959 1.00 0.00 C4A C -ATOM 364 C4 C4A A 91 18.647 15.486 19.577 1.00 0.00 C4A C -ATOM 365 C1 C4A A 92 7.044 5.985 14.946 1.00 0.00 C4A C -ATOM 366 C2 C4A A 92 7.034 6.719 16.299 1.00 0.00 C4A C -ATOM 367 C3 C4A A 92 8.436 5.370 14.706 1.00 0.00 C4A C -ATOM 368 C4 C4A A 92 8.447 4.636 13.353 1.00 0.00 C4A C -ATOM 369 C1 C4A A 93 4.437 13.022 23.708 1.00 0.00 C4A C -ATOM 370 C2 C4A A 93 4.508 12.187 25.000 1.00 0.00 C4A C -ATOM 371 C3 C4A A 93 3.071 12.806 23.031 1.00 0.00 C4A C -ATOM 372 C4 C4A A 93 3.000 13.641 21.739 1.00 0.00 C4A C -ATOM 373 C1 C4A A 94 15.218 3.743 23.853 1.00 0.00 C4A C -ATOM 374 C2 C4A A 94 13.957 3.034 23.328 1.00 0.00 C4A C -ATOM 375 C3 C4A A 94 16.471 3.009 23.340 1.00 0.00 C4A C -ATOM 376 C4 C4A A 94 17.734 3.718 23.864 1.00 0.00 C4A C -ATOM 377 C1 C4A A 95 24.968 20.332 18.051 1.00 0.00 C4A C -ATOM 378 C2 C4A A 95 24.999 20.822 16.592 1.00 0.00 C4A C -ATOM 379 C3 C4A A 95 24.998 21.544 19.000 1.00 0.00 C4A C -ATOM 380 C4 C4A A 95 24.967 21.055 20.460 1.00 0.00 C4A C -ATOM 381 C1 C4A A 96 14.928 22.932 21.645 1.00 0.00 C4A C -ATOM 382 C2 C4A A 96 14.261 22.570 20.305 1.00 0.00 C4A C -ATOM 383 C3 C4A A 96 15.939 21.835 22.028 1.00 0.00 C4A C -ATOM 384 C4 C4A A 96 16.607 22.197 23.367 1.00 0.00 C4A C -ATOM 385 C1 C4A A 97 22.014 3.610 8.892 1.00 0.00 C4A C -ATOM 386 C2 C4A A 97 20.633 2.998 9.189 1.00 0.00 C4A C -ATOM 387 C3 C4A A 97 22.106 5.007 9.533 1.00 0.00 C4A C -ATOM 388 C4 C4A A 97 23.487 5.620 9.236 1.00 0.00 C4A C -ATOM 389 C1 C4A A 98 18.599 11.755 3.403 1.00 0.00 C4A C -ATOM 390 C2 C4A A 98 20.025 12.171 3.000 1.00 0.00 C4A C -ATOM 391 C3 C4A A 98 18.639 11.034 4.763 1.00 0.00 C4A C -ATOM 392 C4 C4A A 98 17.213 10.617 5.167 1.00 0.00 C4A C -ATOM 393 C1 C4A A 99 21.436 9.102 19.097 1.00 0.00 C4A C -ATOM 394 C2 C4A A 99 21.028 9.288 20.570 1.00 0.00 C4A C -ATOM 395 C3 C4A A 99 20.179 9.138 18.207 1.00 0.00 C4A C -ATOM 396 C4 C4A A 99 20.586 8.952 16.734 1.00 0.00 C4A C -ATOM 397 C1 C4A A 100 9.022 11.304 9.262 1.00 0.00 C4A C -ATOM 398 C2 C4A A 100 9.089 9.854 8.750 1.00 0.00 C4A C -ATOM 399 C3 C4A A 100 9.851 12.214 8.336 1.00 0.00 C4A C -ATOM 400 C4 C4A A 100 9.785 13.665 8.847 1.00 0.00 C4A C -ATOM 401 C1 C4A A 101 21.897 13.528 14.130 1.00 0.00 C4A C -ATOM 402 C2 C4A A 101 20.752 13.130 13.181 1.00 0.00 C4A C -ATOM 403 C3 C4A A 101 23.125 13.953 13.303 1.00 0.00 C4A C -ATOM 404 C4 C4A A 101 24.271 14.351 14.251 1.00 0.00 C4A C -ATOM 405 C1 C4A A 102 22.340 11.228 3.040 1.00 0.00 C4A C -ATOM 406 C2 C4A A 102 22.924 12.652 3.000 1.00 0.00 C4A C -ATOM 407 C3 C4A A 102 23.488 10.202 2.998 1.00 0.00 C4A C -ATOM 408 C4 C4A A 102 22.905 8.777 3.038 1.00 0.00 C4A C -ATOM 409 C1 C4A A 103 10.015 19.112 19.386 1.00 0.00 C4A C -ATOM 410 C2 C4A A 103 8.606 19.262 19.988 1.00 0.00 C4A C -ATOM 411 C3 C4A A 103 10.946 18.449 20.418 1.00 0.00 C4A C -ATOM 412 C4 C4A A 103 12.356 18.299 19.817 1.00 0.00 C4A C -ATOM 413 C1 C4A A 104 16.397 24.645 22.906 1.00 0.00 C4A C -ATOM 414 C2 C4A A 104 16.313 25.000 21.410 1.00 0.00 C4A C -ATOM 415 C3 C4A A 104 14.979 24.602 23.504 1.00 0.00 C4A C -ATOM 416 C4 C4A A 104 15.062 24.247 25.000 1.00 0.00 C4A C -ATOM 417 C1 C4A A 105 8.154 15.542 24.917 1.00 0.00 C4A C -ATOM 418 C2 C4A A 105 6.668 15.937 25.000 1.00 0.00 C4A C -ATOM 419 C3 C4A A 105 9.028 16.807 24.999 1.00 0.00 C4A C -ATOM 420 C4 C4A A 105 10.514 16.413 24.916 1.00 0.00 C4A C -ATOM 421 C1 C4A A 106 21.624 9.213 12.103 1.00 0.00 C4A C -ATOM 422 C2 C4A A 106 21.171 10.660 11.833 1.00 0.00 C4A C -ATOM 423 C3 C4A A 106 21.328 8.343 10.868 1.00 0.00 C4A C -ATOM 424 C4 C4A A 106 21.780 6.896 11.138 1.00 0.00 C4A C -ATOM 425 C1 C4A A 107 12.133 18.899 14.861 1.00 0.00 C4A C -ATOM 426 C2 C4A A 107 11.518 20.093 14.107 1.00 0.00 C4A C -ATOM 427 C3 C4A A 107 12.924 19.413 16.078 1.00 0.00 C4A C -ATOM 428 C4 C4A A 107 13.539 18.219 16.832 1.00 0.00 C4A C -ATOM 429 C1 C4A A 108 8.637 14.113 18.815 1.00 0.00 C4A C -ATOM 430 C2 C4A A 108 7.779 12.994 19.433 1.00 0.00 C4A C -ATOM 431 C3 C4A A 108 8.767 15.274 19.818 1.00 0.00 C4A C -ATOM 432 C4 C4A A 108 9.625 16.394 19.201 1.00 0.00 C4A C -ATOM 433 C1 C4A A 109 12.725 14.552 18.977 1.00 0.00 C4A C -ATOM 434 C2 C4A A 109 12.198 15.912 18.483 1.00 0.00 C4A C -ATOM 435 C3 C4A A 109 11.935 13.418 18.297 1.00 0.00 C4A C -ATOM 436 C4 C4A A 109 12.462 12.057 18.791 1.00 0.00 C4A C -ATOM 437 C1 C4A A 110 12.426 7.833 3.808 1.00 0.00 C4A C -ATOM 438 C2 C4A A 110 11.560 8.817 3.000 1.00 0.00 C4A C -ATOM 439 C3 C4A A 110 12.100 6.391 3.379 1.00 0.00 C4A C -ATOM 440 C4 C4A A 110 12.965 5.406 4.187 1.00 0.00 C4A C -ATOM 441 C1 C4A A 111 16.774 10.597 13.226 1.00 0.00 C4A C -ATOM 442 C2 C4A A 111 15.521 11.387 13.644 1.00 0.00 C4A C -ATOM 443 C3 C4A A 111 16.657 10.193 11.744 1.00 0.00 C4A C -ATOM 444 C4 C4A A 111 17.910 9.403 11.325 1.00 0.00 C4A C -ATOM 445 C1 C4A A 112 21.863 22.249 10.476 1.00 0.00 C4A C -ATOM 446 C2 C4A A 112 22.211 21.731 11.883 1.00 0.00 C4A C -ATOM 447 C3 C4A A 112 20.597 21.536 9.965 1.00 0.00 C4A C -ATOM 448 C4 C4A A 112 20.248 22.054 8.557 1.00 0.00 C4A C -ATOM 449 C1 C4A A 113 20.309 5.479 6.034 1.00 0.00 C4A C -ATOM 450 C2 C4A A 113 21.409 5.125 5.017 1.00 0.00 C4A C -ATOM 451 C3 C4A A 113 20.316 4.449 7.178 1.00 0.00 C4A C -ATOM 452 C4 C4A A 113 19.217 4.803 8.196 1.00 0.00 C4A C -ATOM 453 C1 C4A A 114 25.000 14.261 22.223 1.00 0.00 C4A C -ATOM 454 C2 C4A A 114 24.415 15.599 21.736 1.00 0.00 C4A C -ATOM 455 C3 C4A A 114 23.897 13.186 22.219 1.00 0.00 C4A C -ATOM 456 C4 C4A A 114 24.481 11.847 22.706 1.00 0.00 C4A C -ATOM 457 C1 C4A A 115 18.068 21.235 7.644 1.00 0.00 C4A C -ATOM 458 C2 C4A A 115 17.164 22.314 8.269 1.00 0.00 C4A C -ATOM 459 C3 C4A A 115 17.216 20.294 6.771 1.00 0.00 C4A C -ATOM 460 C4 C4A A 115 18.119 19.215 6.146 1.00 0.00 C4A C -ATOM 461 C1 C4A A 116 23.275 6.665 21.822 1.00 0.00 C4A C -ATOM 462 C2 C4A A 116 23.056 7.413 20.494 1.00 0.00 C4A C -ATOM 463 C3 C4A A 116 24.780 6.626 22.147 1.00 0.00 C4A C -ATOM 464 C4 C4A A 116 25.000 5.878 23.475 1.00 0.00 C4A C -ATOM 465 C1 C4A A 117 16.588 5.805 24.641 1.00 0.00 C4A C -ATOM 466 C2 C4A A 117 17.755 6.224 23.729 1.00 0.00 C4A C -ATOM 467 C3 C4A A 117 15.272 6.382 24.088 1.00 0.00 C4A C -ATOM 468 C4 C4A A 117 14.103 5.963 25.000 1.00 0.00 C4A C -ATOM 469 C1 C4A A 118 11.522 15.469 13.007 1.00 0.00 C4A C -ATOM 470 C2 C4A A 118 12.818 15.563 12.181 1.00 0.00 C4A C -ATOM 471 C3 C4A A 118 10.314 15.363 12.057 1.00 0.00 C4A C -ATOM 472 C4 C4A A 118 9.018 15.269 12.883 1.00 0.00 C4A C -ATOM 473 C1 C4A A 119 16.372 21.869 17.326 1.00 0.00 C4A C -ATOM 474 C2 C4A A 119 15.794 23.283 17.133 1.00 0.00 C4A C -ATOM 475 C3 C4A A 119 17.793 21.811 16.735 1.00 0.00 C4A C -ATOM 476 C4 C4A A 119 18.373 20.398 16.928 1.00 0.00 C4A C -ATOM 477 C1 C4A A 120 16.429 10.856 18.037 1.00 0.00 C4A C -ATOM 478 C2 C4A A 120 17.919 10.538 17.816 1.00 0.00 C4A C -ATOM 479 C3 C4A A 120 15.620 9.546 18.049 1.00 0.00 C4A C -ATOM 480 C4 C4A A 120 14.130 9.863 18.270 1.00 0.00 C4A C -ATOM 481 C1 C4A A 121 11.131 4.610 14.583 1.00 0.00 C4A C -ATOM 482 C2 C4A A 121 12.371 5.132 15.331 1.00 0.00 C4A C -ATOM 483 C3 C4A A 121 11.558 3.523 13.578 1.00 0.00 C4A C -ATOM 484 C4 C4A A 121 10.318 3.000 12.829 1.00 0.00 C4A C -ATOM 485 C1 C4A A 122 10.024 21.418 25.000 1.00 0.00 C4A C -ATOM 486 C2 C4A A 122 11.203 20.440 24.840 1.00 0.00 C4A C -ATOM 487 C3 C4A A 122 10.280 22.674 24.147 1.00 0.00 C4A C -ATOM 488 C4 C4A A 122 9.102 23.653 24.306 1.00 0.00 C4A C -ATOM 489 C1 C4A A 123 14.680 12.300 3.040 1.00 0.00 C4A C -ATOM 490 C2 C4A A 123 15.915 11.383 3.110 1.00 0.00 C4A C -ATOM 491 C3 C4A A 123 13.401 11.443 3.070 1.00 0.00 C4A C -ATOM 492 C4 C4A A 123 12.166 12.359 3.000 1.00 0.00 C4A C -ATOM 493 C1 C4A A 124 17.505 3.587 6.840 1.00 0.00 C4A C -ATOM 494 C2 C4A A 124 16.040 3.237 7.158 1.00 0.00 C4A C -ATOM 495 C3 C4A A 124 17.889 2.994 5.472 1.00 0.00 C4A C -ATOM 496 C4 C4A A 124 19.354 3.344 5.153 1.00 0.00 C4A C -ATOM 497 C1 C4A A 125 17.691 21.734 19.656 1.00 0.00 C4A C -ATOM 498 C2 C4A A 125 16.784 22.943 19.951 1.00 0.00 C4A C -ATOM 499 C3 C4A A 125 16.884 20.433 19.821 1.00 0.00 C4A C -ATOM 500 C4 C4A A 125 17.790 19.224 19.526 1.00 0.00 C4A C -ATOM 501 C1 C4A A 126 21.070 17.291 16.312 1.00 0.00 C4A C -ATOM 502 C2 C4A A 126 21.854 18.126 15.283 1.00 0.00 C4A C -ATOM 503 C3 C4A A 126 19.561 17.533 16.126 1.00 0.00 C4A C -ATOM 504 C4 C4A A 126 18.776 16.697 17.155 1.00 0.00 C4A C -ATOM 505 C1 C4A A 127 15.796 10.894 23.757 1.00 0.00 C4A C -ATOM 506 C2 C4A A 127 15.199 11.911 22.767 1.00 0.00 C4A C -ATOM 507 C3 C4A A 127 14.780 9.766 24.010 1.00 0.00 C4A C -ATOM 508 C4 C4A A 127 15.376 8.748 25.000 1.00 0.00 C4A C -ATOM 509 C1 C4A A 128 6.194 8.573 21.894 1.00 0.00 C4A C -ATOM 510 C2 C4A A 128 5.382 9.028 20.667 1.00 0.00 C4A C -ATOM 511 C3 C4A A 128 7.374 7.697 21.432 1.00 0.00 C4A C -ATOM 512 C4 C4A A 128 8.187 7.242 22.658 1.00 0.00 C4A C -ATOM 513 C1 C4A A 129 24.990 5.951 11.206 1.00 0.00 C4A C -ATOM 514 C2 C4A A 129 24.999 7.485 11.067 1.00 0.00 C4A C -ATOM 515 C3 C4A A 129 25.002 5.571 12.698 1.00 0.00 C4A C -ATOM 516 C4 C4A A 129 24.992 4.038 12.839 1.00 0.00 C4A C -ATOM 517 C1 C4A A 130 3.013 9.159 21.703 1.00 0.00 C4A C -ATOM 518 C2 C4A A 130 3.000 9.914 23.045 1.00 0.00 C4A C -ATOM 519 C3 C4A A 130 3.000 10.173 20.544 1.00 0.00 C4A C -ATOM 520 C4 C4A A 130 3.013 9.418 19.201 1.00 0.00 C4A C -ATOM 521 C1 C4A A 131 9.666 10.298 20.557 1.00 0.00 C4A C -ATOM 522 C2 C4A A 131 8.459 10.284 19.600 1.00 0.00 C4A C -ATOM 523 C3 C4A A 131 9.428 9.291 21.698 1.00 0.00 C4A C -ATOM 524 C4 C4A A 131 10.634 9.304 22.655 1.00 0.00 C4A C -ATOM 525 C1 C4A A 132 10.433 4.542 23.862 1.00 0.00 C4A C -ATOM 526 C2 C4A A 132 10.689 3.321 22.960 1.00 0.00 C4A C -ATOM 527 C3 C4A A 132 11.754 5.301 24.086 1.00 0.00 C4A C -ATOM 528 C4 C4A A 132 11.499 6.523 24.989 1.00 0.00 C4A C -ATOM 529 C1 C4A A 133 11.722 16.347 3.000 1.00 0.00 C4A C -ATOM 530 C2 C4A A 133 10.189 16.363 3.138 1.00 0.00 C4A C -ATOM 531 C3 C4A A 133 12.238 14.906 3.173 1.00 0.00 C4A C -ATOM 532 C4 C4A A 133 13.771 14.888 3.035 1.00 0.00 C4A C -ATOM 533 C1 C4A A 134 10.495 18.412 23.415 1.00 0.00 C4A C -ATOM 534 C2 C4A A 134 9.458 19.114 22.520 1.00 0.00 C4A C -ATOM 535 C3 C4A A 134 11.914 18.776 22.941 1.00 0.00 C4A C -ATOM 536 C4 C4A A 134 12.952 18.075 23.836 1.00 0.00 C4A C -ATOM 537 C1 C4A A 135 12.260 7.665 9.555 1.00 0.00 C4A C -ATOM 538 C2 C4A A 135 12.521 8.028 11.028 1.00 0.00 C4A C -ATOM 539 C3 C4A A 135 10.743 7.552 9.315 1.00 0.00 C4A C -ATOM 540 C4 C4A A 135 10.481 7.189 7.841 1.00 0.00 C4A C -ATOM 541 C1 C4A A 136 3.151 17.132 8.317 1.00 0.00 C4A C -ATOM 542 C2 C4A A 136 3.071 18.067 9.537 1.00 0.00 C4A C -ATOM 543 C3 C4A A 136 3.000 15.671 8.779 1.00 0.00 C4A C -ATOM 544 C4 C4A A 136 3.080 14.735 7.559 1.00 0.00 C4A C -ATOM 545 C1 C4A A 137 23.159 12.882 18.025 1.00 0.00 C4A C -ATOM 546 C2 C4A A 137 22.546 12.999 16.618 1.00 0.00 C4A C -ATOM 547 C3 C4A A 137 24.384 13.810 18.130 1.00 0.00 C4A C -ATOM 548 C4 C4A A 137 24.997 13.694 19.538 1.00 0.00 C4A C -ATOM 549 C1 C4A A 138 18.700 24.929 19.125 1.00 0.00 C4A C -ATOM 550 C2 C4A A 138 17.252 24.998 18.607 1.00 0.00 C4A C -ATOM 551 C3 C4A A 138 18.699 25.000 20.663 1.00 0.00 C4A C -ATOM 552 C4 C4A A 138 20.147 24.932 21.183 1.00 0.00 C4A C -ATOM 553 C1 C4A A 139 16.258 5.801 5.868 1.00 0.00 C4A C -ATOM 554 C2 C4A A 139 15.079 4.900 5.457 1.00 0.00 C4A C -ATOM 555 C3 C4A A 139 16.419 5.768 7.399 1.00 0.00 C4A C -ATOM 556 C4 C4A A 139 17.599 6.669 7.811 1.00 0.00 C4A C -ATOM 557 C1 C4A A 140 9.278 3.157 20.343 1.00 0.00 C4A C -ATOM 558 C2 C4A A 140 9.368 3.000 18.814 1.00 0.00 C4A C -ATOM 559 C3 C4A A 140 8.558 4.475 20.683 1.00 0.00 C4A C -ATOM 560 C4 C4A A 140 8.468 4.633 22.212 1.00 0.00 C4A C -ATOM 561 C1 C4A A 141 4.528 3.066 8.948 1.00 0.00 C4A C -ATOM 562 C2 C4A A 141 5.996 3.000 8.489 1.00 0.00 C4A C -ATOM 563 C3 C4A A 141 4.468 3.000 10.486 1.00 0.00 C4A C -ATOM 564 C4 C4A A 141 3.000 3.066 10.946 1.00 0.00 C4A C -ATOM 565 C1 C4A A 142 6.114 13.777 14.888 1.00 0.00 C4A C -ATOM 566 C2 C4A A 142 5.518 15.097 14.366 1.00 0.00 C4A C -ATOM 567 C3 C4A A 142 5.553 12.600 14.068 1.00 0.00 C4A C -ATOM 568 C4 C4A A 142 6.149 11.280 14.590 1.00 0.00 C4A C -ATOM 569 C1 C4A A 143 11.390 15.595 21.000 1.00 0.00 C4A C -ATOM 570 C2 C4A A 143 12.617 16.300 21.606 1.00 0.00 C4A C -ATOM 571 C3 C4A A 143 11.442 14.093 21.336 1.00 0.00 C4A C -ATOM 572 C4 C4A A 143 10.215 13.387 20.730 1.00 0.00 C4A C -ATOM 573 C1 C4A A 144 25.002 5.886 7.265 1.00 0.00 C4A C -ATOM 574 C2 C4A A 144 24.909 7.247 7.979 1.00 0.00 C4A C -ATOM 575 C3 C4A A 144 24.130 5.911 5.996 1.00 0.00 C4A C -ATOM 576 C4 C4A A 144 24.222 4.550 5.282 1.00 0.00 C4A C -ATOM 577 C1 C4A A 145 20.249 24.493 15.879 1.00 0.00 C4A C -ATOM 578 C2 C4A A 145 19.314 23.884 16.939 1.00 0.00 C4A C -ATOM 579 C3 C4A A 145 21.708 24.390 16.361 1.00 0.00 C4A C -ATOM 580 C4 C4A A 145 22.644 25.000 15.302 1.00 0.00 C4A C -ATOM 581 C1 C4A A 146 24.999 11.150 17.708 1.00 0.00 C4A C -ATOM 582 C2 C4A A 146 24.820 11.951 16.405 1.00 0.00 C4A C -ATOM 583 C3 C4A A 146 23.893 10.083 17.810 1.00 0.00 C4A C -ATOM 584 C4 C4A A 146 24.071 9.281 19.112 1.00 0.00 C4A C -ATOM 585 C1 C4A A 147 16.455 18.086 16.028 1.00 0.00 C4A C -ATOM 586 C2 C4A A 147 16.565 16.635 15.527 1.00 0.00 C4A C -ATOM 587 C3 C4A A 147 15.567 18.896 15.065 1.00 0.00 C4A C -ATOM 588 C4 C4A A 147 15.457 20.348 15.565 1.00 0.00 C4A C -ATOM 589 C1 C4A A 148 5.318 17.896 12.713 1.00 0.00 C4A C -ATOM 590 C2 C4A A 148 5.052 18.672 14.016 1.00 0.00 C4A C -ATOM 591 C3 C4A A 148 6.626 17.094 12.851 1.00 0.00 C4A C -ATOM 592 C4 C4A A 148 6.893 16.318 11.548 1.00 0.00 C4A C -ATOM 593 C1 C4A A 149 5.324 19.790 9.602 1.00 0.00 C4A C -ATOM 594 C2 C4A A 149 4.492 19.744 10.897 1.00 0.00 C4A C -ATOM 595 C3 C4A A 149 5.515 18.360 9.064 1.00 0.00 C4A C -ATOM 596 C4 C4A A 149 6.347 18.404 7.769 1.00 0.00 C4A C -ATOM 597 C1 C4A A 150 5.300 7.283 10.775 1.00 0.00 C4A C -ATOM 598 C2 C4A A 150 6.581 7.250 11.630 1.00 0.00 C4A C -ATOM 599 C3 C4A A 150 4.281 6.275 11.339 1.00 0.00 C4A C -ATOM 600 C4 C4A A 150 3.000 6.307 10.485 1.00 0.00 C4A C -ATOM 601 C1 C4A A 151 25.001 3.121 20.263 1.00 0.00 C4A C -ATOM 602 C2 C4A A 151 24.733 4.029 21.477 1.00 0.00 C4A C -ATOM 603 C3 C4A A 151 24.732 3.907 18.965 1.00 0.00 C4A C -ATOM 604 C4 C4A A 151 25.000 3.000 17.750 1.00 0.00 C4A C -ATOM 605 C1 C4A A 152 16.227 23.025 4.202 1.00 0.00 C4A C -ATOM 606 C2 C4A A 152 16.833 23.433 5.558 1.00 0.00 C4A C -ATOM 607 C3 C4A A 152 15.483 21.685 4.355 1.00 0.00 C4A C -ATOM 608 C4 C4A A 152 14.877 21.276 3.000 1.00 0.00 C4A C -ATOM 609 C1 C4A A 153 21.450 19.819 22.746 1.00 0.00 C4A C -ATOM 610 C2 C4A A 153 22.370 20.220 21.579 1.00 0.00 C4A C -ATOM 611 C3 C4A A 153 22.204 18.864 23.691 1.00 0.00 C4A C -ATOM 612 C4 C4A A 153 21.284 18.463 24.859 1.00 0.00 C4A C -ATOM 613 C1 C4A A 154 13.780 22.780 10.200 1.00 0.00 C4A C -ATOM 614 C2 C4A A 154 15.150 23.313 9.744 1.00 0.00 C4A C -ATOM 615 C3 C4A A 154 13.761 22.659 11.735 1.00 0.00 C4A C -ATOM 616 C4 C4A A 154 12.390 22.126 12.192 1.00 0.00 C4A C -ATOM 617 C1 C4A A 155 20.866 24.102 7.264 1.00 0.00 C4A C -ATOM 618 C2 C4A A 155 22.013 24.543 6.337 1.00 0.00 C4A C -ATOM 619 C3 C4A A 155 19.637 24.999 7.022 1.00 0.00 C4A C -ATOM 620 C4 C4A A 155 18.489 24.559 7.949 1.00 0.00 C4A C -ATOM 621 C1 C4A A 156 22.970 9.808 6.717 1.00 0.00 C4A C -ATOM 622 C2 C4A A 156 22.486 10.106 5.286 1.00 0.00 C4A C -ATOM 623 C3 C4A A 156 22.250 8.556 7.252 1.00 0.00 C4A C -ATOM 624 C4 C4A A 156 22.733 8.257 8.683 1.00 0.00 C4A C -ATOM 625 C1 C4A A 157 19.930 7.914 14.151 1.00 0.00 C4A C -ATOM 626 C2 C4A A 157 19.025 9.109 13.803 1.00 0.00 C4A C -ATOM 627 C3 C4A A 157 20.041 6.981 12.931 1.00 0.00 C4A C -ATOM 628 C4 C4A A 157 20.946 5.785 13.278 1.00 0.00 C4A C -ATOM 629 C1 C4A A 158 3.508 15.584 16.769 1.00 0.00 C4A C -ATOM 630 C2 C4A A 158 4.584 14.483 16.790 1.00 0.00 C4A C -ATOM 631 C3 C4A A 158 4.076 16.844 16.091 1.00 0.00 C4A C -ATOM 632 C4 C4A A 158 3.000 17.946 16.070 1.00 0.00 C4A C -ATOM 633 C1 C4A A 159 19.321 22.939 23.498 1.00 0.00 C4A C -ATOM 634 C2 C4A A 159 19.658 21.442 23.381 1.00 0.00 C4A C -ATOM 635 C3 C4A A 159 18.706 23.221 24.882 1.00 0.00 C4A C -ATOM 636 C4 C4A A 159 18.369 24.719 25.000 1.00 0.00 C4A C -ATOM 637 C1 C4A A 160 20.186 18.215 20.125 1.00 0.00 C4A C -ATOM 638 C2 C4A A 160 20.846 17.223 19.150 1.00 0.00 C4A C -ATOM 639 C3 C4A A 160 20.649 19.646 19.794 1.00 0.00 C4A C -ATOM 640 C4 C4A A 160 19.989 20.639 20.769 1.00 0.00 C4A C -ATOM 641 C1 C4A A 161 11.078 5.352 10.453 1.00 0.00 C4A C -ATOM 642 C2 C4A A 161 12.150 4.514 9.732 1.00 0.00 C4A C -ATOM 643 C3 C4A A 161 11.404 5.419 11.956 1.00 0.00 C4A C -ATOM 644 C4 C4A A 161 10.331 6.257 12.678 1.00 0.00 C4A C -ATOM 645 C1 C4A A 162 11.161 10.029 10.380 1.00 0.00 C4A C -ATOM 646 C2 C4A A 162 12.331 10.937 10.802 1.00 0.00 C4A C -ATOM 647 C3 C4A A 162 10.353 9.621 11.626 1.00 0.00 C4A C -ATOM 648 C4 C4A A 162 9.183 8.713 11.205 1.00 0.00 C4A C -ATOM 649 C1 C4A A 163 18.075 16.098 5.436 1.00 0.00 C4A C -ATOM 650 C2 C4A A 163 16.920 17.047 5.803 1.00 0.00 C4A C -ATOM 651 C3 C4A A 163 19.335 16.922 5.113 1.00 0.00 C4A C -ATOM 652 C4 C4A A 163 20.491 15.973 4.745 1.00 0.00 C4A C -ATOM 653 C1 C4A A 164 17.674 4.986 3.976 1.00 0.00 C4A C -ATOM 654 C2 C4A A 164 17.359 3.839 2.998 1.00 0.00 C4A C -ATOM 655 C3 C4A A 164 18.713 5.930 3.342 1.00 0.00 C4A C -ATOM 656 C4 C4A A 164 19.028 7.077 4.320 1.00 0.00 C4A C -ATOM 657 C1 C4A A 165 16.048 16.604 19.005 1.00 0.00 C4A C -ATOM 658 C2 C4A A 165 15.545 18.032 18.727 1.00 0.00 C4A C -ATOM 659 C3 C4A A 165 14.981 15.830 19.803 1.00 0.00 C4A C -ATOM 660 C4 C4A A 165 15.483 14.401 20.081 1.00 0.00 C4A C -ATOM 661 C1 C4A A 166 18.404 24.552 12.525 1.00 0.00 C4A C -ATOM 662 C2 C4A A 166 17.739 24.021 13.808 1.00 0.00 C4A C -ATOM 663 C3 C4A A 166 19.412 23.512 12.001 1.00 0.00 C4A C -ATOM 664 C4 C4A A 166 20.077 24.042 10.717 1.00 0.00 C4A C -ATOM 665 C1 C4A A 167 5.259 6.298 7.168 1.00 0.00 C4A C -ATOM 666 C2 C4A A 167 5.227 6.273 5.629 1.00 0.00 C4A C -ATOM 667 C3 C4A A 167 6.350 5.337 7.674 1.00 0.00 C4A C -ATOM 668 C4 C4A A 167 6.383 5.361 9.214 1.00 0.00 C4A C -ATOM 669 C1 C4A A 168 7.878 21.303 14.480 1.00 0.00 C4A C -ATOM 670 C2 C4A A 168 6.939 20.122 14.785 1.00 0.00 C4A C -ATOM 671 C3 C4A A 168 8.974 20.847 13.500 1.00 0.00 C4A C -ATOM 672 C4 C4A A 168 9.914 22.028 13.194 1.00 0.00 C4A C -ATOM 673 C1 C4A A 169 11.686 23.885 17.355 1.00 0.00 C4A C -ATOM 674 C2 C4A A 169 12.832 22.901 17.653 1.00 0.00 C4A C -ATOM 675 C3 C4A A 169 10.785 24.015 18.597 1.00 0.00 C4A C -ATOM 676 C4 C4A A 169 9.639 25.000 18.300 1.00 0.00 C4A C -ATOM 677 C1 C4A A 170 10.034 7.410 17.875 1.00 0.00 C4A C -ATOM 678 C2 C4A A 170 8.849 6.581 18.404 1.00 0.00 C4A C -ATOM 679 C3 C4A A 170 10.243 8.640 18.777 1.00 0.00 C4A C -ATOM 680 C4 C4A A 170 11.428 9.470 18.249 1.00 0.00 C4A C -ATOM 681 C1 C4A A 171 7.371 20.871 25.000 1.00 0.00 C4A C -ATOM 682 C2 C4A A 171 6.830 22.311 24.944 1.00 0.00 C4A C -ATOM 683 C3 C4A A 171 6.196 19.877 24.920 1.00 0.00 C4A C -ATOM 684 C4 C4A A 171 6.737 18.437 24.976 1.00 0.00 C4A C -ATOM 685 C1 C4A A 172 3.370 15.549 12.843 1.00 0.00 C4A C -ATOM 686 C2 C4A A 172 3.000 16.994 12.462 1.00 0.00 C4A C -ATOM 687 C3 C4A A 172 3.000 15.296 14.316 1.00 0.00 C4A C -ATOM 688 C4 C4A A 172 3.369 13.851 14.699 1.00 0.00 C4A C -ATOM 689 C1 C4A A 173 21.848 15.843 22.323 1.00 0.00 C4A C -ATOM 690 C2 C4A A 173 22.010 17.027 21.353 1.00 0.00 C4A C -ATOM 691 C3 C4A A 173 22.756 16.055 23.549 1.00 0.00 C4A C -ATOM 692 C4 C4A A 173 22.593 14.871 24.520 1.00 0.00 C4A C -ATOM 693 C1 C4A A 174 25.000 17.814 23.087 1.00 0.00 C4A C -ATOM 694 C2 C4A A 174 24.318 17.778 24.466 1.00 0.00 C4A C -ATOM 695 C3 C4A A 174 24.012 18.359 22.039 1.00 0.00 C4A C -ATOM 696 C4 C4A A 174 24.693 18.395 20.659 1.00 0.00 C4A C -ATOM 697 C1 C4A A 175 16.597 8.475 2.998 1.00 0.00 C4A C -ATOM 698 C2 C4A A 175 17.963 9.106 3.322 1.00 0.00 C4A C -ATOM 699 C3 C4A A 175 16.445 7.153 3.774 1.00 0.00 C4A C -ATOM 700 C4 C4A A 175 15.078 6.521 3.451 1.00 0.00 C4A C -ATOM 701 C1 C4A A 176 4.610 11.328 18.973 1.00 0.00 C4A C -ATOM 702 C2 C4A A 176 4.264 12.501 19.908 1.00 0.00 C4A C -ATOM 703 C3 C4A A 176 6.095 10.956 19.145 1.00 0.00 C4A C -ATOM 704 C4 C4A A 176 6.442 9.782 18.210 1.00 0.00 C4A C -ATOM 705 C1 C4A A 177 4.213 4.241 22.476 1.00 0.00 C4A C -ATOM 706 C2 C4A A 177 3.712 3.000 21.714 1.00 0.00 C4A C -ATOM 707 C3 C4A A 177 5.719 4.095 22.761 1.00 0.00 C4A C -ATOM 708 C4 C4A A 177 6.221 5.335 23.523 1.00 0.00 C4A C -ATOM 709 C1 C4A A 178 23.877 21.117 23.829 1.00 0.00 C4A C -ATOM 710 C2 C4A A 178 25.000 20.430 23.030 1.00 0.00 C4A C -ATOM 711 C3 C4A A 178 24.312 22.547 24.201 1.00 0.00 C4A C -ATOM 712 C4 C4A A 178 23.190 23.234 25.000 1.00 0.00 C4A C -ATOM 713 C1 C4A A 179 19.825 9.634 6.488 1.00 0.00 C4A C -ATOM 714 C2 C4A A 179 19.563 8.119 6.577 1.00 0.00 C4A C -ATOM 715 C3 C4A A 179 18.678 10.395 7.180 1.00 0.00 C4A C -ATOM 716 C4 C4A A 179 18.939 11.910 7.091 1.00 0.00 C4A C -ATOM 717 C1 C4A A 180 10.659 15.821 7.572 1.00 0.00 C4A C -ATOM 718 C2 C4A A 180 11.406 15.844 8.918 1.00 0.00 C4A C -ATOM 719 C3 C4A A 180 11.503 15.065 6.530 1.00 0.00 C4A C -ATOM 720 C4 C4A A 180 10.757 15.041 5.183 1.00 0.00 C4A C -ATOM 721 C1 C1A B 1 22.367 3.000 5.920 1.00 0.00 C1A C -ATOM 722 C1 C1A B 2 9.083 7.569 25.000 1.00 0.00 C1A C -ATOM 723 C1 C1A B 3 20.619 3.857 3.012 1.00 0.00 C1A C -ATOM 724 C1 C1A B 4 24.407 24.117 4.727 1.00 0.00 C1A C -ATOM 725 C1 C1A B 5 6.112 3.312 14.414 1.00 0.00 C1A C -ATOM 726 C1 C1A B 6 25.000 9.738 8.173 1.00 0.00 C1A C -ATOM 727 C1 C1A B 7 25.000 8.186 13.470 1.00 0.00 C1A C -ATOM 728 C1 C1A B 8 3.000 6.952 24.545 1.00 0.00 C1A C -ATOM 729 C1 C1A B 9 18.913 11.833 12.055 1.00 0.00 C1A C -ATOM 730 C1 C1A B 10 14.499 15.660 17.036 1.00 0.00 C1A C -ATOM 731 C1 C1A B 11 3.000 23.967 9.284 1.00 0.00 C1A C -ATOM 732 C1 C1A B 12 24.957 3.522 9.670 1.00 0.00 C1A C -ATOM 733 C1 C1A B 13 22.799 24.120 12.330 1.00 0.00 C1A C -ATOM 734 C1 C1A B 14 8.770 16.196 9.571 1.00 0.00 C1A C -ATOM 735 C1 C1A B 15 3.048 11.063 6.825 1.00 0.00 C1A C -ATOM 736 C1 C1A B 16 14.199 13.114 11.977 1.00 0.00 C1A C -ATOM 737 C1 C1A B 17 14.818 22.141 6.722 1.00 0.00 C1A C -ATOM 738 C1 C1A B 18 14.751 6.342 11.495 1.00 0.00 C1A C -ATOM 739 C1 C1A B 19 22.752 7.252 17.804 1.00 0.00 C1A C -ATOM 740 C1 C1A B 20 8.065 21.413 8.482 1.00 0.00 C1A C -ATOM 741 C1 C1A B 21 25.000 16.328 18.918 1.00 0.00 C1A C -ATOM 742 C1 C1A B 22 21.725 22.732 20.391 1.00 0.00 C1A C -ATOM 743 C1 C1A B 23 14.608 25.000 11.507 1.00 0.00 C1A C -ATOM 744 C1 C1A B 24 12.028 13.628 10.398 1.00 0.00 C1A C -ATOM 745 C1 C1A B 25 10.525 12.249 12.391 1.00 0.00 C1A C -ATOM 746 C1 C1A B 26 22.909 22.778 7.864 1.00 0.00 C1A C -ATOM 747 C1 C1A B 27 17.987 21.993 10.617 1.00 0.00 C1A C -ATOM 748 C1 C1A B 28 24.940 18.946 4.390 1.00 0.00 C1A C -ATOM 749 C1 C1A B 29 22.913 20.182 8.715 1.00 0.00 C1A C -ATOM 750 C1 C1A B 30 3.001 9.899 9.393 1.00 0.00 C1A C -ATOM 751 C1 C1A B 31 9.157 19.393 6.585 1.00 0.00 C1A C -ATOM 752 C1 C1A B 32 6.687 19.020 22.524 1.00 0.00 C1A C -ATOM 753 C1 C1A B 33 20.864 6.683 8.156 1.00 0.00 C1A C -ATOM 754 C1 C1A B 34 8.064 18.854 9.704 1.00 0.00 C1A C -ATOM 755 C1 C1A B 35 9.497 3.000 15.937 1.00 0.00 C1A C -ATOM 756 C1 C1A B 36 25.000 17.647 12.604 1.00 0.00 C1A C -ATOM 757 C1 C1A B 37 5.110 25.000 10.140 1.00 0.00 C1A C -ATOM 758 C1 C1A B 38 13.663 5.732 8.112 1.00 0.00 C1A C -ATOM 759 C1 C1A B 39 14.716 25.000 4.456 1.00 0.00 C1A C -ATOM 760 C1 C1A B 40 21.359 14.928 17.742 1.00 0.00 C1A C -ATOM 761 C1 C1A B 41 25.000 3.000 23.886 1.00 0.00 C1A C -ATOM 762 C1 C1A B 42 17.027 14.626 17.310 1.00 0.00 C1A C -ATOM 763 C1 C1A B 43 18.428 5.277 18.165 1.00 0.00 C1A C -ATOM 764 C1 C1A B 44 8.460 5.500 10.601 1.00 0.00 C1A C -ATOM 765 C1 C1A B 45 14.873 3.733 3.243 1.00 0.00 C1A C -ATOM 766 C1 C1A B 46 12.927 7.070 13.586 1.00 0.00 C1A C -ATOM 767 C1 C1A B 47 5.096 22.450 20.321 1.00 0.00 C1A C -ATOM 768 C1 C1A B 48 18.011 16.687 3.000 1.00 0.00 C1A C -ATOM 769 C1 C1A B 49 13.542 20.717 21.977 1.00 0.00 C1A C -ATOM 770 C1 C1A B 50 15.640 24.659 7.381 1.00 0.00 C1A C -ATOM 771 C1 C1A B 51 19.177 17.125 25.000 1.00 0.00 C1A C -ATOM 772 C1 C1A B 52 19.135 19.498 9.978 1.00 0.00 C1A C -ATOM 773 C1 C1A B 53 11.590 4.475 20.741 1.00 0.00 C1A C -ATOM 774 C1 C1A B 54 24.629 12.829 25.000 1.00 0.00 C1A C -ATOM 775 C1 C1A B 55 9.632 22.572 15.918 1.00 0.00 C1A C -ATOM 776 C1 C1A B 56 21.381 11.570 7.505 1.00 0.00 C1A C -ATOM 777 C1 C1A B 57 25.000 14.942 11.926 1.00 0.00 C1A C -ATOM 778 C1 C1A B 58 17.371 25.000 3.113 1.00 0.00 C1A C -ATOM 779 C1 C1A B 59 8.266 10.805 12.931 1.00 0.00 C1A C -ATOM 780 C1 C1A B 60 21.332 25.000 18.909 1.00 0.00 C1A C -ATOM 781 C1 C1A B 61 21.677 20.928 25.000 1.00 0.00 C1A C -ATOM 782 C1 C1A B 62 13.308 25.000 8.751 1.00 0.00 C1A C -ATOM 783 C1 C1A B 63 9.053 17.900 12.081 1.00 0.00 C1A C -ATOM 784 C1 C1A B 64 3.000 4.122 19.591 1.00 0.00 C1A C -ATOM 785 C1 C1A B 65 22.001 11.995 9.889 1.00 0.00 C1A C -ATOM 786 C1 C1A B 66 22.021 22.516 22.907 1.00 0.00 C1A C -ATOM 787 C1 C1A B 67 4.189 4.571 25.000 1.00 0.00 C1A C -ATOM 788 C1 C1A B 68 7.858 15.470 3.000 1.00 0.00 C1A C -ATOM 789 C1 C1A B 69 24.861 21.856 9.576 1.00 0.00 C1A C -ATOM 790 C1 C1A B 70 22.652 22.100 4.115 1.00 0.00 C1A C -ATOM 791 C1 C1A B 71 20.206 22.046 18.380 1.00 0.00 C1A C -ATOM 792 C1 C1A B 72 3.017 25.000 4.642 1.00 0.00 C1A C -ATOM 793 C1 C1A B 73 3.000 21.126 5.326 1.00 0.00 C1A C -ATOM 794 C1 C1A B 74 13.987 25.000 16.940 1.00 0.00 C1A C -ATOM 795 C1 C1A B 75 7.613 11.423 6.854 1.00 0.00 C1A C -ATOM 796 C1 C1A B 76 15.051 18.396 21.227 1.00 0.00 C1A C -ATOM 797 C1 C1A B 77 5.843 3.000 5.401 1.00 0.00 C1A C -ATOM 798 C1 C1A B 78 17.644 19.802 22.354 1.00 0.00 C1A C -ATOM 799 C1 C1A B 79 6.897 17.184 20.487 1.00 0.00 C1A C -ATOM 800 C1 C1A B 80 9.513 15.468 16.630 1.00 0.00 C1A C -ATOM 801 C1 C1A B 81 4.000 11.566 15.855 1.00 0.00 C1A C -ATOM 802 C1 C1A B 82 17.372 12.009 15.513 1.00 0.00 C1A C -ATOM 803 C1 C1A B 83 14.584 15.730 10.089 1.00 0.00 C1A C -ATOM 804 C1 C1A B 84 11.904 24.759 11.362 1.00 0.00 C1A C -ATOM 805 C1 C1A B 85 14.032 10.089 15.548 1.00 0.00 C1A C -ATOM 806 C1 C1A B 86 4.862 3.000 3.000 1.00 0.00 C1A C -ATOM 807 C1 C1A B 87 5.458 21.456 22.845 1.00 0.00 C1A C -ATOM 808 C1 C1A B 88 11.800 11.620 16.116 1.00 0.00 C1A C -ATOM 809 C1 C1A B 89 18.144 5.144 13.896 1.00 0.00 C1A C -ATOM 810 C1 C1A B 90 3.000 13.322 5.359 1.00 0.00 C1A C -ATOM 811 C1 C1A B 91 11.321 12.562 5.632 1.00 0.00 C1A C -ATOM 812 C1 C1A B 92 22.539 20.927 18.394 1.00 0.00 C1A C -ATOM 813 C1 C1A B 93 18.576 7.345 16.420 1.00 0.00 C1A C -ATOM 814 C1 C1A B 94 8.242 8.179 13.733 1.00 0.00 C1A C -ATOM 815 C1 C1A B 95 8.727 13.902 6.447 1.00 0.00 C1A C -ATOM 816 C1 C1A B 96 23.754 10.633 14.306 1.00 0.00 C1A C -ATOM 817 C1 C1A B 97 7.513 5.264 5.245 1.00 0.00 C1A C -ATOM 818 C1 C1A B 98 4.460 6.014 14.042 1.00 0.00 C1A C -ATOM 819 C1 C1A B 99 14.506 9.365 10.265 1.00 0.00 C1A C -ATOM 820 C1 C1A B 100 6.594 3.000 20.216 1.00 0.00 C1A C -ATOM 821 C1 C1A B 101 3.000 21.001 15.009 1.00 0.00 C1A C -ATOM 822 C1 C1A B 102 8.501 9.425 16.836 1.00 0.00 C1A C -ATOM 823 C1 C1A B 103 25.004 7.433 3.235 1.00 0.00 C1A C -ATOM 824 C1 C1A B 104 15.623 7.302 9.205 1.00 0.00 C1A C -ATOM 825 C1 C1A B 105 8.298 19.601 17.295 1.00 0.00 C1A C -ATOM 826 C1 C1A B 106 14.473 11.998 9.473 1.00 0.00 C1A C -ATOM 827 C1 C1A B 107 17.479 25.000 10.241 1.00 0.00 C1A C -ATOM 828 C1 C1A B 108 16.869 9.783 8.810 1.00 0.00 C1A C -ATOM 829 C1 C1A B 109 15.951 4.609 9.795 1.00 0.00 C1A C -ATOM 830 C1 C1A B 110 4.316 24.934 19.450 1.00 0.00 C1A C -ATOM 831 C1 C1A B 111 23.827 20.972 6.012 1.00 0.00 C1A C -ATOM 832 C1 C1A B 112 5.124 14.745 21.019 1.00 0.00 C1A C -ATOM 833 C1 C1A B 113 12.725 10.308 20.867 1.00 0.00 C1A C -ATOM 834 C1 C1A B 114 22.871 16.431 13.093 1.00 0.00 C1A C -ATOM 835 C1 C1A B 115 7.692 9.598 23.970 1.00 0.00 C1A C -ATOM 836 C1 C1A B 116 20.347 21.966 5.939 1.00 0.00 C1A C -ATOM 837 C1 C1A B 117 22.584 14.671 20.188 1.00 0.00 C1A C -ATOM 838 C1 C1A B 118 22.773 4.742 11.928 1.00 0.00 C1A C -ATOM 839 C1 C1A B 119 14.103 20.292 13.167 1.00 0.00 C1A C -ATOM 840 C1 C1A B 120 4.108 6.820 22.046 1.00 0.00 C1A C -ATOM 841 C1 C1A B 121 13.188 25.000 19.543 1.00 0.00 C1A C -ATOM 842 C1 C1A B 122 3.578 6.770 19.353 1.00 0.00 C1A C -ATOM 843 C1 C1A B 123 25.000 10.241 24.868 1.00 0.00 C1A C -ATOM 844 C1 C1A B 124 10.716 4.989 17.200 1.00 0.00 C1A C -ATOM 845 C1 C1A B 125 7.408 24.096 7.442 1.00 0.00 C1A C -ATOM 846 C1 C1A B 126 14.634 20.303 18.206 1.00 0.00 C1A C -ATOM 847 C1 C1A B 127 18.100 3.000 12.610 1.00 0.00 C1A C -ATOM 848 C1 C1A B 128 6.028 20.416 3.000 1.00 0.00 C1A C -ATOM 849 C1 C1A B 129 18.194 14.528 14.844 1.00 0.00 C1A C -ATOM 850 C1 C1A B 130 24.087 19.699 14.471 1.00 0.00 C1A C -ATOM 851 C1 C1A B 131 8.428 19.112 3.000 1.00 0.00 C1A C -ATOM 852 C1 C1A B 132 16.725 8.419 6.253 1.00 0.00 C1A C -ATOM 853 C1 C1A B 133 7.985 7.091 8.382 1.00 0.00 C1A C -ATOM 854 C1 C1A B 134 6.342 17.720 3.000 1.00 0.00 C1A C -ATOM 855 C1 C1A B 135 14.415 5.350 17.401 1.00 0.00 C1A C -ATOM 856 C1 C1A B 136 5.052 9.776 24.627 1.00 0.00 C1A C -ATOM 857 C1 C1A B 137 23.934 8.200 23.895 1.00 0.00 C1A C -ATOM 858 C1 C1A B 138 20.407 8.691 2.999 1.00 0.00 C1A C -ATOM 859 C1 C1A B 139 22.320 6.643 25.000 1.00 0.00 C1A C -ATOM 860 C1 C1A B 140 11.207 4.085 3.000 1.00 0.00 C1A C -ATOM 861 C1 C1A B 141 8.026 3.375 7.079 1.00 0.00 C1A C -ATOM 862 C1 C1A B 142 10.238 24.169 9.259 1.00 0.00 C1A C -ATOM 863 C1 C1A B 143 16.873 13.086 4.968 1.00 0.00 C1A C -ATOM 864 C1 C1A B 144 13.573 14.233 22.636 1.00 0.00 C1A C -ATOM 865 C1 C1A B 145 17.907 21.090 4.504 1.00 0.00 C1A C -ATOM 866 C1 C1A B 146 21.652 5.164 20.655 1.00 0.00 C1A C -ATOM 867 C1 C1A B 147 20.551 15.699 14.099 1.00 0.00 C1A C -ATOM 868 C1 C1A B 148 16.766 8.621 22.760 1.00 0.00 C1A C -ATOM 869 C1 C1A B 149 3.000 9.327 15.221 1.00 0.00 C1A C -ATOM 870 C1 C1A B 150 17.056 17.670 11.046 1.00 0.00 C1A C -ATOM 871 C1 C1A B 151 7.361 23.965 14.709 1.00 0.00 C1A C -ATOM 872 C1 C1A B 152 22.086 12.633 5.355 1.00 0.00 C1A C -ATOM 873 C1 C1A B 153 24.117 9.341 21.679 1.00 0.00 C1A C -ATOM 874 C1 C1A B 154 3.438 3.000 13.902 1.00 0.00 C1A C -ATOM 875 C1 C1A B 155 12.350 10.030 5.083 1.00 0.00 C1A C -ATOM 876 C1 C1A B 156 14.051 17.525 3.338 1.00 0.00 C1A C -ATOM 877 C1 C1A B 157 11.714 10.436 7.515 1.00 0.00 C1A C -ATOM 878 C1 C1A B 158 9.364 22.223 3.000 1.00 0.00 C1A C -ATOM 879 C1 C1A B 159 7.872 3.000 11.551 1.00 0.00 C1A C -ATOM 880 C1 C1A B 160 22.550 2.999 19.785 1.00 0.00 C1A C -ATOM 881 C1 C1A B 161 14.436 17.997 11.743 1.00 0.00 C1A C -ATOM 882 C1 C1A B 162 5.367 9.218 7.774 1.00 0.00 C1A C -ATOM 883 C1 C1A B 163 18.984 14.375 3.551 1.00 0.00 C1A C -ATOM 884 C1 C1A B 164 10.791 20.659 17.293 1.00 0.00 C1A C -ATOM 885 C1 C1A B 165 10.835 17.868 17.126 1.00 0.00 C1A C -ATOM 886 C1 C1A B 166 14.833 21.082 25.000 1.00 0.00 C1A C -ATOM 887 C1 C1A B 167 14.148 12.329 24.996 1.00 0.00 C1A C -ATOM 888 C1 C1A B 168 25.000 12.967 6.938 1.00 0.00 C1A C -ATOM 889 C1 C1A B 169 3.000 12.818 17.774 1.00 0.00 C1A C -ATOM 890 C1 C1A B 170 17.848 8.375 25.000 1.00 0.00 C1A C -ATOM 891 C1 C1A B 171 12.079 15.328 15.682 1.00 0.00 C1A C -ATOM 892 C1 C1A B 172 7.378 10.092 3.085 1.00 0.00 C1A C -ATOM 893 C1 C1A B 173 17.258 25.000 16.057 1.00 0.00 C1A C -ATOM 894 C1 C1A B 174 16.413 14.557 3.000 1.00 0.00 C1A C -ATOM 895 C1 C1A B 175 20.664 13.864 23.290 1.00 0.00 C1A C -ATOM 896 C1 C1A B 176 6.933 15.225 17.215 1.00 0.00 C1A C -ATOM 897 C1 C1A B 177 21.384 8.960 25.000 1.00 0.00 C1A C -ATOM 898 C1 C1A B 178 19.604 11.134 9.381 1.00 0.00 C1A C -ATOM 899 C1 C1A B 179 19.927 3.000 25.000 1.00 0.00 C1A C -ATOM 900 C1 C1A B 180 14.875 13.036 18.077 1.00 0.00 C1A C -ATOM 901 C1 C1A B 181 14.464 5.717 21.750 1.00 0.00 C1A C -ATOM 902 C1 C1A B 182 13.027 20.210 9.895 1.00 0.00 C1A C -ATOM 903 C1 C1A B 183 19.905 21.065 12.583 1.00 0.00 C1A C -ATOM 904 C1 C1A B 184 22.526 11.202 19.983 1.00 0.00 C1A C -ATOM 905 C1 C1A B 185 22.670 17.825 5.846 1.00 0.00 C1A C -ATOM 906 C1 C1A B 186 13.440 7.560 16.376 1.00 0.00 C1A C -ATOM 907 C1 C1A B 187 22.903 15.643 15.898 1.00 0.00 C1A C -ATOM 908 C1 C1A B 188 6.912 9.120 9.737 1.00 0.00 C1A C -ATOM 909 C1 C1A B 189 9.860 11.765 18.153 1.00 0.00 C1A C -ATOM 910 C1 C1A B 190 12.274 21.023 19.563 1.00 0.00 C1A C -ATOM 911 C1 C1A B 191 20.202 13.886 10.423 1.00 0.00 C1A C -ATOM 912 C1 C1A B 192 10.270 6.406 5.093 1.00 0.00 C1A C -ATOM 913 C1 C1A B 193 18.102 3.000 21.204 1.00 0.00 C1A C -ATOM 914 C1 C1A B 194 12.728 11.658 23.050 1.00 0.00 C1A C -ATOM 915 C1 C1A B 195 5.991 20.982 6.745 1.00 0.00 C1A C -ATOM 916 C1 C1A B 196 25.000 3.365 15.246 1.00 0.00 C1A C -ATOM 917 C1 C1A B 197 6.980 19.696 12.047 1.00 0.00 C1A C -ATOM 918 C1 C1A B 198 20.499 6.785 19.140 1.00 0.00 C1A C -ATOM 919 C1 C1A B 199 15.426 10.593 20.577 1.00 0.00 C1A C -ATOM 920 C1 C1A B 200 12.986 3.002 11.540 1.00 0.00 C1A C -ATOM 921 C1 C1A B 201 24.880 16.559 6.662 1.00 0.00 C1A C -ATOM 922 C1 C1A B 202 17.790 12.833 19.177 1.00 0.00 C1A C -ATOM 923 C1 C1A B 203 23.372 15.519 4.566 1.00 0.00 C1A C -ATOM 924 C1 C1A B 204 25.000 3.000 7.082 1.00 0.00 C1A C -ATOM 925 C1 C1A B 205 5.877 4.452 11.954 1.00 0.00 C1A C -ATOM 926 C1 C1A B 206 6.705 23.057 3.203 1.00 0.00 C1A C -ATOM 927 C1 C1A B 207 21.930 25.000 9.340 1.00 0.00 C1A C -ATOM 928 C1 C1A B 208 12.099 3.000 25.000 1.00 0.00 C1A C -ATOM 929 C1 C1A B 209 19.241 17.312 7.760 1.00 0.00 C1A C -ATOM 930 C1 C1A B 210 21.948 17.012 3.000 1.00 0.00 C1A C -ATOM 931 C1 C1A B 211 8.834 16.847 5.826 1.00 0.00 C1A C -ATOM 932 C1 C1A B 212 5.324 21.871 12.367 1.00 0.00 C1A C -ATOM 933 C1 C1A B 213 19.887 17.699 22.673 1.00 0.00 C1A C -ATOM 934 C1 C1A B 214 4.025 22.188 25.000 1.00 0.00 C1A C -ATOM 935 C1 C1A B 215 24.932 25.000 24.683 1.00 0.00 C1A C -ATOM 936 C1 C1A B 216 20.571 11.998 18.643 1.00 0.00 C1A C -ATOM 937 C1 C1A B 217 14.560 9.461 4.061 1.00 0.00 C1A C -ATOM 938 C1 C1A B 218 6.233 7.228 18.815 1.00 0.00 C1A C -ATOM 939 C1 C1A B 219 4.556 16.340 10.618 1.00 0.00 C1A C -ATOM 940 C1 C1A B 220 3.000 15.073 3.221 1.00 0.00 C1A C -ATOM 941 C1 C1A B 221 7.173 24.839 17.301 1.00 0.00 C1A C -ATOM 942 C1 C1A B 222 4.194 3.000 17.160 1.00 0.00 C1A C -ATOM 943 C1 C1A B 223 25.000 8.381 5.740 1.00 0.00 C1A C -ATOM 944 C1 C1A B 224 20.474 19.751 7.549 1.00 0.00 C1A C -ATOM 945 C1 C1A B 225 12.838 22.951 25.000 1.00 0.00 C1A C -ATOM 946 C1 C1A B 226 25.000 19.166 7.483 1.00 0.00 C1A C -ATOM 947 C1 C1A B 227 21.609 7.621 4.953 1.00 0.00 C1A C -ATOM 948 C1 C1A B 228 6.771 25.000 24.840 1.00 0.00 C1A C -ATOM 949 C1 C1A B 229 5.205 22.223 15.086 1.00 0.00 C1A C -ATOM 950 C1 C1A B 230 17.852 3.001 9.572 1.00 0.00 C1A C -ATOM 951 C1 C1A B 231 10.499 6.935 15.247 1.00 0.00 C1A C -ATOM 952 C1 C1A B 232 17.155 7.100 12.560 1.00 0.00 C1A C -ATOM 953 C1 C1A B 233 4.790 19.816 16.430 1.00 0.00 C1A C -ATOM 954 C1 C1A B 234 6.930 13.235 24.626 1.00 0.00 C1A C -ATOM 955 C1 C1A B 235 25.001 11.254 20.333 1.00 0.00 C1A C -ATOM 956 C1 C1A B 236 20.765 25.000 13.486 1.00 0.00 C1A C -ATOM 957 C1 C1A B 237 16.374 6.909 17.973 1.00 0.00 C1A C -ATOM 958 C1 C1A B 238 25.000 6.367 19.321 1.00 0.00 C1A C -ATOM 959 C1 C1A B 239 20.464 17.116 10.205 1.00 0.00 C1A C -ATOM 960 C1 C1A B 240 19.668 8.352 23.286 1.00 0.00 C1A C -END diff --git a/example_file/methane_butane/setup_box_1.psf b/example_file/methane_butane/setup_box_1.psf deleted file mode 100644 index ffde0eb66..000000000 --- a/example_file/methane_butane/setup_box_1.psf +++ /dev/null @@ -1,1457 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology top_mie.inp - REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } - REMARKS segment C1A { first NONE; last NONE; auto angles dihedrals } - - 960 !NATOM - 1 C4A 1 C4A C1 CH2 0.000000 14.0270 0 - 2 C4A 1 C4A C2 CH3 0.000000 15.0350 0 - 3 C4A 1 C4A C3 CH2 0.000000 14.0270 0 - 4 C4A 1 C4A C4 CH3 0.000000 15.0350 0 - 5 C4A 2 C4A C1 CH2 0.000000 14.0270 0 - 6 C4A 2 C4A C2 CH3 0.000000 15.0350 0 - 7 C4A 2 C4A C3 CH2 0.000000 14.0270 0 - 8 C4A 2 C4A C4 CH3 0.000000 15.0350 0 - 9 C4A 3 C4A C1 CH2 0.000000 14.0270 0 - 10 C4A 3 C4A C2 CH3 0.000000 15.0350 0 - 11 C4A 3 C4A C3 CH2 0.000000 14.0270 0 - 12 C4A 3 C4A C4 CH3 0.000000 15.0350 0 - 13 C4A 4 C4A C1 CH2 0.000000 14.0270 0 - 14 C4A 4 C4A C2 CH3 0.000000 15.0350 0 - 15 C4A 4 C4A C3 CH2 0.000000 14.0270 0 - 16 C4A 4 C4A C4 CH3 0.000000 15.0350 0 - 17 C4A 5 C4A C1 CH2 0.000000 14.0270 0 - 18 C4A 5 C4A C2 CH3 0.000000 15.0350 0 - 19 C4A 5 C4A C3 CH2 0.000000 14.0270 0 - 20 C4A 5 C4A C4 CH3 0.000000 15.0350 0 - 21 C4A 6 C4A C1 CH2 0.000000 14.0270 0 - 22 C4A 6 C4A C2 CH3 0.000000 15.0350 0 - 23 C4A 6 C4A C3 CH2 0.000000 14.0270 0 - 24 C4A 6 C4A C4 CH3 0.000000 15.0350 0 - 25 C4A 7 C4A C1 CH2 0.000000 14.0270 0 - 26 C4A 7 C4A C2 CH3 0.000000 15.0350 0 - 27 C4A 7 C4A C3 CH2 0.000000 14.0270 0 - 28 C4A 7 C4A C4 CH3 0.000000 15.0350 0 - 29 C4A 8 C4A C1 CH2 0.000000 14.0270 0 - 30 C4A 8 C4A C2 CH3 0.000000 15.0350 0 - 31 C4A 8 C4A C3 CH2 0.000000 14.0270 0 - 32 C4A 8 C4A C4 CH3 0.000000 15.0350 0 - 33 C4A 9 C4A C1 CH2 0.000000 14.0270 0 - 34 C4A 9 C4A C2 CH3 0.000000 15.0350 0 - 35 C4A 9 C4A C3 CH2 0.000000 14.0270 0 - 36 C4A 9 C4A C4 CH3 0.000000 15.0350 0 - 37 C4A 10 C4A C1 CH2 0.000000 14.0270 0 - 38 C4A 10 C4A C2 CH3 0.000000 15.0350 0 - 39 C4A 10 C4A C3 CH2 0.000000 14.0270 0 - 40 C4A 10 C4A C4 CH3 0.000000 15.0350 0 - 41 C4A 11 C4A C1 CH2 0.000000 14.0270 0 - 42 C4A 11 C4A C2 CH3 0.000000 15.0350 0 - 43 C4A 11 C4A C3 CH2 0.000000 14.0270 0 - 44 C4A 11 C4A C4 CH3 0.000000 15.0350 0 - 45 C4A 12 C4A C1 CH2 0.000000 14.0270 0 - 46 C4A 12 C4A C2 CH3 0.000000 15.0350 0 - 47 C4A 12 C4A C3 CH2 0.000000 14.0270 0 - 48 C4A 12 C4A C4 CH3 0.000000 15.0350 0 - 49 C4A 13 C4A C1 CH2 0.000000 14.0270 0 - 50 C4A 13 C4A C2 CH3 0.000000 15.0350 0 - 51 C4A 13 C4A C3 CH2 0.000000 14.0270 0 - 52 C4A 13 C4A C4 CH3 0.000000 15.0350 0 - 53 C4A 14 C4A C1 CH2 0.000000 14.0270 0 - 54 C4A 14 C4A C2 CH3 0.000000 15.0350 0 - 55 C4A 14 C4A C3 CH2 0.000000 14.0270 0 - 56 C4A 14 C4A C4 CH3 0.000000 15.0350 0 - 57 C4A 15 C4A C1 CH2 0.000000 14.0270 0 - 58 C4A 15 C4A C2 CH3 0.000000 15.0350 0 - 59 C4A 15 C4A C3 CH2 0.000000 14.0270 0 - 60 C4A 15 C4A C4 CH3 0.000000 15.0350 0 - 61 C4A 16 C4A C1 CH2 0.000000 14.0270 0 - 62 C4A 16 C4A C2 CH3 0.000000 15.0350 0 - 63 C4A 16 C4A C3 CH2 0.000000 14.0270 0 - 64 C4A 16 C4A C4 CH3 0.000000 15.0350 0 - 65 C4A 17 C4A C1 CH2 0.000000 14.0270 0 - 66 C4A 17 C4A C2 CH3 0.000000 15.0350 0 - 67 C4A 17 C4A C3 CH2 0.000000 14.0270 0 - 68 C4A 17 C4A C4 CH3 0.000000 15.0350 0 - 69 C4A 18 C4A C1 CH2 0.000000 14.0270 0 - 70 C4A 18 C4A C2 CH3 0.000000 15.0350 0 - 71 C4A 18 C4A C3 CH2 0.000000 14.0270 0 - 72 C4A 18 C4A C4 CH3 0.000000 15.0350 0 - 73 C4A 19 C4A C1 CH2 0.000000 14.0270 0 - 74 C4A 19 C4A C2 CH3 0.000000 15.0350 0 - 75 C4A 19 C4A C3 CH2 0.000000 14.0270 0 - 76 C4A 19 C4A C4 CH3 0.000000 15.0350 0 - 77 C4A 20 C4A C1 CH2 0.000000 14.0270 0 - 78 C4A 20 C4A C2 CH3 0.000000 15.0350 0 - 79 C4A 20 C4A C3 CH2 0.000000 14.0270 0 - 80 C4A 20 C4A C4 CH3 0.000000 15.0350 0 - 81 C4A 21 C4A C1 CH2 0.000000 14.0270 0 - 82 C4A 21 C4A C2 CH3 0.000000 15.0350 0 - 83 C4A 21 C4A C3 CH2 0.000000 14.0270 0 - 84 C4A 21 C4A C4 CH3 0.000000 15.0350 0 - 85 C4A 22 C4A C1 CH2 0.000000 14.0270 0 - 86 C4A 22 C4A C2 CH3 0.000000 15.0350 0 - 87 C4A 22 C4A C3 CH2 0.000000 14.0270 0 - 88 C4A 22 C4A C4 CH3 0.000000 15.0350 0 - 89 C4A 23 C4A C1 CH2 0.000000 14.0270 0 - 90 C4A 23 C4A C2 CH3 0.000000 15.0350 0 - 91 C4A 23 C4A C3 CH2 0.000000 14.0270 0 - 92 C4A 23 C4A C4 CH3 0.000000 15.0350 0 - 93 C4A 24 C4A C1 CH2 0.000000 14.0270 0 - 94 C4A 24 C4A C2 CH3 0.000000 15.0350 0 - 95 C4A 24 C4A C3 CH2 0.000000 14.0270 0 - 96 C4A 24 C4A C4 CH3 0.000000 15.0350 0 - 97 C4A 25 C4A C1 CH2 0.000000 14.0270 0 - 98 C4A 25 C4A C2 CH3 0.000000 15.0350 0 - 99 C4A 25 C4A C3 CH2 0.000000 14.0270 0 - 100 C4A 25 C4A C4 CH3 0.000000 15.0350 0 - 101 C4A 26 C4A C1 CH2 0.000000 14.0270 0 - 102 C4A 26 C4A C2 CH3 0.000000 15.0350 0 - 103 C4A 26 C4A C3 CH2 0.000000 14.0270 0 - 104 C4A 26 C4A C4 CH3 0.000000 15.0350 0 - 105 C4A 27 C4A C1 CH2 0.000000 14.0270 0 - 106 C4A 27 C4A C2 CH3 0.000000 15.0350 0 - 107 C4A 27 C4A C3 CH2 0.000000 14.0270 0 - 108 C4A 27 C4A C4 CH3 0.000000 15.0350 0 - 109 C4A 28 C4A C1 CH2 0.000000 14.0270 0 - 110 C4A 28 C4A C2 CH3 0.000000 15.0350 0 - 111 C4A 28 C4A C3 CH2 0.000000 14.0270 0 - 112 C4A 28 C4A C4 CH3 0.000000 15.0350 0 - 113 C4A 29 C4A C1 CH2 0.000000 14.0270 0 - 114 C4A 29 C4A C2 CH3 0.000000 15.0350 0 - 115 C4A 29 C4A C3 CH2 0.000000 14.0270 0 - 116 C4A 29 C4A C4 CH3 0.000000 15.0350 0 - 117 C4A 30 C4A C1 CH2 0.000000 14.0270 0 - 118 C4A 30 C4A C2 CH3 0.000000 15.0350 0 - 119 C4A 30 C4A C3 CH2 0.000000 14.0270 0 - 120 C4A 30 C4A C4 CH3 0.000000 15.0350 0 - 121 C4A 31 C4A C1 CH2 0.000000 14.0270 0 - 122 C4A 31 C4A C2 CH3 0.000000 15.0350 0 - 123 C4A 31 C4A C3 CH2 0.000000 14.0270 0 - 124 C4A 31 C4A C4 CH3 0.000000 15.0350 0 - 125 C4A 32 C4A C1 CH2 0.000000 14.0270 0 - 126 C4A 32 C4A C2 CH3 0.000000 15.0350 0 - 127 C4A 32 C4A C3 CH2 0.000000 14.0270 0 - 128 C4A 32 C4A C4 CH3 0.000000 15.0350 0 - 129 C4A 33 C4A C1 CH2 0.000000 14.0270 0 - 130 C4A 33 C4A C2 CH3 0.000000 15.0350 0 - 131 C4A 33 C4A C3 CH2 0.000000 14.0270 0 - 132 C4A 33 C4A C4 CH3 0.000000 15.0350 0 - 133 C4A 34 C4A C1 CH2 0.000000 14.0270 0 - 134 C4A 34 C4A C2 CH3 0.000000 15.0350 0 - 135 C4A 34 C4A C3 CH2 0.000000 14.0270 0 - 136 C4A 34 C4A C4 CH3 0.000000 15.0350 0 - 137 C4A 35 C4A C1 CH2 0.000000 14.0270 0 - 138 C4A 35 C4A C2 CH3 0.000000 15.0350 0 - 139 C4A 35 C4A C3 CH2 0.000000 14.0270 0 - 140 C4A 35 C4A C4 CH3 0.000000 15.0350 0 - 141 C4A 36 C4A C1 CH2 0.000000 14.0270 0 - 142 C4A 36 C4A C2 CH3 0.000000 15.0350 0 - 143 C4A 36 C4A C3 CH2 0.000000 14.0270 0 - 144 C4A 36 C4A C4 CH3 0.000000 15.0350 0 - 145 C4A 37 C4A C1 CH2 0.000000 14.0270 0 - 146 C4A 37 C4A C2 CH3 0.000000 15.0350 0 - 147 C4A 37 C4A C3 CH2 0.000000 14.0270 0 - 148 C4A 37 C4A C4 CH3 0.000000 15.0350 0 - 149 C4A 38 C4A C1 CH2 0.000000 14.0270 0 - 150 C4A 38 C4A C2 CH3 0.000000 15.0350 0 - 151 C4A 38 C4A C3 CH2 0.000000 14.0270 0 - 152 C4A 38 C4A C4 CH3 0.000000 15.0350 0 - 153 C4A 39 C4A C1 CH2 0.000000 14.0270 0 - 154 C4A 39 C4A C2 CH3 0.000000 15.0350 0 - 155 C4A 39 C4A C3 CH2 0.000000 14.0270 0 - 156 C4A 39 C4A C4 CH3 0.000000 15.0350 0 - 157 C4A 40 C4A C1 CH2 0.000000 14.0270 0 - 158 C4A 40 C4A C2 CH3 0.000000 15.0350 0 - 159 C4A 40 C4A C3 CH2 0.000000 14.0270 0 - 160 C4A 40 C4A C4 CH3 0.000000 15.0350 0 - 161 C4A 41 C4A C1 CH2 0.000000 14.0270 0 - 162 C4A 41 C4A C2 CH3 0.000000 15.0350 0 - 163 C4A 41 C4A C3 CH2 0.000000 14.0270 0 - 164 C4A 41 C4A C4 CH3 0.000000 15.0350 0 - 165 C4A 42 C4A C1 CH2 0.000000 14.0270 0 - 166 C4A 42 C4A C2 CH3 0.000000 15.0350 0 - 167 C4A 42 C4A C3 CH2 0.000000 14.0270 0 - 168 C4A 42 C4A C4 CH3 0.000000 15.0350 0 - 169 C4A 43 C4A C1 CH2 0.000000 14.0270 0 - 170 C4A 43 C4A C2 CH3 0.000000 15.0350 0 - 171 C4A 43 C4A C3 CH2 0.000000 14.0270 0 - 172 C4A 43 C4A C4 CH3 0.000000 15.0350 0 - 173 C4A 44 C4A C1 CH2 0.000000 14.0270 0 - 174 C4A 44 C4A C2 CH3 0.000000 15.0350 0 - 175 C4A 44 C4A C3 CH2 0.000000 14.0270 0 - 176 C4A 44 C4A C4 CH3 0.000000 15.0350 0 - 177 C4A 45 C4A C1 CH2 0.000000 14.0270 0 - 178 C4A 45 C4A C2 CH3 0.000000 15.0350 0 - 179 C4A 45 C4A C3 CH2 0.000000 14.0270 0 - 180 C4A 45 C4A C4 CH3 0.000000 15.0350 0 - 181 C4A 46 C4A C1 CH2 0.000000 14.0270 0 - 182 C4A 46 C4A C2 CH3 0.000000 15.0350 0 - 183 C4A 46 C4A C3 CH2 0.000000 14.0270 0 - 184 C4A 46 C4A C4 CH3 0.000000 15.0350 0 - 185 C4A 47 C4A C1 CH2 0.000000 14.0270 0 - 186 C4A 47 C4A C2 CH3 0.000000 15.0350 0 - 187 C4A 47 C4A C3 CH2 0.000000 14.0270 0 - 188 C4A 47 C4A C4 CH3 0.000000 15.0350 0 - 189 C4A 48 C4A C1 CH2 0.000000 14.0270 0 - 190 C4A 48 C4A C2 CH3 0.000000 15.0350 0 - 191 C4A 48 C4A C3 CH2 0.000000 14.0270 0 - 192 C4A 48 C4A C4 CH3 0.000000 15.0350 0 - 193 C4A 49 C4A C1 CH2 0.000000 14.0270 0 - 194 C4A 49 C4A C2 CH3 0.000000 15.0350 0 - 195 C4A 49 C4A C3 CH2 0.000000 14.0270 0 - 196 C4A 49 C4A C4 CH3 0.000000 15.0350 0 - 197 C4A 50 C4A C1 CH2 0.000000 14.0270 0 - 198 C4A 50 C4A C2 CH3 0.000000 15.0350 0 - 199 C4A 50 C4A C3 CH2 0.000000 14.0270 0 - 200 C4A 50 C4A C4 CH3 0.000000 15.0350 0 - 201 C4A 51 C4A C1 CH2 0.000000 14.0270 0 - 202 C4A 51 C4A C2 CH3 0.000000 15.0350 0 - 203 C4A 51 C4A C3 CH2 0.000000 14.0270 0 - 204 C4A 51 C4A C4 CH3 0.000000 15.0350 0 - 205 C4A 52 C4A C1 CH2 0.000000 14.0270 0 - 206 C4A 52 C4A C2 CH3 0.000000 15.0350 0 - 207 C4A 52 C4A C3 CH2 0.000000 14.0270 0 - 208 C4A 52 C4A C4 CH3 0.000000 15.0350 0 - 209 C4A 53 C4A C1 CH2 0.000000 14.0270 0 - 210 C4A 53 C4A C2 CH3 0.000000 15.0350 0 - 211 C4A 53 C4A C3 CH2 0.000000 14.0270 0 - 212 C4A 53 C4A C4 CH3 0.000000 15.0350 0 - 213 C4A 54 C4A C1 CH2 0.000000 14.0270 0 - 214 C4A 54 C4A C2 CH3 0.000000 15.0350 0 - 215 C4A 54 C4A C3 CH2 0.000000 14.0270 0 - 216 C4A 54 C4A C4 CH3 0.000000 15.0350 0 - 217 C4A 55 C4A C1 CH2 0.000000 14.0270 0 - 218 C4A 55 C4A C2 CH3 0.000000 15.0350 0 - 219 C4A 55 C4A C3 CH2 0.000000 14.0270 0 - 220 C4A 55 C4A C4 CH3 0.000000 15.0350 0 - 221 C4A 56 C4A C1 CH2 0.000000 14.0270 0 - 222 C4A 56 C4A C2 CH3 0.000000 15.0350 0 - 223 C4A 56 C4A C3 CH2 0.000000 14.0270 0 - 224 C4A 56 C4A C4 CH3 0.000000 15.0350 0 - 225 C4A 57 C4A C1 CH2 0.000000 14.0270 0 - 226 C4A 57 C4A C2 CH3 0.000000 15.0350 0 - 227 C4A 57 C4A C3 CH2 0.000000 14.0270 0 - 228 C4A 57 C4A C4 CH3 0.000000 15.0350 0 - 229 C4A 58 C4A C1 CH2 0.000000 14.0270 0 - 230 C4A 58 C4A C2 CH3 0.000000 15.0350 0 - 231 C4A 58 C4A C3 CH2 0.000000 14.0270 0 - 232 C4A 58 C4A C4 CH3 0.000000 15.0350 0 - 233 C4A 59 C4A C1 CH2 0.000000 14.0270 0 - 234 C4A 59 C4A C2 CH3 0.000000 15.0350 0 - 235 C4A 59 C4A C3 CH2 0.000000 14.0270 0 - 236 C4A 59 C4A C4 CH3 0.000000 15.0350 0 - 237 C4A 60 C4A C1 CH2 0.000000 14.0270 0 - 238 C4A 60 C4A C2 CH3 0.000000 15.0350 0 - 239 C4A 60 C4A C3 CH2 0.000000 14.0270 0 - 240 C4A 60 C4A C4 CH3 0.000000 15.0350 0 - 241 C4A 61 C4A C1 CH2 0.000000 14.0270 0 - 242 C4A 61 C4A C2 CH3 0.000000 15.0350 0 - 243 C4A 61 C4A C3 CH2 0.000000 14.0270 0 - 244 C4A 61 C4A C4 CH3 0.000000 15.0350 0 - 245 C4A 62 C4A C1 CH2 0.000000 14.0270 0 - 246 C4A 62 C4A C2 CH3 0.000000 15.0350 0 - 247 C4A 62 C4A C3 CH2 0.000000 14.0270 0 - 248 C4A 62 C4A C4 CH3 0.000000 15.0350 0 - 249 C4A 63 C4A C1 CH2 0.000000 14.0270 0 - 250 C4A 63 C4A C2 CH3 0.000000 15.0350 0 - 251 C4A 63 C4A C3 CH2 0.000000 14.0270 0 - 252 C4A 63 C4A C4 CH3 0.000000 15.0350 0 - 253 C4A 64 C4A C1 CH2 0.000000 14.0270 0 - 254 C4A 64 C4A C2 CH3 0.000000 15.0350 0 - 255 C4A 64 C4A C3 CH2 0.000000 14.0270 0 - 256 C4A 64 C4A C4 CH3 0.000000 15.0350 0 - 257 C4A 65 C4A C1 CH2 0.000000 14.0270 0 - 258 C4A 65 C4A C2 CH3 0.000000 15.0350 0 - 259 C4A 65 C4A C3 CH2 0.000000 14.0270 0 - 260 C4A 65 C4A C4 CH3 0.000000 15.0350 0 - 261 C4A 66 C4A C1 CH2 0.000000 14.0270 0 - 262 C4A 66 C4A C2 CH3 0.000000 15.0350 0 - 263 C4A 66 C4A C3 CH2 0.000000 14.0270 0 - 264 C4A 66 C4A C4 CH3 0.000000 15.0350 0 - 265 C4A 67 C4A C1 CH2 0.000000 14.0270 0 - 266 C4A 67 C4A C2 CH3 0.000000 15.0350 0 - 267 C4A 67 C4A C3 CH2 0.000000 14.0270 0 - 268 C4A 67 C4A C4 CH3 0.000000 15.0350 0 - 269 C4A 68 C4A C1 CH2 0.000000 14.0270 0 - 270 C4A 68 C4A C2 CH3 0.000000 15.0350 0 - 271 C4A 68 C4A C3 CH2 0.000000 14.0270 0 - 272 C4A 68 C4A C4 CH3 0.000000 15.0350 0 - 273 C4A 69 C4A C1 CH2 0.000000 14.0270 0 - 274 C4A 69 C4A C2 CH3 0.000000 15.0350 0 - 275 C4A 69 C4A C3 CH2 0.000000 14.0270 0 - 276 C4A 69 C4A C4 CH3 0.000000 15.0350 0 - 277 C4A 70 C4A C1 CH2 0.000000 14.0270 0 - 278 C4A 70 C4A C2 CH3 0.000000 15.0350 0 - 279 C4A 70 C4A C3 CH2 0.000000 14.0270 0 - 280 C4A 70 C4A C4 CH3 0.000000 15.0350 0 - 281 C4A 71 C4A C1 CH2 0.000000 14.0270 0 - 282 C4A 71 C4A C2 CH3 0.000000 15.0350 0 - 283 C4A 71 C4A C3 CH2 0.000000 14.0270 0 - 284 C4A 71 C4A C4 CH3 0.000000 15.0350 0 - 285 C4A 72 C4A C1 CH2 0.000000 14.0270 0 - 286 C4A 72 C4A C2 CH3 0.000000 15.0350 0 - 287 C4A 72 C4A C3 CH2 0.000000 14.0270 0 - 288 C4A 72 C4A C4 CH3 0.000000 15.0350 0 - 289 C4A 73 C4A C1 CH2 0.000000 14.0270 0 - 290 C4A 73 C4A C2 CH3 0.000000 15.0350 0 - 291 C4A 73 C4A C3 CH2 0.000000 14.0270 0 - 292 C4A 73 C4A C4 CH3 0.000000 15.0350 0 - 293 C4A 74 C4A C1 CH2 0.000000 14.0270 0 - 294 C4A 74 C4A C2 CH3 0.000000 15.0350 0 - 295 C4A 74 C4A C3 CH2 0.000000 14.0270 0 - 296 C4A 74 C4A C4 CH3 0.000000 15.0350 0 - 297 C4A 75 C4A C1 CH2 0.000000 14.0270 0 - 298 C4A 75 C4A C2 CH3 0.000000 15.0350 0 - 299 C4A 75 C4A C3 CH2 0.000000 14.0270 0 - 300 C4A 75 C4A C4 CH3 0.000000 15.0350 0 - 301 C4A 76 C4A C1 CH2 0.000000 14.0270 0 - 302 C4A 76 C4A C2 CH3 0.000000 15.0350 0 - 303 C4A 76 C4A C3 CH2 0.000000 14.0270 0 - 304 C4A 76 C4A C4 CH3 0.000000 15.0350 0 - 305 C4A 77 C4A C1 CH2 0.000000 14.0270 0 - 306 C4A 77 C4A C2 CH3 0.000000 15.0350 0 - 307 C4A 77 C4A C3 CH2 0.000000 14.0270 0 - 308 C4A 77 C4A C4 CH3 0.000000 15.0350 0 - 309 C4A 78 C4A C1 CH2 0.000000 14.0270 0 - 310 C4A 78 C4A C2 CH3 0.000000 15.0350 0 - 311 C4A 78 C4A C3 CH2 0.000000 14.0270 0 - 312 C4A 78 C4A C4 CH3 0.000000 15.0350 0 - 313 C4A 79 C4A C1 CH2 0.000000 14.0270 0 - 314 C4A 79 C4A C2 CH3 0.000000 15.0350 0 - 315 C4A 79 C4A C3 CH2 0.000000 14.0270 0 - 316 C4A 79 C4A C4 CH3 0.000000 15.0350 0 - 317 C4A 80 C4A C1 CH2 0.000000 14.0270 0 - 318 C4A 80 C4A C2 CH3 0.000000 15.0350 0 - 319 C4A 80 C4A C3 CH2 0.000000 14.0270 0 - 320 C4A 80 C4A C4 CH3 0.000000 15.0350 0 - 321 C4A 81 C4A C1 CH2 0.000000 14.0270 0 - 322 C4A 81 C4A C2 CH3 0.000000 15.0350 0 - 323 C4A 81 C4A C3 CH2 0.000000 14.0270 0 - 324 C4A 81 C4A C4 CH3 0.000000 15.0350 0 - 325 C4A 82 C4A C1 CH2 0.000000 14.0270 0 - 326 C4A 82 C4A C2 CH3 0.000000 15.0350 0 - 327 C4A 82 C4A C3 CH2 0.000000 14.0270 0 - 328 C4A 82 C4A C4 CH3 0.000000 15.0350 0 - 329 C4A 83 C4A C1 CH2 0.000000 14.0270 0 - 330 C4A 83 C4A C2 CH3 0.000000 15.0350 0 - 331 C4A 83 C4A C3 CH2 0.000000 14.0270 0 - 332 C4A 83 C4A C4 CH3 0.000000 15.0350 0 - 333 C4A 84 C4A C1 CH2 0.000000 14.0270 0 - 334 C4A 84 C4A C2 CH3 0.000000 15.0350 0 - 335 C4A 84 C4A C3 CH2 0.000000 14.0270 0 - 336 C4A 84 C4A C4 CH3 0.000000 15.0350 0 - 337 C4A 85 C4A C1 CH2 0.000000 14.0270 0 - 338 C4A 85 C4A C2 CH3 0.000000 15.0350 0 - 339 C4A 85 C4A C3 CH2 0.000000 14.0270 0 - 340 C4A 85 C4A C4 CH3 0.000000 15.0350 0 - 341 C4A 86 C4A C1 CH2 0.000000 14.0270 0 - 342 C4A 86 C4A C2 CH3 0.000000 15.0350 0 - 343 C4A 86 C4A C3 CH2 0.000000 14.0270 0 - 344 C4A 86 C4A C4 CH3 0.000000 15.0350 0 - 345 C4A 87 C4A C1 CH2 0.000000 14.0270 0 - 346 C4A 87 C4A C2 CH3 0.000000 15.0350 0 - 347 C4A 87 C4A C3 CH2 0.000000 14.0270 0 - 348 C4A 87 C4A C4 CH3 0.000000 15.0350 0 - 349 C4A 88 C4A C1 CH2 0.000000 14.0270 0 - 350 C4A 88 C4A C2 CH3 0.000000 15.0350 0 - 351 C4A 88 C4A C3 CH2 0.000000 14.0270 0 - 352 C4A 88 C4A C4 CH3 0.000000 15.0350 0 - 353 C4A 89 C4A C1 CH2 0.000000 14.0270 0 - 354 C4A 89 C4A C2 CH3 0.000000 15.0350 0 - 355 C4A 89 C4A C3 CH2 0.000000 14.0270 0 - 356 C4A 89 C4A C4 CH3 0.000000 15.0350 0 - 357 C4A 90 C4A C1 CH2 0.000000 14.0270 0 - 358 C4A 90 C4A C2 CH3 0.000000 15.0350 0 - 359 C4A 90 C4A C3 CH2 0.000000 14.0270 0 - 360 C4A 90 C4A C4 CH3 0.000000 15.0350 0 - 361 C4A 91 C4A C1 CH2 0.000000 14.0270 0 - 362 C4A 91 C4A C2 CH3 0.000000 15.0350 0 - 363 C4A 91 C4A C3 CH2 0.000000 14.0270 0 - 364 C4A 91 C4A C4 CH3 0.000000 15.0350 0 - 365 C4A 92 C4A C1 CH2 0.000000 14.0270 0 - 366 C4A 92 C4A C2 CH3 0.000000 15.0350 0 - 367 C4A 92 C4A C3 CH2 0.000000 14.0270 0 - 368 C4A 92 C4A C4 CH3 0.000000 15.0350 0 - 369 C4A 93 C4A C1 CH2 0.000000 14.0270 0 - 370 C4A 93 C4A C2 CH3 0.000000 15.0350 0 - 371 C4A 93 C4A C3 CH2 0.000000 14.0270 0 - 372 C4A 93 C4A C4 CH3 0.000000 15.0350 0 - 373 C4A 94 C4A C1 CH2 0.000000 14.0270 0 - 374 C4A 94 C4A C2 CH3 0.000000 15.0350 0 - 375 C4A 94 C4A C3 CH2 0.000000 14.0270 0 - 376 C4A 94 C4A C4 CH3 0.000000 15.0350 0 - 377 C4A 95 C4A C1 CH2 0.000000 14.0270 0 - 378 C4A 95 C4A C2 CH3 0.000000 15.0350 0 - 379 C4A 95 C4A C3 CH2 0.000000 14.0270 0 - 380 C4A 95 C4A C4 CH3 0.000000 15.0350 0 - 381 C4A 96 C4A C1 CH2 0.000000 14.0270 0 - 382 C4A 96 C4A C2 CH3 0.000000 15.0350 0 - 383 C4A 96 C4A C3 CH2 0.000000 14.0270 0 - 384 C4A 96 C4A C4 CH3 0.000000 15.0350 0 - 385 C4A 97 C4A C1 CH2 0.000000 14.0270 0 - 386 C4A 97 C4A C2 CH3 0.000000 15.0350 0 - 387 C4A 97 C4A C3 CH2 0.000000 14.0270 0 - 388 C4A 97 C4A C4 CH3 0.000000 15.0350 0 - 389 C4A 98 C4A C1 CH2 0.000000 14.0270 0 - 390 C4A 98 C4A C2 CH3 0.000000 15.0350 0 - 391 C4A 98 C4A C3 CH2 0.000000 14.0270 0 - 392 C4A 98 C4A C4 CH3 0.000000 15.0350 0 - 393 C4A 99 C4A C1 CH2 0.000000 14.0270 0 - 394 C4A 99 C4A C2 CH3 0.000000 15.0350 0 - 395 C4A 99 C4A C3 CH2 0.000000 14.0270 0 - 396 C4A 99 C4A C4 CH3 0.000000 15.0350 0 - 397 C4A 100 C4A C1 CH2 0.000000 14.0270 0 - 398 C4A 100 C4A C2 CH3 0.000000 15.0350 0 - 399 C4A 100 C4A C3 CH2 0.000000 14.0270 0 - 400 C4A 100 C4A C4 CH3 0.000000 15.0350 0 - 401 C4A 101 C4A C1 CH2 0.000000 14.0270 0 - 402 C4A 101 C4A C2 CH3 0.000000 15.0350 0 - 403 C4A 101 C4A C3 CH2 0.000000 14.0270 0 - 404 C4A 101 C4A C4 CH3 0.000000 15.0350 0 - 405 C4A 102 C4A C1 CH2 0.000000 14.0270 0 - 406 C4A 102 C4A C2 CH3 0.000000 15.0350 0 - 407 C4A 102 C4A C3 CH2 0.000000 14.0270 0 - 408 C4A 102 C4A C4 CH3 0.000000 15.0350 0 - 409 C4A 103 C4A C1 CH2 0.000000 14.0270 0 - 410 C4A 103 C4A C2 CH3 0.000000 15.0350 0 - 411 C4A 103 C4A C3 CH2 0.000000 14.0270 0 - 412 C4A 103 C4A C4 CH3 0.000000 15.0350 0 - 413 C4A 104 C4A C1 CH2 0.000000 14.0270 0 - 414 C4A 104 C4A C2 CH3 0.000000 15.0350 0 - 415 C4A 104 C4A C3 CH2 0.000000 14.0270 0 - 416 C4A 104 C4A C4 CH3 0.000000 15.0350 0 - 417 C4A 105 C4A C1 CH2 0.000000 14.0270 0 - 418 C4A 105 C4A C2 CH3 0.000000 15.0350 0 - 419 C4A 105 C4A C3 CH2 0.000000 14.0270 0 - 420 C4A 105 C4A C4 CH3 0.000000 15.0350 0 - 421 C4A 106 C4A C1 CH2 0.000000 14.0270 0 - 422 C4A 106 C4A C2 CH3 0.000000 15.0350 0 - 423 C4A 106 C4A C3 CH2 0.000000 14.0270 0 - 424 C4A 106 C4A C4 CH3 0.000000 15.0350 0 - 425 C4A 107 C4A C1 CH2 0.000000 14.0270 0 - 426 C4A 107 C4A C2 CH3 0.000000 15.0350 0 - 427 C4A 107 C4A C3 CH2 0.000000 14.0270 0 - 428 C4A 107 C4A C4 CH3 0.000000 15.0350 0 - 429 C4A 108 C4A C1 CH2 0.000000 14.0270 0 - 430 C4A 108 C4A C2 CH3 0.000000 15.0350 0 - 431 C4A 108 C4A C3 CH2 0.000000 14.0270 0 - 432 C4A 108 C4A C4 CH3 0.000000 15.0350 0 - 433 C4A 109 C4A C1 CH2 0.000000 14.0270 0 - 434 C4A 109 C4A C2 CH3 0.000000 15.0350 0 - 435 C4A 109 C4A C3 CH2 0.000000 14.0270 0 - 436 C4A 109 C4A C4 CH3 0.000000 15.0350 0 - 437 C4A 110 C4A C1 CH2 0.000000 14.0270 0 - 438 C4A 110 C4A C2 CH3 0.000000 15.0350 0 - 439 C4A 110 C4A C3 CH2 0.000000 14.0270 0 - 440 C4A 110 C4A C4 CH3 0.000000 15.0350 0 - 441 C4A 111 C4A C1 CH2 0.000000 14.0270 0 - 442 C4A 111 C4A C2 CH3 0.000000 15.0350 0 - 443 C4A 111 C4A C3 CH2 0.000000 14.0270 0 - 444 C4A 111 C4A C4 CH3 0.000000 15.0350 0 - 445 C4A 112 C4A C1 CH2 0.000000 14.0270 0 - 446 C4A 112 C4A C2 CH3 0.000000 15.0350 0 - 447 C4A 112 C4A C3 CH2 0.000000 14.0270 0 - 448 C4A 112 C4A C4 CH3 0.000000 15.0350 0 - 449 C4A 113 C4A C1 CH2 0.000000 14.0270 0 - 450 C4A 113 C4A C2 CH3 0.000000 15.0350 0 - 451 C4A 113 C4A C3 CH2 0.000000 14.0270 0 - 452 C4A 113 C4A C4 CH3 0.000000 15.0350 0 - 453 C4A 114 C4A C1 CH2 0.000000 14.0270 0 - 454 C4A 114 C4A C2 CH3 0.000000 15.0350 0 - 455 C4A 114 C4A C3 CH2 0.000000 14.0270 0 - 456 C4A 114 C4A C4 CH3 0.000000 15.0350 0 - 457 C4A 115 C4A C1 CH2 0.000000 14.0270 0 - 458 C4A 115 C4A C2 CH3 0.000000 15.0350 0 - 459 C4A 115 C4A C3 CH2 0.000000 14.0270 0 - 460 C4A 115 C4A C4 CH3 0.000000 15.0350 0 - 461 C4A 116 C4A C1 CH2 0.000000 14.0270 0 - 462 C4A 116 C4A C2 CH3 0.000000 15.0350 0 - 463 C4A 116 C4A C3 CH2 0.000000 14.0270 0 - 464 C4A 116 C4A C4 CH3 0.000000 15.0350 0 - 465 C4A 117 C4A C1 CH2 0.000000 14.0270 0 - 466 C4A 117 C4A C2 CH3 0.000000 15.0350 0 - 467 C4A 117 C4A C3 CH2 0.000000 14.0270 0 - 468 C4A 117 C4A C4 CH3 0.000000 15.0350 0 - 469 C4A 118 C4A C1 CH2 0.000000 14.0270 0 - 470 C4A 118 C4A C2 CH3 0.000000 15.0350 0 - 471 C4A 118 C4A C3 CH2 0.000000 14.0270 0 - 472 C4A 118 C4A C4 CH3 0.000000 15.0350 0 - 473 C4A 119 C4A C1 CH2 0.000000 14.0270 0 - 474 C4A 119 C4A C2 CH3 0.000000 15.0350 0 - 475 C4A 119 C4A C3 CH2 0.000000 14.0270 0 - 476 C4A 119 C4A C4 CH3 0.000000 15.0350 0 - 477 C4A 120 C4A C1 CH2 0.000000 14.0270 0 - 478 C4A 120 C4A C2 CH3 0.000000 15.0350 0 - 479 C4A 120 C4A C3 CH2 0.000000 14.0270 0 - 480 C4A 120 C4A C4 CH3 0.000000 15.0350 0 - 481 C4A 121 C4A C1 CH2 0.000000 14.0270 0 - 482 C4A 121 C4A C2 CH3 0.000000 15.0350 0 - 483 C4A 121 C4A C3 CH2 0.000000 14.0270 0 - 484 C4A 121 C4A C4 CH3 0.000000 15.0350 0 - 485 C4A 122 C4A C1 CH2 0.000000 14.0270 0 - 486 C4A 122 C4A C2 CH3 0.000000 15.0350 0 - 487 C4A 122 C4A C3 CH2 0.000000 14.0270 0 - 488 C4A 122 C4A C4 CH3 0.000000 15.0350 0 - 489 C4A 123 C4A C1 CH2 0.000000 14.0270 0 - 490 C4A 123 C4A C2 CH3 0.000000 15.0350 0 - 491 C4A 123 C4A C3 CH2 0.000000 14.0270 0 - 492 C4A 123 C4A C4 CH3 0.000000 15.0350 0 - 493 C4A 124 C4A C1 CH2 0.000000 14.0270 0 - 494 C4A 124 C4A C2 CH3 0.000000 15.0350 0 - 495 C4A 124 C4A C3 CH2 0.000000 14.0270 0 - 496 C4A 124 C4A C4 CH3 0.000000 15.0350 0 - 497 C4A 125 C4A C1 CH2 0.000000 14.0270 0 - 498 C4A 125 C4A C2 CH3 0.000000 15.0350 0 - 499 C4A 125 C4A C3 CH2 0.000000 14.0270 0 - 500 C4A 125 C4A C4 CH3 0.000000 15.0350 0 - 501 C4A 126 C4A C1 CH2 0.000000 14.0270 0 - 502 C4A 126 C4A C2 CH3 0.000000 15.0350 0 - 503 C4A 126 C4A C3 CH2 0.000000 14.0270 0 - 504 C4A 126 C4A C4 CH3 0.000000 15.0350 0 - 505 C4A 127 C4A C1 CH2 0.000000 14.0270 0 - 506 C4A 127 C4A C2 CH3 0.000000 15.0350 0 - 507 C4A 127 C4A C3 CH2 0.000000 14.0270 0 - 508 C4A 127 C4A C4 CH3 0.000000 15.0350 0 - 509 C4A 128 C4A C1 CH2 0.000000 14.0270 0 - 510 C4A 128 C4A C2 CH3 0.000000 15.0350 0 - 511 C4A 128 C4A C3 CH2 0.000000 14.0270 0 - 512 C4A 128 C4A C4 CH3 0.000000 15.0350 0 - 513 C4A 129 C4A C1 CH2 0.000000 14.0270 0 - 514 C4A 129 C4A C2 CH3 0.000000 15.0350 0 - 515 C4A 129 C4A C3 CH2 0.000000 14.0270 0 - 516 C4A 129 C4A C4 CH3 0.000000 15.0350 0 - 517 C4A 130 C4A C1 CH2 0.000000 14.0270 0 - 518 C4A 130 C4A C2 CH3 0.000000 15.0350 0 - 519 C4A 130 C4A C3 CH2 0.000000 14.0270 0 - 520 C4A 130 C4A C4 CH3 0.000000 15.0350 0 - 521 C4A 131 C4A C1 CH2 0.000000 14.0270 0 - 522 C4A 131 C4A C2 CH3 0.000000 15.0350 0 - 523 C4A 131 C4A C3 CH2 0.000000 14.0270 0 - 524 C4A 131 C4A C4 CH3 0.000000 15.0350 0 - 525 C4A 132 C4A C1 CH2 0.000000 14.0270 0 - 526 C4A 132 C4A C2 CH3 0.000000 15.0350 0 - 527 C4A 132 C4A C3 CH2 0.000000 14.0270 0 - 528 C4A 132 C4A C4 CH3 0.000000 15.0350 0 - 529 C4A 133 C4A C1 CH2 0.000000 14.0270 0 - 530 C4A 133 C4A C2 CH3 0.000000 15.0350 0 - 531 C4A 133 C4A C3 CH2 0.000000 14.0270 0 - 532 C4A 133 C4A C4 CH3 0.000000 15.0350 0 - 533 C4A 134 C4A C1 CH2 0.000000 14.0270 0 - 534 C4A 134 C4A C2 CH3 0.000000 15.0350 0 - 535 C4A 134 C4A C3 CH2 0.000000 14.0270 0 - 536 C4A 134 C4A C4 CH3 0.000000 15.0350 0 - 537 C4A 135 C4A C1 CH2 0.000000 14.0270 0 - 538 C4A 135 C4A C2 CH3 0.000000 15.0350 0 - 539 C4A 135 C4A C3 CH2 0.000000 14.0270 0 - 540 C4A 135 C4A C4 CH3 0.000000 15.0350 0 - 541 C4A 136 C4A C1 CH2 0.000000 14.0270 0 - 542 C4A 136 C4A C2 CH3 0.000000 15.0350 0 - 543 C4A 136 C4A C3 CH2 0.000000 14.0270 0 - 544 C4A 136 C4A C4 CH3 0.000000 15.0350 0 - 545 C4A 137 C4A C1 CH2 0.000000 14.0270 0 - 546 C4A 137 C4A C2 CH3 0.000000 15.0350 0 - 547 C4A 137 C4A C3 CH2 0.000000 14.0270 0 - 548 C4A 137 C4A C4 CH3 0.000000 15.0350 0 - 549 C4A 138 C4A C1 CH2 0.000000 14.0270 0 - 550 C4A 138 C4A C2 CH3 0.000000 15.0350 0 - 551 C4A 138 C4A C3 CH2 0.000000 14.0270 0 - 552 C4A 138 C4A C4 CH3 0.000000 15.0350 0 - 553 C4A 139 C4A C1 CH2 0.000000 14.0270 0 - 554 C4A 139 C4A C2 CH3 0.000000 15.0350 0 - 555 C4A 139 C4A C3 CH2 0.000000 14.0270 0 - 556 C4A 139 C4A C4 CH3 0.000000 15.0350 0 - 557 C4A 140 C4A C1 CH2 0.000000 14.0270 0 - 558 C4A 140 C4A C2 CH3 0.000000 15.0350 0 - 559 C4A 140 C4A C3 CH2 0.000000 14.0270 0 - 560 C4A 140 C4A C4 CH3 0.000000 15.0350 0 - 561 C4A 141 C4A C1 CH2 0.000000 14.0270 0 - 562 C4A 141 C4A C2 CH3 0.000000 15.0350 0 - 563 C4A 141 C4A C3 CH2 0.000000 14.0270 0 - 564 C4A 141 C4A C4 CH3 0.000000 15.0350 0 - 565 C4A 142 C4A C1 CH2 0.000000 14.0270 0 - 566 C4A 142 C4A C2 CH3 0.000000 15.0350 0 - 567 C4A 142 C4A C3 CH2 0.000000 14.0270 0 - 568 C4A 142 C4A C4 CH3 0.000000 15.0350 0 - 569 C4A 143 C4A C1 CH2 0.000000 14.0270 0 - 570 C4A 143 C4A C2 CH3 0.000000 15.0350 0 - 571 C4A 143 C4A C3 CH2 0.000000 14.0270 0 - 572 C4A 143 C4A C4 CH3 0.000000 15.0350 0 - 573 C4A 144 C4A C1 CH2 0.000000 14.0270 0 - 574 C4A 144 C4A C2 CH3 0.000000 15.0350 0 - 575 C4A 144 C4A C3 CH2 0.000000 14.0270 0 - 576 C4A 144 C4A C4 CH3 0.000000 15.0350 0 - 577 C4A 145 C4A C1 CH2 0.000000 14.0270 0 - 578 C4A 145 C4A C2 CH3 0.000000 15.0350 0 - 579 C4A 145 C4A C3 CH2 0.000000 14.0270 0 - 580 C4A 145 C4A C4 CH3 0.000000 15.0350 0 - 581 C4A 146 C4A C1 CH2 0.000000 14.0270 0 - 582 C4A 146 C4A C2 CH3 0.000000 15.0350 0 - 583 C4A 146 C4A C3 CH2 0.000000 14.0270 0 - 584 C4A 146 C4A C4 CH3 0.000000 15.0350 0 - 585 C4A 147 C4A C1 CH2 0.000000 14.0270 0 - 586 C4A 147 C4A C2 CH3 0.000000 15.0350 0 - 587 C4A 147 C4A C3 CH2 0.000000 14.0270 0 - 588 C4A 147 C4A C4 CH3 0.000000 15.0350 0 - 589 C4A 148 C4A C1 CH2 0.000000 14.0270 0 - 590 C4A 148 C4A C2 CH3 0.000000 15.0350 0 - 591 C4A 148 C4A C3 CH2 0.000000 14.0270 0 - 592 C4A 148 C4A C4 CH3 0.000000 15.0350 0 - 593 C4A 149 C4A C1 CH2 0.000000 14.0270 0 - 594 C4A 149 C4A C2 CH3 0.000000 15.0350 0 - 595 C4A 149 C4A C3 CH2 0.000000 14.0270 0 - 596 C4A 149 C4A C4 CH3 0.000000 15.0350 0 - 597 C4A 150 C4A C1 CH2 0.000000 14.0270 0 - 598 C4A 150 C4A C2 CH3 0.000000 15.0350 0 - 599 C4A 150 C4A C3 CH2 0.000000 14.0270 0 - 600 C4A 150 C4A C4 CH3 0.000000 15.0350 0 - 601 C4A 151 C4A C1 CH2 0.000000 14.0270 0 - 602 C4A 151 C4A C2 CH3 0.000000 15.0350 0 - 603 C4A 151 C4A C3 CH2 0.000000 14.0270 0 - 604 C4A 151 C4A C4 CH3 0.000000 15.0350 0 - 605 C4A 152 C4A C1 CH2 0.000000 14.0270 0 - 606 C4A 152 C4A C2 CH3 0.000000 15.0350 0 - 607 C4A 152 C4A C3 CH2 0.000000 14.0270 0 - 608 C4A 152 C4A C4 CH3 0.000000 15.0350 0 - 609 C4A 153 C4A C1 CH2 0.000000 14.0270 0 - 610 C4A 153 C4A C2 CH3 0.000000 15.0350 0 - 611 C4A 153 C4A C3 CH2 0.000000 14.0270 0 - 612 C4A 153 C4A C4 CH3 0.000000 15.0350 0 - 613 C4A 154 C4A C1 CH2 0.000000 14.0270 0 - 614 C4A 154 C4A C2 CH3 0.000000 15.0350 0 - 615 C4A 154 C4A C3 CH2 0.000000 14.0270 0 - 616 C4A 154 C4A C4 CH3 0.000000 15.0350 0 - 617 C4A 155 C4A C1 CH2 0.000000 14.0270 0 - 618 C4A 155 C4A C2 CH3 0.000000 15.0350 0 - 619 C4A 155 C4A C3 CH2 0.000000 14.0270 0 - 620 C4A 155 C4A C4 CH3 0.000000 15.0350 0 - 621 C4A 156 C4A C1 CH2 0.000000 14.0270 0 - 622 C4A 156 C4A C2 CH3 0.000000 15.0350 0 - 623 C4A 156 C4A C3 CH2 0.000000 14.0270 0 - 624 C4A 156 C4A C4 CH3 0.000000 15.0350 0 - 625 C4A 157 C4A C1 CH2 0.000000 14.0270 0 - 626 C4A 157 C4A C2 CH3 0.000000 15.0350 0 - 627 C4A 157 C4A C3 CH2 0.000000 14.0270 0 - 628 C4A 157 C4A C4 CH3 0.000000 15.0350 0 - 629 C4A 158 C4A C1 CH2 0.000000 14.0270 0 - 630 C4A 158 C4A C2 CH3 0.000000 15.0350 0 - 631 C4A 158 C4A C3 CH2 0.000000 14.0270 0 - 632 C4A 158 C4A C4 CH3 0.000000 15.0350 0 - 633 C4A 159 C4A C1 CH2 0.000000 14.0270 0 - 634 C4A 159 C4A C2 CH3 0.000000 15.0350 0 - 635 C4A 159 C4A C3 CH2 0.000000 14.0270 0 - 636 C4A 159 C4A C4 CH3 0.000000 15.0350 0 - 637 C4A 160 C4A C1 CH2 0.000000 14.0270 0 - 638 C4A 160 C4A C2 CH3 0.000000 15.0350 0 - 639 C4A 160 C4A C3 CH2 0.000000 14.0270 0 - 640 C4A 160 C4A C4 CH3 0.000000 15.0350 0 - 641 C4A 161 C4A C1 CH2 0.000000 14.0270 0 - 642 C4A 161 C4A C2 CH3 0.000000 15.0350 0 - 643 C4A 161 C4A C3 CH2 0.000000 14.0270 0 - 644 C4A 161 C4A C4 CH3 0.000000 15.0350 0 - 645 C4A 162 C4A C1 CH2 0.000000 14.0270 0 - 646 C4A 162 C4A C2 CH3 0.000000 15.0350 0 - 647 C4A 162 C4A C3 CH2 0.000000 14.0270 0 - 648 C4A 162 C4A C4 CH3 0.000000 15.0350 0 - 649 C4A 163 C4A C1 CH2 0.000000 14.0270 0 - 650 C4A 163 C4A C2 CH3 0.000000 15.0350 0 - 651 C4A 163 C4A C3 CH2 0.000000 14.0270 0 - 652 C4A 163 C4A C4 CH3 0.000000 15.0350 0 - 653 C4A 164 C4A C1 CH2 0.000000 14.0270 0 - 654 C4A 164 C4A C2 CH3 0.000000 15.0350 0 - 655 C4A 164 C4A C3 CH2 0.000000 14.0270 0 - 656 C4A 164 C4A C4 CH3 0.000000 15.0350 0 - 657 C4A 165 C4A C1 CH2 0.000000 14.0270 0 - 658 C4A 165 C4A C2 CH3 0.000000 15.0350 0 - 659 C4A 165 C4A C3 CH2 0.000000 14.0270 0 - 660 C4A 165 C4A C4 CH3 0.000000 15.0350 0 - 661 C4A 166 C4A C1 CH2 0.000000 14.0270 0 - 662 C4A 166 C4A C2 CH3 0.000000 15.0350 0 - 663 C4A 166 C4A C3 CH2 0.000000 14.0270 0 - 664 C4A 166 C4A C4 CH3 0.000000 15.0350 0 - 665 C4A 167 C4A C1 CH2 0.000000 14.0270 0 - 666 C4A 167 C4A C2 CH3 0.000000 15.0350 0 - 667 C4A 167 C4A C3 CH2 0.000000 14.0270 0 - 668 C4A 167 C4A C4 CH3 0.000000 15.0350 0 - 669 C4A 168 C4A C1 CH2 0.000000 14.0270 0 - 670 C4A 168 C4A C2 CH3 0.000000 15.0350 0 - 671 C4A 168 C4A C3 CH2 0.000000 14.0270 0 - 672 C4A 168 C4A C4 CH3 0.000000 15.0350 0 - 673 C4A 169 C4A C1 CH2 0.000000 14.0270 0 - 674 C4A 169 C4A C2 CH3 0.000000 15.0350 0 - 675 C4A 169 C4A C3 CH2 0.000000 14.0270 0 - 676 C4A 169 C4A C4 CH3 0.000000 15.0350 0 - 677 C4A 170 C4A C1 CH2 0.000000 14.0270 0 - 678 C4A 170 C4A C2 CH3 0.000000 15.0350 0 - 679 C4A 170 C4A C3 CH2 0.000000 14.0270 0 - 680 C4A 170 C4A C4 CH3 0.000000 15.0350 0 - 681 C4A 171 C4A C1 CH2 0.000000 14.0270 0 - 682 C4A 171 C4A C2 CH3 0.000000 15.0350 0 - 683 C4A 171 C4A C3 CH2 0.000000 14.0270 0 - 684 C4A 171 C4A C4 CH3 0.000000 15.0350 0 - 685 C4A 172 C4A C1 CH2 0.000000 14.0270 0 - 686 C4A 172 C4A C2 CH3 0.000000 15.0350 0 - 687 C4A 172 C4A C3 CH2 0.000000 14.0270 0 - 688 C4A 172 C4A C4 CH3 0.000000 15.0350 0 - 689 C4A 173 C4A C1 CH2 0.000000 14.0270 0 - 690 C4A 173 C4A C2 CH3 0.000000 15.0350 0 - 691 C4A 173 C4A C3 CH2 0.000000 14.0270 0 - 692 C4A 173 C4A C4 CH3 0.000000 15.0350 0 - 693 C4A 174 C4A C1 CH2 0.000000 14.0270 0 - 694 C4A 174 C4A C2 CH3 0.000000 15.0350 0 - 695 C4A 174 C4A C3 CH2 0.000000 14.0270 0 - 696 C4A 174 C4A C4 CH3 0.000000 15.0350 0 - 697 C4A 175 C4A C1 CH2 0.000000 14.0270 0 - 698 C4A 175 C4A C2 CH3 0.000000 15.0350 0 - 699 C4A 175 C4A C3 CH2 0.000000 14.0270 0 - 700 C4A 175 C4A C4 CH3 0.000000 15.0350 0 - 701 C4A 176 C4A C1 CH2 0.000000 14.0270 0 - 702 C4A 176 C4A C2 CH3 0.000000 15.0350 0 - 703 C4A 176 C4A C3 CH2 0.000000 14.0270 0 - 704 C4A 176 C4A C4 CH3 0.000000 15.0350 0 - 705 C4A 177 C4A C1 CH2 0.000000 14.0270 0 - 706 C4A 177 C4A C2 CH3 0.000000 15.0350 0 - 707 C4A 177 C4A C3 CH2 0.000000 14.0270 0 - 708 C4A 177 C4A C4 CH3 0.000000 15.0350 0 - 709 C4A 178 C4A C1 CH2 0.000000 14.0270 0 - 710 C4A 178 C4A C2 CH3 0.000000 15.0350 0 - 711 C4A 178 C4A C3 CH2 0.000000 14.0270 0 - 712 C4A 178 C4A C4 CH3 0.000000 15.0350 0 - 713 C4A 179 C4A C1 CH2 0.000000 14.0270 0 - 714 C4A 179 C4A C2 CH3 0.000000 15.0350 0 - 715 C4A 179 C4A C3 CH2 0.000000 14.0270 0 - 716 C4A 179 C4A C4 CH3 0.000000 15.0350 0 - 717 C4A 180 C4A C1 CH2 0.000000 14.0270 0 - 718 C4A 180 C4A C2 CH3 0.000000 15.0350 0 - 719 C4A 180 C4A C3 CH2 0.000000 14.0270 0 - 720 C4A 180 C4A C4 CH3 0.000000 15.0350 0 - 721 C1A 1 C1A C1 CH4 0.000000 16.0430 0 - 722 C1A 2 C1A C1 CH4 0.000000 16.0430 0 - 723 C1A 3 C1A C1 CH4 0.000000 16.0430 0 - 724 C1A 4 C1A C1 CH4 0.000000 16.0430 0 - 725 C1A 5 C1A C1 CH4 0.000000 16.0430 0 - 726 C1A 6 C1A C1 CH4 0.000000 16.0430 0 - 727 C1A 7 C1A C1 CH4 0.000000 16.0430 0 - 728 C1A 8 C1A C1 CH4 0.000000 16.0430 0 - 729 C1A 9 C1A C1 CH4 0.000000 16.0430 0 - 730 C1A 10 C1A C1 CH4 0.000000 16.0430 0 - 731 C1A 11 C1A C1 CH4 0.000000 16.0430 0 - 732 C1A 12 C1A C1 CH4 0.000000 16.0430 0 - 733 C1A 13 C1A C1 CH4 0.000000 16.0430 0 - 734 C1A 14 C1A C1 CH4 0.000000 16.0430 0 - 735 C1A 15 C1A C1 CH4 0.000000 16.0430 0 - 736 C1A 16 C1A C1 CH4 0.000000 16.0430 0 - 737 C1A 17 C1A C1 CH4 0.000000 16.0430 0 - 738 C1A 18 C1A C1 CH4 0.000000 16.0430 0 - 739 C1A 19 C1A C1 CH4 0.000000 16.0430 0 - 740 C1A 20 C1A C1 CH4 0.000000 16.0430 0 - 741 C1A 21 C1A C1 CH4 0.000000 16.0430 0 - 742 C1A 22 C1A C1 CH4 0.000000 16.0430 0 - 743 C1A 23 C1A C1 CH4 0.000000 16.0430 0 - 744 C1A 24 C1A C1 CH4 0.000000 16.0430 0 - 745 C1A 25 C1A C1 CH4 0.000000 16.0430 0 - 746 C1A 26 C1A C1 CH4 0.000000 16.0430 0 - 747 C1A 27 C1A C1 CH4 0.000000 16.0430 0 - 748 C1A 28 C1A C1 CH4 0.000000 16.0430 0 - 749 C1A 29 C1A C1 CH4 0.000000 16.0430 0 - 750 C1A 30 C1A C1 CH4 0.000000 16.0430 0 - 751 C1A 31 C1A C1 CH4 0.000000 16.0430 0 - 752 C1A 32 C1A C1 CH4 0.000000 16.0430 0 - 753 C1A 33 C1A C1 CH4 0.000000 16.0430 0 - 754 C1A 34 C1A C1 CH4 0.000000 16.0430 0 - 755 C1A 35 C1A C1 CH4 0.000000 16.0430 0 - 756 C1A 36 C1A C1 CH4 0.000000 16.0430 0 - 757 C1A 37 C1A C1 CH4 0.000000 16.0430 0 - 758 C1A 38 C1A C1 CH4 0.000000 16.0430 0 - 759 C1A 39 C1A C1 CH4 0.000000 16.0430 0 - 760 C1A 40 C1A C1 CH4 0.000000 16.0430 0 - 761 C1A 41 C1A C1 CH4 0.000000 16.0430 0 - 762 C1A 42 C1A C1 CH4 0.000000 16.0430 0 - 763 C1A 43 C1A C1 CH4 0.000000 16.0430 0 - 764 C1A 44 C1A C1 CH4 0.000000 16.0430 0 - 765 C1A 45 C1A C1 CH4 0.000000 16.0430 0 - 766 C1A 46 C1A C1 CH4 0.000000 16.0430 0 - 767 C1A 47 C1A C1 CH4 0.000000 16.0430 0 - 768 C1A 48 C1A C1 CH4 0.000000 16.0430 0 - 769 C1A 49 C1A C1 CH4 0.000000 16.0430 0 - 770 C1A 50 C1A C1 CH4 0.000000 16.0430 0 - 771 C1A 51 C1A C1 CH4 0.000000 16.0430 0 - 772 C1A 52 C1A C1 CH4 0.000000 16.0430 0 - 773 C1A 53 C1A C1 CH4 0.000000 16.0430 0 - 774 C1A 54 C1A C1 CH4 0.000000 16.0430 0 - 775 C1A 55 C1A C1 CH4 0.000000 16.0430 0 - 776 C1A 56 C1A C1 CH4 0.000000 16.0430 0 - 777 C1A 57 C1A C1 CH4 0.000000 16.0430 0 - 778 C1A 58 C1A C1 CH4 0.000000 16.0430 0 - 779 C1A 59 C1A C1 CH4 0.000000 16.0430 0 - 780 C1A 60 C1A C1 CH4 0.000000 16.0430 0 - 781 C1A 61 C1A C1 CH4 0.000000 16.0430 0 - 782 C1A 62 C1A C1 CH4 0.000000 16.0430 0 - 783 C1A 63 C1A C1 CH4 0.000000 16.0430 0 - 784 C1A 64 C1A C1 CH4 0.000000 16.0430 0 - 785 C1A 65 C1A C1 CH4 0.000000 16.0430 0 - 786 C1A 66 C1A C1 CH4 0.000000 16.0430 0 - 787 C1A 67 C1A C1 CH4 0.000000 16.0430 0 - 788 C1A 68 C1A C1 CH4 0.000000 16.0430 0 - 789 C1A 69 C1A C1 CH4 0.000000 16.0430 0 - 790 C1A 70 C1A C1 CH4 0.000000 16.0430 0 - 791 C1A 71 C1A C1 CH4 0.000000 16.0430 0 - 792 C1A 72 C1A C1 CH4 0.000000 16.0430 0 - 793 C1A 73 C1A C1 CH4 0.000000 16.0430 0 - 794 C1A 74 C1A C1 CH4 0.000000 16.0430 0 - 795 C1A 75 C1A C1 CH4 0.000000 16.0430 0 - 796 C1A 76 C1A C1 CH4 0.000000 16.0430 0 - 797 C1A 77 C1A C1 CH4 0.000000 16.0430 0 - 798 C1A 78 C1A C1 CH4 0.000000 16.0430 0 - 799 C1A 79 C1A C1 CH4 0.000000 16.0430 0 - 800 C1A 80 C1A C1 CH4 0.000000 16.0430 0 - 801 C1A 81 C1A C1 CH4 0.000000 16.0430 0 - 802 C1A 82 C1A C1 CH4 0.000000 16.0430 0 - 803 C1A 83 C1A C1 CH4 0.000000 16.0430 0 - 804 C1A 84 C1A C1 CH4 0.000000 16.0430 0 - 805 C1A 85 C1A C1 CH4 0.000000 16.0430 0 - 806 C1A 86 C1A C1 CH4 0.000000 16.0430 0 - 807 C1A 87 C1A C1 CH4 0.000000 16.0430 0 - 808 C1A 88 C1A C1 CH4 0.000000 16.0430 0 - 809 C1A 89 C1A C1 CH4 0.000000 16.0430 0 - 810 C1A 90 C1A C1 CH4 0.000000 16.0430 0 - 811 C1A 91 C1A C1 CH4 0.000000 16.0430 0 - 812 C1A 92 C1A C1 CH4 0.000000 16.0430 0 - 813 C1A 93 C1A C1 CH4 0.000000 16.0430 0 - 814 C1A 94 C1A C1 CH4 0.000000 16.0430 0 - 815 C1A 95 C1A C1 CH4 0.000000 16.0430 0 - 816 C1A 96 C1A C1 CH4 0.000000 16.0430 0 - 817 C1A 97 C1A C1 CH4 0.000000 16.0430 0 - 818 C1A 98 C1A C1 CH4 0.000000 16.0430 0 - 819 C1A 99 C1A C1 CH4 0.000000 16.0430 0 - 820 C1A 100 C1A C1 CH4 0.000000 16.0430 0 - 821 C1A 101 C1A C1 CH4 0.000000 16.0430 0 - 822 C1A 102 C1A C1 CH4 0.000000 16.0430 0 - 823 C1A 103 C1A C1 CH4 0.000000 16.0430 0 - 824 C1A 104 C1A C1 CH4 0.000000 16.0430 0 - 825 C1A 105 C1A C1 CH4 0.000000 16.0430 0 - 826 C1A 106 C1A C1 CH4 0.000000 16.0430 0 - 827 C1A 107 C1A C1 CH4 0.000000 16.0430 0 - 828 C1A 108 C1A C1 CH4 0.000000 16.0430 0 - 829 C1A 109 C1A C1 CH4 0.000000 16.0430 0 - 830 C1A 110 C1A C1 CH4 0.000000 16.0430 0 - 831 C1A 111 C1A C1 CH4 0.000000 16.0430 0 - 832 C1A 112 C1A C1 CH4 0.000000 16.0430 0 - 833 C1A 113 C1A C1 CH4 0.000000 16.0430 0 - 834 C1A 114 C1A C1 CH4 0.000000 16.0430 0 - 835 C1A 115 C1A C1 CH4 0.000000 16.0430 0 - 836 C1A 116 C1A C1 CH4 0.000000 16.0430 0 - 837 C1A 117 C1A C1 CH4 0.000000 16.0430 0 - 838 C1A 118 C1A C1 CH4 0.000000 16.0430 0 - 839 C1A 119 C1A C1 CH4 0.000000 16.0430 0 - 840 C1A 120 C1A C1 CH4 0.000000 16.0430 0 - 841 C1A 121 C1A C1 CH4 0.000000 16.0430 0 - 842 C1A 122 C1A C1 CH4 0.000000 16.0430 0 - 843 C1A 123 C1A C1 CH4 0.000000 16.0430 0 - 844 C1A 124 C1A C1 CH4 0.000000 16.0430 0 - 845 C1A 125 C1A C1 CH4 0.000000 16.0430 0 - 846 C1A 126 C1A C1 CH4 0.000000 16.0430 0 - 847 C1A 127 C1A C1 CH4 0.000000 16.0430 0 - 848 C1A 128 C1A C1 CH4 0.000000 16.0430 0 - 849 C1A 129 C1A C1 CH4 0.000000 16.0430 0 - 850 C1A 130 C1A C1 CH4 0.000000 16.0430 0 - 851 C1A 131 C1A C1 CH4 0.000000 16.0430 0 - 852 C1A 132 C1A C1 CH4 0.000000 16.0430 0 - 853 C1A 133 C1A C1 CH4 0.000000 16.0430 0 - 854 C1A 134 C1A C1 CH4 0.000000 16.0430 0 - 855 C1A 135 C1A C1 CH4 0.000000 16.0430 0 - 856 C1A 136 C1A C1 CH4 0.000000 16.0430 0 - 857 C1A 137 C1A C1 CH4 0.000000 16.0430 0 - 858 C1A 138 C1A C1 CH4 0.000000 16.0430 0 - 859 C1A 139 C1A C1 CH4 0.000000 16.0430 0 - 860 C1A 140 C1A C1 CH4 0.000000 16.0430 0 - 861 C1A 141 C1A C1 CH4 0.000000 16.0430 0 - 862 C1A 142 C1A C1 CH4 0.000000 16.0430 0 - 863 C1A 143 C1A C1 CH4 0.000000 16.0430 0 - 864 C1A 144 C1A C1 CH4 0.000000 16.0430 0 - 865 C1A 145 C1A C1 CH4 0.000000 16.0430 0 - 866 C1A 146 C1A C1 CH4 0.000000 16.0430 0 - 867 C1A 147 C1A C1 CH4 0.000000 16.0430 0 - 868 C1A 148 C1A C1 CH4 0.000000 16.0430 0 - 869 C1A 149 C1A C1 CH4 0.000000 16.0430 0 - 870 C1A 150 C1A C1 CH4 0.000000 16.0430 0 - 871 C1A 151 C1A C1 CH4 0.000000 16.0430 0 - 872 C1A 152 C1A C1 CH4 0.000000 16.0430 0 - 873 C1A 153 C1A C1 CH4 0.000000 16.0430 0 - 874 C1A 154 C1A C1 CH4 0.000000 16.0430 0 - 875 C1A 155 C1A C1 CH4 0.000000 16.0430 0 - 876 C1A 156 C1A C1 CH4 0.000000 16.0430 0 - 877 C1A 157 C1A C1 CH4 0.000000 16.0430 0 - 878 C1A 158 C1A C1 CH4 0.000000 16.0430 0 - 879 C1A 159 C1A C1 CH4 0.000000 16.0430 0 - 880 C1A 160 C1A C1 CH4 0.000000 16.0430 0 - 881 C1A 161 C1A C1 CH4 0.000000 16.0430 0 - 882 C1A 162 C1A C1 CH4 0.000000 16.0430 0 - 883 C1A 163 C1A C1 CH4 0.000000 16.0430 0 - 884 C1A 164 C1A C1 CH4 0.000000 16.0430 0 - 885 C1A 165 C1A C1 CH4 0.000000 16.0430 0 - 886 C1A 166 C1A C1 CH4 0.000000 16.0430 0 - 887 C1A 167 C1A C1 CH4 0.000000 16.0430 0 - 888 C1A 168 C1A C1 CH4 0.000000 16.0430 0 - 889 C1A 169 C1A C1 CH4 0.000000 16.0430 0 - 890 C1A 170 C1A C1 CH4 0.000000 16.0430 0 - 891 C1A 171 C1A C1 CH4 0.000000 16.0430 0 - 892 C1A 172 C1A C1 CH4 0.000000 16.0430 0 - 893 C1A 173 C1A C1 CH4 0.000000 16.0430 0 - 894 C1A 174 C1A C1 CH4 0.000000 16.0430 0 - 895 C1A 175 C1A C1 CH4 0.000000 16.0430 0 - 896 C1A 176 C1A C1 CH4 0.000000 16.0430 0 - 897 C1A 177 C1A C1 CH4 0.000000 16.0430 0 - 898 C1A 178 C1A C1 CH4 0.000000 16.0430 0 - 899 C1A 179 C1A C1 CH4 0.000000 16.0430 0 - 900 C1A 180 C1A C1 CH4 0.000000 16.0430 0 - 901 C1A 181 C1A C1 CH4 0.000000 16.0430 0 - 902 C1A 182 C1A C1 CH4 0.000000 16.0430 0 - 903 C1A 183 C1A C1 CH4 0.000000 16.0430 0 - 904 C1A 184 C1A C1 CH4 0.000000 16.0430 0 - 905 C1A 185 C1A C1 CH4 0.000000 16.0430 0 - 906 C1A 186 C1A C1 CH4 0.000000 16.0430 0 - 907 C1A 187 C1A C1 CH4 0.000000 16.0430 0 - 908 C1A 188 C1A C1 CH4 0.000000 16.0430 0 - 909 C1A 189 C1A C1 CH4 0.000000 16.0430 0 - 910 C1A 190 C1A C1 CH4 0.000000 16.0430 0 - 911 C1A 191 C1A C1 CH4 0.000000 16.0430 0 - 912 C1A 192 C1A C1 CH4 0.000000 16.0430 0 - 913 C1A 193 C1A C1 CH4 0.000000 16.0430 0 - 914 C1A 194 C1A C1 CH4 0.000000 16.0430 0 - 915 C1A 195 C1A C1 CH4 0.000000 16.0430 0 - 916 C1A 196 C1A C1 CH4 0.000000 16.0430 0 - 917 C1A 197 C1A C1 CH4 0.000000 16.0430 0 - 918 C1A 198 C1A C1 CH4 0.000000 16.0430 0 - 919 C1A 199 C1A C1 CH4 0.000000 16.0430 0 - 920 C1A 200 C1A C1 CH4 0.000000 16.0430 0 - 921 C1A 201 C1A C1 CH4 0.000000 16.0430 0 - 922 C1A 202 C1A C1 CH4 0.000000 16.0430 0 - 923 C1A 203 C1A C1 CH4 0.000000 16.0430 0 - 924 C1A 204 C1A C1 CH4 0.000000 16.0430 0 - 925 C1A 205 C1A C1 CH4 0.000000 16.0430 0 - 926 C1A 206 C1A C1 CH4 0.000000 16.0430 0 - 927 C1A 207 C1A C1 CH4 0.000000 16.0430 0 - 928 C1A 208 C1A C1 CH4 0.000000 16.0430 0 - 929 C1A 209 C1A C1 CH4 0.000000 16.0430 0 - 930 C1A 210 C1A C1 CH4 0.000000 16.0430 0 - 931 C1A 211 C1A C1 CH4 0.000000 16.0430 0 - 932 C1A 212 C1A C1 CH4 0.000000 16.0430 0 - 933 C1A 213 C1A C1 CH4 0.000000 16.0430 0 - 934 C1A 214 C1A C1 CH4 0.000000 16.0430 0 - 935 C1A 215 C1A C1 CH4 0.000000 16.0430 0 - 936 C1A 216 C1A C1 CH4 0.000000 16.0430 0 - 937 C1A 217 C1A C1 CH4 0.000000 16.0430 0 - 938 C1A 218 C1A C1 CH4 0.000000 16.0430 0 - 939 C1A 219 C1A C1 CH4 0.000000 16.0430 0 - 940 C1A 220 C1A C1 CH4 0.000000 16.0430 0 - 941 C1A 221 C1A C1 CH4 0.000000 16.0430 0 - 942 C1A 222 C1A C1 CH4 0.000000 16.0430 0 - 943 C1A 223 C1A C1 CH4 0.000000 16.0430 0 - 944 C1A 224 C1A C1 CH4 0.000000 16.0430 0 - 945 C1A 225 C1A C1 CH4 0.000000 16.0430 0 - 946 C1A 226 C1A C1 CH4 0.000000 16.0430 0 - 947 C1A 227 C1A C1 CH4 0.000000 16.0430 0 - 948 C1A 228 C1A C1 CH4 0.000000 16.0430 0 - 949 C1A 229 C1A C1 CH4 0.000000 16.0430 0 - 950 C1A 230 C1A C1 CH4 0.000000 16.0430 0 - 951 C1A 231 C1A C1 CH4 0.000000 16.0430 0 - 952 C1A 232 C1A C1 CH4 0.000000 16.0430 0 - 953 C1A 233 C1A C1 CH4 0.000000 16.0430 0 - 954 C1A 234 C1A C1 CH4 0.000000 16.0430 0 - 955 C1A 235 C1A C1 CH4 0.000000 16.0430 0 - 956 C1A 236 C1A C1 CH4 0.000000 16.0430 0 - 957 C1A 237 C1A C1 CH4 0.000000 16.0430 0 - 958 C1A 238 C1A C1 CH4 0.000000 16.0430 0 - 959 C1A 239 C1A C1 CH4 0.000000 16.0430 0 - 960 C1A 240 C1A C1 CH4 0.000000 16.0430 0 - - 540 !NBOND: bonds - 1 3 2 1 3 4 5 7 - 6 5 7 8 9 11 10 9 - 11 12 13 15 14 13 15 16 - 17 19 18 17 19 20 21 23 - 22 21 23 24 25 27 26 25 - 27 28 29 31 30 29 31 32 - 33 35 34 33 35 36 37 39 - 38 37 39 40 41 43 42 41 - 43 44 45 47 46 45 47 48 - 49 51 50 49 51 52 53 55 - 54 53 55 56 57 59 58 57 - 59 60 61 63 62 61 63 64 - 65 67 66 65 67 68 69 71 - 70 69 71 72 73 75 74 73 - 75 76 77 79 78 77 79 80 - 81 83 82 81 83 84 85 87 - 86 85 87 88 89 91 90 89 - 91 92 93 95 94 93 95 96 - 97 99 98 97 99 100 101 103 - 102 101 103 104 105 107 106 105 - 107 108 109 111 110 109 111 112 - 113 115 114 113 115 116 117 119 - 118 117 119 120 121 123 122 121 - 123 124 125 127 126 125 127 128 - 129 131 130 129 131 132 133 135 - 134 133 135 136 137 139 138 137 - 139 140 141 143 142 141 143 144 - 145 147 146 145 147 148 149 151 - 150 149 151 152 153 155 154 153 - 155 156 157 159 158 157 159 160 - 161 163 162 161 163 164 165 167 - 166 165 167 168 169 171 170 169 - 171 172 173 175 174 173 175 176 - 177 179 178 177 179 180 181 183 - 182 181 183 184 185 187 186 185 - 187 188 189 191 190 189 191 192 - 193 195 194 193 195 196 197 199 - 198 197 199 200 201 203 202 201 - 203 204 205 207 206 205 207 208 - 209 211 210 209 211 212 213 215 - 214 213 215 216 217 219 218 217 - 219 220 221 223 222 221 223 224 - 225 227 226 225 227 228 229 231 - 230 229 231 232 233 235 234 233 - 235 236 237 239 238 237 239 240 - 241 243 242 241 243 244 245 247 - 246 245 247 248 249 251 250 249 - 251 252 253 255 254 253 255 256 - 257 259 258 257 259 260 261 263 - 262 261 263 264 265 267 266 265 - 267 268 269 271 270 269 271 272 - 273 275 274 273 275 276 277 279 - 278 277 279 280 281 283 282 281 - 283 284 285 287 286 285 287 288 - 289 291 290 289 291 292 293 295 - 294 293 295 296 297 299 298 297 - 299 300 301 303 302 301 303 304 - 305 307 306 305 307 308 309 311 - 310 309 311 312 313 315 314 313 - 315 316 317 319 318 317 319 320 - 321 323 322 321 323 324 325 327 - 326 325 327 328 329 331 330 329 - 331 332 333 335 334 333 335 336 - 337 339 338 337 339 340 341 343 - 342 341 343 344 345 347 346 345 - 347 348 349 351 350 349 351 352 - 353 355 354 353 355 356 357 359 - 358 357 359 360 361 363 362 361 - 363 364 365 367 366 365 367 368 - 369 371 370 369 371 372 373 375 - 374 373 375 376 377 379 378 377 - 379 380 381 383 382 381 383 384 - 385 387 386 385 387 388 389 391 - 390 389 391 392 393 395 394 393 - 395 396 397 399 398 397 399 400 - 401 403 402 401 403 404 405 407 - 406 405 407 408 409 411 410 409 - 411 412 413 415 414 413 415 416 - 417 419 418 417 419 420 421 423 - 422 421 423 424 425 427 426 425 - 427 428 429 431 430 429 431 432 - 433 435 434 433 435 436 437 439 - 438 437 439 440 441 443 442 441 - 443 444 445 447 446 445 447 448 - 449 451 450 449 451 452 453 455 - 454 453 455 456 457 459 458 457 - 459 460 461 463 462 461 463 464 - 465 467 466 465 467 468 469 471 - 470 469 471 472 473 475 474 473 - 475 476 477 479 478 477 479 480 - 481 483 482 481 483 484 485 487 - 486 485 487 488 489 491 490 489 - 491 492 493 495 494 493 495 496 - 497 499 498 497 499 500 501 503 - 502 501 503 504 505 507 506 505 - 507 508 509 511 510 509 511 512 - 513 515 514 513 515 516 517 519 - 518 517 519 520 521 523 522 521 - 523 524 525 527 526 525 527 528 - 529 531 530 529 531 532 533 535 - 534 533 535 536 537 539 538 537 - 539 540 541 543 542 541 543 544 - 545 547 546 545 547 548 549 551 - 550 549 551 552 553 555 554 553 - 555 556 557 559 558 557 559 560 - 561 563 562 561 563 564 565 567 - 566 565 567 568 569 571 570 569 - 571 572 573 575 574 573 575 576 - 577 579 578 577 579 580 581 583 - 582 581 583 584 585 587 586 585 - 587 588 589 591 590 589 591 592 - 593 595 594 593 595 596 597 599 - 598 597 599 600 601 603 602 601 - 603 604 605 607 606 605 607 608 - 609 611 610 609 611 612 613 615 - 614 613 615 616 617 619 618 617 - 619 620 621 623 622 621 623 624 - 625 627 626 625 627 628 629 631 - 630 629 631 632 633 635 634 633 - 635 636 637 639 638 637 639 640 - 641 643 642 641 643 644 645 647 - 646 645 647 648 649 651 650 649 - 651 652 653 655 654 653 655 656 - 657 659 658 657 659 660 661 663 - 662 661 663 664 665 667 666 665 - 667 668 669 671 670 669 671 672 - 673 675 674 673 675 676 677 679 - 678 677 679 680 681 683 682 681 - 683 684 685 687 686 685 687 688 - 689 691 690 689 691 692 693 695 - 694 693 695 696 697 699 698 697 - 699 700 701 703 702 701 703 704 - 705 707 706 705 707 708 709 711 - 710 709 711 712 713 715 714 713 - 715 716 717 719 718 717 719 720 - - 360 !NTHETA: angles - 1 3 4 2 1 3 5 7 8 - 6 5 7 9 11 12 10 9 11 - 13 15 16 14 13 15 17 19 20 - 18 17 19 21 23 24 22 21 23 - 25 27 28 26 25 27 29 31 32 - 30 29 31 33 35 36 34 33 35 - 37 39 40 38 37 39 41 43 44 - 42 41 43 45 47 48 46 45 47 - 49 51 52 50 49 51 53 55 56 - 54 53 55 57 59 60 58 57 59 - 61 63 64 62 61 63 65 67 68 - 66 65 67 69 71 72 70 69 71 - 73 75 76 74 73 75 77 79 80 - 78 77 79 81 83 84 82 81 83 - 85 87 88 86 85 87 89 91 92 - 90 89 91 93 95 96 94 93 95 - 97 99 100 98 97 99 101 103 104 - 102 101 103 105 107 108 106 105 107 - 109 111 112 110 109 111 113 115 116 - 114 113 115 117 119 120 118 117 119 - 121 123 124 122 121 123 125 127 128 - 126 125 127 129 131 132 130 129 131 - 133 135 136 134 133 135 137 139 140 - 138 137 139 141 143 144 142 141 143 - 145 147 148 146 145 147 149 151 152 - 150 149 151 153 155 156 154 153 155 - 157 159 160 158 157 159 161 163 164 - 162 161 163 165 167 168 166 165 167 - 169 171 172 170 169 171 173 175 176 - 174 173 175 177 179 180 178 177 179 - 181 183 184 182 181 183 185 187 188 - 186 185 187 189 191 192 190 189 191 - 193 195 196 194 193 195 197 199 200 - 198 197 199 201 203 204 202 201 203 - 205 207 208 206 205 207 209 211 212 - 210 209 211 213 215 216 214 213 215 - 217 219 220 218 217 219 221 223 224 - 222 221 223 225 227 228 226 225 227 - 229 231 232 230 229 231 233 235 236 - 234 233 235 237 239 240 238 237 239 - 241 243 244 242 241 243 245 247 248 - 246 245 247 249 251 252 250 249 251 - 253 255 256 254 253 255 257 259 260 - 258 257 259 261 263 264 262 261 263 - 265 267 268 266 265 267 269 271 272 - 270 269 271 273 275 276 274 273 275 - 277 279 280 278 277 279 281 283 284 - 282 281 283 285 287 288 286 285 287 - 289 291 292 290 289 291 293 295 296 - 294 293 295 297 299 300 298 297 299 - 301 303 304 302 301 303 305 307 308 - 306 305 307 309 311 312 310 309 311 - 313 315 316 314 313 315 317 319 320 - 318 317 319 321 323 324 322 321 323 - 325 327 328 326 325 327 329 331 332 - 330 329 331 333 335 336 334 333 335 - 337 339 340 338 337 339 341 343 344 - 342 341 343 345 347 348 346 345 347 - 349 351 352 350 349 351 353 355 356 - 354 353 355 357 359 360 358 357 359 - 361 363 364 362 361 363 365 367 368 - 366 365 367 369 371 372 370 369 371 - 373 375 376 374 373 375 377 379 380 - 378 377 379 381 383 384 382 381 383 - 385 387 388 386 385 387 389 391 392 - 390 389 391 393 395 396 394 393 395 - 397 399 400 398 397 399 401 403 404 - 402 401 403 405 407 408 406 405 407 - 409 411 412 410 409 411 413 415 416 - 414 413 415 417 419 420 418 417 419 - 421 423 424 422 421 423 425 427 428 - 426 425 427 429 431 432 430 429 431 - 433 435 436 434 433 435 437 439 440 - 438 437 439 441 443 444 442 441 443 - 445 447 448 446 445 447 449 451 452 - 450 449 451 453 455 456 454 453 455 - 457 459 460 458 457 459 461 463 464 - 462 461 463 465 467 468 466 465 467 - 469 471 472 470 469 471 473 475 476 - 474 473 475 477 479 480 478 477 479 - 481 483 484 482 481 483 485 487 488 - 486 485 487 489 491 492 490 489 491 - 493 495 496 494 493 495 497 499 500 - 498 497 499 501 503 504 502 501 503 - 505 507 508 506 505 507 509 511 512 - 510 509 511 513 515 516 514 513 515 - 517 519 520 518 517 519 521 523 524 - 522 521 523 525 527 528 526 525 527 - 529 531 532 530 529 531 533 535 536 - 534 533 535 537 539 540 538 537 539 - 541 543 544 542 541 543 545 547 548 - 546 545 547 549 551 552 550 549 551 - 553 555 556 554 553 555 557 559 560 - 558 557 559 561 563 564 562 561 563 - 565 567 568 566 565 567 569 571 572 - 570 569 571 573 575 576 574 573 575 - 577 579 580 578 577 579 581 583 584 - 582 581 583 585 587 588 586 585 587 - 589 591 592 590 589 591 593 595 596 - 594 593 595 597 599 600 598 597 599 - 601 603 604 602 601 603 605 607 608 - 606 605 607 609 611 612 610 609 611 - 613 615 616 614 613 615 617 619 620 - 618 617 619 621 623 624 622 621 623 - 625 627 628 626 625 627 629 631 632 - 630 629 631 633 635 636 634 633 635 - 637 639 640 638 637 639 641 643 644 - 642 641 643 645 647 648 646 645 647 - 649 651 652 650 649 651 653 655 656 - 654 653 655 657 659 660 658 657 659 - 661 663 664 662 661 663 665 667 668 - 666 665 667 669 671 672 670 669 671 - 673 675 676 674 673 675 677 679 680 - 678 677 679 681 683 684 682 681 683 - 685 687 688 686 685 687 689 691 692 - 690 689 691 693 695 696 694 693 695 - 697 699 700 698 697 699 701 703 704 - 702 701 703 705 707 708 706 705 707 - 709 711 712 710 709 711 713 715 716 - 714 713 715 717 719 720 718 717 719 - - 180 !NPHI: dihedrals - 2 1 3 4 6 5 7 8 - 10 9 11 12 14 13 15 16 - 18 17 19 20 22 21 23 24 - 26 25 27 28 30 29 31 32 - 34 33 35 36 38 37 39 40 - 42 41 43 44 46 45 47 48 - 50 49 51 52 54 53 55 56 - 58 57 59 60 62 61 63 64 - 66 65 67 68 70 69 71 72 - 74 73 75 76 78 77 79 80 - 82 81 83 84 86 85 87 88 - 90 89 91 92 94 93 95 96 - 98 97 99 100 102 101 103 104 - 106 105 107 108 110 109 111 112 - 114 113 115 116 118 117 119 120 - 122 121 123 124 126 125 127 128 - 130 129 131 132 134 133 135 136 - 138 137 139 140 142 141 143 144 - 146 145 147 148 150 149 151 152 - 154 153 155 156 158 157 159 160 - 162 161 163 164 166 165 167 168 - 170 169 171 172 174 173 175 176 - 178 177 179 180 182 181 183 184 - 186 185 187 188 190 189 191 192 - 194 193 195 196 198 197 199 200 - 202 201 203 204 206 205 207 208 - 210 209 211 212 214 213 215 216 - 218 217 219 220 222 221 223 224 - 226 225 227 228 230 229 231 232 - 234 233 235 236 238 237 239 240 - 242 241 243 244 246 245 247 248 - 250 249 251 252 254 253 255 256 - 258 257 259 260 262 261 263 264 - 266 265 267 268 270 269 271 272 - 274 273 275 276 278 277 279 280 - 282 281 283 284 286 285 287 288 - 290 289 291 292 294 293 295 296 - 298 297 299 300 302 301 303 304 - 306 305 307 308 310 309 311 312 - 314 313 315 316 318 317 319 320 - 322 321 323 324 326 325 327 328 - 330 329 331 332 334 333 335 336 - 338 337 339 340 342 341 343 344 - 346 345 347 348 350 349 351 352 - 354 353 355 356 358 357 359 360 - 362 361 363 364 366 365 367 368 - 370 369 371 372 374 373 375 376 - 378 377 379 380 382 381 383 384 - 386 385 387 388 390 389 391 392 - 394 393 395 396 398 397 399 400 - 402 401 403 404 406 405 407 408 - 410 409 411 412 414 413 415 416 - 418 417 419 420 422 421 423 424 - 426 425 427 428 430 429 431 432 - 434 433 435 436 438 437 439 440 - 442 441 443 444 446 445 447 448 - 450 449 451 452 454 453 455 456 - 458 457 459 460 462 461 463 464 - 466 465 467 468 470 469 471 472 - 474 473 475 476 478 477 479 480 - 482 481 483 484 486 485 487 488 - 490 489 491 492 494 493 495 496 - 498 497 499 500 502 501 503 504 - 506 505 507 508 510 509 511 512 - 514 513 515 516 518 517 519 520 - 522 521 523 524 526 525 527 528 - 530 529 531 532 534 533 535 536 - 538 537 539 540 542 541 543 544 - 546 545 547 548 550 549 551 552 - 554 553 555 556 558 557 559 560 - 562 561 563 564 566 565 567 568 - 570 569 571 572 574 573 575 576 - 578 577 579 580 582 581 583 584 - 586 585 587 588 590 589 591 592 - 594 593 595 596 598 597 599 600 - 602 601 603 604 606 605 607 608 - 610 609 611 612 614 613 615 616 - 618 617 619 620 622 621 623 624 - 626 625 627 628 630 629 631 632 - 634 633 635 636 638 637 639 640 - 642 641 643 644 646 645 647 648 - 650 649 651 652 654 653 655 656 - 658 657 659 660 662 661 663 664 - 666 665 667 668 670 669 671 672 - 674 673 675 676 678 677 679 680 - 682 681 683 684 686 685 687 688 - 690 689 691 692 694 693 695 696 - 698 697 699 700 702 701 703 704 - 706 705 707 708 710 709 711 712 - 714 713 715 716 718 717 719 720 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - - - 1 0 !NGRP - 0 0 0 - diff --git a/example_file/perfluorobutane_butane/in.conf b/example_file/perfluorobutane_butane/in.conf deleted file mode 100644 index 8e8dc716f..000000000 --- a/example_file/perfluorobutane_butane/in.conf +++ /dev/null @@ -1,163 +0,0 @@ -######################## -## Init File -## -## IMPROVEMENTS -## - Compacts inputs into one line -## - Suggestion: edit inline with (insert key) -## -## To-Do -## (make editor + XML version) -######################## - -############################################################################ -# ========-------------------- INPUT --------------------------=========== -############################################################################ - -######################### -# enable, step -######################### -Restart false - -#################################### -# kind {RESTART, RANDOM, INTSEED} -#################################### -PRNG RANDOM - -#################################### -# FORCE FIELD -#################################### -ParaTypeEXOTIC true -Parameters ./par_mie.inp - -#################################### -# INPUT PDB FILES -#################################### -Coordinates 0 ./setup_box_0.pdb -Coordinates 1 ./setup_box_1.pdb - - -#################################### -# INPUT PSF FILES -#################################### -Structure 0 ./setup_box_0.psf -Structure 1 ./setup_box_1.psf - - -############################################################################ -# =======--------------------- SYSTEM --------------------------=========== -############################################################################ - -################################## -# GEMC TYPE (DEFULT IS NVT_GEMC) -################################## - - -############################# -# SIMULATION CONDITION -############################# -Temperature 259.95 -Potential VDW -LRC true -Rcut 10 -Exclude 1-4 - -############################# -# ELECTROSTATIC -############################# -Ewald false -ElectroStatic false - -############################### -# PRESSURE CALCULATION -################################ -PressureCalc false - -################################ -# STEPS -################################ -RunSteps 20000000 -EqSteps 1000 -AdjSteps 1000 - -################################ -# MOVE FREQUENCY -################################ -DisFreq 0.20 -RotFreq 0.10 -SwapFreq 0.30 -RegrowthFreq 0.10 -MEMC-1Freq 0.30 - -########################### -# MEMC PARAMETERS -########################### -ExchangeVolumeDim 8.0 8.0 10.0 -ExchangeRatio 1 -ExchangeLargeKind FA4 -ExchangeSmallKind C4A -LargeKindBackBone C1 C4 - - - -################################ -# BOX DIMENSION #, X, Y, Z -################################ -CellBasisVector1 0 30.0 0.0 0.0 -CellBasisVector2 0 0.0 30.0 0.0 -CellBasisVector3 0 0.0 0.0 30.0 - -CellBasisVector1 1 35.0 0.0 0.0 -CellBasisVector2 1 0.0 35.0 0.0 -CellBasisVector3 1 0.0 0.0 35.0 - - -############################## -# CBMC TRIALS -############################## -CBMC_First 8 -CBMC_Nth 6 -CBMC_Ang 100 -CBMC_Dih 100 - -#################################### -# Mol. Name Chem. Pot. -#################################### -ChemPot FA4 -2805 -ChemPot C4A -3120 - -############################################################################ -# =======-------------------- OUTPUT --------------------------=========== -############################################################################ - -########################## -# statistics filename add -########################## -OutputName FA4_C4A - -##################################### -# enable, frequency -##################################### -CoordinatesFreq true 10000000 -RestartFreq true 1000000 -ConsoleFreq true 100000 -BlockAverageFreq true 100000 -HistogramFreq true 100000 - - -################################ -# OutHistSettings -################################ -DistName dis -HistName his -RunNumber 1 -RunLetter a -SampleFreq 200 - -################################## -# enable: blk avg., fluct. -################################## -OutEnergy true true -OutPressure false false -OutMolNum true true -OutDensity true true - diff --git a/example_file/perfluorobutane_butane/par_mie.inp b/example_file/perfluorobutane_butane/par_mie.inp deleted file mode 100644 index 7d1324bec..000000000 --- a/example_file/perfluorobutane_butane/par_mie.inp +++ /dev/null @@ -1,166 +0,0 @@ -* -* Topology File for Mie General model (Mick, Soroush Barhaghi, and Potoff) United Atom Force Field -* -* Parameters From: -* -* "Mie potentials for phase equilibria calculations: Application to alkanes and perfluoroalkanes." -* Potoff, Jeffrey J., and Damien A. Bernard-Brunel. -* The Journal of Physical Chemistry B 113.44 (2009): 14725-14731. -* -* -* "Optimized Mie Potentials for Phase Equilibria: Understanding the limits of transferability in branched alkanes" -* Jason R. Mick, Mohammad Soroush Barhaghi, Jeffrey J. Potoff. -* -* - - -BONDS -! -!V(bond) = Kb(b - b0)**2 -! -!Kb: kcal/mole/A**2 -!b0: A -! -! Kb (kcal/mol) = Kb (K) * Boltz. const.; (9999999999 if no stretching) -! -!atom type Kb b0 description -CH3 CH3 9999999999 1.540 ! (ethane) -CH3 CH2 9999999999 1.540 ! (ex. propane) -CH2 CH2 9999999999 1.540 ! (ex. n-butane) -CH3 CHS 9999999999 1.540 ! (ex. 2-methylpropane) -CH3 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH3 CTS 9999999999 1.540 ! (ex. 2,2-dimethylpropane) -CH3 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CH2 CHS 9999999999 1.540 ! (ex. 2-methylbutane) -CH2 CHL 9999999999 1.540 ! (ex. 2-methylpentane) -CH2 CTS 9999999999 1.540 ! (ex. 2,2-dimethylbutane) -CH2 CTL 9999999999 1.540 ! (ex. 2,2-dimethylpentane) -CHS CHS 9999999999 1.540 ! (ex. 2,3-dimethylbutane) -CHL CHL 9999999999 1.540 ! (ex. 2,3-dimethylpentane) -CHS CTS 9999999999 1.540 ! (ex. 2,2,3-trimethylbutane) -CHL CTL 9999999999 1.540 ! (ex. 2,2,3-trimethylpentane) -CTT CTT 9999999999 1.580 ! (2,2,3,3-tetramethylbutane) -CF3 CF3 9999999999 1.540 ! -CF3 CF2 9999999999 1.540 ! -CF2 CF2 9999999999 1.540 ! - - - -ANGLES -! -!V(angle) = Ktheta(Theta - Theta0)**2 -! -!Ktheta: kcal/mole/rad**2 -!Theta0: degrees -! -! Ktheta (kcal/mol) = Ktheta (K) * Boltz. const. -! -!atom types Ktheta Theta0 -CH3 CH2 CH3 31250 114.00 ! (propane only) -CH3 CH2 CH2 31250 114.00 ! (ex. n-butane) -CH3 CH2 CHS 31250 114.00 ! (ex. 2-methylbutane) -CH3 CH2 CHL 31250 114.00 ! (ex. 3-methylpentane) -CH3 CH2 CTS 31250 114.00 ! (ex. 2,2-dimethylbutane) -CH3 CH2 CTL 31250 114.00 ! (ex. 3,3-dimethylhexane) -CH2 CH2 CH2 31250 114.00 ! (ex. n-pentane) -CH2 CH2 CHL 31250 114.00 ! (ex. 2-methylpentane) -CH2 CH2 CTL 31250 114.00 ! (ex. 2,2-dimethylpentane) -CHL CH2 CHL 31250 114.00 ! (ex. 2,4-dimethylpentane) -CHL CH2 CTL 31250 114.00 ! (ex. 2,2,4-trimethylpentane) -CH3 CHS CH3 31250 112.00 ! (ex. isobutane) -CH3 CHL CH3 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CH2 31250 112.00 ! (ex. 2-methylbutane) -CH3 CHL CH2 31250 112.00 ! (ex. 2-methylpentane) -CH3 CHS CHS 31250 112.00 ! (2,3-dimethylbutane only) -CH3 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH3 CHS CTS 31250 112.00 ! (2,2,3-trimethylbutane only) -CH3 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CH2 CHL CH2 31250 112.00 ! (ex. 3-methylpentane) -CH2 CHL CHL 31250 112.00 ! (ex. 2,3-dimethylpentane) -CH2 CHL CTL 31250 112.00 ! (ex. 2,2,3-trimethylpentane) -CHL CHL CHL 31250 112.00 ! (ex. 2,3,4-trimethylpentane) -CH3 CTS CH3 31250 109.47 ! (ex. 2,2-dimethylpropane) -CH3 CTL CH3 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CH2 31250 109.47 ! (ex. 2,2-dimethylbutane) -CH3 CTL CH2 31250 109.47 ! (ex. 2,2-dimethylpentane) -CH3 CTS CHS 31250 109.47 ! (ex. 2,2,3-trimethylbutane) -CH3 CTL CHL 31250 109.47 ! (ex. 2,2,3-trimethylpentane) -CH2 CTL CH2 31250 109.47 ! (ex. 3,3-dimethylpentane) -CH3 CTT CTT 31250 111.00 ! (2,2,3,3-tetramethylbutane) -CH3 CTT CH3 31250 107.00 ! (2,2,3,3-tetramethylbutane) -CF3 CF2 CF3 31250 114.00 ! perfluorocarbons -CF2 CF2 CF3 31250 114.00 ! -CF2 CF2 CF2 31250 114.00 ! - - -DIHEDRALS -! -!V(dihedral) = Kchi(1 + cos(n(chi) - delta)) -! -!Kchi: kcal/mole -!n: multiplicity -!delta: degrees -! -! Kchi (kcal/mol) = Kchi (K) * Boltz. const. -! Boltzmann = 0.0019872041 kcal / (mol * K) -! -! TraPPE Inherits most of its dihedrals from OPLS UA -! X-CT-CH1-X fitted to QM data in this work -! -!atom types Kchi n delta description -X CH2 CH2 X 0.000000 0 0.0 ! OPLS (ex. n-butane) -X CH2 CH2 X 355.029964 1 0.0 ! "" -X CH2 CH2 X -68.189775 2 180.0 ! "" -X CH2 CH2 X 791.317812 3 0.0 ! "" -X CH2 CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2-methylbutane) -X CH2 CHS X 428.729993 1 0.0 ! "" -X CH2 CHS X -111.850111 2 180.0 ! "" -X CH2 CHS X 441.270224 3 0.0 ! "" -X CH2 CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CH2 CHL X 428.729993 1 0.0 ! "" -X CH2 CHL X -111.850111 2 180.0 ! "" -X CH2 CHL X 441.270224 3 0.0 ! "" -X CHS CHS X -251.059767 0 0.0 ! OPLS -- short backbone (ex. 2,3-dimethylbutane) -X CHS CHS X 428.729993 1 0.0 ! "" -X CHS CHS X -111.850111 2 180.0 ! "" -X CHS CHS X 441.270224 3 0.0 ! "" -X CHL CHL X -251.059767 0 0.0 ! (same as prev., but for long backbone) -X CHL CHL X 428.729993 1 0.0 ! "" -X CHL CHL X -111.850111 2 180.0 ! "" -X CHL CHL X 441.270224 3 0.0 ! "" -X CTS CH2 X 461.289809 3 0.0 ! OPLS -- short backbone (ex. 2,2-DMBut) -X CTL CH2 X 461.289809 3 0.0 ! (same as prev., but for long backbone) -X CTS CHS X 1369.00000 3 0.0 ! this work -- short backbone (ex. 2,2,3-TriMBut) -X CTL CHL X 1369.00000 3 0.0 ! this work -- long backbone (ex. 2,2,3-TriMPen) -X CTS CTS X 2950.910000 0 0.0 ! this work -- from QM -X CTS CTS X -2047.060000 3 0.0 ! (ex. 2,2,3,3-tetramethylbutane) -X CTS CTS X 529.250000 6 180.0 ! "" -X CTS CTS X 150.160000 12 0.0 ! "" -! perfluorocarbons: use wacky seven term torsion -X CF2 CF2 X -1577.68 0 0.0 ! Fit to MP2/6-31+g(d,p) data for perfluorobutane -X CF2 CF2 X 791.61 1 0.0 ! -X CF2 CF2 X 333.65 2 0.0 ! -X CF2 CF2 X 854.01 3 0.0 ! -X CF2 CF2 X 349.25 4 0.0 ! -X CF2 CF2 X 211.51 5 0.0 ! -X CF2 CF2 X 117.66 6 0.0 ! -X CF2 CF2 X -83.44 7 0.0 ! - - -NONBONDED_MIE -! -!V(mie) = 4*eps*((sig_ij/r_ij)^n-(sig_ij/r_ij)^6) -! -!atom eps sig_ij n description -CH4 161.00 3.740 14 ! Potoff, 2009 -CH3 121.25 3.783 16 ! Potoff, 2009 -CH2 61.00 3.990 16 ! Potoff, 2009 -CHS 15.00 4.700 16 ! alkanes w/ 4 or less carbons in backbone -CHL 14.00 4.700 16 ! alkanes w/ 5 or more carbons in backbone -CTS 1.45 6.100 16 ! alkanes w/ 4 or less carbons in backbone -CTL 1.20 6.200 16 ! alkanes w/ 5 or more carbons in backbone -CTT 1.45 6.100 16 ! 2,2,3,3-tetramethylbutane (same as CTS) -CF4 269.00 4.355 36 ! Potoff, 2009 -CF3 155.75 4.475 36 ! Potoff, 2009 -CF2 72.20 4.75 44 ! Potoff, 2009; modified for new torsion - diff --git a/example_file/perfluorobutane_butane/setup_box_0.pdb b/example_file/perfluorobutane_butane/setup_box_0.pdb deleted file mode 100644 index 3da303a3f..000000000 --- a/example_file/perfluorobutane_butane/setup_box_0.pdb +++ /dev/null @@ -1,602 +0,0 @@ -REMARK 30.000 30.000 30.000 STEP: 2000000 -ATOM 1 C1 C4A A 1 2.470 1.698 12.369 0.00 0.00 -ATOM 2 C2 C4A A 1 2.945 1.581 10.909 0.00 0.00 -ATOM 3 C3 C4A A 1 3.430 1.426 13.543 0.00 0.00 -ATOM 4 C4 C4A A 1 2.720 1.476 14.908 0.00 0.00 -ATOM 5 C1 C4A A 2 3.658 18.757 21.797 0.00 0.00 -ATOM 6 C2 C4A A 2 4.351 17.452 21.365 0.00 0.00 -ATOM 7 C3 C4A A 2 4.313 19.705 22.819 0.00 0.00 -ATOM 8 C4 C4A A 2 3.699 21.117 22.832 0.00 0.00 -ATOM 9 C1 C4A A 3 16.975 28.987 0.561 0.00 0.00 -ATOM 10 C2 C4A A 3 15.659 28.212 0.755 0.00 0.00 -ATOM 11 C3 C4A A 3 17.266 29.923 1.749 0.00 0.00 -ATOM 12 C4 C4A A 3 18.584 30.712 1.632 0.00 0.00 -ATOM 13 C1 C4A A 4 10.067 8.388 22.378 0.00 0.00 -ATOM 14 C2 C4A A 4 9.009 9.405 22.847 0.00 0.00 -ATOM 15 C3 C4A A 4 11.389 9.004 21.884 0.00 0.00 -ATOM 16 C4 C4A A 4 12.359 7.914 21.392 0.00 0.00 -ATOM 17 C1 C4A A 5 15.252 1.126 13.029 0.00 0.00 -ATOM 18 C2 C4A A 5 13.889 1.361 12.351 0.00 0.00 -ATOM 19 C3 C4A A 5 16.352 1.915 12.294 0.00 0.00 -ATOM 20 C4 C4A A 5 15.980 3.392 12.064 0.00 0.00 -ATOM 21 C1 C4A A 6 18.532 17.451 21.969 0.00 0.00 -ATOM 22 C2 C4A A 6 17.703 17.079 23.212 0.00 0.00 -ATOM 23 C3 C4A A 6 18.618 16.341 20.904 0.00 0.00 -ATOM 24 C4 C4A A 6 19.253 16.864 19.603 0.00 0.00 -ATOM 25 C1 C4A A 7 14.879 28.788 7.381 0.00 0.00 -ATOM 26 C2 C4A A 7 14.620 27.348 7.862 0.00 0.00 -ATOM 27 C3 C4A A 7 14.402 29.227 5.984 0.00 0.00 -ATOM 28 C4 C4A A 7 15.267 28.667 4.840 0.00 0.00 -ATOM 29 C1 C4A A 8 27.809 25.926 14.074 0.00 0.00 -ATOM 30 C2 C4A A 8 27.958 24.420 13.791 0.00 0.00 -ATOM 31 C3 C4A A 8 26.436 26.414 13.572 0.00 0.00 -ATOM 32 C4 C4A A 8 26.021 27.858 13.908 0.00 0.00 -ATOM 33 C1 C4A A 9 24.482 15.732 26.808 0.00 0.00 -ATOM 34 C2 C4A A 9 25.605 14.766 26.387 0.00 0.00 -ATOM 35 C3 C4A A 9 23.346 15.745 25.767 0.00 0.00 -ATOM 36 C4 C4A A 9 22.368 16.935 25.739 0.00 0.00 -ATOM 37 C1 C4A A 10 21.676 18.103 15.974 0.00 0.00 -ATOM 38 C2 C4A A 10 22.050 19.098 17.088 0.00 0.00 -ATOM 39 C3 C4A A 10 20.502 18.461 15.044 0.00 0.00 -ATOM 40 C4 C4A A 10 19.170 18.531 15.814 0.00 0.00 -ATOM 41 C1 C4A A 11 20.269 25.732 16.832 0.00 0.00 -ATOM 42 C2 C4A A 11 19.847 24.252 16.806 0.00 0.00 -ATOM 43 C3 C4A A 11 19.501 26.728 15.942 0.00 0.00 -ATOM 44 C4 C4A A 11 20.133 28.132 15.928 0.00 0.00 -ATOM 45 C1 C4A A 12 8.140 23.400 1.538 0.00 0.00 -ATOM 46 C2 C4A A 12 7.442 24.693 1.077 0.00 0.00 -ATOM 47 C3 C4A A 12 8.638 22.532 0.367 0.00 0.00 -ATOM 48 C4 C4A A 12 9.405 21.307 0.898 0.00 0.00 -ATOM 49 C1 C4A A 13 18.235 14.365 28.000 0.00 0.00 -ATOM 50 C2 C4A A 13 17.595 14.729 26.648 0.00 0.00 -ATOM 51 C3 C4A A 13 19.628 13.723 27.855 0.00 0.00 -ATOM 52 C4 C4A A 13 20.407 13.413 29.146 0.00 0.00 -ATOM 53 C1 C4A A 14 -0.109 20.613 13.908 0.00 0.00 -ATOM 54 C2 C4A A 14 1.156 20.393 13.058 0.00 0.00 -ATOM 55 C3 C4A A 14 0.194 20.433 15.407 0.00 0.00 -ATOM 56 C4 C4A A 14 1.049 21.550 16.035 0.00 0.00 -ATOM 57 C1 C4A A 15 14.757 29.111 26.043 0.00 0.00 -ATOM 58 C2 C4A A 15 15.185 27.634 26.134 0.00 0.00 -ATOM 59 C3 C4A A 15 13.407 29.457 26.698 0.00 0.00 -ATOM 60 C4 C4A A 15 13.067 30.959 26.727 0.00 0.00 -ATOM 61 C1 C4A A 16 23.292 3.235 10.385 0.00 0.00 -ATOM 62 C2 C4A A 16 23.288 1.695 10.372 0.00 0.00 -ATOM 63 C3 C4A A 16 24.463 3.894 9.633 0.00 0.00 -ATOM 64 C4 C4A A 16 24.444 3.910 8.094 0.00 0.00 -ATOM 65 C1 C4A A 17 25.892 26.348 30.387 0.00 0.00 -ATOM 66 C2 C4A A 17 26.206 27.728 30.994 0.00 0.00 -ATOM 67 C3 C4A A 17 25.272 26.373 28.977 0.00 0.00 -ATOM 68 C4 C4A A 17 23.776 26.723 29.084 0.00 0.00 -ATOM 69 C1 C4A A 18 21.476 8.670 13.527 0.00 0.00 -ATOM 70 C2 C4A A 18 22.083 8.595 12.113 0.00 0.00 -ATOM 71 C3 C4A A 18 20.313 7.663 13.602 0.00 0.00 -ATOM 72 C4 C4A A 18 19.568 7.606 14.949 0.00 0.00 -ATOM 73 C1 C4A A 19 6.626 14.252 11.072 0.00 0.00 -ATOM 74 C2 C4A A 19 7.755 14.938 10.279 0.00 0.00 -ATOM 75 C3 C4A A 19 5.677 15.242 11.771 0.00 0.00 -ATOM 76 C4 C4A A 19 4.487 14.574 12.484 0.00 0.00 -ATOM 77 C1 C4A A 20 17.762 2.486 26.077 0.00 0.00 -ATOM 78 C2 C4A A 20 18.296 1.750 27.320 0.00 0.00 -ATOM 79 C3 C4A A 20 18.355 3.874 25.768 0.00 0.00 -ATOM 80 C4 C4A A 20 19.841 3.736 25.390 0.00 0.00 -ATOM 81 C1 C4A A 21 30.091 17.943 23.841 0.00 0.00 -ATOM 82 C2 C4A A 21 30.873 19.055 24.565 0.00 0.00 -ATOM 83 C3 C4A A 21 29.621 16.756 24.703 0.00 0.00 -ATOM 84 C4 C4A A 21 28.843 15.666 23.943 0.00 0.00 -ATOM 85 C1 C4A A 22 29.622 17.986 28.219 0.00 0.00 -ATOM 86 C2 C4A A 22 28.331 18.712 27.798 0.00 0.00 -ATOM 87 C3 C4A A 22 29.549 17.595 29.706 0.00 0.00 -ATOM 88 C4 C4A A 22 30.625 16.554 30.066 0.00 0.00 -ATOM 89 C1 C4A A 23 13.466 3.942 23.784 0.00 0.00 -ATOM 90 C2 C4A A 23 14.655 4.773 23.265 0.00 0.00 -ATOM 91 C3 C4A A 23 12.395 4.730 24.560 0.00 0.00 -ATOM 92 C4 C4A A 23 11.191 3.879 25.007 0.00 0.00 -ATOM 93 C1 C4A A 24 19.002 3.030 21.594 0.00 0.00 -ATOM 94 C2 C4A A 24 17.991 4.184 21.727 0.00 0.00 -ATOM 95 C3 C4A A 24 18.384 1.678 21.995 0.00 0.00 -ATOM 96 C4 C4A A 24 19.482 0.599 21.956 0.00 0.00 -ATOM 97 C1 C4A A 25 26.188 13.205 21.576 0.00 0.00 -ATOM 98 C2 C4A A 25 26.145 12.851 23.074 0.00 0.00 -ATOM 99 C3 C4A A 25 27.218 12.464 20.703 0.00 0.00 -ATOM 100 C4 C4A A 25 27.111 13.035 19.277 0.00 0.00 -ATOM 101 C1 C4A A 26 28.408 23.060 1.268 0.00 0.00 -ATOM 102 C2 C4A A 26 28.321 21.697 0.558 0.00 0.00 -ATOM 103 C3 C4A A 26 29.192 23.087 2.593 0.00 0.00 -ATOM 104 C4 C4A A 26 29.551 24.524 3.014 0.00 0.00 -ATOM 105 C1 C4A A 27 8.469 21.919 26.659 0.00 0.00 -ATOM 106 C2 C4A A 27 9.509 20.800 26.852 0.00 0.00 -ATOM 107 C3 C4A A 27 6.989 21.503 26.562 0.00 0.00 -ATOM 108 C4 C4A A 27 5.994 22.660 26.357 0.00 0.00 -ATOM 109 C1 C4A A 28 5.042 24.837 5.081 0.00 0.00 -ATOM 110 C2 C4A A 28 6.479 24.554 5.558 0.00 0.00 -ATOM 111 C3 C4A A 28 3.937 24.061 5.821 0.00 0.00 -ATOM 112 C4 C4A A 28 2.480 24.527 5.640 0.00 0.00 -ATOM 113 C1 C4A A 29 9.161 29.987 27.753 0.00 0.00 -ATOM 114 C2 C4A A 29 8.316 31.087 27.085 0.00 0.00 -ATOM 115 C3 C4A A 29 8.785 28.552 27.339 0.00 0.00 -ATOM 116 C4 C4A A 29 8.521 27.698 28.594 0.00 0.00 -ATOM 117 C1 C4A A 30 15.887 10.759 13.954 0.00 0.00 -ATOM 118 C2 C4A A 30 14.477 11.064 13.414 0.00 0.00 -ATOM 119 C3 C4A A 30 16.031 9.565 14.916 0.00 0.00 -ATOM 120 C4 C4A A 30 15.775 8.125 14.434 0.00 0.00 -ATOM 121 C1 C4A A 31 17.766 13.430 23.031 0.00 0.00 -ATOM 122 C2 C4A A 31 16.455 12.866 22.452 0.00 0.00 -ATOM 123 C3 C4A A 31 18.729 12.286 23.399 0.00 0.00 -ATOM 124 C4 C4A A 31 20.176 12.711 23.711 0.00 0.00 -ATOM 125 C1 C4A A 32 3.837 28.003 2.891 0.00 0.00 -ATOM 126 C2 C4A A 32 3.690 28.542 4.326 0.00 0.00 -ATOM 127 C3 C4A A 32 4.835 28.727 1.967 0.00 0.00 -ATOM 128 C4 C4A A 32 4.852 28.225 0.512 0.00 0.00 -ATOM 129 C1 C4A A 33 23.652 22.014 2.623 0.00 0.00 -ATOM 130 C2 C4A A 33 24.421 23.137 1.903 0.00 0.00 -ATOM 131 C3 C4A A 33 22.854 22.409 3.880 0.00 0.00 -ATOM 132 C4 C4A A 33 22.619 21.257 4.875 0.00 0.00 -ATOM 133 C1 C4A A 34 2.706 11.021 15.609 0.00 0.00 -ATOM 134 C2 C4A A 34 1.695 10.380 14.641 0.00 0.00 -ATOM 135 C3 C4A A 34 3.732 10.058 16.235 0.00 0.00 -ATOM 136 C4 C4A A 34 4.788 10.903 16.973 0.00 0.00 -ATOM 137 C1 C4A A 35 8.433 7.747 26.484 0.00 0.00 -ATOM 138 C2 C4A A 35 8.288 9.080 27.242 0.00 0.00 -ATOM 139 C3 C4A A 35 8.808 6.634 27.480 0.00 0.00 -ATOM 140 C4 C4A A 35 10.240 6.665 28.046 0.00 0.00 -ATOM 141 C1 C4A A 36 25.357 2.653 20.222 0.00 0.00 -ATOM 142 C2 C4A A 36 26.771 3.153 20.571 0.00 0.00 -ATOM 143 C3 C4A A 36 24.569 3.291 19.062 0.00 0.00 -ATOM 144 C4 C4A A 36 24.929 4.747 18.715 0.00 0.00 -ATOM 145 C1 C4A A 37 23.239 25.071 11.756 0.00 0.00 -ATOM 146 C2 C4A A 37 22.206 24.323 12.618 0.00 0.00 -ATOM 147 C3 C4A A 37 22.811 26.527 11.495 0.00 0.00 -ATOM 148 C4 C4A A 37 23.749 27.247 10.507 0.00 0.00 -ATOM 149 C1 C4A A 38 16.296 25.961 12.480 0.00 0.00 -ATOM 150 C2 C4A A 38 16.602 27.189 11.604 0.00 0.00 -ATOM 151 C3 C4A A 38 17.574 25.155 12.780 0.00 0.00 -ATOM 152 C4 C4A A 38 17.262 23.652 12.904 0.00 0.00 -ATOM 153 C1 C4A A 39 1.017 12.647 18.982 0.00 0.00 -ATOM 154 C2 C4A A 39 0.638 11.218 19.414 0.00 0.00 -ATOM 155 C3 C4A A 39 2.232 13.237 19.721 0.00 0.00 -ATOM 156 C4 C4A A 39 2.938 14.394 18.989 0.00 0.00 -ATOM 157 C1 C4A A 40 12.085 26.133 4.219 0.00 0.00 -ATOM 158 C2 C4A A 40 12.520 26.701 2.856 0.00 0.00 -ATOM 159 C3 C4A A 40 10.800 26.766 4.785 0.00 0.00 -ATOM 160 C4 C4A A 40 10.814 28.214 5.308 0.00 0.00 -ATOM 161 C1 C4A A 41 5.401 6.410 0.796 0.00 0.00 -ATOM 162 C2 C4A A 41 4.171 7.178 1.315 0.00 0.00 -ATOM 163 C3 C4A A 41 6.374 5.995 1.916 0.00 0.00 -ATOM 164 C4 C4A A 41 7.464 5.074 1.336 0.00 0.00 -ATOM 165 C1 C4A A 42 21.076 17.546 5.824 0.00 0.00 -ATOM 166 C2 C4A A 42 20.913 18.398 7.097 0.00 0.00 -ATOM 167 C3 C4A A 42 20.494 16.141 6.064 0.00 0.00 -ATOM 168 C4 C4A A 42 20.257 15.252 4.828 0.00 0.00 -ATOM 169 C1 C4A A 43 11.302 29.105 23.010 0.00 0.00 -ATOM 170 C2 C4A A 43 11.302 30.591 23.416 0.00 0.00 -ATOM 171 C3 C4A A 43 12.240 28.773 21.835 0.00 0.00 -ATOM 172 C4 C4A A 43 13.726 28.927 22.208 0.00 0.00 -ATOM 173 C1 C4A A 44 12.837 7.463 10.691 0.00 0.00 -ATOM 174 C2 C4A A 44 14.126 8.255 10.400 0.00 0.00 -ATOM 175 C3 C4A A 44 12.716 6.810 12.080 0.00 0.00 -ATOM 176 C4 C4A A 44 11.455 5.941 12.238 0.00 0.00 -ATOM 177 C1 C4A A 45 23.855 4.919 23.713 0.00 0.00 -ATOM 178 C2 C4A A 45 23.323 6.225 24.333 0.00 0.00 -ATOM 179 C3 C4A A 45 22.708 4.033 23.191 0.00 0.00 -ATOM 180 C4 C4A A 45 22.061 4.772 22.005 0.00 0.00 -ATOM 181 C1 C4A A 46 25.980 17.093 8.075 0.00 0.00 -ATOM 182 C2 C4A A 46 26.233 15.574 8.045 0.00 0.00 -ATOM 183 C3 C4A A 46 26.242 17.794 6.729 0.00 0.00 -ATOM 184 C4 C4A A 46 26.127 19.326 6.831 0.00 0.00 -ATOM 185 C1 C4A A 47 13.040 4.071 7.932 0.00 0.00 -ATOM 186 C2 C4A A 47 14.131 4.206 9.010 0.00 0.00 -ATOM 187 C3 C4A A 47 12.786 2.638 7.430 0.00 0.00 -ATOM 188 C4 C4A A 47 11.957 2.516 6.138 0.00 0.00 -ATOM 189 C1 C4A A 48 20.826 15.836 10.171 0.00 0.00 -ATOM 190 C2 C4A A 48 21.961 14.797 10.103 0.00 0.00 -ATOM 191 C3 C4A A 48 20.240 15.822 11.595 0.00 0.00 -ATOM 192 C4 C4A A 48 19.043 16.777 11.751 0.00 0.00 -ATOM 193 C1 C4A A 49 10.317 12.768 20.023 0.00 0.00 -ATOM 194 C2 C4A A 49 11.015 12.795 21.396 0.00 0.00 -ATOM 195 C3 C4A A 49 9.757 11.373 19.687 0.00 0.00 -ATOM 196 C4 C4A A 49 8.774 11.265 18.506 0.00 0.00 -ATOM 197 C1 C4A A 50 15.232 27.463 16.211 0.00 0.00 -ATOM 198 C2 C4A A 50 15.899 28.822 16.494 0.00 0.00 -ATOM 199 C3 C4A A 50 13.731 27.470 15.864 0.00 0.00 -ATOM 200 C4 C4A A 50 13.204 26.167 15.235 0.00 0.00 -ATOM 201 C1 C4A A 51 3.536 8.739 21.777 0.00 0.00 -ATOM 202 C2 C4A A 51 2.816 7.833 22.794 0.00 0.00 -ATOM 203 C3 C4A A 51 5.053 8.960 21.924 0.00 0.00 -ATOM 204 C4 C4A A 51 5.840 9.926 21.019 0.00 0.00 -ATOM 205 C1 C4A A 52 24.073 10.745 26.526 0.00 0.00 -ATOM 206 C2 C4A A 52 22.871 11.541 25.984 0.00 0.00 -ATOM 207 C3 C4A A 52 23.654 9.440 27.227 0.00 0.00 -ATOM 208 C4 C4A A 52 24.846 8.572 27.671 0.00 0.00 -ATOM 209 C1 C4A A 53 23.015 2.380 15.099 0.00 0.00 -ATOM 210 C2 C4A A 53 23.798 1.180 14.535 0.00 0.00 -ATOM 211 C3 C4A A 53 23.555 3.736 14.607 0.00 0.00 -ATOM 212 C4 C4A A 53 22.866 4.947 15.263 0.00 0.00 -ATOM 213 C1 C4A A 54 18.860 3.845 16.118 0.00 0.00 -ATOM 214 C2 C4A A 54 17.686 4.340 15.254 0.00 0.00 -ATOM 215 C3 C4A A 54 18.752 2.336 16.406 0.00 0.00 -ATOM 216 C4 C4A A 54 19.869 1.790 17.316 0.00 0.00 -ATOM 217 C1 C4A A 55 25.795 17.037 14.314 0.00 0.00 -ATOM 218 C2 C4A A 55 24.874 16.345 13.292 0.00 0.00 -ATOM 219 C3 C4A A 55 26.892 16.077 14.809 0.00 0.00 -ATOM 220 C4 C4A A 55 26.375 14.731 15.352 0.00 0.00 -ATOM 221 C1 C4A A 56 17.002 2.554 6.870 0.00 0.00 -ATOM 222 C2 C4A A 56 17.684 1.239 6.448 0.00 0.00 -ATOM 223 C3 C4A A 56 16.773 3.400 5.603 0.00 0.00 -ATOM 224 C4 C4A A 56 16.051 2.710 4.431 0.00 0.00 -ATOM 225 C1 C4A A 57 4.104 2.572 20.519 0.00 0.00 -ATOM 226 C2 C4A A 57 3.601 3.930 21.043 0.00 0.00 -ATOM 227 C3 C4A A 57 3.533 2.167 19.147 0.00 0.00 -ATOM 228 C4 C4A A 57 1.999 2.062 19.225 0.00 0.00 -ATOM 229 C1 C4A A 58 10.730 24.416 18.242 0.00 0.00 -ATOM 230 C2 C4A A 58 9.525 24.826 17.374 0.00 0.00 -ATOM 231 C3 C4A A 58 11.526 25.540 18.930 0.00 0.00 -ATOM 232 C4 C4A A 58 12.566 25.129 19.989 0.00 0.00 -ATOM 233 C1 C4A A 59 25.660 22.644 16.678 0.00 0.00 -ATOM 234 C2 C4A A 59 26.618 21.471 16.396 0.00 0.00 -ATOM 235 C3 C4A A 59 24.711 23.092 15.551 0.00 0.00 -ATOM 236 C4 C4A A 59 23.727 24.195 15.983 0.00 0.00 -ATOM 237 C1 C4A A 60 1.768 15.018 15.371 0.00 0.00 -ATOM 238 C2 C4A A 60 0.401 14.393 15.705 0.00 0.00 -ATOM 239 C3 C4A A 60 1.796 16.554 15.277 0.00 0.00 -ATOM 240 C4 C4A A 60 3.142 17.283 15.110 0.00 0.00 -ATOM 241 C1 C4A A 61 20.485 25.562 1.481 0.00 0.00 -ATOM 242 C2 C4A A 61 20.868 24.146 1.013 0.00 0.00 -ATOM 243 C3 C4A A 61 21.643 26.400 2.054 0.00 0.00 -ATOM 244 C4 C4A A 61 21.446 27.906 2.309 0.00 0.00 -ATOM 245 C1 C4A A 62 15.318 19.714 9.558 0.00 0.00 -ATOM 246 C2 C4A A 62 15.165 20.911 10.515 0.00 0.00 -ATOM 247 C3 C4A A 62 16.696 19.030 9.482 0.00 0.00 -ATOM 248 C4 C4A A 62 16.777 17.883 8.457 0.00 0.00 -ATOM 249 C1 C4A A 63 1.014 24.400 26.363 0.00 0.00 -ATOM 250 C2 C4A A 63 0.054 23.434 27.083 0.00 0.00 -ATOM 251 C3 C4A A 63 1.425 23.895 24.968 0.00 0.00 -ATOM 252 C4 C4A A 63 2.627 24.617 24.330 0.00 0.00 -ATOM 253 C1 C4A A 64 22.048 27.202 6.990 0.00 0.00 -ATOM 254 C2 C4A A 64 21.449 25.950 7.658 0.00 0.00 -ATOM 255 C3 C4A A 64 21.046 28.199 6.379 0.00 0.00 -ATOM 256 C4 C4A A 64 21.679 29.483 5.813 0.00 0.00 -ATOM 257 C1 C4A A 65 10.844 16.981 8.402 0.00 0.00 -ATOM 258 C2 C4A A 65 11.608 17.887 9.385 0.00 0.00 -ATOM 259 C3 C4A A 65 11.063 17.284 6.908 0.00 0.00 -ATOM 260 C4 C4A A 65 10.139 16.592 5.888 0.00 0.00 -ATOM 261 C1 C4A A 66 4.974 19.336 6.824 0.00 0.00 -ATOM 262 C2 C4A A 66 5.507 20.778 6.750 0.00 0.00 -ATOM 263 C3 C4A A 66 6.053 18.286 7.147 0.00 0.00 -ATOM 264 C4 C4A A 66 5.477 16.873 7.356 0.00 0.00 -ATOM 265 C1 C4A A 67 23.053 15.031 20.160 0.00 0.00 -ATOM 266 C2 C4A A 67 22.457 13.659 19.796 0.00 0.00 -ATOM 267 C3 C4A A 67 22.911 15.604 21.582 0.00 0.00 -ATOM 268 C4 C4A A 67 23.598 16.918 21.997 0.00 0.00 -ATOM 269 C1 C4A A 68 11.543 22.552 13.403 0.00 0.00 -ATOM 270 C2 C4A A 68 10.435 22.515 12.333 0.00 0.00 -ATOM 271 C3 C4A A 68 12.458 21.317 13.488 0.00 0.00 -ATOM 272 C4 C4A A 68 13.752 21.517 14.299 0.00 0.00 -ATOM 273 C1 C4A A 69 10.294 29.582 15.839 0.00 0.00 -ATOM 274 C2 C4A A 69 9.743 30.373 14.638 0.00 0.00 -ATOM 275 C3 C4A A 69 9.552 29.929 17.144 0.00 0.00 -ATOM 276 C4 C4A A 69 10.269 29.385 18.393 0.00 0.00 -ATOM 277 C1 C4A A 70 20.535 -0.328 11.627 0.00 0.00 -ATOM 278 C2 C4A A 70 19.938 0.602 12.700 0.00 0.00 -ATOM 279 C3 C4A A 70 19.669 -0.214 10.359 0.00 0.00 -ATOM 280 C4 C4A A 70 19.724 1.205 9.763 0.00 0.00 -ATOM 281 C1 C4A A 71 27.917 10.908 29.193 0.00 0.00 -ATOM 282 C2 C4A A 71 27.597 12.337 28.718 0.00 0.00 -ATOM 283 C3 C4A A 71 28.969 10.883 30.318 0.00 0.00 -ATOM 284 C4 C4A A 71 29.406 9.470 30.746 0.00 0.00 -ATOM 285 C1 C4A A 72 24.538 10.533 9.266 0.00 0.00 -ATOM 286 C2 C4A A 72 25.336 11.325 10.318 0.00 0.00 -ATOM 287 C3 C4A A 72 25.340 9.443 8.530 0.00 0.00 -ATOM 288 C4 C4A A 72 24.700 8.503 7.492 0.00 0.00 -ATOM 289 C1 C4A A 73 11.430 7.989 17.444 0.00 0.00 -ATOM 290 C2 C4A A 73 12.951 8.058 17.216 0.00 0.00 -ATOM 291 C3 C4A A 73 10.577 7.813 16.174 0.00 0.00 -ATOM 292 C4 C4A A 73 9.064 7.891 16.447 0.00 0.00 -ATOM 293 C1 C4A A 74 7.566 15.066 18.273 0.00 0.00 -ATOM 294 C2 C4A A 74 7.070 15.192 19.726 0.00 0.00 -ATOM 295 C3 C4A A 74 6.476 14.811 17.216 0.00 0.00 -ATOM 296 C4 C4A A 74 6.882 14.423 15.782 0.00 0.00 -ATOM 297 C1 C4A A 75 17.562 12.213 2.435 0.00 0.00 -ATOM 298 C2 C4A A 75 18.306 11.244 1.498 0.00 0.00 -ATOM 299 C3 C4A A 75 16.798 13.293 1.647 0.00 0.00 -ATOM 300 C4 C4A A 75 15.518 12.894 0.889 0.00 0.00 -ATOM 301 C1 FA4 B 1 0.489 27.613 18.967 0.00 0.00 -ATOM 302 C2 FA4 B 1 -0.591 28.308 19.818 0.00 0.00 -ATOM 303 C3 FA4 B 1 0.211 27.339 17.478 0.00 0.00 -ATOM 304 C4 FA4 B 1 1.201 26.287 16.945 0.00 0.00 -ATOM 305 C1 FA4 B 2 28.724 2.447 15.933 0.00 0.00 -ATOM 306 C2 FA4 B 2 28.004 1.234 16.550 0.00 0.00 -ATOM 307 C3 FA4 B 2 28.023 2.918 14.645 0.00 0.00 -ATOM 308 C4 FA4 B 2 28.049 1.959 13.441 0.00 0.00 -ATOM 309 C1 FA4 B 3 10.635 13.069 12.951 0.00 0.00 -ATOM 310 C2 FA4 B 3 10.254 12.109 11.809 0.00 0.00 -ATOM 311 C3 FA4 B 3 10.270 12.396 14.287 0.00 0.00 -ATOM 312 C4 FA4 B 3 11.047 13.013 15.465 0.00 0.00 -ATOM 313 C1 FA4 B 4 10.114 26.688 9.265 0.00 0.00 -ATOM 314 C2 FA4 B 4 9.189 25.459 9.334 0.00 0.00 -ATOM 315 C3 FA4 B 4 11.069 26.678 10.473 0.00 0.00 -ATOM 316 C4 FA4 B 4 11.619 28.035 10.951 0.00 0.00 -ATOM 317 C1 FA4 B 5 1.432 27.667 9.876 0.00 0.00 -ATOM 318 C2 FA4 B 5 1.029 27.639 8.390 0.00 0.00 -ATOM 319 C3 FA4 B 5 1.826 26.289 10.440 0.00 0.00 -ATOM 320 C4 FA4 B 5 1.925 26.330 11.976 0.00 0.00 -ATOM 321 C1 FA4 B 6 3.169 7.705 6.169 0.00 0.00 -ATOM 322 C2 FA4 B 6 4.043 6.447 6.329 0.00 0.00 -ATOM 323 C3 FA4 B 6 2.197 7.734 4.975 0.00 0.00 -ATOM 324 C4 FA4 B 6 1.455 9.052 4.686 0.00 0.00 -ATOM 325 C1 FA4 B 7 20.191 18.147 30.647 0.00 0.00 -ATOM 326 C2 FA4 B 7 19.499 19.248 31.473 0.00 0.00 -ATOM 327 C3 FA4 B 7 19.937 18.307 29.137 0.00 0.00 -ATOM 328 C4 FA4 B 7 20.394 19.671 28.585 0.00 0.00 -ATOM 329 C1 FA4 B 8 13.353 3.494 17.486 0.00 0.00 -ATOM 330 C2 FA4 B 8 12.518 3.267 16.211 0.00 0.00 -ATOM 331 C3 FA4 B 8 13.642 2.361 18.487 0.00 0.00 -ATOM 332 C4 FA4 B 8 14.488 2.552 19.760 0.00 0.00 -ATOM 333 C1 FA4 B 9 18.118 23.202 6.139 0.00 0.00 -ATOM 334 C2 FA4 B 9 18.449 21.699 6.090 0.00 0.00 -ATOM 335 C3 FA4 B 9 18.161 23.776 4.711 0.00 0.00 -ATOM 336 C4 FA4 B 9 17.708 25.248 4.692 0.00 0.00 -ATOM 337 C1 FA4 B 10 21.791 23.377 20.583 0.00 0.00 -ATOM 338 C2 FA4 B 10 21.616 23.613 22.094 0.00 0.00 -ATOM 339 C3 FA4 B 10 22.511 22.062 20.229 0.00 0.00 -ATOM 340 C4 FA4 B 10 21.935 20.835 20.959 0.00 0.00 -ATOM 341 C1 FA4 B 11 24.942 16.486 1.165 0.00 0.00 -ATOM 342 C2 FA4 B 11 25.261 15.607 2.388 0.00 0.00 -ATOM 343 C3 FA4 B 11 24.822 18.002 1.406 0.00 0.00 -ATOM 344 C4 FA4 B 11 26.075 18.538 2.122 0.00 0.00 -ATOM 345 C1 FA4 B 12 8.713 13.070 24.819 0.00 0.00 -ATOM 346 C2 FA4 B 12 9.871 14.025 25.166 0.00 0.00 -ATOM 347 C3 FA4 B 12 7.598 13.548 23.871 0.00 0.00 -ATOM 348 C4 FA4 B 12 6.309 12.728 24.067 0.00 0.00 -ATOM 349 C1 FA4 B 13 23.518 10.311 3.130 0.00 0.00 -ATOM 350 C2 FA4 B 13 23.267 10.130 1.621 0.00 0.00 -ATOM 351 C3 FA4 B 13 22.997 11.697 3.553 0.00 0.00 -ATOM 352 C4 FA4 B 13 23.223 11.954 5.055 0.00 0.00 -ATOM 353 C1 FA4 B 14 5.488 17.908 2.144 0.00 0.00 -ATOM 354 C2 FA4 B 14 6.340 19.027 2.771 0.00 0.00 -ATOM 355 C3 FA4 B 14 5.102 16.675 2.981 0.00 0.00 -ATOM 356 C4 FA4 B 14 4.003 15.789 2.365 0.00 0.00 -ATOM 357 C1 FA4 B 15 26.067 -0.077 7.073 0.00 0.00 -ATOM 358 C2 FA4 B 15 26.174 -0.048 5.537 0.00 0.00 -ATOM 359 C3 FA4 B 15 27.291 0.645 7.667 0.00 0.00 -ATOM 360 C4 FA4 B 15 27.501 0.427 9.176 0.00 0.00 -ATOM 361 C1 FA4 B 16 29.629 15.322 10.821 0.00 0.00 -ATOM 362 C2 FA4 B 16 30.636 16.466 11.039 0.00 0.00 -ATOM 363 C3 FA4 B 16 30.188 13.887 10.797 0.00 0.00 -ATOM 364 C4 FA4 B 16 29.264 12.821 10.180 0.00 0.00 -ATOM 365 C1 FA4 B 17 27.332 23.213 20.723 0.00 0.00 -ATOM 366 C2 FA4 B 17 26.569 23.862 21.893 0.00 0.00 -ATOM 367 C3 FA4 B 17 28.704 22.569 20.996 0.00 0.00 -ATOM 368 C4 FA4 B 17 29.759 22.383 19.890 0.00 0.00 -ATOM 369 C1 FA4 B 18 2.380 29.193 24.756 0.00 0.00 -ATOM 370 C2 FA4 B 18 2.004 29.852 23.416 0.00 0.00 -ATOM 371 C3 FA4 B 18 3.896 29.313 24.998 0.00 0.00 -ATOM 372 C4 FA4 B 18 4.464 28.746 26.312 0.00 0.00 -ATOM 373 C1 FA4 B 19 3.932 3.331 27.491 0.00 0.00 -ATOM 374 C2 FA4 B 19 4.429 2.545 28.719 0.00 0.00 -ATOM 375 C3 FA4 B 19 5.015 3.746 26.478 0.00 0.00 -ATOM 376 C4 FA4 B 19 4.529 4.316 25.132 0.00 0.00 -ATOM 377 C1 FA4 B 20 24.024 20.726 11.480 0.00 0.00 -ATOM 378 C2 FA4 B 20 25.547 20.565 11.325 0.00 0.00 -ATOM 379 C3 FA4 B 20 23.189 20.313 10.253 0.00 0.00 -ATOM 380 C4 FA4 B 20 21.700 20.192 10.626 0.00 0.00 -ATOM 381 C1 FA4 B 21 26.909 5.252 2.835 0.00 0.00 -ATOM 382 C2 FA4 B 21 26.618 6.267 1.714 0.00 0.00 -ATOM 383 C3 FA4 B 21 26.926 5.858 4.250 0.00 0.00 -ATOM 384 C4 FA4 B 21 27.316 4.793 5.292 0.00 0.00 -ATOM 385 C1 FA4 B 22 13.771 16.140 20.925 0.00 0.00 -ATOM 386 C2 FA4 B 22 13.130 17.532 21.073 0.00 0.00 -ATOM 387 C3 FA4 B 22 14.121 15.901 19.445 0.00 0.00 -ATOM 388 C4 FA4 B 22 14.782 14.549 19.118 0.00 0.00 -ATOM 389 C1 FA4 B 23 11.357 1.161 1.691 0.00 0.00 -ATOM 390 C2 FA4 B 23 12.890 1.054 1.799 0.00 0.00 -ATOM 391 C3 FA4 B 23 10.772 2.545 1.355 0.00 0.00 -ATOM 392 C4 FA4 B 23 11.512 3.696 2.062 0.00 0.00 -ATOM 393 C1 FA4 B 24 23.932 28.558 20.119 0.00 0.00 -ATOM 394 C2 FA4 B 24 22.950 28.087 21.208 0.00 0.00 -ATOM 395 C3 FA4 B 24 24.092 27.496 19.015 0.00 0.00 -ATOM 396 C4 FA4 B 24 24.906 27.941 17.786 0.00 0.00 -ATOM 397 C1 FA4 B 25 21.744 4.209 4.337 0.00 0.00 -ATOM 398 C2 FA4 B 25 22.932 3.238 4.212 0.00 0.00 -ATOM 399 C3 FA4 B 25 21.791 5.441 3.414 0.00 0.00 -ATOM 400 C4 FA4 B 25 20.839 6.571 3.847 0.00 0.00 -ATOM 401 C1 FA4 B 26 29.519 7.273 9.397 0.00 0.00 -ATOM 402 C2 FA4 B 26 28.903 8.366 10.289 0.00 0.00 -ATOM 403 C3 FA4 B 26 29.881 6.053 10.265 0.00 0.00 -ATOM 404 C4 FA4 B 26 30.388 4.852 9.446 0.00 0.00 -ATOM 405 C1 FA4 B 27 0.220 29.503 29.283 0.00 0.00 -ATOM 406 C2 FA4 B 27 -0.565 30.491 28.399 0.00 0.00 -ATOM 407 C3 FA4 B 27 0.285 28.075 28.711 0.00 0.00 -ATOM 408 C4 FA4 B 27 0.781 27.190 29.870 0.00 0.00 -ATOM 409 C1 FA4 B 28 23.548 3.329 29.289 0.00 0.00 -ATOM 410 C2 FA4 B 28 22.503 4.342 28.786 0.00 0.00 -ATOM 411 C3 FA4 B 28 24.328 2.456 28.289 0.00 0.00 -ATOM 412 C4 FA4 B 28 23.405 1.504 27.506 0.00 0.00 -ATOM 413 C1 FA4 B 29 4.283 11.132 28.217 0.00 0.00 -ATOM 414 C2 FA4 B 29 3.880 12.100 29.345 0.00 0.00 -ATOM 415 C3 FA4 B 29 3.260 10.026 27.895 0.00 0.00 -ATOM 416 C4 FA4 B 29 3.817 8.945 26.950 0.00 0.00 -ATOM 417 C1 FA4 B 30 17.301 7.854 18.581 0.00 0.00 -ATOM 418 C2 FA4 B 30 16.228 6.758 18.724 0.00 0.00 -ATOM 419 C3 FA4 B 30 17.130 9.016 19.577 0.00 0.00 -ATOM 420 C4 FA4 B 30 15.999 10.032 19.330 0.00 0.00 -ATOM 421 C1 FA4 B 31 24.656 20.402 25.716 0.00 0.00 -ATOM 422 C2 FA4 B 31 24.974 20.197 24.223 0.00 0.00 -ATOM 423 C3 FA4 B 31 24.569 21.886 26.116 0.00 0.00 -ATOM 424 C4 FA4 B 31 24.826 22.034 27.627 0.00 0.00 -ATOM 425 C1 FA4 B 32 15.397 22.294 0.993 0.00 0.00 -ATOM 426 C2 FA4 B 32 14.293 22.909 1.873 0.00 0.00 -ATOM 427 C3 FA4 B 32 16.305 23.245 0.191 0.00 0.00 -ATOM 428 C4 FA4 B 32 17.080 22.641 -0.995 0.00 0.00 -ATOM 429 C1 FA4 B 33 19.398 7.333 8.321 0.00 0.00 -ATOM 430 C2 FA4 B 33 20.546 6.517 8.944 0.00 0.00 -ATOM 431 C3 FA4 B 33 18.027 6.676 8.561 0.00 0.00 -ATOM 432 C4 FA4 B 33 17.819 6.496 10.077 0.00 0.00 -ATOM 433 C1 FA4 B 34 6.420 27.144 13.040 0.00 0.00 -ATOM 434 C2 FA4 B 34 6.122 28.478 12.329 0.00 0.00 -ATOM 435 C3 FA4 B 34 6.382 27.160 14.579 0.00 0.00 -ATOM 436 C4 FA4 B 34 5.096 27.812 15.120 0.00 0.00 -ATOM 437 C1 FA4 B 35 3.912 5.637 16.257 0.00 0.00 -ATOM 438 C2 FA4 B 35 2.837 5.893 15.185 0.00 0.00 -ATOM 439 C3 FA4 B 35 5.251 5.395 15.535 0.00 0.00 -ATOM 440 C4 FA4 B 35 6.298 4.696 16.422 0.00 0.00 -ATOM 441 C1 FA4 B 36 6.205 16.848 26.783 0.00 0.00 -ATOM 442 C2 FA4 B 36 7.354 17.154 27.762 0.00 0.00 -ATOM 443 C3 FA4 B 36 4.774 16.691 27.331 0.00 0.00 -ATOM 444 C4 FA4 B 36 3.846 16.045 26.285 0.00 0.00 -ATOM 445 C1 FA4 B 37 27.072 29.360 23.972 0.00 0.00 -ATOM 446 C2 FA4 B 37 25.837 30.281 23.967 0.00 0.00 -ATOM 447 C3 FA4 B 37 26.833 27.846 24.113 0.00 0.00 -ATOM 448 C4 FA4 B 37 28.108 27.219 24.706 0.00 0.00 -ATOM 449 C1 FA4 B 38 29.340 4.912 26.988 0.00 0.00 -ATOM 450 C2 FA4 B 38 28.999 6.232 27.704 0.00 0.00 -ATOM 451 C3 FA4 B 38 29.306 4.979 25.450 0.00 0.00 -ATOM 452 C4 FA4 B 38 29.387 3.610 24.749 0.00 0.00 -ATOM 453 C1 FA4 B 39 4.843 8.576 11.804 0.00 0.00 -ATOM 454 C2 FA4 B 39 4.127 7.542 10.915 0.00 0.00 -ATOM 455 C3 FA4 B 39 6.357 8.407 12.034 0.00 0.00 -ATOM 456 C4 FA4 B 39 6.900 9.435 13.043 0.00 0.00 -ATOM 457 C1 FA4 B 40 10.868 22.214 5.303 0.00 0.00 -ATOM 458 C2 FA4 B 40 9.623 21.341 5.061 0.00 0.00 -ATOM 459 C3 FA4 B 40 11.480 21.763 6.642 0.00 0.00 -ATOM 460 C4 FA4 B 40 12.474 22.772 7.247 0.00 0.00 -ATOM 461 C1 FA4 B 41 8.207 21.192 22.176 0.00 0.00 -ATOM 462 C2 FA4 B 41 8.737 22.163 21.105 0.00 0.00 -ATOM 463 C3 FA4 B 41 9.249 20.138 22.596 0.00 0.00 -ATOM 464 C4 FA4 B 41 8.792 18.818 23.245 0.00 0.00 -ATOM 465 C1 FA4 B 42 12.983 13.170 7.037 0.00 0.00 -ATOM 466 C2 FA4 B 42 13.218 12.367 8.330 0.00 0.00 -ATOM 467 C3 FA4 B 42 12.781 12.375 5.733 0.00 0.00 -ATOM 468 C4 FA4 B 42 11.932 13.080 4.659 0.00 0.00 -ATOM 469 C1 FA4 B 43 5.785 12.605 6.092 0.00 0.00 -ATOM 470 C2 FA4 B 43 7.278 12.979 6.161 0.00 0.00 -ATOM 471 C3 FA4 B 43 5.113 12.325 7.448 0.00 0.00 -ATOM 472 C4 FA4 B 43 3.573 12.300 7.430 0.00 0.00 -ATOM 473 C1 FA4 B 44 8.969 12.437 0.885 0.00 0.00 -ATOM 474 C2 FA4 B 44 8.946 13.923 1.288 0.00 0.00 -ATOM 475 C3 FA4 B 44 8.403 11.439 1.912 0.00 0.00 -ATOM 476 C4 FA4 B 44 8.326 9.979 1.427 0.00 0.00 -ATOM 477 C1 FA4 B 45 14.712 17.366 13.604 0.00 0.00 -ATOM 478 C2 FA4 B 45 14.892 17.256 15.130 0.00 0.00 -ATOM 479 C3 FA4 B 45 14.828 15.980 12.945 0.00 0.00 -ATOM 480 C4 FA4 B 45 14.379 15.833 11.479 0.00 0.00 -ATOM 481 C1 FA4 B 46 14.605 7.734 4.978 0.00 0.00 -ATOM 482 C2 FA4 B 46 14.080 6.378 4.469 0.00 0.00 -ATOM 483 C3 FA4 B 46 15.301 8.545 3.869 0.00 0.00 -ATOM 484 C4 FA4 B 46 14.409 8.715 2.625 0.00 0.00 -ATOM 485 C1 FA4 B 47 27.195 9.371 14.754 0.00 0.00 -ATOM 486 C2 FA4 B 47 26.987 10.615 15.637 0.00 0.00 -ATOM 487 C3 FA4 B 47 26.075 8.315 14.810 0.00 0.00 -ATOM 488 C4 FA4 B 47 26.127 7.200 13.749 0.00 0.00 -ATOM 489 C1 FA4 B 48 27.828 18.267 18.805 0.00 0.00 -ATOM 490 C2 FA4 B 48 26.372 17.828 19.045 0.00 0.00 -ATOM 491 C3 FA4 B 48 28.848 17.166 19.149 0.00 0.00 -ATOM 492 C4 FA4 B 48 30.283 17.724 19.189 0.00 0.00 -ATOM 493 C1 FA4 B 49 5.640 27.502 21.046 0.00 0.00 -ATOM 494 C2 FA4 B 49 5.645 28.310 19.735 0.00 0.00 -ATOM 495 C3 FA4 B 49 7.078 27.262 21.543 0.00 0.00 -ATOM 496 C4 FA4 B 49 7.324 26.337 22.749 0.00 0.00 -ATOM 497 C1 FA4 B 50 20.151 25.786 26.193 0.00 0.00 -ATOM 498 C2 FA4 B 50 21.007 24.589 26.645 0.00 0.00 -ATOM 499 C3 FA4 B 50 20.920 27.039 25.736 0.00 0.00 -ATOM 500 C4 FA4 B 50 20.057 28.313 25.802 0.00 0.00 -ATOM 501 C1 FA4 B 51 16.842 5.344 29.644 0.00 0.00 -ATOM 502 C2 FA4 B 51 17.319 5.504 31.099 0.00 0.00 -ATOM 503 C3 FA4 B 51 15.425 4.741 29.615 0.00 0.00 -ATOM 504 C4 FA4 B 51 14.889 4.484 28.195 0.00 0.00 -ATOM 505 C1 FA4 B 52 20.695 12.434 15.596 0.00 0.00 -ATOM 506 C2 FA4 B 52 22.214 12.669 15.695 0.00 0.00 -ATOM 507 C3 FA4 B 52 19.847 13.439 16.397 0.00 0.00 -ATOM 508 C4 FA4 B 52 18.326 13.250 16.238 0.00 0.00 -ATOM 509 C1 FA4 B 53 9.201 8.421 6.958 0.00 0.00 -ATOM 510 C2 FA4 B 53 9.924 9.234 8.047 0.00 0.00 -ATOM 511 C3 FA4 B 53 10.031 7.238 6.427 0.00 0.00 -ATOM 512 C4 FA4 B 53 9.449 6.606 5.149 0.00 0.00 -ATOM 513 C1 FA4 B 54 4.665 22.067 11.376 0.00 0.00 -ATOM 514 C2 FA4 B 54 5.180 23.324 10.651 0.00 0.00 -ATOM 515 C3 FA4 B 54 5.681 20.914 11.281 0.00 0.00 -ATOM 516 C4 FA4 B 54 5.184 19.599 11.911 0.00 0.00 -ATOM 517 C1 FA4 B 55 28.290 12.891 4.644 0.00 0.00 -ATOM 518 C2 FA4 B 55 27.865 12.058 5.868 0.00 0.00 -ATOM 519 C3 FA4 B 55 29.434 13.885 4.914 0.00 0.00 -ATOM 520 C4 FA4 B 55 29.660 14.672 3.610 0.00 0.00 -ATOM 521 C1 FA4 B 56 17.909 12.287 9.890 0.00 0.00 -ATOM 522 C2 FA4 B 56 18.621 11.275 10.807 0.00 0.00 -ATOM 523 C3 FA4 B 56 18.479 12.031 8.483 0.00 0.00 -ATOM 524 C4 FA4 B 56 17.720 12.788 7.377 0.00 0.00 -ATOM 525 C1 FA4 B 57 18.911 9.065 26.874 0.00 0.00 -ATOM 526 C2 FA4 B 57 19.600 9.270 28.236 0.00 0.00 -ATOM 527 C3 FA4 B 57 19.742 8.090 26.019 0.00 0.00 -ATOM 528 C4 FA4 B 57 19.254 7.926 24.568 0.00 0.00 -ATOM 529 C1 FA4 B 58 5.605 21.902 17.042 0.00 0.00 -ATOM 530 C2 FA4 B 58 6.528 22.426 15.927 0.00 0.00 -ATOM 531 C3 FA4 B 58 5.417 22.961 18.145 0.00 0.00 -ATOM 532 C4 FA4 B 58 4.328 22.555 19.156 0.00 0.00 -ATOM 533 C1 FA4 B 59 13.234 18.232 26.730 0.00 0.00 -ATOM 534 C2 FA4 B 59 13.613 19.686 27.067 0.00 0.00 -ATOM 535 C3 FA4 B 59 12.963 17.287 27.915 0.00 0.00 -ATOM 536 C4 FA4 B 59 13.215 15.780 27.722 0.00 0.00 -ATOM 537 C1 FA4 B 60 8.481 18.227 15.150 0.00 0.00 -ATOM 538 C2 FA4 B 60 9.007 17.549 13.871 0.00 0.00 -ATOM 539 C3 FA4 B 60 9.511 19.023 15.972 0.00 0.00 -ATOM 540 C4 FA4 B 60 10.653 18.145 16.516 0.00 0.00 -ATOM 541 C1 FA4 B 61 7.241 0.233 6.081 0.00 0.00 -ATOM 542 C2 FA4 B 61 6.675 -0.577 7.262 0.00 0.00 -ATOM 543 C3 FA4 B 61 6.366 1.462 5.772 0.00 0.00 -ATOM 544 C4 FA4 B 61 6.882 2.299 4.587 0.00 0.00 -ATOM 545 C1 FA4 B 62 0.574 19.511 6.703 0.00 0.00 -ATOM 546 C2 FA4 B 62 0.568 20.321 8.013 0.00 0.00 -ATOM 547 C3 FA4 B 62 0.737 20.427 5.476 0.00 0.00 -ATOM 548 C4 FA4 B 62 0.865 19.671 4.141 0.00 0.00 -ATOM 549 C1 FA4 B 63 26.432 25.415 6.967 0.00 0.00 -ATOM 550 C2 FA4 B 63 25.804 25.384 5.561 0.00 0.00 -ATOM 551 C3 FA4 B 63 26.264 24.126 7.794 0.00 0.00 -ATOM 552 C4 FA4 B 63 27.536 23.743 8.571 0.00 0.00 -ATOM 553 C1 FA4 B 64 13.526 17.576 2.585 0.00 0.00 -ATOM 554 C2 FA4 B 64 12.478 18.601 2.115 0.00 0.00 -ATOM 555 C3 FA4 B 64 14.762 18.139 3.311 0.00 0.00 -ATOM 556 C4 FA4 B 64 15.461 17.106 4.213 0.00 0.00 -ATOM 557 C1 FA4 B 65 8.527 2.781 11.484 0.00 0.00 -ATOM 558 C2 FA4 B 65 8.836 1.544 10.619 0.00 0.00 -ATOM 559 C3 FA4 B 65 7.499 3.739 10.855 0.00 0.00 -ATOM 560 C4 FA4 B 65 7.828 4.093 9.392 0.00 0.00 -ATOM 561 C1 FA4 B 66 22.163 9.010 20.811 0.00 0.00 -ATOM 562 C2 FA4 B 66 23.357 9.682 21.515 0.00 0.00 -ATOM 563 C3 FA4 B 66 22.051 9.400 19.326 0.00 0.00 -ATOM 564 C4 FA4 B 66 23.359 9.283 18.522 0.00 0.00 -ATOM 565 C1 FA4 B 67 28.235 7.379 19.165 0.00 0.00 -ATOM 566 C2 FA4 B 67 27.739 7.463 20.620 0.00 0.00 -ATOM 567 C3 FA4 B 67 29.630 6.791 18.885 0.00 0.00 -ATOM 568 C4 FA4 B 67 30.036 5.535 19.678 0.00 0.00 -ATOM 569 C1 FA4 B 68 2.805 21.585 0.327 0.00 0.00 -ATOM 570 C2 FA4 B 68 2.937 20.467 -0.724 0.00 0.00 -ATOM 571 C3 FA4 B 68 3.565 22.903 0.090 0.00 0.00 -ATOM 572 C4 FA4 B 68 3.507 23.838 1.312 0.00 0.00 -ATOM 573 C1 FA4 B 69 29.473 10.238 24.104 0.00 0.00 -ATOM 574 C2 FA4 B 69 28.271 9.817 24.970 0.00 0.00 -ATOM 575 C3 FA4 B 69 30.212 11.556 24.405 0.00 0.00 -ATOM 576 C4 FA4 B 69 31.550 11.672 23.652 0.00 0.00 -ATOM 577 C1 FA4 B 70 17.166 25.472 21.845 0.00 0.00 -ATOM 578 C2 FA4 B 70 17.617 26.940 21.965 0.00 0.00 -ATOM 579 C3 FA4 B 70 16.866 24.749 23.171 0.00 0.00 -ATOM 580 C4 FA4 B 70 16.402 23.281 23.122 0.00 0.00 -ATOM 581 C1 FA4 B 71 9.453 3.733 20.946 0.00 0.00 -ATOM 582 C2 FA4 B 71 9.625 4.689 19.751 0.00 0.00 -ATOM 583 C3 FA4 B 71 8.040 3.814 21.553 0.00 0.00 -ATOM 584 C4 FA4 B 71 7.548 5.264 21.723 0.00 0.00 -ATOM 585 C1 FA4 B 72 12.613 24.177 26.505 0.00 0.00 -ATOM 586 C2 FA4 B 72 12.345 24.871 27.853 0.00 0.00 -ATOM 587 C3 FA4 B 72 11.950 24.845 25.285 0.00 0.00 -ATOM 588 C4 FA4 B 72 11.679 23.748 24.240 0.00 0.00 -ATOM 589 C1 FA4 B 73 13.467 9.312 26.743 0.00 0.00 -ATOM 590 C2 FA4 B 73 14.438 8.514 25.854 0.00 0.00 -ATOM 591 C3 FA4 B 73 13.485 10.753 26.198 0.00 0.00 -ATOM 592 C4 FA4 B 73 14.924 11.114 25.787 0.00 0.00 -ATOM 593 C1 FA4 B 74 2.294 3.253 3.244 0.00 0.00 -ATOM 594 C2 FA4 B 74 1.406 4.024 2.250 0.00 0.00 -ATOM 595 C3 FA4 B 74 1.595 2.560 4.428 0.00 0.00 -ATOM 596 C4 FA4 B 74 0.510 1.535 4.047 0.00 0.00 -ATOM 597 C1 FA4 B 75 15.383 21.468 18.523 0.00 0.00 -ATOM 598 C2 FA4 B 75 16.018 22.858 18.336 0.00 0.00 -ATOM 599 C3 FA4 B 75 16.383 20.308 18.683 0.00 0.00 -ATOM 600 C4 FA4 B 75 17.331 20.682 19.838 0.00 0.00 -END diff --git a/example_file/perfluorobutane_butane/setup_box_0.psf b/example_file/perfluorobutane_butane/setup_box_0.psf deleted file mode 100644 index 7e2e1b3ef..000000000 --- a/example_file/perfluorobutane_butane/setup_box_0.psf +++ /dev/null @@ -1,994 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology ./top_mie.inp - REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } - REMARKS segment FA4 { first NONE; last NONE; auto angles dihedrals } - - 600 !NATOM - 1 C4A 1 C4A C1 CH2 0.000000 14.0270 0 - 2 C4A 1 C4A C2 CH3 0.000000 15.0350 0 - 3 C4A 1 C4A C3 CH2 0.000000 14.0270 0 - 4 C4A 1 C4A C4 CH3 0.000000 15.0350 0 - 5 C4A 2 C4A C1 CH2 0.000000 14.0270 0 - 6 C4A 2 C4A C2 CH3 0.000000 15.0350 0 - 7 C4A 2 C4A C3 CH2 0.000000 14.0270 0 - 8 C4A 2 C4A C4 CH3 0.000000 15.0350 0 - 9 C4A 3 C4A C1 CH2 0.000000 14.0270 0 - 10 C4A 3 C4A C2 CH3 0.000000 15.0350 0 - 11 C4A 3 C4A C3 CH2 0.000000 14.0270 0 - 12 C4A 3 C4A C4 CH3 0.000000 15.0350 0 - 13 C4A 4 C4A C1 CH2 0.000000 14.0270 0 - 14 C4A 4 C4A C2 CH3 0.000000 15.0350 0 - 15 C4A 4 C4A C3 CH2 0.000000 14.0270 0 - 16 C4A 4 C4A C4 CH3 0.000000 15.0350 0 - 17 C4A 5 C4A C1 CH2 0.000000 14.0270 0 - 18 C4A 5 C4A C2 CH3 0.000000 15.0350 0 - 19 C4A 5 C4A C3 CH2 0.000000 14.0270 0 - 20 C4A 5 C4A C4 CH3 0.000000 15.0350 0 - 21 C4A 6 C4A C1 CH2 0.000000 14.0270 0 - 22 C4A 6 C4A C2 CH3 0.000000 15.0350 0 - 23 C4A 6 C4A C3 CH2 0.000000 14.0270 0 - 24 C4A 6 C4A C4 CH3 0.000000 15.0350 0 - 25 C4A 7 C4A C1 CH2 0.000000 14.0270 0 - 26 C4A 7 C4A C2 CH3 0.000000 15.0350 0 - 27 C4A 7 C4A C3 CH2 0.000000 14.0270 0 - 28 C4A 7 C4A C4 CH3 0.000000 15.0350 0 - 29 C4A 8 C4A C1 CH2 0.000000 14.0270 0 - 30 C4A 8 C4A C2 CH3 0.000000 15.0350 0 - 31 C4A 8 C4A C3 CH2 0.000000 14.0270 0 - 32 C4A 8 C4A C4 CH3 0.000000 15.0350 0 - 33 C4A 9 C4A C1 CH2 0.000000 14.0270 0 - 34 C4A 9 C4A C2 CH3 0.000000 15.0350 0 - 35 C4A 9 C4A C3 CH2 0.000000 14.0270 0 - 36 C4A 9 C4A C4 CH3 0.000000 15.0350 0 - 37 C4A 10 C4A C1 CH2 0.000000 14.0270 0 - 38 C4A 10 C4A C2 CH3 0.000000 15.0350 0 - 39 C4A 10 C4A C3 CH2 0.000000 14.0270 0 - 40 C4A 10 C4A C4 CH3 0.000000 15.0350 0 - 41 C4A 11 C4A C1 CH2 0.000000 14.0270 0 - 42 C4A 11 C4A C2 CH3 0.000000 15.0350 0 - 43 C4A 11 C4A C3 CH2 0.000000 14.0270 0 - 44 C4A 11 C4A C4 CH3 0.000000 15.0350 0 - 45 C4A 12 C4A C1 CH2 0.000000 14.0270 0 - 46 C4A 12 C4A C2 CH3 0.000000 15.0350 0 - 47 C4A 12 C4A C3 CH2 0.000000 14.0270 0 - 48 C4A 12 C4A C4 CH3 0.000000 15.0350 0 - 49 C4A 13 C4A C1 CH2 0.000000 14.0270 0 - 50 C4A 13 C4A C2 CH3 0.000000 15.0350 0 - 51 C4A 13 C4A C3 CH2 0.000000 14.0270 0 - 52 C4A 13 C4A C4 CH3 0.000000 15.0350 0 - 53 C4A 14 C4A C1 CH2 0.000000 14.0270 0 - 54 C4A 14 C4A C2 CH3 0.000000 15.0350 0 - 55 C4A 14 C4A C3 CH2 0.000000 14.0270 0 - 56 C4A 14 C4A C4 CH3 0.000000 15.0350 0 - 57 C4A 15 C4A C1 CH2 0.000000 14.0270 0 - 58 C4A 15 C4A C2 CH3 0.000000 15.0350 0 - 59 C4A 15 C4A C3 CH2 0.000000 14.0270 0 - 60 C4A 15 C4A C4 CH3 0.000000 15.0350 0 - 61 C4A 16 C4A C1 CH2 0.000000 14.0270 0 - 62 C4A 16 C4A C2 CH3 0.000000 15.0350 0 - 63 C4A 16 C4A C3 CH2 0.000000 14.0270 0 - 64 C4A 16 C4A C4 CH3 0.000000 15.0350 0 - 65 C4A 17 C4A C1 CH2 0.000000 14.0270 0 - 66 C4A 17 C4A C2 CH3 0.000000 15.0350 0 - 67 C4A 17 C4A C3 CH2 0.000000 14.0270 0 - 68 C4A 17 C4A C4 CH3 0.000000 15.0350 0 - 69 C4A 18 C4A C1 CH2 0.000000 14.0270 0 - 70 C4A 18 C4A C2 CH3 0.000000 15.0350 0 - 71 C4A 18 C4A C3 CH2 0.000000 14.0270 0 - 72 C4A 18 C4A C4 CH3 0.000000 15.0350 0 - 73 C4A 19 C4A C1 CH2 0.000000 14.0270 0 - 74 C4A 19 C4A C2 CH3 0.000000 15.0350 0 - 75 C4A 19 C4A C3 CH2 0.000000 14.0270 0 - 76 C4A 19 C4A C4 CH3 0.000000 15.0350 0 - 77 C4A 20 C4A C1 CH2 0.000000 14.0270 0 - 78 C4A 20 C4A C2 CH3 0.000000 15.0350 0 - 79 C4A 20 C4A C3 CH2 0.000000 14.0270 0 - 80 C4A 20 C4A C4 CH3 0.000000 15.0350 0 - 81 C4A 21 C4A C1 CH2 0.000000 14.0270 0 - 82 C4A 21 C4A C2 CH3 0.000000 15.0350 0 - 83 C4A 21 C4A C3 CH2 0.000000 14.0270 0 - 84 C4A 21 C4A C4 CH3 0.000000 15.0350 0 - 85 C4A 22 C4A C1 CH2 0.000000 14.0270 0 - 86 C4A 22 C4A C2 CH3 0.000000 15.0350 0 - 87 C4A 22 C4A C3 CH2 0.000000 14.0270 0 - 88 C4A 22 C4A C4 CH3 0.000000 15.0350 0 - 89 C4A 23 C4A C1 CH2 0.000000 14.0270 0 - 90 C4A 23 C4A C2 CH3 0.000000 15.0350 0 - 91 C4A 23 C4A C3 CH2 0.000000 14.0270 0 - 92 C4A 23 C4A C4 CH3 0.000000 15.0350 0 - 93 C4A 24 C4A C1 CH2 0.000000 14.0270 0 - 94 C4A 24 C4A C2 CH3 0.000000 15.0350 0 - 95 C4A 24 C4A C3 CH2 0.000000 14.0270 0 - 96 C4A 24 C4A C4 CH3 0.000000 15.0350 0 - 97 C4A 25 C4A C1 CH2 0.000000 14.0270 0 - 98 C4A 25 C4A C2 CH3 0.000000 15.0350 0 - 99 C4A 25 C4A C3 CH2 0.000000 14.0270 0 - 100 C4A 25 C4A C4 CH3 0.000000 15.0350 0 - 101 C4A 26 C4A C1 CH2 0.000000 14.0270 0 - 102 C4A 26 C4A C2 CH3 0.000000 15.0350 0 - 103 C4A 26 C4A C3 CH2 0.000000 14.0270 0 - 104 C4A 26 C4A C4 CH3 0.000000 15.0350 0 - 105 C4A 27 C4A C1 CH2 0.000000 14.0270 0 - 106 C4A 27 C4A C2 CH3 0.000000 15.0350 0 - 107 C4A 27 C4A C3 CH2 0.000000 14.0270 0 - 108 C4A 27 C4A C4 CH3 0.000000 15.0350 0 - 109 C4A 28 C4A C1 CH2 0.000000 14.0270 0 - 110 C4A 28 C4A C2 CH3 0.000000 15.0350 0 - 111 C4A 28 C4A C3 CH2 0.000000 14.0270 0 - 112 C4A 28 C4A C4 CH3 0.000000 15.0350 0 - 113 C4A 29 C4A C1 CH2 0.000000 14.0270 0 - 114 C4A 29 C4A C2 CH3 0.000000 15.0350 0 - 115 C4A 29 C4A C3 CH2 0.000000 14.0270 0 - 116 C4A 29 C4A C4 CH3 0.000000 15.0350 0 - 117 C4A 30 C4A C1 CH2 0.000000 14.0270 0 - 118 C4A 30 C4A C2 CH3 0.000000 15.0350 0 - 119 C4A 30 C4A C3 CH2 0.000000 14.0270 0 - 120 C4A 30 C4A C4 CH3 0.000000 15.0350 0 - 121 C4A 31 C4A C1 CH2 0.000000 14.0270 0 - 122 C4A 31 C4A C2 CH3 0.000000 15.0350 0 - 123 C4A 31 C4A C3 CH2 0.000000 14.0270 0 - 124 C4A 31 C4A C4 CH3 0.000000 15.0350 0 - 125 C4A 32 C4A C1 CH2 0.000000 14.0270 0 - 126 C4A 32 C4A C2 CH3 0.000000 15.0350 0 - 127 C4A 32 C4A C3 CH2 0.000000 14.0270 0 - 128 C4A 32 C4A C4 CH3 0.000000 15.0350 0 - 129 C4A 33 C4A C1 CH2 0.000000 14.0270 0 - 130 C4A 33 C4A C2 CH3 0.000000 15.0350 0 - 131 C4A 33 C4A C3 CH2 0.000000 14.0270 0 - 132 C4A 33 C4A C4 CH3 0.000000 15.0350 0 - 133 C4A 34 C4A C1 CH2 0.000000 14.0270 0 - 134 C4A 34 C4A C2 CH3 0.000000 15.0350 0 - 135 C4A 34 C4A C3 CH2 0.000000 14.0270 0 - 136 C4A 34 C4A C4 CH3 0.000000 15.0350 0 - 137 C4A 35 C4A C1 CH2 0.000000 14.0270 0 - 138 C4A 35 C4A C2 CH3 0.000000 15.0350 0 - 139 C4A 35 C4A C3 CH2 0.000000 14.0270 0 - 140 C4A 35 C4A C4 CH3 0.000000 15.0350 0 - 141 C4A 36 C4A C1 CH2 0.000000 14.0270 0 - 142 C4A 36 C4A C2 CH3 0.000000 15.0350 0 - 143 C4A 36 C4A C3 CH2 0.000000 14.0270 0 - 144 C4A 36 C4A C4 CH3 0.000000 15.0350 0 - 145 C4A 37 C4A C1 CH2 0.000000 14.0270 0 - 146 C4A 37 C4A C2 CH3 0.000000 15.0350 0 - 147 C4A 37 C4A C3 CH2 0.000000 14.0270 0 - 148 C4A 37 C4A C4 CH3 0.000000 15.0350 0 - 149 C4A 38 C4A C1 CH2 0.000000 14.0270 0 - 150 C4A 38 C4A C2 CH3 0.000000 15.0350 0 - 151 C4A 38 C4A C3 CH2 0.000000 14.0270 0 - 152 C4A 38 C4A C4 CH3 0.000000 15.0350 0 - 153 C4A 39 C4A C1 CH2 0.000000 14.0270 0 - 154 C4A 39 C4A C2 CH3 0.000000 15.0350 0 - 155 C4A 39 C4A C3 CH2 0.000000 14.0270 0 - 156 C4A 39 C4A C4 CH3 0.000000 15.0350 0 - 157 C4A 40 C4A C1 CH2 0.000000 14.0270 0 - 158 C4A 40 C4A C2 CH3 0.000000 15.0350 0 - 159 C4A 40 C4A C3 CH2 0.000000 14.0270 0 - 160 C4A 40 C4A C4 CH3 0.000000 15.0350 0 - 161 C4A 41 C4A C1 CH2 0.000000 14.0270 0 - 162 C4A 41 C4A C2 CH3 0.000000 15.0350 0 - 163 C4A 41 C4A C3 CH2 0.000000 14.0270 0 - 164 C4A 41 C4A C4 CH3 0.000000 15.0350 0 - 165 C4A 42 C4A C1 CH2 0.000000 14.0270 0 - 166 C4A 42 C4A C2 CH3 0.000000 15.0350 0 - 167 C4A 42 C4A C3 CH2 0.000000 14.0270 0 - 168 C4A 42 C4A C4 CH3 0.000000 15.0350 0 - 169 C4A 43 C4A C1 CH2 0.000000 14.0270 0 - 170 C4A 43 C4A C2 CH3 0.000000 15.0350 0 - 171 C4A 43 C4A C3 CH2 0.000000 14.0270 0 - 172 C4A 43 C4A C4 CH3 0.000000 15.0350 0 - 173 C4A 44 C4A C1 CH2 0.000000 14.0270 0 - 174 C4A 44 C4A C2 CH3 0.000000 15.0350 0 - 175 C4A 44 C4A C3 CH2 0.000000 14.0270 0 - 176 C4A 44 C4A C4 CH3 0.000000 15.0350 0 - 177 C4A 45 C4A C1 CH2 0.000000 14.0270 0 - 178 C4A 45 C4A C2 CH3 0.000000 15.0350 0 - 179 C4A 45 C4A C3 CH2 0.000000 14.0270 0 - 180 C4A 45 C4A C4 CH3 0.000000 15.0350 0 - 181 C4A 46 C4A C1 CH2 0.000000 14.0270 0 - 182 C4A 46 C4A C2 CH3 0.000000 15.0350 0 - 183 C4A 46 C4A C3 CH2 0.000000 14.0270 0 - 184 C4A 46 C4A C4 CH3 0.000000 15.0350 0 - 185 C4A 47 C4A C1 CH2 0.000000 14.0270 0 - 186 C4A 47 C4A C2 CH3 0.000000 15.0350 0 - 187 C4A 47 C4A C3 CH2 0.000000 14.0270 0 - 188 C4A 47 C4A C4 CH3 0.000000 15.0350 0 - 189 C4A 48 C4A C1 CH2 0.000000 14.0270 0 - 190 C4A 48 C4A C2 CH3 0.000000 15.0350 0 - 191 C4A 48 C4A C3 CH2 0.000000 14.0270 0 - 192 C4A 48 C4A C4 CH3 0.000000 15.0350 0 - 193 C4A 49 C4A C1 CH2 0.000000 14.0270 0 - 194 C4A 49 C4A C2 CH3 0.000000 15.0350 0 - 195 C4A 49 C4A C3 CH2 0.000000 14.0270 0 - 196 C4A 49 C4A C4 CH3 0.000000 15.0350 0 - 197 C4A 50 C4A C1 CH2 0.000000 14.0270 0 - 198 C4A 50 C4A C2 CH3 0.000000 15.0350 0 - 199 C4A 50 C4A C3 CH2 0.000000 14.0270 0 - 200 C4A 50 C4A C4 CH3 0.000000 15.0350 0 - 201 C4A 51 C4A C1 CH2 0.000000 14.0270 0 - 202 C4A 51 C4A C2 CH3 0.000000 15.0350 0 - 203 C4A 51 C4A C3 CH2 0.000000 14.0270 0 - 204 C4A 51 C4A C4 CH3 0.000000 15.0350 0 - 205 C4A 52 C4A C1 CH2 0.000000 14.0270 0 - 206 C4A 52 C4A C2 CH3 0.000000 15.0350 0 - 207 C4A 52 C4A C3 CH2 0.000000 14.0270 0 - 208 C4A 52 C4A C4 CH3 0.000000 15.0350 0 - 209 C4A 53 C4A C1 CH2 0.000000 14.0270 0 - 210 C4A 53 C4A C2 CH3 0.000000 15.0350 0 - 211 C4A 53 C4A C3 CH2 0.000000 14.0270 0 - 212 C4A 53 C4A C4 CH3 0.000000 15.0350 0 - 213 C4A 54 C4A C1 CH2 0.000000 14.0270 0 - 214 C4A 54 C4A C2 CH3 0.000000 15.0350 0 - 215 C4A 54 C4A C3 CH2 0.000000 14.0270 0 - 216 C4A 54 C4A C4 CH3 0.000000 15.0350 0 - 217 C4A 55 C4A C1 CH2 0.000000 14.0270 0 - 218 C4A 55 C4A C2 CH3 0.000000 15.0350 0 - 219 C4A 55 C4A C3 CH2 0.000000 14.0270 0 - 220 C4A 55 C4A C4 CH3 0.000000 15.0350 0 - 221 C4A 56 C4A C1 CH2 0.000000 14.0270 0 - 222 C4A 56 C4A C2 CH3 0.000000 15.0350 0 - 223 C4A 56 C4A C3 CH2 0.000000 14.0270 0 - 224 C4A 56 C4A C4 CH3 0.000000 15.0350 0 - 225 C4A 57 C4A C1 CH2 0.000000 14.0270 0 - 226 C4A 57 C4A C2 CH3 0.000000 15.0350 0 - 227 C4A 57 C4A C3 CH2 0.000000 14.0270 0 - 228 C4A 57 C4A C4 CH3 0.000000 15.0350 0 - 229 C4A 58 C4A C1 CH2 0.000000 14.0270 0 - 230 C4A 58 C4A C2 CH3 0.000000 15.0350 0 - 231 C4A 58 C4A C3 CH2 0.000000 14.0270 0 - 232 C4A 58 C4A C4 CH3 0.000000 15.0350 0 - 233 C4A 59 C4A C1 CH2 0.000000 14.0270 0 - 234 C4A 59 C4A C2 CH3 0.000000 15.0350 0 - 235 C4A 59 C4A C3 CH2 0.000000 14.0270 0 - 236 C4A 59 C4A C4 CH3 0.000000 15.0350 0 - 237 C4A 60 C4A C1 CH2 0.000000 14.0270 0 - 238 C4A 60 C4A C2 CH3 0.000000 15.0350 0 - 239 C4A 60 C4A C3 CH2 0.000000 14.0270 0 - 240 C4A 60 C4A C4 CH3 0.000000 15.0350 0 - 241 C4A 61 C4A C1 CH2 0.000000 14.0270 0 - 242 C4A 61 C4A C2 CH3 0.000000 15.0350 0 - 243 C4A 61 C4A C3 CH2 0.000000 14.0270 0 - 244 C4A 61 C4A C4 CH3 0.000000 15.0350 0 - 245 C4A 62 C4A C1 CH2 0.000000 14.0270 0 - 246 C4A 62 C4A C2 CH3 0.000000 15.0350 0 - 247 C4A 62 C4A C3 CH2 0.000000 14.0270 0 - 248 C4A 62 C4A C4 CH3 0.000000 15.0350 0 - 249 C4A 63 C4A C1 CH2 0.000000 14.0270 0 - 250 C4A 63 C4A C2 CH3 0.000000 15.0350 0 - 251 C4A 63 C4A C3 CH2 0.000000 14.0270 0 - 252 C4A 63 C4A C4 CH3 0.000000 15.0350 0 - 253 C4A 64 C4A C1 CH2 0.000000 14.0270 0 - 254 C4A 64 C4A C2 CH3 0.000000 15.0350 0 - 255 C4A 64 C4A C3 CH2 0.000000 14.0270 0 - 256 C4A 64 C4A C4 CH3 0.000000 15.0350 0 - 257 C4A 65 C4A C1 CH2 0.000000 14.0270 0 - 258 C4A 65 C4A C2 CH3 0.000000 15.0350 0 - 259 C4A 65 C4A C3 CH2 0.000000 14.0270 0 - 260 C4A 65 C4A C4 CH3 0.000000 15.0350 0 - 261 C4A 66 C4A C1 CH2 0.000000 14.0270 0 - 262 C4A 66 C4A C2 CH3 0.000000 15.0350 0 - 263 C4A 66 C4A C3 CH2 0.000000 14.0270 0 - 264 C4A 66 C4A C4 CH3 0.000000 15.0350 0 - 265 C4A 67 C4A C1 CH2 0.000000 14.0270 0 - 266 C4A 67 C4A C2 CH3 0.000000 15.0350 0 - 267 C4A 67 C4A C3 CH2 0.000000 14.0270 0 - 268 C4A 67 C4A C4 CH3 0.000000 15.0350 0 - 269 C4A 68 C4A C1 CH2 0.000000 14.0270 0 - 270 C4A 68 C4A C2 CH3 0.000000 15.0350 0 - 271 C4A 68 C4A C3 CH2 0.000000 14.0270 0 - 272 C4A 68 C4A C4 CH3 0.000000 15.0350 0 - 273 C4A 69 C4A C1 CH2 0.000000 14.0270 0 - 274 C4A 69 C4A C2 CH3 0.000000 15.0350 0 - 275 C4A 69 C4A C3 CH2 0.000000 14.0270 0 - 276 C4A 69 C4A C4 CH3 0.000000 15.0350 0 - 277 C4A 70 C4A C1 CH2 0.000000 14.0270 0 - 278 C4A 70 C4A C2 CH3 0.000000 15.0350 0 - 279 C4A 70 C4A C3 CH2 0.000000 14.0270 0 - 280 C4A 70 C4A C4 CH3 0.000000 15.0350 0 - 281 C4A 71 C4A C1 CH2 0.000000 14.0270 0 - 282 C4A 71 C4A C2 CH3 0.000000 15.0350 0 - 283 C4A 71 C4A C3 CH2 0.000000 14.0270 0 - 284 C4A 71 C4A C4 CH3 0.000000 15.0350 0 - 285 C4A 72 C4A C1 CH2 0.000000 14.0270 0 - 286 C4A 72 C4A C2 CH3 0.000000 15.0350 0 - 287 C4A 72 C4A C3 CH2 0.000000 14.0270 0 - 288 C4A 72 C4A C4 CH3 0.000000 15.0350 0 - 289 C4A 73 C4A C1 CH2 0.000000 14.0270 0 - 290 C4A 73 C4A C2 CH3 0.000000 15.0350 0 - 291 C4A 73 C4A C3 CH2 0.000000 14.0270 0 - 292 C4A 73 C4A C4 CH3 0.000000 15.0350 0 - 293 C4A 74 C4A C1 CH2 0.000000 14.0270 0 - 294 C4A 74 C4A C2 CH3 0.000000 15.0350 0 - 295 C4A 74 C4A C3 CH2 0.000000 14.0270 0 - 296 C4A 74 C4A C4 CH3 0.000000 15.0350 0 - 297 C4A 75 C4A C1 CH2 0.000000 14.0270 0 - 298 C4A 75 C4A C2 CH3 0.000000 15.0350 0 - 299 C4A 75 C4A C3 CH2 0.000000 14.0270 0 - 300 C4A 75 C4A C4 CH3 0.000000 15.0350 0 - 301 FA4 1 FA4 C1 CF2 0.000000 50.0070 0 - 302 FA4 1 FA4 C2 CF3 0.000000 69.0050 0 - 303 FA4 1 FA4 C3 CF2 0.000000 50.0070 0 - 304 FA4 1 FA4 C4 CF3 0.000000 69.0050 0 - 305 FA4 2 FA4 C1 CF2 0.000000 50.0070 0 - 306 FA4 2 FA4 C2 CF3 0.000000 69.0050 0 - 307 FA4 2 FA4 C3 CF2 0.000000 50.0070 0 - 308 FA4 2 FA4 C4 CF3 0.000000 69.0050 0 - 309 FA4 3 FA4 C1 CF2 0.000000 50.0070 0 - 310 FA4 3 FA4 C2 CF3 0.000000 69.0050 0 - 311 FA4 3 FA4 C3 CF2 0.000000 50.0070 0 - 312 FA4 3 FA4 C4 CF3 0.000000 69.0050 0 - 313 FA4 4 FA4 C1 CF2 0.000000 50.0070 0 - 314 FA4 4 FA4 C2 CF3 0.000000 69.0050 0 - 315 FA4 4 FA4 C3 CF2 0.000000 50.0070 0 - 316 FA4 4 FA4 C4 CF3 0.000000 69.0050 0 - 317 FA4 5 FA4 C1 CF2 0.000000 50.0070 0 - 318 FA4 5 FA4 C2 CF3 0.000000 69.0050 0 - 319 FA4 5 FA4 C3 CF2 0.000000 50.0070 0 - 320 FA4 5 FA4 C4 CF3 0.000000 69.0050 0 - 321 FA4 6 FA4 C1 CF2 0.000000 50.0070 0 - 322 FA4 6 FA4 C2 CF3 0.000000 69.0050 0 - 323 FA4 6 FA4 C3 CF2 0.000000 50.0070 0 - 324 FA4 6 FA4 C4 CF3 0.000000 69.0050 0 - 325 FA4 7 FA4 C1 CF2 0.000000 50.0070 0 - 326 FA4 7 FA4 C2 CF3 0.000000 69.0050 0 - 327 FA4 7 FA4 C3 CF2 0.000000 50.0070 0 - 328 FA4 7 FA4 C4 CF3 0.000000 69.0050 0 - 329 FA4 8 FA4 C1 CF2 0.000000 50.0070 0 - 330 FA4 8 FA4 C2 CF3 0.000000 69.0050 0 - 331 FA4 8 FA4 C3 CF2 0.000000 50.0070 0 - 332 FA4 8 FA4 C4 CF3 0.000000 69.0050 0 - 333 FA4 9 FA4 C1 CF2 0.000000 50.0070 0 - 334 FA4 9 FA4 C2 CF3 0.000000 69.0050 0 - 335 FA4 9 FA4 C3 CF2 0.000000 50.0070 0 - 336 FA4 9 FA4 C4 CF3 0.000000 69.0050 0 - 337 FA4 10 FA4 C1 CF2 0.000000 50.0070 0 - 338 FA4 10 FA4 C2 CF3 0.000000 69.0050 0 - 339 FA4 10 FA4 C3 CF2 0.000000 50.0070 0 - 340 FA4 10 FA4 C4 CF3 0.000000 69.0050 0 - 341 FA4 11 FA4 C1 CF2 0.000000 50.0070 0 - 342 FA4 11 FA4 C2 CF3 0.000000 69.0050 0 - 343 FA4 11 FA4 C3 CF2 0.000000 50.0070 0 - 344 FA4 11 FA4 C4 CF3 0.000000 69.0050 0 - 345 FA4 12 FA4 C1 CF2 0.000000 50.0070 0 - 346 FA4 12 FA4 C2 CF3 0.000000 69.0050 0 - 347 FA4 12 FA4 C3 CF2 0.000000 50.0070 0 - 348 FA4 12 FA4 C4 CF3 0.000000 69.0050 0 - 349 FA4 13 FA4 C1 CF2 0.000000 50.0070 0 - 350 FA4 13 FA4 C2 CF3 0.000000 69.0050 0 - 351 FA4 13 FA4 C3 CF2 0.000000 50.0070 0 - 352 FA4 13 FA4 C4 CF3 0.000000 69.0050 0 - 353 FA4 14 FA4 C1 CF2 0.000000 50.0070 0 - 354 FA4 14 FA4 C2 CF3 0.000000 69.0050 0 - 355 FA4 14 FA4 C3 CF2 0.000000 50.0070 0 - 356 FA4 14 FA4 C4 CF3 0.000000 69.0050 0 - 357 FA4 15 FA4 C1 CF2 0.000000 50.0070 0 - 358 FA4 15 FA4 C2 CF3 0.000000 69.0050 0 - 359 FA4 15 FA4 C3 CF2 0.000000 50.0070 0 - 360 FA4 15 FA4 C4 CF3 0.000000 69.0050 0 - 361 FA4 16 FA4 C1 CF2 0.000000 50.0070 0 - 362 FA4 16 FA4 C2 CF3 0.000000 69.0050 0 - 363 FA4 16 FA4 C3 CF2 0.000000 50.0070 0 - 364 FA4 16 FA4 C4 CF3 0.000000 69.0050 0 - 365 FA4 17 FA4 C1 CF2 0.000000 50.0070 0 - 366 FA4 17 FA4 C2 CF3 0.000000 69.0050 0 - 367 FA4 17 FA4 C3 CF2 0.000000 50.0070 0 - 368 FA4 17 FA4 C4 CF3 0.000000 69.0050 0 - 369 FA4 18 FA4 C1 CF2 0.000000 50.0070 0 - 370 FA4 18 FA4 C2 CF3 0.000000 69.0050 0 - 371 FA4 18 FA4 C3 CF2 0.000000 50.0070 0 - 372 FA4 18 FA4 C4 CF3 0.000000 69.0050 0 - 373 FA4 19 FA4 C1 CF2 0.000000 50.0070 0 - 374 FA4 19 FA4 C2 CF3 0.000000 69.0050 0 - 375 FA4 19 FA4 C3 CF2 0.000000 50.0070 0 - 376 FA4 19 FA4 C4 CF3 0.000000 69.0050 0 - 377 FA4 20 FA4 C1 CF2 0.000000 50.0070 0 - 378 FA4 20 FA4 C2 CF3 0.000000 69.0050 0 - 379 FA4 20 FA4 C3 CF2 0.000000 50.0070 0 - 380 FA4 20 FA4 C4 CF3 0.000000 69.0050 0 - 381 FA4 21 FA4 C1 CF2 0.000000 50.0070 0 - 382 FA4 21 FA4 C2 CF3 0.000000 69.0050 0 - 383 FA4 21 FA4 C3 CF2 0.000000 50.0070 0 - 384 FA4 21 FA4 C4 CF3 0.000000 69.0050 0 - 385 FA4 22 FA4 C1 CF2 0.000000 50.0070 0 - 386 FA4 22 FA4 C2 CF3 0.000000 69.0050 0 - 387 FA4 22 FA4 C3 CF2 0.000000 50.0070 0 - 388 FA4 22 FA4 C4 CF3 0.000000 69.0050 0 - 389 FA4 23 FA4 C1 CF2 0.000000 50.0070 0 - 390 FA4 23 FA4 C2 CF3 0.000000 69.0050 0 - 391 FA4 23 FA4 C3 CF2 0.000000 50.0070 0 - 392 FA4 23 FA4 C4 CF3 0.000000 69.0050 0 - 393 FA4 24 FA4 C1 CF2 0.000000 50.0070 0 - 394 FA4 24 FA4 C2 CF3 0.000000 69.0050 0 - 395 FA4 24 FA4 C3 CF2 0.000000 50.0070 0 - 396 FA4 24 FA4 C4 CF3 0.000000 69.0050 0 - 397 FA4 25 FA4 C1 CF2 0.000000 50.0070 0 - 398 FA4 25 FA4 C2 CF3 0.000000 69.0050 0 - 399 FA4 25 FA4 C3 CF2 0.000000 50.0070 0 - 400 FA4 25 FA4 C4 CF3 0.000000 69.0050 0 - 401 FA4 26 FA4 C1 CF2 0.000000 50.0070 0 - 402 FA4 26 FA4 C2 CF3 0.000000 69.0050 0 - 403 FA4 26 FA4 C3 CF2 0.000000 50.0070 0 - 404 FA4 26 FA4 C4 CF3 0.000000 69.0050 0 - 405 FA4 27 FA4 C1 CF2 0.000000 50.0070 0 - 406 FA4 27 FA4 C2 CF3 0.000000 69.0050 0 - 407 FA4 27 FA4 C3 CF2 0.000000 50.0070 0 - 408 FA4 27 FA4 C4 CF3 0.000000 69.0050 0 - 409 FA4 28 FA4 C1 CF2 0.000000 50.0070 0 - 410 FA4 28 FA4 C2 CF3 0.000000 69.0050 0 - 411 FA4 28 FA4 C3 CF2 0.000000 50.0070 0 - 412 FA4 28 FA4 C4 CF3 0.000000 69.0050 0 - 413 FA4 29 FA4 C1 CF2 0.000000 50.0070 0 - 414 FA4 29 FA4 C2 CF3 0.000000 69.0050 0 - 415 FA4 29 FA4 C3 CF2 0.000000 50.0070 0 - 416 FA4 29 FA4 C4 CF3 0.000000 69.0050 0 - 417 FA4 30 FA4 C1 CF2 0.000000 50.0070 0 - 418 FA4 30 FA4 C2 CF3 0.000000 69.0050 0 - 419 FA4 30 FA4 C3 CF2 0.000000 50.0070 0 - 420 FA4 30 FA4 C4 CF3 0.000000 69.0050 0 - 421 FA4 31 FA4 C1 CF2 0.000000 50.0070 0 - 422 FA4 31 FA4 C2 CF3 0.000000 69.0050 0 - 423 FA4 31 FA4 C3 CF2 0.000000 50.0070 0 - 424 FA4 31 FA4 C4 CF3 0.000000 69.0050 0 - 425 FA4 32 FA4 C1 CF2 0.000000 50.0070 0 - 426 FA4 32 FA4 C2 CF3 0.000000 69.0050 0 - 427 FA4 32 FA4 C3 CF2 0.000000 50.0070 0 - 428 FA4 32 FA4 C4 CF3 0.000000 69.0050 0 - 429 FA4 33 FA4 C1 CF2 0.000000 50.0070 0 - 430 FA4 33 FA4 C2 CF3 0.000000 69.0050 0 - 431 FA4 33 FA4 C3 CF2 0.000000 50.0070 0 - 432 FA4 33 FA4 C4 CF3 0.000000 69.0050 0 - 433 FA4 34 FA4 C1 CF2 0.000000 50.0070 0 - 434 FA4 34 FA4 C2 CF3 0.000000 69.0050 0 - 435 FA4 34 FA4 C3 CF2 0.000000 50.0070 0 - 436 FA4 34 FA4 C4 CF3 0.000000 69.0050 0 - 437 FA4 35 FA4 C1 CF2 0.000000 50.0070 0 - 438 FA4 35 FA4 C2 CF3 0.000000 69.0050 0 - 439 FA4 35 FA4 C3 CF2 0.000000 50.0070 0 - 440 FA4 35 FA4 C4 CF3 0.000000 69.0050 0 - 441 FA4 36 FA4 C1 CF2 0.000000 50.0070 0 - 442 FA4 36 FA4 C2 CF3 0.000000 69.0050 0 - 443 FA4 36 FA4 C3 CF2 0.000000 50.0070 0 - 444 FA4 36 FA4 C4 CF3 0.000000 69.0050 0 - 445 FA4 37 FA4 C1 CF2 0.000000 50.0070 0 - 446 FA4 37 FA4 C2 CF3 0.000000 69.0050 0 - 447 FA4 37 FA4 C3 CF2 0.000000 50.0070 0 - 448 FA4 37 FA4 C4 CF3 0.000000 69.0050 0 - 449 FA4 38 FA4 C1 CF2 0.000000 50.0070 0 - 450 FA4 38 FA4 C2 CF3 0.000000 69.0050 0 - 451 FA4 38 FA4 C3 CF2 0.000000 50.0070 0 - 452 FA4 38 FA4 C4 CF3 0.000000 69.0050 0 - 453 FA4 39 FA4 C1 CF2 0.000000 50.0070 0 - 454 FA4 39 FA4 C2 CF3 0.000000 69.0050 0 - 455 FA4 39 FA4 C3 CF2 0.000000 50.0070 0 - 456 FA4 39 FA4 C4 CF3 0.000000 69.0050 0 - 457 FA4 40 FA4 C1 CF2 0.000000 50.0070 0 - 458 FA4 40 FA4 C2 CF3 0.000000 69.0050 0 - 459 FA4 40 FA4 C3 CF2 0.000000 50.0070 0 - 460 FA4 40 FA4 C4 CF3 0.000000 69.0050 0 - 461 FA4 41 FA4 C1 CF2 0.000000 50.0070 0 - 462 FA4 41 FA4 C2 CF3 0.000000 69.0050 0 - 463 FA4 41 FA4 C3 CF2 0.000000 50.0070 0 - 464 FA4 41 FA4 C4 CF3 0.000000 69.0050 0 - 465 FA4 42 FA4 C1 CF2 0.000000 50.0070 0 - 466 FA4 42 FA4 C2 CF3 0.000000 69.0050 0 - 467 FA4 42 FA4 C3 CF2 0.000000 50.0070 0 - 468 FA4 42 FA4 C4 CF3 0.000000 69.0050 0 - 469 FA4 43 FA4 C1 CF2 0.000000 50.0070 0 - 470 FA4 43 FA4 C2 CF3 0.000000 69.0050 0 - 471 FA4 43 FA4 C3 CF2 0.000000 50.0070 0 - 472 FA4 43 FA4 C4 CF3 0.000000 69.0050 0 - 473 FA4 44 FA4 C1 CF2 0.000000 50.0070 0 - 474 FA4 44 FA4 C2 CF3 0.000000 69.0050 0 - 475 FA4 44 FA4 C3 CF2 0.000000 50.0070 0 - 476 FA4 44 FA4 C4 CF3 0.000000 69.0050 0 - 477 FA4 45 FA4 C1 CF2 0.000000 50.0070 0 - 478 FA4 45 FA4 C2 CF3 0.000000 69.0050 0 - 479 FA4 45 FA4 C3 CF2 0.000000 50.0070 0 - 480 FA4 45 FA4 C4 CF3 0.000000 69.0050 0 - 481 FA4 46 FA4 C1 CF2 0.000000 50.0070 0 - 482 FA4 46 FA4 C2 CF3 0.000000 69.0050 0 - 483 FA4 46 FA4 C3 CF2 0.000000 50.0070 0 - 484 FA4 46 FA4 C4 CF3 0.000000 69.0050 0 - 485 FA4 47 FA4 C1 CF2 0.000000 50.0070 0 - 486 FA4 47 FA4 C2 CF3 0.000000 69.0050 0 - 487 FA4 47 FA4 C3 CF2 0.000000 50.0070 0 - 488 FA4 47 FA4 C4 CF3 0.000000 69.0050 0 - 489 FA4 48 FA4 C1 CF2 0.000000 50.0070 0 - 490 FA4 48 FA4 C2 CF3 0.000000 69.0050 0 - 491 FA4 48 FA4 C3 CF2 0.000000 50.0070 0 - 492 FA4 48 FA4 C4 CF3 0.000000 69.0050 0 - 493 FA4 49 FA4 C1 CF2 0.000000 50.0070 0 - 494 FA4 49 FA4 C2 CF3 0.000000 69.0050 0 - 495 FA4 49 FA4 C3 CF2 0.000000 50.0070 0 - 496 FA4 49 FA4 C4 CF3 0.000000 69.0050 0 - 497 FA4 50 FA4 C1 CF2 0.000000 50.0070 0 - 498 FA4 50 FA4 C2 CF3 0.000000 69.0050 0 - 499 FA4 50 FA4 C3 CF2 0.000000 50.0070 0 - 500 FA4 50 FA4 C4 CF3 0.000000 69.0050 0 - 501 FA4 51 FA4 C1 CF2 0.000000 50.0070 0 - 502 FA4 51 FA4 C2 CF3 0.000000 69.0050 0 - 503 FA4 51 FA4 C3 CF2 0.000000 50.0070 0 - 504 FA4 51 FA4 C4 CF3 0.000000 69.0050 0 - 505 FA4 52 FA4 C1 CF2 0.000000 50.0070 0 - 506 FA4 52 FA4 C2 CF3 0.000000 69.0050 0 - 507 FA4 52 FA4 C3 CF2 0.000000 50.0070 0 - 508 FA4 52 FA4 C4 CF3 0.000000 69.0050 0 - 509 FA4 53 FA4 C1 CF2 0.000000 50.0070 0 - 510 FA4 53 FA4 C2 CF3 0.000000 69.0050 0 - 511 FA4 53 FA4 C3 CF2 0.000000 50.0070 0 - 512 FA4 53 FA4 C4 CF3 0.000000 69.0050 0 - 513 FA4 54 FA4 C1 CF2 0.000000 50.0070 0 - 514 FA4 54 FA4 C2 CF3 0.000000 69.0050 0 - 515 FA4 54 FA4 C3 CF2 0.000000 50.0070 0 - 516 FA4 54 FA4 C4 CF3 0.000000 69.0050 0 - 517 FA4 55 FA4 C1 CF2 0.000000 50.0070 0 - 518 FA4 55 FA4 C2 CF3 0.000000 69.0050 0 - 519 FA4 55 FA4 C3 CF2 0.000000 50.0070 0 - 520 FA4 55 FA4 C4 CF3 0.000000 69.0050 0 - 521 FA4 56 FA4 C1 CF2 0.000000 50.0070 0 - 522 FA4 56 FA4 C2 CF3 0.000000 69.0050 0 - 523 FA4 56 FA4 C3 CF2 0.000000 50.0070 0 - 524 FA4 56 FA4 C4 CF3 0.000000 69.0050 0 - 525 FA4 57 FA4 C1 CF2 0.000000 50.0070 0 - 526 FA4 57 FA4 C2 CF3 0.000000 69.0050 0 - 527 FA4 57 FA4 C3 CF2 0.000000 50.0070 0 - 528 FA4 57 FA4 C4 CF3 0.000000 69.0050 0 - 529 FA4 58 FA4 C1 CF2 0.000000 50.0070 0 - 530 FA4 58 FA4 C2 CF3 0.000000 69.0050 0 - 531 FA4 58 FA4 C3 CF2 0.000000 50.0070 0 - 532 FA4 58 FA4 C4 CF3 0.000000 69.0050 0 - 533 FA4 59 FA4 C1 CF2 0.000000 50.0070 0 - 534 FA4 59 FA4 C2 CF3 0.000000 69.0050 0 - 535 FA4 59 FA4 C3 CF2 0.000000 50.0070 0 - 536 FA4 59 FA4 C4 CF3 0.000000 69.0050 0 - 537 FA4 60 FA4 C1 CF2 0.000000 50.0070 0 - 538 FA4 60 FA4 C2 CF3 0.000000 69.0050 0 - 539 FA4 60 FA4 C3 CF2 0.000000 50.0070 0 - 540 FA4 60 FA4 C4 CF3 0.000000 69.0050 0 - 541 FA4 61 FA4 C1 CF2 0.000000 50.0070 0 - 542 FA4 61 FA4 C2 CF3 0.000000 69.0050 0 - 543 FA4 61 FA4 C3 CF2 0.000000 50.0070 0 - 544 FA4 61 FA4 C4 CF3 0.000000 69.0050 0 - 545 FA4 62 FA4 C1 CF2 0.000000 50.0070 0 - 546 FA4 62 FA4 C2 CF3 0.000000 69.0050 0 - 547 FA4 62 FA4 C3 CF2 0.000000 50.0070 0 - 548 FA4 62 FA4 C4 CF3 0.000000 69.0050 0 - 549 FA4 63 FA4 C1 CF2 0.000000 50.0070 0 - 550 FA4 63 FA4 C2 CF3 0.000000 69.0050 0 - 551 FA4 63 FA4 C3 CF2 0.000000 50.0070 0 - 552 FA4 63 FA4 C4 CF3 0.000000 69.0050 0 - 553 FA4 64 FA4 C1 CF2 0.000000 50.0070 0 - 554 FA4 64 FA4 C2 CF3 0.000000 69.0050 0 - 555 FA4 64 FA4 C3 CF2 0.000000 50.0070 0 - 556 FA4 64 FA4 C4 CF3 0.000000 69.0050 0 - 557 FA4 65 FA4 C1 CF2 0.000000 50.0070 0 - 558 FA4 65 FA4 C2 CF3 0.000000 69.0050 0 - 559 FA4 65 FA4 C3 CF2 0.000000 50.0070 0 - 560 FA4 65 FA4 C4 CF3 0.000000 69.0050 0 - 561 FA4 66 FA4 C1 CF2 0.000000 50.0070 0 - 562 FA4 66 FA4 C2 CF3 0.000000 69.0050 0 - 563 FA4 66 FA4 C3 CF2 0.000000 50.0070 0 - 564 FA4 66 FA4 C4 CF3 0.000000 69.0050 0 - 565 FA4 67 FA4 C1 CF2 0.000000 50.0070 0 - 566 FA4 67 FA4 C2 CF3 0.000000 69.0050 0 - 567 FA4 67 FA4 C3 CF2 0.000000 50.0070 0 - 568 FA4 67 FA4 C4 CF3 0.000000 69.0050 0 - 569 FA4 68 FA4 C1 CF2 0.000000 50.0070 0 - 570 FA4 68 FA4 C2 CF3 0.000000 69.0050 0 - 571 FA4 68 FA4 C3 CF2 0.000000 50.0070 0 - 572 FA4 68 FA4 C4 CF3 0.000000 69.0050 0 - 573 FA4 69 FA4 C1 CF2 0.000000 50.0070 0 - 574 FA4 69 FA4 C2 CF3 0.000000 69.0050 0 - 575 FA4 69 FA4 C3 CF2 0.000000 50.0070 0 - 576 FA4 69 FA4 C4 CF3 0.000000 69.0050 0 - 577 FA4 70 FA4 C1 CF2 0.000000 50.0070 0 - 578 FA4 70 FA4 C2 CF3 0.000000 69.0050 0 - 579 FA4 70 FA4 C3 CF2 0.000000 50.0070 0 - 580 FA4 70 FA4 C4 CF3 0.000000 69.0050 0 - 581 FA4 71 FA4 C1 CF2 0.000000 50.0070 0 - 582 FA4 71 FA4 C2 CF3 0.000000 69.0050 0 - 583 FA4 71 FA4 C3 CF2 0.000000 50.0070 0 - 584 FA4 71 FA4 C4 CF3 0.000000 69.0050 0 - 585 FA4 72 FA4 C1 CF2 0.000000 50.0070 0 - 586 FA4 72 FA4 C2 CF3 0.000000 69.0050 0 - 587 FA4 72 FA4 C3 CF2 0.000000 50.0070 0 - 588 FA4 72 FA4 C4 CF3 0.000000 69.0050 0 - 589 FA4 73 FA4 C1 CF2 0.000000 50.0070 0 - 590 FA4 73 FA4 C2 CF3 0.000000 69.0050 0 - 591 FA4 73 FA4 C3 CF2 0.000000 50.0070 0 - 592 FA4 73 FA4 C4 CF3 0.000000 69.0050 0 - 593 FA4 74 FA4 C1 CF2 0.000000 50.0070 0 - 594 FA4 74 FA4 C2 CF3 0.000000 69.0050 0 - 595 FA4 74 FA4 C3 CF2 0.000000 50.0070 0 - 596 FA4 74 FA4 C4 CF3 0.000000 69.0050 0 - 597 FA4 75 FA4 C1 CF2 0.000000 50.0070 0 - 598 FA4 75 FA4 C2 CF3 0.000000 69.0050 0 - 599 FA4 75 FA4 C3 CF2 0.000000 50.0070 0 - 600 FA4 75 FA4 C4 CF3 0.000000 69.0050 0 - - 450 !NBOND: bonds - 1 3 2 1 3 4 5 7 - 6 5 7 8 9 11 10 9 - 11 12 13 15 14 13 15 16 - 17 19 18 17 19 20 21 23 - 22 21 23 24 25 27 26 25 - 27 28 29 31 30 29 31 32 - 33 35 34 33 35 36 37 39 - 38 37 39 40 41 43 42 41 - 43 44 45 47 46 45 47 48 - 49 51 50 49 51 52 53 55 - 54 53 55 56 57 59 58 57 - 59 60 61 63 62 61 63 64 - 65 67 66 65 67 68 69 71 - 70 69 71 72 73 75 74 73 - 75 76 77 79 78 77 79 80 - 81 83 82 81 83 84 85 87 - 86 85 87 88 89 91 90 89 - 91 92 93 95 94 93 95 96 - 97 99 98 97 99 100 101 103 - 102 101 103 104 105 107 106 105 - 107 108 109 111 110 109 111 112 - 113 115 114 113 115 116 117 119 - 118 117 119 120 121 123 122 121 - 123 124 125 127 126 125 127 128 - 129 131 130 129 131 132 133 135 - 134 133 135 136 137 139 138 137 - 139 140 141 143 142 141 143 144 - 145 147 146 145 147 148 149 151 - 150 149 151 152 153 155 154 153 - 155 156 157 159 158 157 159 160 - 161 163 162 161 163 164 165 167 - 166 165 167 168 169 171 170 169 - 171 172 173 175 174 173 175 176 - 177 179 178 177 179 180 181 183 - 182 181 183 184 185 187 186 185 - 187 188 189 191 190 189 191 192 - 193 195 194 193 195 196 197 199 - 198 197 199 200 201 203 202 201 - 203 204 205 207 206 205 207 208 - 209 211 210 209 211 212 213 215 - 214 213 215 216 217 219 218 217 - 219 220 221 223 222 221 223 224 - 225 227 226 225 227 228 229 231 - 230 229 231 232 233 235 234 233 - 235 236 237 239 238 237 239 240 - 241 243 242 241 243 244 245 247 - 246 245 247 248 249 251 250 249 - 251 252 253 255 254 253 255 256 - 257 259 258 257 259 260 261 263 - 262 261 263 264 265 267 266 265 - 267 268 269 271 270 269 271 272 - 273 275 274 273 275 276 277 279 - 278 277 279 280 281 283 282 281 - 283 284 285 287 286 285 287 288 - 289 291 290 289 291 292 293 295 - 294 293 295 296 297 299 298 297 - 299 300 301 303 302 301 303 304 - 305 307 306 305 307 308 309 311 - 310 309 311 312 313 315 314 313 - 315 316 317 319 318 317 319 320 - 321 323 322 321 323 324 325 327 - 326 325 327 328 329 331 330 329 - 331 332 333 335 334 333 335 336 - 337 339 338 337 339 340 341 343 - 342 341 343 344 345 347 346 345 - 347 348 349 351 350 349 351 352 - 353 355 354 353 355 356 357 359 - 358 357 359 360 361 363 362 361 - 363 364 365 367 366 365 367 368 - 369 371 370 369 371 372 373 375 - 374 373 375 376 377 379 378 377 - 379 380 381 383 382 381 383 384 - 385 387 386 385 387 388 389 391 - 390 389 391 392 393 395 394 393 - 395 396 397 399 398 397 399 400 - 401 403 402 401 403 404 405 407 - 406 405 407 408 409 411 410 409 - 411 412 413 415 414 413 415 416 - 417 419 418 417 419 420 421 423 - 422 421 423 424 425 427 426 425 - 427 428 429 431 430 429 431 432 - 433 435 434 433 435 436 437 439 - 438 437 439 440 441 443 442 441 - 443 444 445 447 446 445 447 448 - 449 451 450 449 451 452 453 455 - 454 453 455 456 457 459 458 457 - 459 460 461 463 462 461 463 464 - 465 467 466 465 467 468 469 471 - 470 469 471 472 473 475 474 473 - 475 476 477 479 478 477 479 480 - 481 483 482 481 483 484 485 487 - 486 485 487 488 489 491 490 489 - 491 492 493 495 494 493 495 496 - 497 499 498 497 499 500 501 503 - 502 501 503 504 505 507 506 505 - 507 508 509 511 510 509 511 512 - 513 515 514 513 515 516 517 519 - 518 517 519 520 521 523 522 521 - 523 524 525 527 526 525 527 528 - 529 531 530 529 531 532 533 535 - 534 533 535 536 537 539 538 537 - 539 540 541 543 542 541 543 544 - 545 547 546 545 547 548 549 551 - 550 549 551 552 553 555 554 553 - 555 556 557 559 558 557 559 560 - 561 563 562 561 563 564 565 567 - 566 565 567 568 569 571 570 569 - 571 572 573 575 574 573 575 576 - 577 579 578 577 579 580 581 583 - 582 581 583 584 585 587 586 585 - 587 588 589 591 590 589 591 592 - 593 595 594 593 595 596 597 599 - 598 597 599 600 - - 300 !NTHETA: angles - 1 3 4 2 1 3 5 7 8 - 6 5 7 9 11 12 10 9 11 - 13 15 16 14 13 15 17 19 20 - 18 17 19 21 23 24 22 21 23 - 25 27 28 26 25 27 29 31 32 - 30 29 31 33 35 36 34 33 35 - 37 39 40 38 37 39 41 43 44 - 42 41 43 45 47 48 46 45 47 - 49 51 52 50 49 51 53 55 56 - 54 53 55 57 59 60 58 57 59 - 61 63 64 62 61 63 65 67 68 - 66 65 67 69 71 72 70 69 71 - 73 75 76 74 73 75 77 79 80 - 78 77 79 81 83 84 82 81 83 - 85 87 88 86 85 87 89 91 92 - 90 89 91 93 95 96 94 93 95 - 97 99 100 98 97 99 101 103 104 - 102 101 103 105 107 108 106 105 107 - 109 111 112 110 109 111 113 115 116 - 114 113 115 117 119 120 118 117 119 - 121 123 124 122 121 123 125 127 128 - 126 125 127 129 131 132 130 129 131 - 133 135 136 134 133 135 137 139 140 - 138 137 139 141 143 144 142 141 143 - 145 147 148 146 145 147 149 151 152 - 150 149 151 153 155 156 154 153 155 - 157 159 160 158 157 159 161 163 164 - 162 161 163 165 167 168 166 165 167 - 169 171 172 170 169 171 173 175 176 - 174 173 175 177 179 180 178 177 179 - 181 183 184 182 181 183 185 187 188 - 186 185 187 189 191 192 190 189 191 - 193 195 196 194 193 195 197 199 200 - 198 197 199 201 203 204 202 201 203 - 205 207 208 206 205 207 209 211 212 - 210 209 211 213 215 216 214 213 215 - 217 219 220 218 217 219 221 223 224 - 222 221 223 225 227 228 226 225 227 - 229 231 232 230 229 231 233 235 236 - 234 233 235 237 239 240 238 237 239 - 241 243 244 242 241 243 245 247 248 - 246 245 247 249 251 252 250 249 251 - 253 255 256 254 253 255 257 259 260 - 258 257 259 261 263 264 262 261 263 - 265 267 268 266 265 267 269 271 272 - 270 269 271 273 275 276 274 273 275 - 277 279 280 278 277 279 281 283 284 - 282 281 283 285 287 288 286 285 287 - 289 291 292 290 289 291 293 295 296 - 294 293 295 297 299 300 298 297 299 - 301 303 304 302 301 303 305 307 308 - 306 305 307 309 311 312 310 309 311 - 313 315 316 314 313 315 317 319 320 - 318 317 319 321 323 324 322 321 323 - 325 327 328 326 325 327 329 331 332 - 330 329 331 333 335 336 334 333 335 - 337 339 340 338 337 339 341 343 344 - 342 341 343 345 347 348 346 345 347 - 349 351 352 350 349 351 353 355 356 - 354 353 355 357 359 360 358 357 359 - 361 363 364 362 361 363 365 367 368 - 366 365 367 369 371 372 370 369 371 - 373 375 376 374 373 375 377 379 380 - 378 377 379 381 383 384 382 381 383 - 385 387 388 386 385 387 389 391 392 - 390 389 391 393 395 396 394 393 395 - 397 399 400 398 397 399 401 403 404 - 402 401 403 405 407 408 406 405 407 - 409 411 412 410 409 411 413 415 416 - 414 413 415 417 419 420 418 417 419 - 421 423 424 422 421 423 425 427 428 - 426 425 427 429 431 432 430 429 431 - 433 435 436 434 433 435 437 439 440 - 438 437 439 441 443 444 442 441 443 - 445 447 448 446 445 447 449 451 452 - 450 449 451 453 455 456 454 453 455 - 457 459 460 458 457 459 461 463 464 - 462 461 463 465 467 468 466 465 467 - 469 471 472 470 469 471 473 475 476 - 474 473 475 477 479 480 478 477 479 - 481 483 484 482 481 483 485 487 488 - 486 485 487 489 491 492 490 489 491 - 493 495 496 494 493 495 497 499 500 - 498 497 499 501 503 504 502 501 503 - 505 507 508 506 505 507 509 511 512 - 510 509 511 513 515 516 514 513 515 - 517 519 520 518 517 519 521 523 524 - 522 521 523 525 527 528 526 525 527 - 529 531 532 530 529 531 533 535 536 - 534 533 535 537 539 540 538 537 539 - 541 543 544 542 541 543 545 547 548 - 546 545 547 549 551 552 550 549 551 - 553 555 556 554 553 555 557 559 560 - 558 557 559 561 563 564 562 561 563 - 565 567 568 566 565 567 569 571 572 - 570 569 571 573 575 576 574 573 575 - 577 579 580 578 577 579 581 583 584 - 582 581 583 585 587 588 586 585 587 - 589 591 592 590 589 591 593 595 596 - 594 593 595 597 599 600 598 597 599 - - 150 !NPHI: dihedrals - 2 1 3 4 6 5 7 8 - 10 9 11 12 14 13 15 16 - 18 17 19 20 22 21 23 24 - 26 25 27 28 30 29 31 32 - 34 33 35 36 38 37 39 40 - 42 41 43 44 46 45 47 48 - 50 49 51 52 54 53 55 56 - 58 57 59 60 62 61 63 64 - 66 65 67 68 70 69 71 72 - 74 73 75 76 78 77 79 80 - 82 81 83 84 86 85 87 88 - 90 89 91 92 94 93 95 96 - 98 97 99 100 102 101 103 104 - 106 105 107 108 110 109 111 112 - 114 113 115 116 118 117 119 120 - 122 121 123 124 126 125 127 128 - 130 129 131 132 134 133 135 136 - 138 137 139 140 142 141 143 144 - 146 145 147 148 150 149 151 152 - 154 153 155 156 158 157 159 160 - 162 161 163 164 166 165 167 168 - 170 169 171 172 174 173 175 176 - 178 177 179 180 182 181 183 184 - 186 185 187 188 190 189 191 192 - 194 193 195 196 198 197 199 200 - 202 201 203 204 206 205 207 208 - 210 209 211 212 214 213 215 216 - 218 217 219 220 222 221 223 224 - 226 225 227 228 230 229 231 232 - 234 233 235 236 238 237 239 240 - 242 241 243 244 246 245 247 248 - 250 249 251 252 254 253 255 256 - 258 257 259 260 262 261 263 264 - 266 265 267 268 270 269 271 272 - 274 273 275 276 278 277 279 280 - 282 281 283 284 286 285 287 288 - 290 289 291 292 294 293 295 296 - 298 297 299 300 302 301 303 304 - 306 305 307 308 310 309 311 312 - 314 313 315 316 318 317 319 320 - 322 321 323 324 326 325 327 328 - 330 329 331 332 334 333 335 336 - 338 337 339 340 342 341 343 344 - 346 345 347 348 350 349 351 352 - 354 353 355 356 358 357 359 360 - 362 361 363 364 366 365 367 368 - 370 369 371 372 374 373 375 376 - 378 377 379 380 382 381 383 384 - 386 385 387 388 390 389 391 392 - 394 393 395 396 398 397 399 400 - 402 401 403 404 406 405 407 408 - 410 409 411 412 414 413 415 416 - 418 417 419 420 422 421 423 424 - 426 425 427 428 430 429 431 432 - 434 433 435 436 438 437 439 440 - 442 441 443 444 446 445 447 448 - 450 449 451 452 454 453 455 456 - 458 457 459 460 462 461 463 464 - 466 465 467 468 470 469 471 472 - 474 473 475 476 478 477 479 480 - 482 481 483 484 486 485 487 488 - 490 489 491 492 494 493 495 496 - 498 497 499 500 502 501 503 504 - 506 505 507 508 510 509 511 512 - 514 513 515 516 518 517 519 520 - 522 521 523 524 526 525 527 528 - 530 529 531 532 534 533 535 536 - 538 537 539 540 542 541 543 544 - 546 545 547 548 550 549 551 552 - 554 553 555 556 558 557 559 560 - 562 561 563 564 566 565 567 568 - 570 569 571 572 574 573 575 576 - 578 577 579 580 582 581 583 584 - 586 585 587 588 590 589 591 592 - 594 593 595 596 598 597 599 600 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - - 1 0 !NGRP - 0 0 0 - diff --git a/example_file/perfluorobutane_butane/setup_box_1.pdb b/example_file/perfluorobutane_butane/setup_box_1.pdb deleted file mode 100644 index be1cd0fd6..000000000 --- a/example_file/perfluorobutane_butane/setup_box_1.pdb +++ /dev/null @@ -1,1650 +0,0 @@ -REMARK original generated coordinate pdb file -ATOM 1 C1 FA4 A 1 31.046 24.684 9.327 1.00 0.00 FA4 C -ATOM 2 C2 FA4 A 1 29.935 25.508 8.648 1.00 0.00 FA4 C -ATOM 3 C3 FA4 A 1 30.706 24.397 10.801 1.00 0.00 FA4 C -ATOM 4 C4 FA4 A 1 31.479 23.219 11.422 1.00 0.00 FA4 C -ATOM 5 C1 FA4 A 2 30.928 29.195 33.503 1.00 0.00 FA4 C -ATOM 6 C2 FA4 A 2 29.465 28.874 33.148 1.00 0.00 FA4 C -ATOM 7 C3 FA4 A 2 31.571 28.775 34.838 1.00 0.00 FA4 C -ATOM 8 C4 FA4 A 2 32.843 29.613 35.064 1.00 0.00 FA4 C -ATOM 9 C1 FA4 A 3 18.696 30.950 4.530 1.00 0.00 FA4 C -ATOM 10 C2 FA4 A 3 17.666 31.491 5.540 1.00 0.00 FA4 C -ATOM 11 C3 FA4 A 3 19.241 29.527 4.748 1.00 0.00 FA4 C -ATOM 12 C4 FA4 A 3 19.654 28.836 3.435 1.00 0.00 FA4 C -ATOM 13 C1 FA4 A 4 17.594 19.150 23.219 1.00 0.00 FA4 C -ATOM 14 C2 FA4 A 4 17.684 20.485 23.981 1.00 0.00 FA4 C -ATOM 15 C3 FA4 A 4 17.113 17.959 24.068 1.00 0.00 FA4 C -ATOM 16 C4 FA4 A 4 18.070 17.431 25.153 1.00 0.00 FA4 C -ATOM 17 C1 FA4 A 5 19.451 12.176 12.954 1.00 0.00 FA4 C -ATOM 18 C2 FA4 A 5 19.737 12.675 14.382 1.00 0.00 FA4 C -ATOM 19 C3 FA4 A 5 20.412 12.717 11.879 1.00 0.00 FA4 C -ATOM 20 C4 FA4 A 5 20.364 12.138 10.452 1.00 0.00 FA4 C -ATOM 21 C1 FA4 A 6 25.625 23.589 11.516 1.00 0.00 FA4 C -ATOM 22 C2 FA4 A 6 24.803 24.891 11.487 1.00 0.00 FA4 C -ATOM 23 C3 FA4 A 6 26.332 23.094 10.240 1.00 0.00 FA4 C -ATOM 24 C4 FA4 A 6 26.831 21.654 10.465 1.00 0.00 FA4 C -ATOM 25 C1 FA4 A 7 12.430 28.019 30.336 1.00 0.00 FA4 C -ATOM 26 C2 FA4 A 7 11.113 27.664 31.051 1.00 0.00 FA4 C -ATOM 27 C3 FA4 A 7 13.579 27.007 30.505 1.00 0.00 FA4 C -ATOM 28 C4 FA4 A 7 13.804 26.861 32.022 1.00 0.00 FA4 C -ATOM 29 C1 FA4 A 8 28.871 4.974 10.041 1.00 0.00 FA4 C -ATOM 30 C2 FA4 A 8 28.366 3.821 10.928 1.00 0.00 FA4 C -ATOM 31 C3 FA4 A 8 30.400 4.893 10.207 1.00 0.00 FA4 C -ATOM 32 C4 FA4 A 8 31.060 6.262 9.958 1.00 0.00 FA4 C -ATOM 33 C1 FA4 A 9 8.480 28.272 16.361 1.00 0.00 FA4 C -ATOM 34 C2 FA4 A 9 10.004 28.394 16.552 1.00 0.00 FA4 C -ATOM 35 C3 FA4 A 9 8.032 28.361 14.891 1.00 0.00 FA4 C -ATOM 36 C4 FA4 A 9 6.597 27.855 14.655 1.00 0.00 FA4 C -ATOM 37 C1 FA4 A 10 1.342 25.499 4.619 1.00 0.00 FA4 C -ATOM 38 C2 FA4 A 10 1.389 26.419 3.384 1.00 0.00 FA4 C -ATOM 39 C3 FA4 A 10 0.217 25.682 5.654 1.00 0.00 FA4 C -ATOM 40 C4 FA4 A 10 0.275 24.561 6.708 1.00 0.00 FA4 C -ATOM 41 C1 FA4 A 11 27.489 5.624 4.782 1.00 0.00 FA4 C -ATOM 42 C2 FA4 A 11 26.206 6.115 5.478 1.00 0.00 FA4 C -ATOM 43 C3 FA4 A 11 28.674 5.245 5.690 1.00 0.00 FA4 C -ATOM 44 C4 FA4 A 11 29.958 4.903 4.911 1.00 0.00 FA4 C -ATOM 45 C1 FA4 A 12 14.285 7.311 27.774 1.00 0.00 FA4 C -ATOM 46 C2 FA4 A 12 13.474 8.301 28.631 1.00 0.00 FA4 C -ATOM 47 C3 FA4 A 12 13.659 7.511 26.382 1.00 0.00 FA4 C -ATOM 48 C4 FA4 A 12 12.120 7.472 26.430 1.00 0.00 FA4 C -ATOM 49 C1 FA4 A 13 17.781 10.984 5.812 1.00 0.00 FA4 C -ATOM 50 C2 FA4 A 13 17.414 10.535 7.239 1.00 0.00 FA4 C -ATOM 51 C3 FA4 A 13 18.095 9.826 4.847 1.00 0.00 FA4 C -ATOM 52 C4 FA4 A 13 17.042 8.704 4.906 1.00 0.00 FA4 C -ATOM 53 C1 FA4 A 14 30.666 10.026 30.123 1.00 0.00 FA4 C -ATOM 54 C2 FA4 A 14 29.980 9.022 29.178 1.00 0.00 FA4 C -ATOM 55 C3 FA4 A 14 31.872 10.684 29.426 1.00 0.00 FA4 C -ATOM 56 C4 FA4 A 14 32.353 11.908 30.226 1.00 0.00 FA4 C -ATOM 57 C1 FA4 A 15 18.634 28.362 30.537 1.00 0.00 FA4 C -ATOM 58 C2 FA4 A 15 18.995 28.210 29.048 1.00 0.00 FA4 C -ATOM 59 C3 FA4 A 15 17.492 29.358 30.815 1.00 0.00 FA4 C -ATOM 60 C4 FA4 A 15 16.103 29.124 30.192 1.00 0.00 FA4 C -ATOM 61 C1 FA4 A 16 17.616 23.168 5.719 1.00 0.00 FA4 C -ATOM 62 C2 FA4 A 16 18.374 23.147 7.059 1.00 0.00 FA4 C -ATOM 63 C3 FA4 A 16 17.656 24.592 5.133 1.00 0.00 FA4 C -ATOM 64 C4 FA4 A 16 17.080 24.902 3.740 1.00 0.00 FA4 C -ATOM 65 C1 FA4 A 17 25.431 5.444 15.060 1.00 0.00 FA4 C -ATOM 66 C2 FA4 A 17 26.629 6.256 15.588 1.00 0.00 FA4 C -ATOM 67 C3 FA4 A 17 24.094 5.829 15.721 1.00 0.00 FA4 C -ATOM 68 C4 FA4 A 17 22.841 5.201 15.084 1.00 0.00 FA4 C -ATOM 69 C1 FA4 A 18 25.320 29.538 32.138 1.00 0.00 FA4 C -ATOM 70 C2 FA4 A 18 24.670 29.896 33.488 1.00 0.00 FA4 C -ATOM 71 C3 FA4 A 18 24.245 28.752 31.365 1.00 0.00 FA4 C -ATOM 72 C4 FA4 A 18 23.998 27.361 31.978 1.00 0.00 FA4 C -ATOM 73 C1 FA4 A 19 26.480 18.113 5.969 1.00 0.00 FA4 C -ATOM 74 C2 FA4 A 19 27.734 17.221 6.025 1.00 0.00 FA4 C -ATOM 75 C3 FA4 A 19 26.671 19.543 6.507 1.00 0.00 FA4 C -ATOM 76 C4 FA4 A 19 27.694 20.421 5.762 1.00 0.00 FA4 C -ATOM 77 C1 FA4 A 20 9.355 2.868 27.055 1.00 0.00 FA4 C -ATOM 78 C2 FA4 A 20 7.873 2.697 27.437 1.00 0.00 FA4 C -ATOM 79 C3 FA4 A 20 10.078 4.147 27.517 1.00 0.00 FA4 C -ATOM 80 C4 FA4 A 20 9.664 5.554 27.048 1.00 0.00 FA4 C -ATOM 81 C1 FA4 A 21 33.108 2.335 30.036 1.00 0.00 FA4 C -ATOM 82 C2 FA4 A 21 33.533 1.736 31.389 1.00 0.00 FA4 C -ATOM 83 C3 FA4 A 21 34.084 2.759 28.922 1.00 0.00 FA4 C -ATOM 84 C4 FA4 A 21 33.457 2.699 27.516 1.00 0.00 FA4 C -ATOM 85 C1 FA4 A 22 32.170 9.173 16.444 1.00 0.00 FA4 C -ATOM 86 C2 FA4 A 22 31.314 10.416 16.138 1.00 0.00 FA4 C -ATOM 87 C3 FA4 A 22 31.738 8.299 17.636 1.00 0.00 FA4 C -ATOM 88 C4 FA4 A 22 30.215 8.074 17.639 1.00 0.00 FA4 C -ATOM 89 C1 FA4 A 23 19.403 28.037 5.484 1.00 0.00 FA4 C -ATOM 90 C2 FA4 A 23 19.476 26.914 6.535 1.00 0.00 FA4 C -ATOM 91 C3 FA4 A 23 18.459 29.218 5.775 1.00 0.00 FA4 C -ATOM 92 C4 FA4 A 23 18.611 30.250 4.642 1.00 0.00 FA4 C -ATOM 93 C1 FA4 A 24 33.505 17.079 3.773 1.00 0.00 FA4 C -ATOM 94 C2 FA4 A 24 32.111 16.464 3.996 1.00 0.00 FA4 C -ATOM 95 C3 FA4 A 24 33.803 17.706 2.399 1.00 0.00 FA4 C -ATOM 96 C4 FA4 A 24 33.481 16.937 1.104 1.00 0.00 FA4 C -ATOM 97 C1 FA4 A 25 22.445 30.748 15.184 1.00 0.00 FA4 C -ATOM 98 C2 FA4 A 25 21.074 30.416 15.801 1.00 0.00 FA4 C -ATOM 99 C3 FA4 A 25 22.927 32.175 15.504 1.00 0.00 FA4 C -ATOM 100 C4 FA4 A 25 24.269 32.515 14.830 1.00 0.00 FA4 C -ATOM 101 C1 FA4 A 26 6.310 17.082 35.027 1.00 0.00 FA4 C -ATOM 102 C2 FA4 A 26 4.873 17.633 34.975 1.00 0.00 FA4 C -ATOM 103 C3 FA4 A 26 6.764 16.438 33.703 1.00 0.00 FA4 C -ATOM 104 C4 FA4 A 26 8.131 15.811 34.033 1.00 0.00 FA4 C -ATOM 105 C1 FA4 A 27 11.813 5.541 33.341 1.00 0.00 FA4 C -ATOM 106 C2 FA4 A 27 10.975 4.516 32.555 1.00 0.00 FA4 C -ATOM 107 C3 FA4 A 27 13.307 5.269 33.598 1.00 0.00 FA4 C -ATOM 108 C4 FA4 A 27 14.090 6.464 34.174 1.00 0.00 FA4 C -ATOM 109 C1 FA4 A 28 35.423 8.720 6.325 1.00 0.00 FA4 C -ATOM 110 C2 FA4 A 28 35.602 8.647 7.852 1.00 0.00 FA4 C -ATOM 111 C3 FA4 A 28 33.966 8.958 5.888 1.00 0.00 FA4 C -ATOM 112 C4 FA4 A 28 33.646 8.164 4.608 1.00 0.00 FA4 C -ATOM 113 C1 FA4 A 29 10.123 11.216 5.617 1.00 0.00 FA4 C -ATOM 114 C2 FA4 A 29 10.827 11.998 4.493 1.00 0.00 FA4 C -ATOM 115 C3 FA4 A 29 11.023 10.506 6.645 1.00 0.00 FA4 C -ATOM 116 C4 FA4 A 29 11.025 8.966 6.624 1.00 0.00 FA4 C -ATOM 117 C1 FA4 A 30 6.260 33.232 32.094 1.00 0.00 FA4 C -ATOM 118 C2 FA4 A 30 5.631 34.516 32.667 1.00 0.00 FA4 C -ATOM 119 C3 FA4 A 30 5.488 32.119 31.362 1.00 0.00 FA4 C -ATOM 120 C4 FA4 A 30 6.020 30.705 31.661 1.00 0.00 FA4 C -ATOM 121 C1 FA4 A 31 24.091 33.614 12.700 1.00 0.00 FA4 C -ATOM 122 C2 FA4 A 31 25.459 32.964 12.977 1.00 0.00 FA4 C -ATOM 123 C3 FA4 A 31 23.253 32.889 11.631 1.00 0.00 FA4 C -ATOM 124 C4 FA4 A 31 21.739 33.149 11.731 1.00 0.00 FA4 C -ATOM 125 C1 FA4 A 32 19.060 27.171 33.110 1.00 0.00 FA4 C -ATOM 126 C2 FA4 A 32 19.603 28.307 32.223 1.00 0.00 FA4 C -ATOM 127 C3 FA4 A 32 19.051 25.689 32.689 1.00 0.00 FA4 C -ATOM 128 C4 FA4 A 32 18.123 24.686 33.399 1.00 0.00 FA4 C -ATOM 129 C1 FA4 A 33 5.841 29.998 2.082 1.00 0.00 FA4 C -ATOM 130 C2 FA4 A 33 6.650 31.173 1.503 1.00 0.00 FA4 C -ATOM 131 C3 FA4 A 33 4.331 30.172 1.832 1.00 0.00 FA4 C -ATOM 132 C4 FA4 A 33 3.317 29.445 2.735 1.00 0.00 FA4 C -ATOM 133 C1 FA4 A 34 35.284 13.553 34.620 1.00 0.00 FA4 C -ATOM 134 C2 FA4 A 34 36.437 14.384 35.213 1.00 0.00 FA4 C -ATOM 135 C3 FA4 A 34 34.272 14.405 33.831 1.00 0.00 FA4 C -ATOM 136 C4 FA4 A 34 33.428 15.500 34.509 1.00 0.00 FA4 C -ATOM 137 C1 FA4 A 35 3.687 13.091 18.311 1.00 0.00 FA4 C -ATOM 138 C2 FA4 A 35 2.739 14.300 18.203 1.00 0.00 FA4 C -ATOM 139 C3 FA4 A 35 3.334 12.011 17.271 1.00 0.00 FA4 C -ATOM 140 C4 FA4 A 35 3.873 10.606 17.595 1.00 0.00 FA4 C -ATOM 141 C1 FA4 A 36 24.368 3.170 30.466 1.00 0.00 FA4 C -ATOM 142 C2 FA4 A 36 23.059 2.474 30.050 1.00 0.00 FA4 C -ATOM 143 C3 FA4 A 36 25.291 3.235 29.235 1.00 0.00 FA4 C -ATOM 144 C4 FA4 A 36 26.757 3.408 29.674 1.00 0.00 FA4 C -ATOM 145 C1 FA4 A 37 1.162 16.044 22.863 1.00 0.00 FA4 C -ATOM 146 C2 FA4 A 37 2.068 16.072 21.618 1.00 0.00 FA4 C -ATOM 147 C3 FA4 A 37 -0.192 16.732 22.612 1.00 0.00 FA4 C -ATOM 148 C4 FA4 A 37 -1.065 16.091 21.517 1.00 0.00 FA4 C -ATOM 149 C1 FA4 A 38 17.790 18.809 32.416 1.00 0.00 FA4 C -ATOM 150 C2 FA4 A 38 17.202 17.557 31.739 1.00 0.00 FA4 C -ATOM 151 C3 FA4 A 38 17.450 18.614 33.906 1.00 0.00 FA4 C -ATOM 152 C4 FA4 A 38 17.583 19.932 34.691 1.00 0.00 FA4 C -ATOM 153 C1 FA4 A 39 4.571 16.979 20.852 1.00 0.00 FA4 C -ATOM 154 C2 FA4 A 39 3.875 16.144 19.762 1.00 0.00 FA4 C -ATOM 155 C3 FA4 A 39 3.857 17.006 22.217 1.00 0.00 FA4 C -ATOM 156 C4 FA4 A 39 2.335 17.232 22.160 1.00 0.00 FA4 C -ATOM 157 C1 FA4 A 40 5.882 17.121 10.056 1.00 0.00 FA4 C -ATOM 158 C2 FA4 A 40 4.570 17.296 10.842 1.00 0.00 FA4 C -ATOM 159 C3 FA4 A 40 6.830 18.308 9.800 1.00 0.00 FA4 C -ATOM 160 C4 FA4 A 40 8.226 18.010 9.222 1.00 0.00 FA4 C -ATOM 161 C1 FA4 A 41 33.340 27.923 32.952 1.00 0.00 FA4 C -ATOM 162 C2 FA4 A 41 31.943 28.518 33.211 1.00 0.00 FA4 C -ATOM 163 C3 FA4 A 41 34.380 29.034 33.186 1.00 0.00 FA4 C -ATOM 164 C4 FA4 A 41 35.696 28.474 32.617 1.00 0.00 FA4 C -ATOM 165 C1 FA4 A 42 20.328 0.816 14.540 1.00 0.00 FA4 C -ATOM 166 C2 FA4 A 42 20.941 1.064 15.931 1.00 0.00 FA4 C -ATOM 167 C3 FA4 A 42 19.363 1.917 14.064 1.00 0.00 FA4 C -ATOM 168 C4 FA4 A 42 19.141 1.715 12.554 1.00 0.00 FA4 C -ATOM 169 C1 FA4 A 43 34.024 28.707 19.533 1.00 0.00 FA4 C -ATOM 170 C2 FA4 A 43 35.047 29.845 19.364 1.00 0.00 FA4 C -ATOM 171 C3 FA4 A 43 32.655 29.093 20.125 1.00 0.00 FA4 C -ATOM 172 C4 FA4 A 43 31.797 28.000 20.788 1.00 0.00 FA4 C -ATOM 173 C1 FA4 A 44 14.667 4.716 3.619 1.00 0.00 FA4 C -ATOM 174 C2 FA4 A 44 15.104 5.555 2.404 1.00 0.00 FA4 C -ATOM 175 C3 FA4 A 44 15.446 4.946 4.928 1.00 0.00 FA4 C -ATOM 176 C4 FA4 A 44 14.549 4.574 6.124 1.00 0.00 FA4 C -ATOM 177 C1 FA4 A 45 19.270 15.264 22.079 1.00 0.00 FA4 C -ATOM 178 C2 FA4 A 45 17.747 15.287 22.308 1.00 0.00 FA4 C -ATOM 179 C3 FA4 A 45 19.860 16.569 22.645 1.00 0.00 FA4 C -ATOM 180 C4 FA4 A 45 19.337 17.080 24.001 1.00 0.00 FA4 C -ATOM 181 C1 FA4 A 46 16.014 0.746 -0.431 1.00 0.00 FA4 C -ATOM 182 C2 FA4 A 46 15.654 -0.121 -1.652 1.00 0.00 FA4 C -ATOM 183 C3 FA4 A 46 16.343 -0.035 0.855 1.00 0.00 FA4 C -ATOM 184 C4 FA4 A 46 16.981 0.868 1.928 1.00 0.00 FA4 C -ATOM 185 C1 FA4 A 47 33.515 27.688 35.534 1.00 0.00 FA4 C -ATOM 186 C2 FA4 A 47 33.088 26.211 35.459 1.00 0.00 FA4 C -ATOM 187 C3 FA4 A 47 34.898 28.034 34.952 1.00 0.00 FA4 C -ATOM 188 C4 FA4 A 47 34.764 27.965 33.419 1.00 0.00 FA4 C -ATOM 189 C1 FA4 A 48 16.581 10.063 18.999 1.00 0.00 FA4 C -ATOM 190 C2 FA4 A 48 17.595 10.137 20.155 1.00 0.00 FA4 C -ATOM 191 C3 FA4 A 48 15.176 9.684 19.504 1.00 0.00 FA4 C -ATOM 192 C4 FA4 A 48 15.118 8.533 20.525 1.00 0.00 FA4 C -ATOM 193 C1 FA4 A 49 28.609 5.368 31.570 1.00 0.00 FA4 C -ATOM 194 C2 FA4 A 49 27.764 4.315 32.311 1.00 0.00 FA4 C -ATOM 195 C3 FA4 A 49 29.794 4.709 30.839 1.00 0.00 FA4 C -ATOM 196 C4 FA4 A 49 30.915 5.566 30.223 1.00 0.00 FA4 C -ATOM 197 C1 FA4 A 50 32.503 21.545 6.756 1.00 0.00 FA4 C -ATOM 198 C2 FA4 A 50 33.075 22.453 5.652 1.00 0.00 FA4 C -ATOM 199 C3 FA4 A 50 32.965 20.084 6.605 1.00 0.00 FA4 C -ATOM 200 C4 FA4 A 50 32.357 19.011 7.527 1.00 0.00 FA4 C -ATOM 201 C1 FA4 A 51 21.953 12.840 17.848 1.00 0.00 FA4 C -ATOM 202 C2 FA4 A 51 22.363 12.642 19.319 1.00 0.00 FA4 C -ATOM 203 C3 FA4 A 51 20.627 13.595 17.642 1.00 0.00 FA4 C -ATOM 204 C4 FA4 A 51 20.434 13.755 16.123 1.00 0.00 FA4 C -ATOM 205 C1 FA4 A 52 18.297 16.694 21.608 1.00 0.00 FA4 C -ATOM 206 C2 FA4 A 52 19.204 16.958 22.825 1.00 0.00 FA4 C -ATOM 207 C3 FA4 A 52 18.253 17.623 20.380 1.00 0.00 FA4 C -ATOM 208 C4 FA4 A 52 17.707 16.799 19.199 1.00 0.00 FA4 C -ATOM 209 C1 FA4 A 53 12.317 3.751 14.548 1.00 0.00 FA4 C -ATOM 210 C2 FA4 A 53 13.740 3.416 14.065 1.00 0.00 FA4 C -ATOM 211 C3 FA4 A 53 11.962 2.967 15.825 1.00 0.00 FA4 C -ATOM 212 C4 FA4 A 53 12.927 3.133 17.014 1.00 0.00 FA4 C -ATOM 213 C1 FA4 A 54 14.750 6.642 1.178 1.00 0.00 FA4 C -ATOM 214 C2 FA4 A 54 14.395 6.251 -0.269 1.00 0.00 FA4 C -ATOM 215 C3 FA4 A 54 14.823 8.170 1.351 1.00 0.00 FA4 C -ATOM 216 C4 FA4 A 54 13.470 8.720 1.837 1.00 0.00 FA4 C -ATOM 217 C1 FA4 A 55 8.436 32.461 5.004 1.00 0.00 FA4 C -ATOM 218 C2 FA4 A 55 7.540 33.027 6.121 1.00 0.00 FA4 C -ATOM 219 C3 FA4 A 55 8.704 33.651 4.064 1.00 0.00 FA4 C -ATOM 220 C4 FA4 A 55 8.819 33.258 2.580 1.00 0.00 FA4 C -ATOM 221 C1 FA4 A 56 11.035 9.473 9.497 1.00 0.00 FA4 C -ATOM 222 C2 FA4 A 56 10.194 9.365 10.783 1.00 0.00 FA4 C -ATOM 223 C3 FA4 A 56 10.075 9.852 8.354 1.00 0.00 FA4 C -ATOM 224 C4 FA4 A 56 10.048 11.383 8.196 1.00 0.00 FA4 C -ATOM 225 C1 FA4 A 57 19.039 15.450 21.068 1.00 0.00 FA4 C -ATOM 226 C2 FA4 A 57 19.378 16.828 21.664 1.00 0.00 FA4 C -ATOM 227 C3 FA4 A 57 17.542 15.258 20.758 1.00 0.00 FA4 C -ATOM 228 C4 FA4 A 57 17.257 14.354 19.544 1.00 0.00 FA4 C -ATOM 229 C1 FA4 A 58 6.947 13.452 22.759 1.00 0.00 FA4 C -ATOM 230 C2 FA4 A 58 5.653 13.842 22.021 1.00 0.00 FA4 C -ATOM 231 C3 FA4 A 58 7.901 14.630 23.026 1.00 0.00 FA4 C -ATOM 232 C4 FA4 A 58 7.524 15.198 24.406 1.00 0.00 FA4 C -ATOM 233 C1 FA4 A 59 25.444 31.541 33.790 1.00 0.00 FA4 C -ATOM 234 C2 FA4 A 59 24.482 31.388 34.982 1.00 0.00 FA4 C -ATOM 235 C3 FA4 A 59 25.976 32.984 33.709 1.00 0.00 FA4 C -ATOM 236 C4 FA4 A 59 24.811 33.939 33.391 1.00 0.00 FA4 C -ATOM 237 C1 FA4 A 60 19.783 6.647 7.294 1.00 0.00 FA4 C -ATOM 238 C2 FA4 A 60 20.378 7.595 6.236 1.00 0.00 FA4 C -ATOM 239 C3 FA4 A 60 18.996 7.467 8.333 1.00 0.00 FA4 C -ATOM 240 C4 FA4 A 60 19.916 8.315 9.232 1.00 0.00 FA4 C -ATOM 241 C1 FA4 A 61 28.589 30.857 12.831 1.00 0.00 FA4 C -ATOM 242 C2 FA4 A 61 27.969 29.502 12.440 1.00 0.00 FA4 C -ATOM 243 C3 FA4 A 61 29.909 30.856 13.625 1.00 0.00 FA4 C -ATOM 244 C4 FA4 A 61 29.794 31.218 15.118 1.00 0.00 FA4 C -ATOM 245 C1 FA4 A 62 3.322 10.340 1.582 1.00 0.00 FA4 C -ATOM 246 C2 FA4 A 62 4.465 9.331 1.364 1.00 0.00 FA4 C -ATOM 247 C3 FA4 A 62 1.952 9.745 1.208 1.00 0.00 FA4 C -ATOM 248 C4 FA4 A 62 0.874 10.829 1.397 1.00 0.00 FA4 C -ATOM 249 C1 FA4 A 63 27.152 5.583 16.329 1.00 0.00 FA4 C -ATOM 250 C2 FA4 A 63 26.166 5.084 15.256 1.00 0.00 FA4 C -ATOM 251 C3 FA4 A 63 27.276 4.765 17.628 1.00 0.00 FA4 C -ATOM 252 C4 FA4 A 63 28.228 3.563 17.486 1.00 0.00 FA4 C -ATOM 253 C1 FA4 A 64 20.156 15.146 1.501 1.00 0.00 FA4 C -ATOM 254 C2 FA4 A 64 20.680 15.889 2.744 1.00 0.00 FA4 C -ATOM 255 C3 FA4 A 64 20.675 13.697 1.454 1.00 0.00 FA4 C -ATOM 256 C4 FA4 A 64 19.921 12.720 0.534 1.00 0.00 FA4 C -ATOM 257 C1 FA4 A 65 27.406 33.259 26.015 1.00 0.00 FA4 C -ATOM 258 C2 FA4 A 65 27.845 31.862 26.493 1.00 0.00 FA4 C -ATOM 259 C3 FA4 A 65 26.896 33.313 24.563 1.00 0.00 FA4 C -ATOM 260 C4 FA4 A 65 27.607 32.556 23.426 1.00 0.00 FA4 C -ATOM 261 C1 FA4 A 66 0.903 30.520 8.009 1.00 0.00 FA4 C -ATOM 262 C2 FA4 A 66 2.133 30.151 7.159 1.00 0.00 FA4 C -ATOM 263 C3 FA4 A 66 1.129 30.570 9.531 1.00 0.00 FA4 C -ATOM 264 C4 FA4 A 66 2.434 31.220 10.026 1.00 0.00 FA4 C -ATOM 265 C1 FA4 A 67 17.946 15.086 24.329 1.00 0.00 FA4 C -ATOM 266 C2 FA4 A 67 17.202 16.263 23.671 1.00 0.00 FA4 C -ATOM 267 C3 FA4 A 67 19.168 15.548 25.144 1.00 0.00 FA4 C -ATOM 268 C4 FA4 A 67 20.114 16.464 24.347 1.00 0.00 FA4 C -ATOM 269 C1 FA4 A 68 21.985 33.774 2.457 1.00 0.00 FA4 C -ATOM 270 C2 FA4 A 68 21.146 32.750 3.244 1.00 0.00 FA4 C -ATOM 271 C3 FA4 A 68 21.866 35.250 2.878 1.00 0.00 FA4 C -ATOM 272 C4 FA4 A 68 21.950 36.371 1.826 1.00 0.00 FA4 C -ATOM 273 C1 FA4 A 69 17.751 26.774 22.804 1.00 0.00 FA4 C -ATOM 274 C2 FA4 A 69 17.036 26.041 23.954 1.00 0.00 FA4 C -ATOM 275 C3 FA4 A 69 17.153 28.060 22.202 1.00 0.00 FA4 C -ATOM 276 C4 FA4 A 69 17.227 28.312 20.685 1.00 0.00 FA4 C -ATOM 277 C1 FA4 A 70 30.164 0.100 11.197 1.00 0.00 FA4 C -ATOM 278 C2 FA4 A 70 30.760 -0.901 12.204 1.00 0.00 FA4 C -ATOM 279 C3 FA4 A 70 30.891 1.400 10.807 1.00 0.00 FA4 C -ATOM 280 C4 FA4 A 70 30.397 2.229 9.607 1.00 0.00 FA4 C -ATOM 281 C1 FA4 A 71 21.701 13.835 28.976 1.00 0.00 FA4 C -ATOM 282 C2 FA4 A 71 22.868 14.756 28.577 1.00 0.00 FA4 C -ATOM 283 C3 FA4 A 71 20.466 14.510 29.602 1.00 0.00 FA4 C -ATOM 284 C4 FA4 A 71 19.398 13.735 30.396 1.00 0.00 FA4 C -ATOM 285 C1 FA4 A 72 6.332 3.304 9.364 1.00 0.00 FA4 C -ATOM 286 C2 FA4 A 72 7.642 3.004 10.115 1.00 0.00 FA4 C -ATOM 287 C3 FA4 A 72 5.357 4.055 10.290 1.00 0.00 FA4 C -ATOM 288 C4 FA4 A 72 3.963 3.809 9.682 1.00 0.00 FA4 C -ATOM 289 C1 FA4 A 73 15.394 5.551 4.810 1.00 0.00 FA4 C -ATOM 290 C2 FA4 A 73 15.381 6.071 6.260 1.00 0.00 FA4 C -ATOM 291 C3 FA4 A 73 16.314 4.340 4.566 1.00 0.00 FA4 C -ATOM 292 C4 FA4 A 73 17.836 4.570 4.505 1.00 0.00 FA4 C -ATOM 293 C1 FA4 A 74 2.166 1.564 19.006 1.00 0.00 FA4 C -ATOM 294 C2 FA4 A 74 1.192 1.560 20.198 1.00 0.00 FA4 C -ATOM 295 C3 FA4 A 74 2.711 2.972 18.704 1.00 0.00 FA4 C -ATOM 296 C4 FA4 A 74 3.013 3.239 17.218 1.00 0.00 FA4 C -ATOM 297 C1 FA4 A 75 28.249 33.864 17.587 1.00 0.00 FA4 C -ATOM 298 C2 FA4 A 75 27.632 33.498 16.224 1.00 0.00 FA4 C -ATOM 299 C3 FA4 A 75 29.487 33.037 17.980 1.00 0.00 FA4 C -ATOM 300 C4 FA4 A 75 29.400 32.304 19.332 1.00 0.00 FA4 C -ATOM 301 C1 FA4 A 76 19.488 7.504 1.536 1.00 0.00 FA4 C -ATOM 302 C2 FA4 A 76 19.781 8.949 1.981 1.00 0.00 FA4 C -ATOM 303 C3 FA4 A 76 20.067 6.932 0.229 1.00 0.00 FA4 C -ATOM 304 C4 FA4 A 76 20.107 5.392 0.253 1.00 0.00 FA4 C -ATOM 305 C1 FA4 A 77 13.831 15.295 1.857 1.00 0.00 FA4 C -ATOM 306 C2 FA4 A 77 12.706 14.256 1.693 1.00 0.00 FA4 C -ATOM 307 C3 FA4 A 77 14.837 14.837 2.929 1.00 0.00 FA4 C -ATOM 308 C4 FA4 A 77 16.321 15.230 2.795 1.00 0.00 FA4 C -ATOM 309 C1 FA4 A 78 9.778 24.964 12.489 1.00 0.00 FA4 C -ATOM 310 C2 FA4 A 78 9.609 26.053 13.565 1.00 0.00 FA4 C -ATOM 311 C3 FA4 A 78 10.830 25.218 11.394 1.00 0.00 FA4 C -ATOM 312 C4 FA4 A 78 12.216 25.617 11.934 1.00 0.00 FA4 C -ATOM 313 C1 FA4 A 79 11.650 13.913 32.836 1.00 0.00 FA4 C -ATOM 314 C2 FA4 A 79 11.197 15.111 33.692 1.00 0.00 FA4 C -ATOM 315 C3 FA4 A 79 13.157 13.630 32.984 1.00 0.00 FA4 C -ATOM 316 C4 FA4 A 79 13.469 12.167 32.618 1.00 0.00 FA4 C -ATOM 317 C1 FA4 A 80 22.001 22.181 10.998 1.00 0.00 FA4 C -ATOM 318 C2 FA4 A 80 23.432 22.281 10.438 1.00 0.00 FA4 C -ATOM 319 C3 FA4 A 80 21.984 21.481 12.369 1.00 0.00 FA4 C -ATOM 320 C4 FA4 A 80 20.557 21.128 12.828 1.00 0.00 FA4 C -ATOM 321 C1 FA4 A 81 34.295 5.323 14.327 1.00 0.00 FA4 C -ATOM 322 C2 FA4 A 81 34.249 3.865 14.821 1.00 0.00 FA4 C -ATOM 323 C3 FA4 A 81 35.177 5.249 13.066 1.00 0.00 FA4 C -ATOM 324 C4 FA4 A 81 35.250 6.535 12.223 1.00 0.00 FA4 C -ATOM 325 C1 FA4 A 82 19.112 12.019 25.460 1.00 0.00 FA4 C -ATOM 326 C2 FA4 A 82 19.553 13.491 25.562 1.00 0.00 FA4 C -ATOM 327 C3 FA4 A 82 20.087 11.006 26.090 1.00 0.00 FA4 C -ATOM 328 C4 FA4 A 82 19.505 9.628 25.725 1.00 0.00 FA4 C -ATOM 329 C1 FA4 A 83 29.946 4.547 30.669 1.00 0.00 FA4 C -ATOM 330 C2 FA4 A 83 29.927 3.202 31.419 1.00 0.00 FA4 C -ATOM 331 C3 FA4 A 83 30.626 5.710 31.415 1.00 0.00 FA4 C -ATOM 332 C4 FA4 A 83 29.956 5.949 32.781 1.00 0.00 FA4 C -ATOM 333 C1 FA4 A 84 6.562 2.120 11.002 1.00 0.00 FA4 C -ATOM 334 C2 FA4 A 84 7.041 3.277 10.105 1.00 0.00 FA4 C -ATOM 335 C3 FA4 A 84 5.058 1.865 10.794 1.00 0.00 FA4 C -ATOM 336 C4 FA4 A 84 4.612 0.391 10.767 1.00 0.00 FA4 C -ATOM 337 C1 FA4 A 85 2.977 14.399 34.915 1.00 0.00 FA4 C -ATOM 338 C2 FA4 A 85 2.141 15.401 34.097 1.00 0.00 FA4 C -ATOM 339 C3 FA4 A 85 3.939 13.520 34.096 1.00 0.00 FA4 C -ATOM 340 C4 FA4 A 85 4.493 12.262 34.790 1.00 0.00 FA4 C -ATOM 341 C1 FA4 A 86 29.836 20.221 20.922 1.00 0.00 FA4 C -ATOM 342 C2 FA4 A 86 29.338 20.323 22.376 1.00 0.00 FA4 C -ATOM 343 C3 FA4 A 86 29.486 21.431 20.037 1.00 0.00 FA4 C -ATOM 344 C4 FA4 A 86 30.117 21.338 18.635 1.00 0.00 FA4 C -ATOM 345 C1 FA4 A 87 24.567 24.816 30.456 1.00 0.00 FA4 C -ATOM 346 C2 FA4 A 87 25.374 25.885 31.215 1.00 0.00 FA4 C -ATOM 347 C3 FA4 A 87 25.484 23.862 29.670 1.00 0.00 FA4 C -ATOM 348 C4 FA4 A 87 25.907 24.522 28.344 1.00 0.00 FA4 C -ATOM 349 C1 FA4 A 88 14.221 13.685 11.625 1.00 0.00 FA4 C -ATOM 350 C2 FA4 A 88 12.771 13.414 12.066 1.00 0.00 FA4 C -ATOM 351 C3 FA4 A 88 14.807 12.872 10.456 1.00 0.00 FA4 C -ATOM 352 C4 FA4 A 88 15.969 13.630 9.787 1.00 0.00 FA4 C -ATOM 353 C1 FA4 A 89 23.960 10.502 33.693 1.00 0.00 FA4 C -ATOM 354 C2 FA4 A 89 22.900 10.195 32.619 1.00 0.00 FA4 C -ATOM 355 C3 FA4 A 89 24.083 9.453 34.814 1.00 0.00 FA4 C -ATOM 356 C4 FA4 A 89 25.241 9.453 35.830 1.00 0.00 FA4 C -ATOM 357 C1 FA4 A 90 19.299 8.706 2.240 1.00 0.00 FA4 C -ATOM 358 C2 FA4 A 90 19.955 9.130 3.567 1.00 0.00 FA4 C -ATOM 359 C3 FA4 A 90 20.221 8.044 1.200 1.00 0.00 FA4 C -ATOM 360 C4 FA4 A 90 19.463 7.049 0.302 1.00 0.00 FA4 C -ATOM 361 C1 FA4 A 91 13.652 34.094 6.852 1.00 0.00 FA4 C -ATOM 362 C2 FA4 A 91 15.000 33.957 7.582 1.00 0.00 FA4 C -ATOM 363 C3 FA4 A 91 13.033 32.695 6.672 1.00 0.00 FA4 C -ATOM 364 C4 FA4 A 91 13.054 31.844 7.955 1.00 0.00 FA4 C -ATOM 365 C1 FA4 A 92 2.861 22.808 24.350 1.00 0.00 FA4 C -ATOM 366 C2 FA4 A 92 2.991 23.558 23.012 1.00 0.00 FA4 C -ATOM 367 C3 FA4 A 92 3.449 21.415 24.055 1.00 0.00 FA4 C -ATOM 368 C4 FA4 A 92 3.284 20.440 25.235 1.00 0.00 FA4 C -ATOM 369 C1 FA4 A 93 26.009 14.617 12.652 1.00 0.00 FA4 C -ATOM 370 C2 FA4 A 93 27.478 14.946 12.981 1.00 0.00 FA4 C -ATOM 371 C3 FA4 A 93 25.119 14.830 13.890 1.00 0.00 FA4 C -ATOM 372 C4 FA4 A 93 23.873 13.930 13.976 1.00 0.00 FA4 C -ATOM 373 C1 FA4 A 94 26.374 17.536 12.639 1.00 0.00 FA4 C -ATOM 374 C2 FA4 A 94 27.735 18.198 12.351 1.00 0.00 FA4 C -ATOM 375 C3 FA4 A 94 26.277 16.000 12.582 1.00 0.00 FA4 C -ATOM 376 C4 FA4 A 94 24.871 15.392 12.736 1.00 0.00 FA4 C -ATOM 377 C1 FA4 A 95 6.937 29.070 13.084 1.00 0.00 FA4 C -ATOM 378 C2 FA4 A 95 7.236 28.564 11.660 1.00 0.00 FA4 C -ATOM 379 C3 FA4 A 95 6.837 27.915 14.097 1.00 0.00 FA4 C -ATOM 380 C4 FA4 A 95 7.379 28.230 15.504 1.00 0.00 FA4 C -ATOM 381 C1 FA4 A 96 7.358 26.605 26.175 1.00 0.00 FA4 C -ATOM 382 C2 FA4 A 96 8.270 27.383 25.208 1.00 0.00 FA4 C -ATOM 383 C3 FA4 A 96 5.949 27.203 26.349 1.00 0.00 FA4 C -ATOM 384 C4 FA4 A 96 4.997 26.211 27.042 1.00 0.00 FA4 C -ATOM 385 C1 FA4 A 97 27.711 0.838 31.581 1.00 0.00 FA4 C -ATOM 386 C2 FA4 A 97 26.289 0.894 30.992 1.00 0.00 FA4 C -ATOM 387 C3 FA4 A 97 27.770 -0.452 32.419 1.00 0.00 FA4 C -ATOM 388 C4 FA4 A 97 29.133 -0.640 33.112 1.00 0.00 FA4 C -ATOM 389 C1 FA4 A 98 34.923 9.688 22.231 1.00 0.00 FA4 C -ATOM 390 C2 FA4 A 98 35.263 10.559 21.007 1.00 0.00 FA4 C -ATOM 391 C3 FA4 A 98 33.423 9.614 22.572 1.00 0.00 FA4 C -ATOM 392 C4 FA4 A 98 32.581 8.535 21.866 1.00 0.00 FA4 C -ATOM 393 C1 FA4 A 99 10.786 21.881 8.644 1.00 0.00 FA4 C -ATOM 394 C2 FA4 A 99 12.189 21.424 8.203 1.00 0.00 FA4 C -ATOM 395 C3 FA4 A 99 10.030 22.423 7.416 1.00 0.00 FA4 C -ATOM 396 C4 FA4 A 99 10.183 21.392 6.283 1.00 0.00 FA4 C -ATOM 397 C1 FA4 A 100 20.172 12.738 13.373 1.00 0.00 FA4 C -ATOM 398 C2 FA4 A 100 20.450 12.887 14.880 1.00 0.00 FA4 C -ATOM 399 C3 FA4 A 100 18.785 13.284 12.984 1.00 0.00 FA4 C -ATOM 400 C4 FA4 A 100 18.540 13.260 11.464 1.00 0.00 FA4 C -ATOM 401 C1 FA4 A 101 21.055 34.261 31.601 1.00 0.00 FA4 C -ATOM 402 C2 FA4 A 101 20.751 33.721 30.191 1.00 0.00 FA4 C -ATOM 403 C3 FA4 A 101 22.554 34.110 31.918 1.00 0.00 FA4 C -ATOM 404 C4 FA4 A 101 23.113 34.873 33.133 1.00 0.00 FA4 C -ATOM 405 C1 FA4 A 102 2.627 14.966 33.817 1.00 0.00 FA4 C -ATOM 406 C2 FA4 A 102 1.518 16.024 33.967 1.00 0.00 FA4 C -ATOM 407 C3 FA4 A 102 3.159 14.984 32.372 1.00 0.00 FA4 C -ATOM 408 C4 FA4 A 102 3.294 16.385 31.748 1.00 0.00 FA4 C -ATOM 409 C1 FA4 A 103 32.091 17.825 27.032 1.00 0.00 FA4 C -ATOM 410 C2 FA4 A 103 33.505 17.546 26.491 1.00 0.00 FA4 C -ATOM 411 C3 FA4 A 103 31.774 16.776 28.114 1.00 0.00 FA4 C -ATOM 412 C4 FA4 A 103 30.358 16.606 28.695 1.00 0.00 FA4 C -ATOM 413 C1 FA4 A 104 22.564 24.941 28.058 1.00 0.00 FA4 C -ATOM 414 C2 FA4 A 104 22.433 25.405 29.521 1.00 0.00 FA4 C -ATOM 415 C3 FA4 A 104 24.024 24.922 27.569 1.00 0.00 FA4 C -ATOM 416 C4 FA4 A 104 24.185 25.040 26.042 1.00 0.00 FA4 C -ATOM 417 C1 FA4 A 105 30.175 23.400 30.383 1.00 0.00 FA4 C -ATOM 418 C2 FA4 A 105 31.157 22.223 30.532 1.00 0.00 FA4 C -ATOM 419 C3 FA4 A 105 29.318 23.704 31.626 1.00 0.00 FA4 C -ATOM 420 C4 FA4 A 105 28.503 25.011 31.642 1.00 0.00 FA4 C -ATOM 421 C1 FA4 A 106 18.067 29.362 -0.528 1.00 0.00 FA4 C -ATOM 422 C2 FA4 A 106 19.262 30.262 -0.894 1.00 0.00 FA4 C -ATOM 423 C3 FA4 A 106 17.035 30.101 0.345 1.00 0.00 FA4 C -ATOM 424 C4 FA4 A 106 17.419 30.753 1.686 1.00 0.00 FA4 C -ATOM 425 C1 FA4 A 107 14.445 6.550 9.871 1.00 0.00 FA4 C -ATOM 426 C2 FA4 A 107 14.916 7.985 9.571 1.00 0.00 FA4 C -ATOM 427 C3 FA4 A 107 13.400 6.557 11.002 1.00 0.00 FA4 C -ATOM 428 C4 FA4 A 107 12.771 5.151 10.972 1.00 0.00 FA4 C -ATOM 429 C1 FA4 A 108 23.770 19.006 22.209 1.00 0.00 FA4 C -ATOM 430 C2 FA4 A 108 22.398 19.085 22.903 1.00 0.00 FA4 C -ATOM 431 C3 FA4 A 108 24.581 20.315 22.184 1.00 0.00 FA4 C -ATOM 432 C4 FA4 A 108 26.049 20.175 21.741 1.00 0.00 FA4 C -ATOM 433 C1 FA4 A 109 18.051 14.806 21.554 1.00 0.00 FA4 C -ATOM 434 C2 FA4 A 109 19.371 14.261 20.977 1.00 0.00 FA4 C -ATOM 435 C3 FA4 A 109 16.913 14.140 20.759 1.00 0.00 FA4 C -ATOM 436 C4 FA4 A 109 16.905 14.366 19.235 1.00 0.00 FA4 C -ATOM 437 C1 FA4 A 110 8.400 6.938 17.093 1.00 0.00 FA4 C -ATOM 438 C2 FA4 A 110 7.083 6.560 17.796 1.00 0.00 FA4 C -ATOM 439 C3 FA4 A 110 8.290 8.238 16.275 1.00 0.00 FA4 C -ATOM 440 C4 FA4 A 110 7.829 9.536 16.963 1.00 0.00 FA4 C -ATOM 441 C1 FA4 A 111 22.037 24.067 24.693 1.00 0.00 FA4 C -ATOM 442 C2 FA4 A 111 21.302 25.355 25.106 1.00 0.00 FA4 C -ATOM 443 C3 FA4 A 111 23.327 23.890 25.516 1.00 0.00 FA4 C -ATOM 444 C4 FA4 A 111 24.180 22.736 24.956 1.00 0.00 FA4 C -ATOM 445 C1 FA4 A 112 29.312 5.107 12.677 1.00 0.00 FA4 C -ATOM 446 C2 FA4 A 112 28.221 5.376 13.730 1.00 0.00 FA4 C -ATOM 447 C3 FA4 A 112 30.309 6.225 12.320 1.00 0.00 FA4 C -ATOM 448 C4 FA4 A 112 31.708 5.738 12.739 1.00 0.00 FA4 C -ATOM 449 C1 FA4 A 113 32.212 11.979 10.137 1.00 0.00 FA4 C -ATOM 450 C2 FA4 A 113 30.923 11.655 10.916 1.00 0.00 FA4 C -ATOM 451 C3 FA4 A 113 32.021 11.819 8.618 1.00 0.00 FA4 C -ATOM 452 C4 FA4 A 113 31.362 10.493 8.196 1.00 0.00 FA4 C -ATOM 453 C1 FA4 A 114 7.235 27.778 11.878 1.00 0.00 FA4 C -ATOM 454 C2 FA4 A 114 7.204 29.274 12.244 1.00 0.00 FA4 C -ATOM 455 C3 FA4 A 114 8.334 26.999 12.625 1.00 0.00 FA4 C -ATOM 456 C4 FA4 A 114 8.194 25.466 12.598 1.00 0.00 FA4 C -ATOM 457 C1 FA4 A 115 30.244 25.945 27.771 1.00 0.00 FA4 C -ATOM 458 C2 FA4 A 115 31.608 25.253 27.593 1.00 0.00 FA4 C -ATOM 459 C3 FA4 A 115 29.090 25.416 26.900 1.00 0.00 FA4 C -ATOM 460 C4 FA4 A 115 27.788 26.077 27.390 1.00 0.00 FA4 C -ATOM 461 C1 FA4 A 116 8.331 26.085 2.470 1.00 0.00 FA4 C -ATOM 462 C2 FA4 A 116 7.041 26.848 2.115 1.00 0.00 FA4 C -ATOM 463 C3 FA4 A 116 8.639 24.962 1.461 1.00 0.00 FA4 C -ATOM 464 C4 FA4 A 116 9.703 23.920 1.851 1.00 0.00 FA4 C -ATOM 465 C1 FA4 A 117 34.685 21.574 21.882 1.00 0.00 FA4 C -ATOM 466 C2 FA4 A 117 33.845 22.675 21.207 1.00 0.00 FA4 C -ATOM 467 C3 FA4 A 117 34.050 20.171 21.876 1.00 0.00 FA4 C -ATOM 468 C4 FA4 A 117 34.775 18.863 22.244 1.00 0.00 FA4 C -ATOM 469 C1 FA4 A 118 17.633 14.802 33.789 1.00 0.00 FA4 C -ATOM 470 C2 FA4 A 118 17.762 13.274 33.641 1.00 0.00 FA4 C -ATOM 471 C3 FA4 A 118 18.430 15.817 32.948 1.00 0.00 FA4 C -ATOM 472 C4 FA4 A 118 17.990 17.285 33.096 1.00 0.00 FA4 C -ATOM 473 C1 FA4 A 119 23.619 14.971 1.776 1.00 0.00 FA4 C -ATOM 474 C2 FA4 A 119 24.073 14.198 3.028 1.00 0.00 FA4 C -ATOM 475 C3 FA4 A 119 22.706 14.108 0.885 1.00 0.00 FA4 C -ATOM 476 C4 FA4 A 119 21.459 13.524 1.576 1.00 0.00 FA4 C -ATOM 477 C1 FA4 A 120 4.077 30.518 10.917 1.00 0.00 FA4 C -ATOM 478 C2 FA4 A 120 5.141 30.858 9.857 1.00 0.00 FA4 C -ATOM 479 C3 FA4 A 120 3.959 31.212 12.287 1.00 0.00 FA4 C -ATOM 480 C4 FA4 A 120 5.276 31.471 13.041 1.00 0.00 FA4 C -ATOM 481 C1 FA4 A 121 31.714 32.493 12.240 1.00 0.00 FA4 C -ATOM 482 C2 FA4 A 121 32.219 32.990 13.608 1.00 0.00 FA4 C -ATOM 483 C3 FA4 A 121 30.743 31.302 12.334 1.00 0.00 FA4 C -ATOM 484 C4 FA4 A 121 29.456 31.619 13.119 1.00 0.00 FA4 C -ATOM 485 C1 FA4 A 122 28.236 0.766 29.640 1.00 0.00 FA4 C -ATOM 486 C2 FA4 A 122 29.667 0.346 30.023 1.00 0.00 FA4 C -ATOM 487 C3 FA4 A 122 28.041 2.252 29.993 1.00 0.00 FA4 C -ATOM 488 C4 FA4 A 122 26.958 2.855 29.079 1.00 0.00 FA4 C -ATOM 489 C1 FA4 A 123 22.623 27.053 23.941 1.00 0.00 FA4 C -ATOM 490 C2 FA4 A 123 23.493 27.494 25.133 1.00 0.00 FA4 C -ATOM 491 C3 FA4 A 123 22.395 25.532 23.860 1.00 0.00 FA4 C -ATOM 492 C4 FA4 A 123 21.317 25.035 24.842 1.00 0.00 FA4 C -ATOM 493 C1 FA4 A 124 19.402 14.495 3.011 1.00 0.00 FA4 C -ATOM 494 C2 FA4 A 124 19.587 14.002 1.564 1.00 0.00 FA4 C -ATOM 495 C3 FA4 A 124 20.694 14.920 3.733 1.00 0.00 FA4 C -ATOM 496 C4 FA4 A 124 21.692 15.691 2.850 1.00 0.00 FA4 C -ATOM 497 C1 FA4 A 125 12.675 17.467 19.289 1.00 0.00 FA4 C -ATOM 498 C2 FA4 A 125 12.965 18.189 17.960 1.00 0.00 FA4 C -ATOM 499 C3 FA4 A 125 12.036 18.366 20.364 1.00 0.00 FA4 C -ATOM 500 C4 FA4 A 125 11.315 17.621 21.502 1.00 0.00 FA4 C -ATOM 501 C1 FA4 A 126 23.272 19.435 32.991 1.00 0.00 FA4 C -ATOM 502 C2 FA4 A 126 22.707 19.573 31.565 1.00 0.00 FA4 C -ATOM 503 C3 FA4 A 126 22.686 18.231 33.752 1.00 0.00 FA4 C -ATOM 504 C4 FA4 A 126 23.461 17.739 34.988 1.00 0.00 FA4 C -ATOM 505 C1 FA4 A 127 28.511 16.353 26.151 1.00 0.00 FA4 C -ATOM 506 C2 FA4 A 127 27.405 16.404 25.081 1.00 0.00 FA4 C -ATOM 507 C3 FA4 A 127 28.880 17.657 26.882 1.00 0.00 FA4 C -ATOM 508 C4 FA4 A 127 30.218 17.715 27.642 1.00 0.00 FA4 C -ATOM 509 C1 FA4 A 128 26.427 17.319 24.679 1.00 0.00 FA4 C -ATOM 510 C2 FA4 A 128 26.445 16.939 23.187 1.00 0.00 FA4 C -ATOM 511 C3 FA4 A 128 27.630 16.853 25.521 1.00 0.00 FA4 C -ATOM 512 C4 FA4 A 128 27.625 17.172 27.028 1.00 0.00 FA4 C -ATOM 513 C1 FA4 A 129 17.442 20.066 18.637 1.00 0.00 FA4 C -ATOM 514 C2 FA4 A 129 16.044 20.082 17.992 1.00 0.00 FA4 C -ATOM 515 C3 FA4 A 129 17.335 20.094 20.173 1.00 0.00 FA4 C -ATOM 516 C4 FA4 A 129 16.184 20.980 20.684 1.00 0.00 FA4 C -ATOM 517 C1 FA4 A 130 1.045 3.670 23.261 1.00 0.00 FA4 C -ATOM 518 C2 FA4 A 130 2.538 4.014 23.105 1.00 0.00 FA4 C -ATOM 519 C3 FA4 A 130 0.196 4.953 23.336 1.00 0.00 FA4 C -ATOM 520 C4 FA4 A 130 -1.284 4.633 23.619 1.00 0.00 FA4 C -ATOM 521 C1 FA4 A 131 13.790 24.544 16.220 1.00 0.00 FA4 C -ATOM 522 C2 FA4 A 131 12.765 23.470 15.812 1.00 0.00 FA4 C -ATOM 523 C3 FA4 A 131 13.385 25.299 17.500 1.00 0.00 FA4 C -ATOM 524 C4 FA4 A 131 14.502 25.889 18.380 1.00 0.00 FA4 C -ATOM 525 C1 FA4 A 132 11.018 15.528 1.361 1.00 0.00 FA4 C -ATOM 526 C2 FA4 A 132 12.418 16.041 0.977 1.00 0.00 FA4 C -ATOM 527 C3 FA4 A 132 9.971 16.484 1.963 1.00 0.00 FA4 C -ATOM 528 C4 FA4 A 132 8.473 16.164 1.807 1.00 0.00 FA4 C -ATOM 529 C1 FA4 A 133 6.930 25.723 16.748 1.00 0.00 FA4 C -ATOM 530 C2 FA4 A 133 6.958 25.536 15.220 1.00 0.00 FA4 C -ATOM 531 C3 FA4 A 133 8.081 24.928 17.393 1.00 0.00 FA4 C -ATOM 532 C4 FA4 A 133 7.998 24.748 18.920 1.00 0.00 FA4 C -ATOM 533 C1 FA4 A 134 32.263 21.896 1.114 1.00 0.00 FA4 C -ATOM 534 C2 FA4 A 134 31.489 21.211 -0.027 1.00 0.00 FA4 C -ATOM 535 C3 FA4 A 134 31.442 22.282 2.359 1.00 0.00 FA4 C -ATOM 536 C4 FA4 A 134 32.259 22.717 3.590 1.00 0.00 FA4 C -ATOM 537 C1 FA4 A 135 35.322 10.417 22.345 1.00 0.00 FA4 C -ATOM 538 C2 FA4 A 135 35.250 11.608 23.319 1.00 0.00 FA4 C -ATOM 539 C3 FA4 A 135 34.235 10.445 21.255 1.00 0.00 FA4 C -ATOM 540 C4 FA4 A 135 34.113 9.192 20.367 1.00 0.00 FA4 C -ATOM 541 C1 FA4 A 136 8.857 9.624 21.805 1.00 0.00 FA4 C -ATOM 542 C2 FA4 A 136 8.476 8.901 20.500 1.00 0.00 FA4 C -ATOM 543 C3 FA4 A 136 8.158 10.993 21.892 1.00 0.00 FA4 C -ATOM 544 C4 FA4 A 136 6.659 11.086 21.552 1.00 0.00 FA4 C -ATOM 545 C1 FA4 A 137 20.271 7.359 2.804 1.00 0.00 FA4 C -ATOM 546 C2 FA4 A 137 19.481 6.249 2.087 1.00 0.00 FA4 C -ATOM 547 C3 FA4 A 137 19.533 8.504 3.523 1.00 0.00 FA4 C -ATOM 548 C4 FA4 A 137 20.457 9.718 3.733 1.00 0.00 FA4 C -ATOM 549 C1 FA4 A 138 8.292 3.559 17.653 1.00 0.00 FA4 C -ATOM 550 C2 FA4 A 138 8.949 3.671 16.265 1.00 0.00 FA4 C -ATOM 551 C3 FA4 A 138 6.802 3.947 17.613 1.00 0.00 FA4 C -ATOM 552 C4 FA4 A 138 5.939 3.228 16.559 1.00 0.00 FA4 C -ATOM 553 C1 FA4 A 139 16.297 16.651 35.114 1.00 0.00 FA4 C -ATOM 554 C2 FA4 A 139 15.710 15.292 35.538 1.00 0.00 FA4 C -ATOM 555 C3 FA4 A 139 15.476 17.388 34.039 1.00 0.00 FA4 C -ATOM 556 C4 FA4 A 139 13.995 17.653 34.368 1.00 0.00 FA4 C -ATOM 557 C1 FA4 A 140 1.038 2.709 23.048 1.00 0.00 FA4 C -ATOM 558 C2 FA4 A 140 0.400 3.308 24.316 1.00 0.00 FA4 C -ATOM 559 C3 FA4 A 140 2.549 2.768 23.339 1.00 0.00 FA4 C -ATOM 560 C4 FA4 A 140 3.285 2.429 22.030 1.00 0.00 FA4 C -ATOM 561 C1 FA4 A 141 30.070 32.413 33.600 1.00 0.00 FA4 C -ATOM 562 C2 FA4 A 141 28.960 33.460 33.394 1.00 0.00 FA4 C -ATOM 563 C3 FA4 A 141 29.602 30.985 33.936 1.00 0.00 FA4 C -ATOM 564 C4 FA4 A 141 30.669 29.876 33.873 1.00 0.00 FA4 C -ATOM 565 C1 FA4 A 142 22.780 9.767 25.770 1.00 0.00 FA4 C -ATOM 566 C2 FA4 A 142 21.836 10.310 24.681 1.00 0.00 FA4 C -ATOM 567 C3 FA4 A 142 24.245 9.672 25.307 1.00 0.00 FA4 C -ATOM 568 C4 FA4 A 142 24.863 11.035 25.672 1.00 0.00 FA4 C -ATOM 569 C1 FA4 A 143 7.850 11.615 19.320 1.00 0.00 FA4 C -ATOM 570 C2 FA4 A 143 9.264 11.006 19.280 1.00 0.00 FA4 C -ATOM 571 C3 FA4 A 143 6.791 10.868 20.150 1.00 0.00 FA4 C -ATOM 572 C4 FA4 A 143 5.473 11.638 20.355 1.00 0.00 FA4 C -ATOM 573 C1 FA4 A 144 26.263 30.693 3.800 1.00 0.00 FA4 C -ATOM 574 C2 FA4 A 144 27.224 31.197 4.893 1.00 0.00 FA4 C -ATOM 575 C3 FA4 A 144 26.825 29.627 2.841 1.00 0.00 FA4 C -ATOM 576 C4 FA4 A 144 27.688 28.633 3.640 1.00 0.00 FA4 C -ATOM 577 C1 FA4 A 145 19.408 24.455 33.572 1.00 0.00 FA4 C -ATOM 578 C2 FA4 A 145 18.806 25.867 33.442 1.00 0.00 FA4 C -ATOM 579 C3 FA4 A 145 18.761 23.557 34.643 1.00 0.00 FA4 C -ATOM 580 C4 FA4 A 145 19.545 22.259 34.911 1.00 0.00 FA4 C -ATOM 581 C1 FA4 A 146 1.945 27.253 17.420 1.00 0.00 FA4 C -ATOM 582 C2 FA4 A 146 1.547 28.732 17.581 1.00 0.00 FA4 C -ATOM 583 C3 FA4 A 146 2.499 27.152 15.986 1.00 0.00 FA4 C -ATOM 584 C4 FA4 A 146 3.135 25.861 15.438 1.00 0.00 FA4 C -ATOM 585 C1 FA4 A 147 30.410 0.619 29.567 1.00 0.00 FA4 C -ATOM 586 C2 FA4 A 147 29.673 1.637 30.456 1.00 0.00 FA4 C -ATOM 587 C3 FA4 A 147 30.823 1.022 28.139 1.00 0.00 FA4 C -ATOM 588 C4 FA4 A 147 32.233 1.584 27.874 1.00 0.00 FA4 C -ATOM 589 C1 FA4 A 148 16.491 18.515 22.676 1.00 0.00 FA4 C -ATOM 590 C2 FA4 A 148 15.894 17.110 22.879 1.00 0.00 FA4 C -ATOM 591 C3 FA4 A 148 16.873 19.277 23.959 1.00 0.00 FA4 C -ATOM 592 C4 FA4 A 148 17.765 18.426 24.882 1.00 0.00 FA4 C -ATOM 593 C1 FA4 A 149 18.223 8.991 1.684 1.00 0.00 FA4 C -ATOM 594 C2 FA4 A 149 18.695 8.298 0.392 1.00 0.00 FA4 C -ATOM 595 C3 FA4 A 149 17.982 10.506 1.544 1.00 0.00 FA4 C -ATOM 596 C4 FA4 A 149 17.334 11.267 2.716 1.00 0.00 FA4 C -ATOM 597 C1 FA4 A 150 22.532 28.184 18.156 1.00 0.00 FA4 C -ATOM 598 C2 FA4 A 150 23.096 29.457 18.812 1.00 0.00 FA4 C -ATOM 599 C3 FA4 A 150 21.070 28.059 17.687 1.00 0.00 FA4 C -ATOM 600 C4 FA4 A 150 20.481 26.843 16.948 1.00 0.00 FA4 C -ATOM 601 C1 FA4 A 151 28.866 11.187 6.607 1.00 0.00 FA4 C -ATOM 602 C2 FA4 A 151 27.548 11.631 5.946 1.00 0.00 FA4 C -ATOM 603 C3 FA4 A 151 29.684 10.474 5.514 1.00 0.00 FA4 C -ATOM 604 C4 FA4 A 151 29.827 11.273 4.205 1.00 0.00 FA4 C -ATOM 605 C1 FA4 A 152 27.032 21.671 19.458 1.00 0.00 FA4 C -ATOM 606 C2 FA4 A 152 26.500 20.480 20.278 1.00 0.00 FA4 C -ATOM 607 C3 FA4 A 152 25.823 22.465 18.928 1.00 0.00 FA4 C -ATOM 608 C4 FA4 A 152 25.828 23.345 17.665 1.00 0.00 FA4 C -ATOM 609 C1 FA4 A 153 24.023 23.085 32.801 1.00 0.00 FA4 C -ATOM 610 C2 FA4 A 153 24.817 22.079 33.654 1.00 0.00 FA4 C -ATOM 611 C3 FA4 A 153 22.685 23.400 33.496 1.00 0.00 FA4 C -ATOM 612 C4 FA4 A 153 22.126 24.717 32.928 1.00 0.00 FA4 C -ATOM 613 C1 FA4 A 154 1.017 4.627 2.914 1.00 0.00 FA4 C -ATOM 614 C2 FA4 A 154 1.816 3.320 3.072 1.00 0.00 FA4 C -ATOM 615 C3 FA4 A 154 -0.429 4.446 2.417 1.00 0.00 FA4 C -ATOM 616 C4 FA4 A 154 -0.740 3.883 1.018 1.00 0.00 FA4 C -ATOM 617 C1 FA4 A 155 30.803 22.948 12.691 1.00 0.00 FA4 C -ATOM 618 C2 FA4 A 155 30.333 23.980 13.733 1.00 0.00 FA4 C -ATOM 619 C3 FA4 A 155 29.646 21.992 12.346 1.00 0.00 FA4 C -ATOM 620 C4 FA4 A 155 29.833 21.090 11.112 1.00 0.00 FA4 C -ATOM 621 C1 FA4 A 156 29.506 15.591 2.335 1.00 0.00 FA4 C -ATOM 622 C2 FA4 A 156 30.860 15.855 3.021 1.00 0.00 FA4 C -ATOM 623 C3 FA4 A 156 29.818 15.206 0.877 1.00 0.00 FA4 C -ATOM 624 C4 FA4 A 156 28.599 15.531 -0.007 1.00 0.00 FA4 C -ATOM 625 C1 FA4 A 157 30.087 34.898 4.250 1.00 0.00 FA4 C -ATOM 626 C2 FA4 A 157 29.873 35.100 2.739 1.00 0.00 FA4 C -ATOM 627 C3 FA4 A 157 28.863 34.805 5.181 1.00 0.00 FA4 C -ATOM 628 C4 FA4 A 157 29.009 33.978 6.472 1.00 0.00 FA4 C -ATOM 629 C1 FA4 A 158 18.687 24.069 7.369 1.00 0.00 FA4 C -ATOM 630 C2 FA4 A 158 17.415 24.082 6.500 1.00 0.00 FA4 C -ATOM 631 C3 FA4 A 158 19.225 25.502 7.539 1.00 0.00 FA4 C -ATOM 632 C4 FA4 A 158 20.333 25.716 8.587 1.00 0.00 FA4 C -ATOM 633 C1 FA4 A 159 19.699 3.920 19.224 1.00 0.00 FA4 C -ATOM 634 C2 FA4 A 159 20.257 5.007 18.287 1.00 0.00 FA4 C -ATOM 635 C3 FA4 A 159 18.210 4.085 19.584 1.00 0.00 FA4 C -ATOM 636 C4 FA4 A 159 17.921 5.364 20.391 1.00 0.00 FA4 C -ATOM 637 C1 FA4 A 160 3.246 8.075 14.921 1.00 0.00 FA4 C -ATOM 638 C2 FA4 A 160 2.258 7.276 15.790 1.00 0.00 FA4 C -ATOM 639 C3 FA4 A 160 3.761 7.376 13.649 1.00 0.00 FA4 C -ATOM 640 C4 FA4 A 160 4.270 8.472 12.695 1.00 0.00 FA4 C -ATOM 641 C1 FA4 A 161 22.208 0.367 22.203 1.00 0.00 FA4 C -ATOM 642 C2 FA4 A 161 21.229 -0.536 21.430 1.00 0.00 FA4 C -ATOM 643 C3 FA4 A 161 23.700 -0.011 22.190 1.00 0.00 FA4 C -ATOM 644 C4 FA4 A 161 24.381 0.684 23.384 1.00 0.00 FA4 C -ATOM 645 C1 FA4 A 162 7.043 22.700 32.500 1.00 0.00 FA4 C -ATOM 646 C2 FA4 A 162 6.178 23.861 33.026 1.00 0.00 FA4 C -ATOM 647 C3 FA4 A 162 6.393 21.393 32.992 1.00 0.00 FA4 C -ATOM 648 C4 FA4 A 162 7.306 20.156 32.898 1.00 0.00 FA4 C -ATOM 649 C1 C4A B 1 33.443 6.833 22.082 1.00 0.00 C4A C -ATOM 650 C2 C4A B 1 34.339 7.481 23.154 1.00 0.00 C4A C -ATOM 651 C3 C4A B 1 34.234 6.533 20.796 1.00 0.00 C4A C -ATOM 652 C4 C4A B 1 34.938 7.642 19.991 1.00 0.00 C4A C -ATOM 653 C1 C4A B 2 28.490 28.914 11.542 1.00 0.00 C4A C -ATOM 654 C2 C4A B 2 28.306 29.004 13.068 1.00 0.00 C4A C -ATOM 655 C3 C4A B 2 29.825 28.236 11.181 1.00 0.00 C4A C -ATOM 656 C4 C4A B 2 30.982 29.144 11.635 1.00 0.00 C4A C -ATOM 657 C1 C4A B 3 32.329 28.698 13.518 1.00 0.00 C4A C -ATOM 658 C2 C4A B 3 32.058 29.064 14.989 1.00 0.00 C4A C -ATOM 659 C3 C4A B 3 31.561 29.662 12.595 1.00 0.00 C4A C -ATOM 660 C4 C4A B 3 31.922 29.748 11.100 1.00 0.00 C4A C -ATOM 661 C1 C4A B 4 23.359 30.738 4.776 1.00 0.00 C4A C -ATOM 662 C2 C4A B 4 22.439 31.973 4.750 1.00 0.00 C4A C -ATOM 663 C3 C4A B 4 24.059 30.359 3.458 1.00 0.00 C4A C -ATOM 664 C4 C4A B 4 25.060 31.379 2.884 1.00 0.00 C4A C -ATOM 665 C1 C4A B 5 25.284 17.709 23.704 1.00 0.00 C4A C -ATOM 666 C2 C4A B 5 26.098 19.011 23.822 1.00 0.00 C4A C -ATOM 667 C3 C4A B 5 24.582 17.190 24.973 1.00 0.00 C4A C -ATOM 668 C4 C4A B 5 24.212 15.710 25.181 1.00 0.00 C4A C -ATOM 669 C1 C4A B 6 31.526 8.705 22.001 1.00 0.00 C4A C -ATOM 670 C2 C4A B 6 32.517 9.830 21.647 1.00 0.00 C4A C -ATOM 671 C3 C4A B 6 31.769 7.293 21.437 1.00 0.00 C4A C -ATOM 672 C4 C4A B 6 32.208 7.074 19.977 1.00 0.00 C4A C -ATOM 673 C1 C4A B 7 11.124 29.483 32.196 1.00 0.00 C4A C -ATOM 674 C2 C4A B 7 9.590 29.472 32.060 1.00 0.00 C4A C -ATOM 675 C3 C4A B 7 11.990 30.005 31.035 1.00 0.00 C4A C -ATOM 676 C4 C4A B 7 11.542 29.429 29.678 1.00 0.00 C4A C -ATOM 677 C1 C4A B 8 8.462 29.087 19.718 1.00 0.00 C4A C -ATOM 678 C2 C4A B 8 8.843 29.042 21.210 1.00 0.00 C4A C -ATOM 679 C3 C4A B 8 8.360 30.540 19.219 1.00 0.00 C4A C -ATOM 680 C4 C4A B 8 8.047 30.669 17.716 1.00 0.00 C4A C -ATOM 681 C1 C4A B 9 -0.210 9.655 14.726 1.00 0.00 C4A C -ATOM 682 C2 C4A B 9 -1.153 8.461 14.484 1.00 0.00 C4A C -ATOM 683 C3 C4A B 9 1.190 9.159 14.319 1.00 0.00 C4A C -ATOM 684 C4 C4A B 9 2.223 10.139 14.905 1.00 0.00 C4A C -ATOM 685 C1 C4A B 10 11.332 32.272 -0.386 1.00 0.00 C4A C -ATOM 686 C2 C4A B 10 12.848 32.086 -0.190 1.00 0.00 C4A C -ATOM 687 C3 C4A B 10 10.575 33.143 0.634 1.00 0.00 C4A C -ATOM 688 C4 C4A B 10 9.247 33.701 0.090 1.00 0.00 C4A C -ATOM 689 C1 C4A B 11 27.514 20.513 28.509 1.00 0.00 C4A C -ATOM 690 C2 C4A B 11 27.634 18.981 28.418 1.00 0.00 C4A C -ATOM 691 C3 C4A B 11 27.757 21.097 29.913 1.00 0.00 C4A C -ATOM 692 C4 C4A B 11 27.503 22.614 29.993 1.00 0.00 C4A C -ATOM 693 C1 C4A B 12 16.774 31.629 26.518 1.00 0.00 C4A C -ATOM 694 C2 C4A B 12 17.333 30.339 25.891 1.00 0.00 C4A C -ATOM 695 C3 C4A B 12 16.950 31.764 28.042 1.00 0.00 C4A C -ATOM 696 C4 C4A B 12 18.405 32.091 28.429 1.00 0.00 C4A C -ATOM 697 C1 C4A B 13 14.945 18.886 31.789 1.00 0.00 C4A C -ATOM 698 C2 C4A B 13 14.296 20.275 31.931 1.00 0.00 C4A C -ATOM 699 C3 C4A B 13 15.388 18.623 30.338 1.00 0.00 C4A C -ATOM 700 C4 C4A B 13 16.329 17.414 30.185 1.00 0.00 C4A C -ATOM 701 C1 C4A B 14 17.581 2.099 9.877 1.00 0.00 C4A C -ATOM 702 C2 C4A B 14 17.651 0.854 10.782 1.00 0.00 C4A C -ATOM 703 C3 C4A B 14 18.728 1.972 8.858 1.00 0.00 C4A C -ATOM 704 C4 C4A B 14 19.024 3.269 8.082 1.00 0.00 C4A C -ATOM 705 C1 C4A B 15 25.374 27.087 19.450 1.00 0.00 C4A C -ATOM 706 C2 C4A B 15 24.783 25.688 19.708 1.00 0.00 C4A C -ATOM 707 C3 C4A B 15 25.177 28.162 20.535 1.00 0.00 C4A C -ATOM 708 C4 C4A B 15 25.050 29.583 19.955 1.00 0.00 C4A C -ATOM 709 C1 C4A B 16 13.533 0.311 25.658 1.00 0.00 C4A C -ATOM 710 C2 C4A B 16 13.179 0.922 24.290 1.00 0.00 C4A C -ATOM 711 C3 C4A B 16 14.930 0.779 26.109 1.00 0.00 C4A C -ATOM 712 C4 C4A B 16 15.235 0.685 27.615 1.00 0.00 C4A C -ATOM 713 C1 C4A B 17 9.866 20.069 27.132 1.00 0.00 C4A C -ATOM 714 C2 C4A B 17 11.315 19.793 27.573 1.00 0.00 C4A C -ATOM 715 C3 C4A B 17 8.805 19.954 28.242 1.00 0.00 C4A C -ATOM 716 C4 C4A B 17 7.371 20.296 27.797 1.00 0.00 C4A C -ATOM 717 C1 C4A B 18 22.166 25.422 5.617 1.00 0.00 C4A C -ATOM 718 C2 C4A B 18 21.750 26.213 4.363 1.00 0.00 C4A C -ATOM 719 C3 C4A B 18 23.516 25.853 6.219 1.00 0.00 C4A C -ATOM 720 C4 C4A B 18 23.899 25.360 7.626 1.00 0.00 C4A C -ATOM 721 C1 C4A B 19 22.538 19.215 11.702 1.00 0.00 C4A C -ATOM 722 C2 C4A B 19 22.446 17.699 11.961 1.00 0.00 C4A C -ATOM 723 C3 C4A B 19 23.358 19.733 12.897 1.00 0.00 C4A C -ATOM 724 C4 C4A B 19 23.251 21.224 13.268 1.00 0.00 C4A C -ATOM 725 C1 C4A B 20 24.941 2.080 14.917 1.00 0.00 C4A C -ATOM 726 C2 C4A B 20 25.687 3.162 14.113 1.00 0.00 C4A C -ATOM 727 C3 C4A B 20 25.694 0.841 15.436 1.00 0.00 C4A C -ATOM 728 C4 C4A B 20 27.129 1.161 15.895 1.00 0.00 C4A C -ATOM 729 C1 C4A B 21 19.354 21.252 33.566 1.00 0.00 C4A C -ATOM 730 C2 C4A B 21 19.888 22.646 33.187 1.00 0.00 C4A C -ATOM 731 C3 C4A B 21 19.998 20.490 34.739 1.00 0.00 C4A C -ATOM 732 C4 C4A B 21 21.471 20.099 34.519 1.00 0.00 C4A C -ATOM 733 C1 C4A B 22 18.060 8.830 11.008 1.00 0.00 C4A C -ATOM 734 C2 C4A B 22 17.059 10.000 10.986 1.00 0.00 C4A C -ATOM 735 C3 C4A B 22 17.914 7.688 9.985 1.00 0.00 C4A C -ATOM 736 C4 C4A B 22 19.148 6.767 9.992 1.00 0.00 C4A C -ATOM 737 C1 C4A B 23 21.429 24.700 16.624 1.00 0.00 C4A C -ATOM 738 C2 C4A B 23 20.029 25.160 16.176 1.00 0.00 C4A C -ATOM 739 C3 C4A B 23 22.437 24.862 15.470 1.00 0.00 C4A C -ATOM 740 C4 C4A B 23 22.424 26.210 14.726 1.00 0.00 C4A C -ATOM 741 C1 C4A B 24 34.324 29.228 13.329 1.00 0.00 C4A C -ATOM 742 C2 C4A B 24 32.897 28.850 12.892 1.00 0.00 C4A C -ATOM 743 C3 C4A B 24 34.703 30.711 13.152 1.00 0.00 C4A C -ATOM 744 C4 C4A B 24 35.858 31.284 13.994 1.00 0.00 C4A C -ATOM 745 C1 C4A B 25 9.999 2.579 30.871 1.00 0.00 C4A C -ATOM 746 C2 C4A B 25 9.214 2.772 32.182 1.00 0.00 C4A C -ATOM 747 C3 C4A B 25 9.486 3.540 29.783 1.00 0.00 C4A C -ATOM 748 C4 C4A B 25 10.685 4.197 29.074 1.00 0.00 C4A C -ATOM 749 C1 C4A B 26 21.163 34.031 12.830 1.00 0.00 C4A C -ATOM 750 C2 C4A B 26 19.897 34.291 13.666 1.00 0.00 C4A C -ATOM 751 C3 C4A B 26 20.741 32.997 11.769 1.00 0.00 C4A C -ATOM 752 C4 C4A B 26 21.523 32.952 10.443 1.00 0.00 C4A C -ATOM 753 C1 C4A B 27 19.541 17.045 18.252 1.00 0.00 C4A C -ATOM 754 C2 C4A B 27 20.280 16.727 16.939 1.00 0.00 C4A C -ATOM 755 C3 C4A B 27 20.230 18.106 19.130 1.00 0.00 C4A C -ATOM 756 C4 C4A B 27 19.591 18.774 20.361 1.00 0.00 C4A C -ATOM 757 C1 C4A B 28 33.706 31.356 13.971 1.00 0.00 C4A C -ATOM 758 C2 C4A B 28 34.921 31.027 13.084 1.00 0.00 C4A C -ATOM 759 C3 C4A B 28 32.328 31.390 13.285 1.00 0.00 C4A C -ATOM 760 C4 C4A B 28 31.223 32.038 14.139 1.00 0.00 C4A C -ATOM 761 C1 C4A B 29 1.603 8.594 23.110 1.00 0.00 C4A C -ATOM 762 C2 C4A B 29 2.861 9.087 22.370 1.00 0.00 C4A C -ATOM 763 C3 C4A B 29 1.140 9.538 24.235 1.00 0.00 C4A C -ATOM 764 C4 C4A B 29 2.027 9.529 25.494 1.00 0.00 C4A C -ATOM 765 C1 C4A B 30 20.362 0.499 14.527 1.00 0.00 C4A C -ATOM 766 C2 C4A B 30 19.713 -0.671 13.765 1.00 0.00 C4A C -ATOM 767 C3 C4A B 30 19.725 0.876 15.877 1.00 0.00 C4A C -ATOM 768 C4 C4A B 30 18.404 1.667 15.905 1.00 0.00 C4A C -ATOM 769 C1 C4A B 31 7.780 28.671 29.611 1.00 0.00 C4A C -ATOM 770 C2 C4A B 31 8.381 27.472 30.368 1.00 0.00 C4A C -ATOM 771 C3 C4A B 31 6.242 28.719 29.658 1.00 0.00 C4A C -ATOM 772 C4 C4A B 31 5.474 29.772 28.838 1.00 0.00 C4A C -ATOM 773 C1 C4A B 32 3.878 25.304 31.437 1.00 0.00 C4A C -ATOM 774 C2 C4A B 32 5.334 25.085 30.987 1.00 0.00 C4A C -ATOM 775 C3 C4A B 32 3.169 26.442 30.681 1.00 0.00 C4A C -ATOM 776 C4 C4A B 32 2.890 26.119 29.201 1.00 0.00 C4A C -ATOM 777 C1 C4A B 33 34.818 14.346 19.275 1.00 0.00 C4A C -ATOM 778 C2 C4A B 33 36.310 14.542 19.602 1.00 0.00 C4A C -ATOM 779 C3 C4A B 33 33.991 15.031 20.380 1.00 0.00 C4A C -ATOM 780 C4 C4A B 33 34.117 16.563 20.461 1.00 0.00 C4A C -ATOM 781 C1 C4A B 34 26.806 3.058 35.058 1.00 0.00 C4A C -ATOM 782 C2 C4A B 34 27.165 1.957 36.074 1.00 0.00 C4A C -ATOM 783 C3 C4A B 34 25.692 2.644 34.078 1.00 0.00 C4A C -ATOM 784 C4 C4A B 34 24.288 2.301 34.609 1.00 0.00 C4A C -ATOM 785 C1 C4A B 35 22.079 5.783 29.029 1.00 0.00 C4A C -ATOM 786 C2 C4A B 35 21.611 6.146 27.607 1.00 0.00 C4A C -ATOM 787 C3 C4A B 35 22.556 4.323 29.139 1.00 0.00 C4A C -ATOM 788 C4 C4A B 35 22.631 3.500 30.438 1.00 0.00 C4A C -ATOM 789 C1 C4A B 36 16.168 8.842 19.673 1.00 0.00 C4A C -ATOM 790 C2 C4A B 36 15.553 8.465 18.313 1.00 0.00 C4A C -ATOM 791 C3 C4A B 36 17.687 8.656 19.852 1.00 0.00 C4A C -ATOM 792 C4 C4A B 36 18.338 8.654 21.247 1.00 0.00 C4A C -ATOM 793 C1 C4A B 37 31.794 2.476 5.969 1.00 0.00 C4A C -ATOM 794 C2 C4A B 37 32.400 3.471 4.962 1.00 0.00 C4A C -ATOM 795 C3 C4A B 37 31.774 1.038 5.416 1.00 0.00 C4A C -ATOM 796 C4 C4A B 37 31.494 -0.103 6.410 1.00 0.00 C4A C -ATOM 797 C1 C4A B 38 -0.012 22.117 25.842 1.00 0.00 C4A C -ATOM 798 C2 C4A B 38 -1.115 21.042 25.850 1.00 0.00 C4A C -ATOM 799 C3 C4A B 38 0.538 22.383 24.428 1.00 0.00 C4A C -ATOM 800 C4 C4A B 38 1.457 23.607 24.258 1.00 0.00 C4A C -ATOM 801 C1 C4A B 39 4.762 33.913 9.805 1.00 0.00 C4A C -ATOM 802 C2 C4A B 39 4.990 35.436 9.806 1.00 0.00 C4A C -ATOM 803 C3 C4A B 39 5.035 33.236 11.161 1.00 0.00 C4A C -ATOM 804 C4 C4A B 39 4.293 31.906 11.392 1.00 0.00 C4A C -ATOM 805 C1 C4A B 40 34.597 27.258 9.404 1.00 0.00 C4A C -ATOM 806 C2 C4A B 40 33.738 25.980 9.437 1.00 0.00 C4A C -ATOM 807 C3 C4A B 40 34.761 27.895 10.796 1.00 0.00 C4A C -ATOM 808 C4 C4A B 40 35.903 28.928 10.789 1.00 0.00 C4A C -ATOM 809 C1 C4A B 41 13.147 18.795 22.047 1.00 0.00 C4A C -ATOM 810 C2 C4A B 41 11.931 18.899 22.986 1.00 0.00 C4A C -ATOM 811 C3 C4A B 41 14.316 19.745 22.370 1.00 0.00 C4A C -ATOM 812 C4 C4A B 41 15.734 19.315 21.950 1.00 0.00 C4A C -ATOM 813 C1 C4A B 42 32.574 13.094 25.948 1.00 0.00 C4A C -ATOM 814 C2 C4A B 42 31.764 14.098 26.789 1.00 0.00 C4A C -ATOM 815 C3 C4A B 42 33.467 13.506 24.763 1.00 0.00 C4A C -ATOM 816 C4 C4A B 42 34.287 12.328 24.205 1.00 0.00 C4A C -ATOM 817 C1 C4A B 43 9.401 8.422 13.986 1.00 0.00 C4A C -ATOM 818 C2 C4A B 43 10.128 7.242 13.315 1.00 0.00 C4A C -ATOM 819 C3 C4A B 43 8.289 9.182 13.240 1.00 0.00 C4A C -ATOM 820 C4 C4A B 43 8.556 9.458 11.749 1.00 0.00 C4A C -ATOM 821 C1 C4A B 44 33.938 7.130 11.869 1.00 0.00 C4A C -ATOM 822 C2 C4A B 44 33.843 7.220 10.334 1.00 0.00 C4A C -ATOM 823 C3 C4A B 44 33.842 8.565 12.422 1.00 0.00 C4A C -ATOM 824 C4 C4A B 44 33.327 8.688 13.868 1.00 0.00 C4A C -ATOM 825 C1 C4A B 45 33.085 33.886 16.195 1.00 0.00 C4A C -ATOM 826 C2 C4A B 45 32.480 32.535 15.771 1.00 0.00 C4A C -ATOM 827 C3 C4A B 45 34.486 33.775 16.825 1.00 0.00 C4A C -ATOM 828 C4 C4A B 45 35.633 33.401 15.868 1.00 0.00 C4A C -ATOM 829 C1 C4A B 46 24.022 13.017 26.084 1.00 0.00 C4A C -ATOM 830 C2 C4A B 46 24.421 12.938 24.598 1.00 0.00 C4A C -ATOM 831 C3 C4A B 46 25.152 12.717 27.087 1.00 0.00 C4A C -ATOM 832 C4 C4A B 46 24.751 13.396 28.410 1.00 0.00 C4A C -ATOM 833 C1 C4A B 47 19.602 4.373 10.323 1.00 0.00 C4A C -ATOM 834 C2 C4A B 47 20.756 5.125 9.634 1.00 0.00 C4A C -ATOM 835 C3 C4A B 47 19.642 4.382 11.862 1.00 0.00 C4A C -ATOM 836 C4 C4A B 47 18.194 4.073 12.286 1.00 0.00 C4A C -ATOM 837 C1 C4A B 48 17.372 10.115 0.483 1.00 0.00 C4A C -ATOM 838 C2 C4A B 48 18.364 9.180 1.201 1.00 0.00 C4A C -ATOM 839 C3 C4A B 48 17.495 11.626 0.755 1.00 0.00 C4A C -ATOM 840 C4 C4A B 48 16.473 12.507 0.013 1.00 0.00 C4A C -ATOM 841 C1 C4A B 49 27.838 1.776 26.726 1.00 0.00 C4A C -ATOM 842 C2 C4A B 49 28.640 1.424 25.459 1.00 0.00 C4A C -ATOM 843 C3 C4A B 49 26.395 2.283 26.541 1.00 0.00 C4A C -ATOM 844 C4 C4A B 49 25.705 2.517 27.898 1.00 0.00 C4A C -ATOM 845 C1 C4A B 50 32.559 35.216 29.419 1.00 0.00 C4A C -ATOM 846 C2 C4A B 50 32.271 36.624 28.865 1.00 0.00 C4A C -ATOM 847 C3 C4A B 50 31.506 34.661 30.397 1.00 0.00 C4A C -ATOM 848 C4 C4A B 50 31.811 33.292 31.033 1.00 0.00 C4A C -ATOM 849 C1 C4A B 51 0.230 7.869 0.960 1.00 0.00 C4A C -ATOM 850 C2 C4A B 51 -0.142 7.047 -0.288 1.00 0.00 C4A C -ATOM 851 C3 C4A B 51 1.209 9.040 0.756 1.00 0.00 C4A C -ATOM 852 C4 C4A B 51 1.716 9.782 2.006 1.00 0.00 C4A C -ATOM 853 C1 C4A B 52 23.748 4.877 27.903 1.00 0.00 C4A C -ATOM 854 C2 C4A B 52 24.766 3.731 28.054 1.00 0.00 C4A C -ATOM 855 C3 C4A B 52 23.922 5.661 26.589 1.00 0.00 C4A C -ATOM 856 C4 C4A B 52 23.256 7.049 26.551 1.00 0.00 C4A C -ATOM 857 C1 C4A B 53 26.573 14.592 31.494 1.00 0.00 C4A C -ATOM 858 C2 C4A B 53 27.963 13.933 31.575 1.00 0.00 C4A C -ATOM 859 C3 C4A B 53 26.422 16.002 32.095 1.00 0.00 C4A C -ATOM 860 C4 C4A B 53 25.016 16.616 31.968 1.00 0.00 C4A C -ATOM 861 C1 C4A B 54 7.049 11.503 14.321 1.00 0.00 C4A C -ATOM 862 C2 C4A B 54 5.979 10.972 13.349 1.00 0.00 C4A C -ATOM 863 C3 C4A B 54 7.692 10.465 15.260 1.00 0.00 C4A C -ATOM 864 C4 C4A B 54 8.971 10.998 15.931 1.00 0.00 C4A C -ATOM 865 C1 C4A B 55 30.386 5.916 27.498 1.00 0.00 C4A C -ATOM 866 C2 C4A B 55 29.769 7.324 27.587 1.00 0.00 C4A C -ATOM 867 C3 C4A B 55 30.889 5.294 28.814 1.00 0.00 C4A C -ATOM 868 C4 C4A B 55 31.226 3.793 28.747 1.00 0.00 C4A C -ATOM 869 C1 C4A B 56 10.958 0.382 16.176 1.00 0.00 C4A C -ATOM 870 C2 C4A B 56 11.000 0.206 14.646 1.00 0.00 C4A C -ATOM 871 C3 C4A B 56 11.327 1.751 16.777 1.00 0.00 C4A C -ATOM 872 C4 C4A B 56 12.722 2.256 16.363 1.00 0.00 C4A C -ATOM 873 C1 C4A B 57 33.637 33.860 12.411 1.00 0.00 C4A C -ATOM 874 C2 C4A B 57 34.943 34.671 12.501 1.00 0.00 C4A C -ATOM 875 C3 C4A B 57 32.877 34.054 13.737 1.00 0.00 C4A C -ATOM 876 C4 C4A B 57 31.491 33.390 13.645 1.00 0.00 C4A C -ATOM 877 C1 C4A B 58 8.057 21.137 32.163 1.00 0.00 C4A C -ATOM 878 C2 C4A B 58 7.061 22.199 32.665 1.00 0.00 C4A C -ATOM 879 C3 C4A B 58 8.317 19.802 32.884 1.00 0.00 C4A C -ATOM 880 C4 C4A B 58 9.386 19.016 32.102 1.00 0.00 C4A C -ATOM 881 C1 C4A B 59 33.812 32.169 11.154 1.00 0.00 C4A C -ATOM 882 C2 C4A B 59 32.840 31.365 12.036 1.00 0.00 C4A C -ATOM 883 C3 C4A B 59 34.599 31.025 10.486 1.00 0.00 C4A C -ATOM 884 C4 C4A B 59 34.076 30.793 9.056 1.00 0.00 C4A C -ATOM 885 C1 C4A B 60 19.837 32.561 4.509 1.00 0.00 C4A C -ATOM 886 C2 C4A B 60 19.818 34.031 4.969 1.00 0.00 C4A C -ATOM 887 C3 C4A B 60 20.500 31.602 5.516 1.00 0.00 C4A C -ATOM 888 C4 C4A B 60 20.369 30.097 5.215 1.00 0.00 C4A C -ATOM 889 C1 C4A B 61 8.575 6.611 10.293 1.00 0.00 C4A C -ATOM 890 C2 C4A B 61 8.361 6.597 8.768 1.00 0.00 C4A C -ATOM 891 C3 C4A B 61 8.956 5.229 10.855 1.00 0.00 C4A C -ATOM 892 C4 C4A B 61 8.871 5.194 12.392 1.00 0.00 C4A C -ATOM 893 C1 C4A B 62 9.726 3.886 31.522 1.00 0.00 C4A C -ATOM 894 C2 C4A B 62 9.792 2.849 30.385 1.00 0.00 C4A C -ATOM 895 C3 C4A B 62 10.550 3.538 32.776 1.00 0.00 C4A C -ATOM 896 C4 C4A B 62 10.165 4.373 34.012 1.00 0.00 C4A C -ATOM 897 C1 C4A B 63 30.845 14.862 12.024 1.00 0.00 C4A C -ATOM 898 C2 C4A B 63 30.544 15.712 13.272 1.00 0.00 C4A C -ATOM 899 C3 C4A B 63 29.832 13.739 11.734 1.00 0.00 C4A C -ATOM 900 C4 C4A B 63 30.232 12.697 10.672 1.00 0.00 C4A C -ATOM 901 C1 C4A B 64 4.487 14.130 9.101 1.00 0.00 C4A C -ATOM 902 C2 C4A B 64 3.867 14.360 10.492 1.00 0.00 C4A C -ATOM 903 C3 C4A B 64 6.023 14.180 9.191 1.00 0.00 C4A C -ATOM 904 C4 C4A B 64 6.402 15.410 10.037 1.00 0.00 C4A C -ATOM 905 C1 C4A B 65 30.478 5.837 8.253 1.00 0.00 C4A C -ATOM 906 C2 C4A B 65 29.776 5.230 9.481 1.00 0.00 C4A C -ATOM 907 C3 C4A B 65 29.956 7.270 8.038 1.00 0.00 C4A C -ATOM 908 C4 C4A B 65 28.469 7.307 7.643 1.00 0.00 C4A C -ATOM 909 C1 C4A B 66 5.420 21.240 13.828 1.00 0.00 C4A C -ATOM 910 C2 C4A B 66 6.300 20.106 13.272 1.00 0.00 C4A C -ATOM 911 C3 C4A B 66 5.338 22.424 12.846 1.00 0.00 C4A C -ATOM 912 C4 C4A B 66 4.163 22.300 11.857 1.00 0.00 C4A C -ATOM 913 C1 C4A B 67 34.275 2.635 12.317 1.00 0.00 C4A C -ATOM 914 C2 C4A B 67 33.354 3.359 11.318 1.00 0.00 C4A C -ATOM 915 C3 C4A B 67 33.744 1.202 12.508 1.00 0.00 C4A C -ATOM 916 C4 C4A B 67 34.674 0.508 13.521 1.00 0.00 C4A C -ATOM 917 C1 C4A B 68 10.386 33.030 12.576 1.00 0.00 C4A C -ATOM 918 C2 C4A B 68 10.169 32.057 13.750 1.00 0.00 C4A C -ATOM 919 C3 C4A B 68 9.138 33.613 11.888 1.00 0.00 C4A C -ATOM 920 C4 C4A B 68 8.589 32.729 10.752 1.00 0.00 C4A C -ATOM 921 C1 C4A B 69 26.701 33.673 12.820 1.00 0.00 C4A C -ATOM 922 C2 C4A B 69 26.553 35.017 13.558 1.00 0.00 C4A C -ATOM 923 C3 C4A B 69 28.194 33.464 12.506 1.00 0.00 C4A C -ATOM 924 C4 C4A B 69 28.594 32.033 12.100 1.00 0.00 C4A C -ATOM 925 C1 C4A B 70 24.001 7.105 8.832 1.00 0.00 C4A C -ATOM 926 C2 C4A B 70 22.800 6.867 7.898 1.00 0.00 C4A C -ATOM 927 C3 C4A B 70 23.778 8.304 9.773 1.00 0.00 C4A C -ATOM 928 C4 C4A B 70 25.043 8.888 10.428 1.00 0.00 C4A C -ATOM 929 C1 C4A B 71 13.752 13.916 29.729 1.00 0.00 C4A C -ATOM 930 C2 C4A B 71 15.236 14.292 29.897 1.00 0.00 C4A C -ATOM 931 C3 C4A B 71 12.765 14.641 30.663 1.00 0.00 C4A C -ATOM 932 C4 C4A B 71 11.461 13.905 31.023 1.00 0.00 C4A C -ATOM 933 C1 C4A B 72 28.235 30.038 8.738 1.00 0.00 C4A C -ATOM 934 C2 C4A B 72 27.742 29.776 10.173 1.00 0.00 C4A C -ATOM 935 C3 C4A B 72 29.261 29.111 8.059 1.00 0.00 C4A C -ATOM 936 C4 C4A B 72 29.007 27.595 8.146 1.00 0.00 C4A C -ATOM 937 C1 C4A B 73 20.577 1.036 16.496 1.00 0.00 C4A C -ATOM 938 C2 C4A B 73 19.159 0.464 16.318 1.00 0.00 C4A C -ATOM 939 C3 C4A B 73 20.608 2.542 16.818 1.00 0.00 C4A C -ATOM 940 C4 C4A B 73 19.716 2.854 18.034 1.00 0.00 C4A C -ATOM 941 C1 C4A B 74 12.120 29.384 0.867 1.00 0.00 C4A C -ATOM 942 C2 C4A B 74 11.759 27.984 0.336 1.00 0.00 C4A C -ATOM 943 C3 C4A B 74 11.057 30.400 1.325 1.00 0.00 C4A C -ATOM 944 C4 C4A B 74 11.489 31.236 2.544 1.00 0.00 C4A C -ATOM 945 C1 C4A B 75 1.877 24.854 5.963 1.00 0.00 C4A C -ATOM 946 C2 C4A B 75 3.364 24.568 5.680 1.00 0.00 C4A C -ATOM 947 C3 C4A B 75 1.213 23.948 7.016 1.00 0.00 C4A C -ATOM 948 C4 C4A B 75 0.903 24.484 8.426 1.00 0.00 C4A C -ATOM 949 C1 C4A B 76 19.321 27.955 14.145 1.00 0.00 C4A C -ATOM 950 C2 C4A B 76 18.324 27.749 12.989 1.00 0.00 C4A C -ATOM 951 C3 C4A B 76 18.678 27.834 15.539 1.00 0.00 C4A C -ATOM 952 C4 C4A B 76 19.750 27.734 16.640 1.00 0.00 C4A C -ATOM 953 C1 C4A B 77 13.898 17.440 6.089 1.00 0.00 C4A C -ATOM 954 C2 C4A B 77 15.437 17.476 6.131 1.00 0.00 C4A C -ATOM 955 C3 C4A B 77 13.115 16.782 4.938 1.00 0.00 C4A C -ATOM 956 C4 C4A B 77 13.266 15.250 4.928 1.00 0.00 C4A C -ATOM 957 C1 C4A B 78 29.620 33.917 16.970 1.00 0.00 C4A C -ATOM 958 C2 C4A B 78 28.516 34.926 17.339 1.00 0.00 C4A C -ATOM 959 C3 C4A B 78 29.566 33.461 15.500 1.00 0.00 C4A C -ATOM 960 C4 C4A B 78 30.733 32.568 15.038 1.00 0.00 C4A C -ATOM 961 C1 C4A B 79 4.763 10.308 19.521 1.00 0.00 C4A C -ATOM 962 C2 C4A B 79 3.755 10.533 18.378 1.00 0.00 C4A C -ATOM 963 C3 C4A B 79 5.725 11.509 19.446 1.00 0.00 C4A C -ATOM 964 C4 C4A B 79 6.728 11.584 18.280 1.00 0.00 C4A C -ATOM 965 C1 C4A B 80 20.819 4.624 22.755 1.00 0.00 C4A C -ATOM 966 C2 C4A B 80 20.523 3.113 22.714 1.00 0.00 C4A C -ATOM 967 C3 C4A B 80 20.109 5.363 23.904 1.00 0.00 C4A C -ATOM 968 C4 C4A B 80 18.608 5.691 23.808 1.00 0.00 C4A C -ATOM 969 C1 C4A B 81 10.546 17.956 10.337 1.00 0.00 C4A C -ATOM 970 C2 C4A B 81 10.793 17.456 11.772 1.00 0.00 C4A C -ATOM 971 C3 C4A B 81 9.093 18.181 9.879 1.00 0.00 C4A C -ATOM 972 C4 C4A B 81 8.540 19.542 10.342 1.00 0.00 C4A C -ATOM 973 C1 C4A B 82 27.076 31.784 12.184 1.00 0.00 C4A C -ATOM 974 C2 C4A B 82 26.069 30.662 11.866 1.00 0.00 C4A C -ATOM 975 C3 C4A B 82 26.502 33.203 12.018 1.00 0.00 C4A C -ATOM 976 C4 C4A B 82 27.227 34.333 12.772 1.00 0.00 C4A C -ATOM 977 C1 C4A B 83 11.552 16.772 28.814 1.00 0.00 C4A C -ATOM 978 C2 C4A B 83 11.483 15.234 28.825 1.00 0.00 C4A C -ATOM 979 C3 C4A B 83 12.546 17.510 27.898 1.00 0.00 C4A C -ATOM 980 C4 C4A B 83 12.716 18.950 28.419 1.00 0.00 C4A C -ATOM 981 C1 C4A B 84 24.600 34.056 0.740 1.00 0.00 C4A C -ATOM 982 C2 C4A B 84 23.629 32.871 0.578 1.00 0.00 C4A C -ATOM 983 C3 C4A B 84 26.073 33.740 1.058 1.00 0.00 C4A C -ATOM 984 C4 C4A B 84 26.921 33.021 -0.008 1.00 0.00 C4A C -ATOM 985 C1 C4A B 85 28.275 30.121 25.241 1.00 0.00 C4A C -ATOM 986 C2 C4A B 85 28.691 30.853 23.952 1.00 0.00 C4A C -ATOM 987 C3 C4A B 85 26.782 29.924 25.562 1.00 0.00 C4A C -ATOM 988 C4 C4A B 85 26.374 28.956 26.688 1.00 0.00 C4A C -ATOM 989 C1 C4A B 86 11.114 21.249 1.376 1.00 0.00 C4A C -ATOM 990 C2 C4A B 86 9.707 21.454 1.967 1.00 0.00 C4A C -ATOM 991 C3 C4A B 86 11.353 19.827 0.836 1.00 0.00 C4A C -ATOM 992 C4 C4A B 86 12.864 19.540 0.747 1.00 0.00 C4A C -ATOM 993 C1 C4A B 87 28.959 19.074 34.983 1.00 0.00 C4A C -ATOM 994 C2 C4A B 87 28.341 20.203 35.829 1.00 0.00 C4A C -ATOM 995 C3 C4A B 87 29.463 19.446 33.577 1.00 0.00 C4A C -ATOM 996 C4 C4A B 87 29.952 18.152 32.900 1.00 0.00 C4A C -ATOM 997 C1 C4A B 88 29.876 10.301 28.625 1.00 0.00 C4A C -ATOM 998 C2 C4A B 88 29.559 8.980 27.900 1.00 0.00 C4A C -ATOM 999 C3 C4A B 88 29.885 10.145 30.157 1.00 0.00 C4A C -ATOM 1000 C4 C4A B 88 28.470 9.780 30.643 1.00 0.00 C4A C -ATOM 1001 C1 C4A B 89 24.470 1.990 2.998 1.00 0.00 C4A C -ATOM 1002 C2 C4A B 89 24.382 0.566 2.417 1.00 0.00 C4A C -ATOM 1003 C3 C4A B 89 23.916 3.015 1.991 1.00 0.00 C4A C -ATOM 1004 C4 C4A B 89 23.725 4.472 2.454 1.00 0.00 C4A C -ATOM 1005 C1 C4A B 90 34.879 11.093 30.141 1.00 0.00 C4A C -ATOM 1006 C2 C4A B 90 36.160 11.321 30.966 1.00 0.00 C4A C -ATOM 1007 C3 C4A B 90 33.762 10.456 30.987 1.00 0.00 C4A C -ATOM 1008 C4 C4A B 90 34.107 9.011 31.394 1.00 0.00 C4A C -ATOM 1009 C1 C4A B 91 20.147 13.145 14.796 1.00 0.00 C4A C -ATOM 1010 C2 C4A B 91 19.951 14.543 15.411 1.00 0.00 C4A C -ATOM 1011 C3 C4A B 91 21.532 12.565 14.452 1.00 0.00 C4A C -ATOM 1012 C4 C4A B 91 21.528 11.262 13.631 1.00 0.00 C4A C -ATOM 1013 C1 C4A B 92 9.770 19.310 5.461 1.00 0.00 C4A C -ATOM 1014 C2 C4A B 92 11.236 18.855 5.583 1.00 0.00 C4A C -ATOM 1015 C3 C4A B 92 9.036 18.987 6.776 1.00 0.00 C4A C -ATOM 1016 C4 C4A B 92 9.603 19.812 7.945 1.00 0.00 C4A C -ATOM 1017 C1 C4A B 93 31.336 1.742 15.400 1.00 0.00 C4A C -ATOM 1018 C2 C4A B 93 31.086 2.030 16.892 1.00 0.00 C4A C -ATOM 1019 C3 C4A B 93 31.838 2.995 14.657 1.00 0.00 C4A C -ATOM 1020 C4 C4A B 93 33.234 3.554 14.987 1.00 0.00 C4A C -ATOM 1021 C1 C4A B 94 13.440 21.342 18.997 1.00 0.00 C4A C -ATOM 1022 C2 C4A B 94 12.031 21.845 19.363 1.00 0.00 C4A C -ATOM 1023 C3 C4A B 94 13.452 20.096 18.091 1.00 0.00 C4A C -ATOM 1024 C4 C4A B 94 14.853 19.669 17.615 1.00 0.00 C4A C -ATOM 1025 C1 C4A B 95 14.520 26.024 33.685 1.00 0.00 C4A C -ATOM 1026 C2 C4A B 95 13.140 26.521 34.156 1.00 0.00 C4A C -ATOM 1027 C3 C4A B 95 15.415 25.322 34.723 1.00 0.00 C4A C -ATOM 1028 C4 C4A B 95 16.759 24.748 34.238 1.00 0.00 C4A C -ATOM 1029 C1 C4A B 96 14.549 24.283 24.799 1.00 0.00 C4A C -ATOM 1030 C2 C4A B 96 15.457 24.829 25.917 1.00 0.00 C4A C -ATOM 1031 C3 C4A B 96 13.711 25.283 23.981 1.00 0.00 C4A C -ATOM 1032 C4 C4A B 96 12.721 26.162 24.767 1.00 0.00 C4A C -ATOM 1033 C1 C4A B 97 24.313 19.729 11.114 1.00 0.00 C4A C -ATOM 1034 C2 C4A B 97 24.560 19.071 12.484 1.00 0.00 C4A C -ATOM 1035 C3 C4A B 97 25.190 20.984 10.948 1.00 0.00 C4A C -ATOM 1036 C4 C4A B 97 26.624 20.496 11.227 1.00 0.00 C4A C -ATOM 1037 C1 C4A B 98 -0.359 29.315 15.883 1.00 0.00 C4A C -ATOM 1038 C2 C4A B 98 -0.905 30.170 17.042 1.00 0.00 C4A C -ATOM 1039 C3 C4A B 98 1.180 29.276 15.886 1.00 0.00 C4A C -ATOM 1040 C4 C4A B 98 1.889 28.234 15.002 1.00 0.00 C4A C -ATOM 1041 C1 C4A B 99 26.768 4.166 27.309 1.00 0.00 C4A C -ATOM 1042 C2 C4A B 99 28.272 4.095 27.634 1.00 0.00 C4A C -ATOM 1043 C3 C4A B 99 26.244 5.613 27.363 1.00 0.00 C4A C -ATOM 1044 C4 C4A B 99 24.758 5.853 27.040 1.00 0.00 C4A C -ATOM 1045 C1 C4A B 100 23.938 2.237 13.331 1.00 0.00 C4A C -ATOM 1046 C2 C4A B 100 23.974 3.776 13.383 1.00 0.00 C4A C -ATOM 1047 C3 C4A B 100 24.679 1.325 14.325 1.00 0.00 C4A C -ATOM 1048 C4 C4A B 100 24.899 -0.098 13.779 1.00 0.00 C4A C -ATOM 1049 C1 C4A B 101 13.302 21.179 25.130 1.00 0.00 C4A C -ATOM 1050 C2 C4A B 101 12.407 21.103 26.381 1.00 0.00 C4A C -ATOM 1051 C3 C4A B 101 14.753 21.692 25.180 1.00 0.00 C4A C -ATOM 1052 C4 C4A B 101 15.670 20.474 24.965 1.00 0.00 C4A C -ATOM 1053 C1 C4A B 102 11.312 2.863 -0.159 1.00 0.00 C4A C -ATOM 1054 C2 C4A B 102 12.534 3.705 -0.571 1.00 0.00 C4A C -ATOM 1055 C3 C4A B 102 9.879 3.425 -0.092 1.00 0.00 C4A C -ATOM 1056 C4 C4A B 102 9.683 4.634 0.841 1.00 0.00 C4A C -ATOM 1057 C1 C4A B 103 23.294 10.955 33.879 1.00 0.00 C4A C -ATOM 1058 C2 C4A B 103 22.037 11.673 33.355 1.00 0.00 C4A C -ATOM 1059 C3 C4A B 103 24.573 11.813 33.845 1.00 0.00 C4A C -ATOM 1060 C4 C4A B 103 24.741 12.974 34.843 1.00 0.00 C4A C -ATOM 1061 C1 C4A B 104 9.195 1.542 30.090 1.00 0.00 C4A C -ATOM 1062 C2 C4A B 104 9.049 2.179 28.696 1.00 0.00 C4A C -ATOM 1063 C3 C4A B 104 8.528 0.180 30.359 1.00 0.00 C4A C -ATOM 1064 C4 C4A B 104 7.013 0.006 30.141 1.00 0.00 C4A C -ATOM 1065 C1 C4A B 105 26.452 2.876 8.088 1.00 0.00 C4A C -ATOM 1066 C2 C4A B 105 25.507 2.905 6.873 1.00 0.00 C4A C -ATOM 1067 C3 C4A B 105 26.067 1.833 9.154 1.00 0.00 C4A C -ATOM 1068 C4 C4A B 105 26.145 0.410 8.572 1.00 0.00 C4A C -ATOM 1069 C1 C4A B 106 12.336 12.679 6.272 1.00 0.00 C4A C -ATOM 1070 C2 C4A B 106 11.262 11.727 5.713 1.00 0.00 C4A C -ATOM 1071 C3 C4A B 106 12.626 13.923 5.413 1.00 0.00 C4A C -ATOM 1072 C4 C4A B 106 11.676 15.098 5.711 1.00 0.00 C4A C -ATOM 1073 C1 C4A B 107 11.214 7.358 31.198 1.00 0.00 C4A C -ATOM 1074 C2 C4A B 107 12.333 6.443 31.730 1.00 0.00 C4A C -ATOM 1075 C3 C4A B 107 11.816 8.367 30.203 1.00 0.00 C4A C -ATOM 1076 C4 C4A B 107 10.743 9.380 29.764 1.00 0.00 C4A C -ATOM 1077 C1 C4A B 108 3.456 5.894 4.080 1.00 0.00 C4A C -ATOM 1078 C2 C4A B 108 2.737 6.826 3.086 1.00 0.00 C4A C -ATOM 1079 C3 C4A B 108 3.853 4.491 3.586 1.00 0.00 C4A C -ATOM 1080 C4 C4A B 108 4.668 3.593 4.536 1.00 0.00 C4A C -ATOM 1081 C1 C4A B 109 28.759 20.720 28.690 1.00 0.00 C4A C -ATOM 1082 C2 C4A B 109 29.078 21.202 30.117 1.00 0.00 C4A C -ATOM 1083 C3 C4A B 109 27.483 21.268 28.024 1.00 0.00 C4A C -ATOM 1084 C4 C4A B 109 27.733 22.625 27.340 1.00 0.00 C4A C -ATOM 1085 C1 C4A B 110 17.452 30.652 31.617 1.00 0.00 C4A C -ATOM 1086 C2 C4A B 110 18.758 30.050 32.167 1.00 0.00 C4A C -ATOM 1087 C3 C4A B 110 17.648 32.005 30.908 1.00 0.00 C4A C -ATOM 1088 C4 C4A B 110 16.763 33.113 31.508 1.00 0.00 C4A C -ATOM 1089 C1 C4A B 111 15.336 1.798 21.247 1.00 0.00 C4A C -ATOM 1090 C2 C4A B 111 15.698 3.205 20.736 1.00 0.00 C4A C -ATOM 1091 C3 C4A B 111 15.881 0.767 20.241 1.00 0.00 C4A C -ATOM 1092 C4 C4A B 111 15.519 -0.671 20.657 1.00 0.00 C4A C -ATOM 1093 C1 C4A B 112 15.518 31.588 28.576 1.00 0.00 C4A C -ATOM 1094 C2 C4A B 112 14.821 32.372 27.448 1.00 0.00 C4A C -ATOM 1095 C3 C4A B 112 16.306 30.432 27.931 1.00 0.00 C4A C -ATOM 1096 C4 C4A B 112 17.535 30.143 28.812 1.00 0.00 C4A C -ATOM 1097 C1 C4A B 113 3.180 27.190 33.386 1.00 0.00 C4A C -ATOM 1098 C2 C4A B 113 3.604 27.978 34.640 1.00 0.00 C4A C -ATOM 1099 C3 C4A B 113 3.088 28.008 32.085 1.00 0.00 C4A C -ATOM 1100 C4 C4A B 113 2.726 27.133 30.870 1.00 0.00 C4A C -ATOM 1101 C1 C4A B 114 10.951 5.018 17.444 1.00 0.00 C4A C -ATOM 1102 C2 C4A B 114 10.733 5.302 18.942 1.00 0.00 C4A C -ATOM 1103 C3 C4A B 114 12.451 4.930 17.107 1.00 0.00 C4A C -ATOM 1104 C4 C4A B 114 12.712 4.711 15.605 1.00 0.00 C4A C -ATOM 1105 C1 C4A B 115 4.368 25.583 24.413 1.00 0.00 C4A C -ATOM 1106 C2 C4A B 115 3.850 24.305 23.728 1.00 0.00 C4A C -ATOM 1107 C3 C4A B 115 3.506 26.772 23.950 1.00 0.00 C4A C -ATOM 1108 C4 C4A B 115 2.049 26.960 24.413 1.00 0.00 C4A C -ATOM 1109 C1 C4A B 116 29.693 10.649 32.519 1.00 0.00 C4A C -ATOM 1110 C2 C4A B 116 28.488 9.789 32.944 1.00 0.00 C4A C -ATOM 1111 C3 C4A B 116 30.938 10.248 33.331 1.00 0.00 C4A C -ATOM 1112 C4 C4A B 116 32.323 10.840 33.010 1.00 0.00 C4A C -ATOM 1113 C1 C4A B 117 3.508 11.262 12.442 1.00 0.00 C4A C -ATOM 1114 C2 C4A B 117 4.823 11.711 11.779 1.00 0.00 C4A C -ATOM 1115 C3 C4A B 117 3.558 10.801 13.911 1.00 0.00 C4A C -ATOM 1116 C4 C4A B 117 2.299 10.059 14.399 1.00 0.00 C4A C -ATOM 1117 C1 C4A B 118 26.755 22.431 19.073 1.00 0.00 C4A C -ATOM 1118 C2 C4A B 118 25.509 21.638 19.508 1.00 0.00 C4A C -ATOM 1119 C3 C4A B 118 26.832 23.924 19.444 1.00 0.00 C4A C -ATOM 1120 C4 C4A B 118 28.036 24.748 18.949 1.00 0.00 C4A C -ATOM 1121 C1 C4A B 119 32.093 11.757 8.765 1.00 0.00 C4A C -ATOM 1122 C2 C4A B 119 32.093 12.379 7.357 1.00 0.00 C4A C -ATOM 1123 C3 C4A B 119 31.110 10.586 8.951 1.00 0.00 C4A C -ATOM 1124 C4 C4A B 119 31.014 9.993 10.370 1.00 0.00 C4A C -ATOM 1125 C1 C4A B 120 10.672 17.636 22.533 1.00 0.00 C4A C -ATOM 1126 C2 C4A B 120 10.674 19.171 22.402 1.00 0.00 C4A C -ATOM 1127 C3 C4A B 120 11.240 16.811 21.364 1.00 0.00 C4A C -ATOM 1128 C4 C4A B 120 12.692 17.211 21.041 1.00 0.00 C4A C -ATOM 1129 C1 C4A B 121 13.268 13.369 6.351 1.00 0.00 C4A C -ATOM 1130 C2 C4A B 121 11.799 13.051 6.683 1.00 0.00 C4A C -ATOM 1131 C3 C4A B 121 14.075 12.073 6.146 1.00 0.00 C4A C -ATOM 1132 C4 C4A B 121 15.569 12.425 6.264 1.00 0.00 C4A C -ATOM 1133 C1 C4A B 122 28.385 5.405 26.787 1.00 0.00 C4A C -ATOM 1134 C2 C4A B 122 28.883 5.770 25.376 1.00 0.00 C4A C -ATOM 1135 C3 C4A B 122 28.089 3.894 26.830 1.00 0.00 C4A C -ATOM 1136 C4 C4A B 122 27.270 3.560 25.570 1.00 0.00 C4A C -ATOM 1137 C1 C4A B 123 5.775 16.771 9.371 1.00 0.00 C4A C -ATOM 1138 C2 C4A B 123 6.044 15.637 8.365 1.00 0.00 C4A C -ATOM 1139 C3 C4A B 123 6.977 17.071 10.286 1.00 0.00 C4A C -ATOM 1140 C4 C4A B 123 6.915 16.392 11.667 1.00 0.00 C4A C -ATOM 1141 C1 C4A B 124 16.629 0.457 12.463 1.00 0.00 C4A C -ATOM 1142 C2 C4A B 124 15.686 -0.373 11.573 1.00 0.00 C4A C -ATOM 1143 C3 C4A B 124 17.006 1.807 11.825 1.00 0.00 C4A C -ATOM 1144 C4 C4A B 124 17.658 2.736 12.866 1.00 0.00 C4A C -ATOM 1145 C1 C4A B 125 16.085 8.631 1.729 1.00 0.00 C4A C -ATOM 1146 C2 C4A B 125 16.214 10.132 1.410 1.00 0.00 C4A C -ATOM 1147 C3 C4A B 125 14.624 8.146 1.730 1.00 0.00 C4A C -ATOM 1148 C4 C4A B 125 14.496 6.640 2.027 1.00 0.00 C4A C -ATOM 1149 C1 C4A B 126 27.313 25.336 14.994 1.00 0.00 C4A C -ATOM 1150 C2 C4A B 126 28.705 24.846 14.554 1.00 0.00 C4A C -ATOM 1151 C3 C4A B 126 26.298 25.530 13.851 1.00 0.00 C4A C -ATOM 1152 C4 C4A B 126 25.626 24.257 13.306 1.00 0.00 C4A C -ATOM 1153 C1 C4A B 127 4.190 32.524 13.639 1.00 0.00 C4A C -ATOM 1154 C2 C4A B 127 4.590 31.714 12.392 1.00 0.00 C4A C -ATOM 1155 C3 C4A B 127 3.300 31.716 14.601 1.00 0.00 C4A C -ATOM 1156 C4 C4A B 127 3.811 30.413 15.243 1.00 0.00 C4A C -ATOM 1157 C1 C4A B 128 30.814 8.737 0.131 1.00 0.00 C4A C -ATOM 1158 C2 C4A B 128 30.692 7.228 0.411 1.00 0.00 C4A C -ATOM 1159 C3 C4A B 128 29.716 9.623 0.747 1.00 0.00 C4A C -ATOM 1160 C4 C4A B 128 29.856 11.090 0.299 1.00 0.00 C4A C -ATOM 1161 C1 C4A B 129 12.929 6.076 16.091 1.00 0.00 C4A C -ATOM 1162 C2 C4A B 129 13.363 7.550 15.990 1.00 0.00 C4A C -ATOM 1163 C3 C4A B 129 13.594 5.372 17.289 1.00 0.00 C4A C -ATOM 1164 C4 C4A B 129 12.944 4.017 17.627 1.00 0.00 C4A C -ATOM 1165 C1 C4A B 130 7.379 2.907 31.339 1.00 0.00 C4A C -ATOM 1166 C2 C4A B 130 7.186 3.729 32.627 1.00 0.00 C4A C -ATOM 1167 C3 C4A B 130 8.203 3.568 30.219 1.00 0.00 C4A C -ATOM 1168 C4 C4A B 130 8.624 2.556 29.138 1.00 0.00 C4A C -ATOM 1169 C1 C4A B 131 5.287 25.480 3.039 1.00 0.00 C4A C -ATOM 1170 C2 C4A B 131 5.148 25.327 4.565 1.00 0.00 C4A C -ATOM 1171 C3 C4A B 131 6.359 26.560 2.801 1.00 0.00 C4A C -ATOM 1172 C4 C4A B 131 6.216 27.410 1.525 1.00 0.00 C4A C -ATOM 1173 C1 C4A B 132 28.566 11.867 3.464 1.00 0.00 C4A C -ATOM 1174 C2 C4A B 132 28.394 10.858 2.314 1.00 0.00 C4A C -ATOM 1175 C3 C4A B 132 29.637 11.499 4.507 1.00 0.00 C4A C -ATOM 1176 C4 C4A B 132 30.007 12.811 5.223 1.00 0.00 C4A C -ATOM 1177 C1 C4A B 133 25.716 31.449 5.977 1.00 0.00 C4A C -ATOM 1178 C2 C4A B 133 26.315 30.489 7.023 1.00 0.00 C4A C -ATOM 1179 C3 C4A B 133 25.372 30.899 4.581 1.00 0.00 C4A C -ATOM 1180 C4 C4A B 133 24.738 31.924 3.622 1.00 0.00 C4A C -ATOM 1181 C1 C4A B 134 2.508 22.498 29.494 1.00 0.00 C4A C -ATOM 1182 C2 C4A B 134 2.910 23.984 29.494 1.00 0.00 C4A C -ATOM 1183 C3 C4A B 134 3.431 21.626 30.366 1.00 0.00 C4A C -ATOM 1184 C4 C4A B 134 4.881 21.518 29.861 1.00 0.00 C4A C -ATOM 1185 C1 C4A B 135 25.781 9.296 28.096 1.00 0.00 C4A C -ATOM 1186 C2 C4A B 135 24.384 9.375 28.739 1.00 0.00 C4A C -ATOM 1187 C3 C4A B 135 26.269 10.650 27.549 1.00 0.00 C4A C -ATOM 1188 C4 C4A B 135 27.518 10.381 26.689 1.00 0.00 C4A C -ATOM 1189 C1 C4A B 136 34.010 28.726 1.848 1.00 0.00 C4A C -ATOM 1190 C2 C4A B 136 34.784 29.408 2.990 1.00 0.00 C4A C -ATOM 1191 C3 C4A B 136 33.705 27.239 2.112 1.00 0.00 C4A C -ATOM 1192 C4 C4A B 136 32.650 26.658 1.151 1.00 0.00 C4A C -ATOM 1193 C1 C4A B 137 26.830 16.542 19.693 1.00 0.00 C4A C -ATOM 1194 C2 C4A B 137 28.032 15.995 18.901 1.00 0.00 C4A C -ATOM 1195 C3 C4A B 137 25.488 16.289 18.981 1.00 0.00 C4A C -ATOM 1196 C4 C4A B 137 24.247 16.475 19.874 1.00 0.00 C4A C -ATOM 1197 C1 C4A B 138 27.652 27.008 18.763 1.00 0.00 C4A C -ATOM 1198 C2 C4A B 138 27.250 28.235 17.923 1.00 0.00 C4A C -ATOM 1199 C3 C4A B 138 29.170 26.986 19.023 1.00 0.00 C4A C -ATOM 1200 C4 C4A B 138 29.700 26.006 20.086 1.00 0.00 C4A C -ATOM 1201 C1 C4A B 139 19.583 6.925 4.666 1.00 0.00 C4A C -ATOM 1202 C2 C4A B 139 20.209 5.556 4.991 1.00 0.00 C4A C -ATOM 1203 C3 C4A B 139 18.851 7.643 5.815 1.00 0.00 C4A C -ATOM 1204 C4 C4A B 139 19.736 7.895 7.050 1.00 0.00 C4A C -ATOM 1205 C1 C4A B 140 17.135 12.060 3.336 1.00 0.00 C4A C -ATOM 1206 C2 C4A B 140 17.577 12.836 4.591 1.00 0.00 C4A C -ATOM 1207 C3 C4A B 140 18.349 11.357 2.700 1.00 0.00 C4A C -ATOM 1208 C4 C4A B 140 17.961 10.337 1.614 1.00 0.00 C4A C -ATOM 1209 C1 C4A B 141 19.702 29.871 1.598 1.00 0.00 C4A C -ATOM 1210 C2 C4A B 141 21.120 29.832 2.195 1.00 0.00 C4A C -ATOM 1211 C3 C4A B 141 18.633 29.977 2.701 1.00 0.00 C4A C -ATOM 1212 C4 C4A B 141 17.195 30.266 2.231 1.00 0.00 C4A C -ATOM 1213 C1 C4A B 142 20.981 32.569 31.536 1.00 0.00 C4A C -ATOM 1214 C2 C4A B 142 19.570 31.992 31.751 1.00 0.00 C4A C -ATOM 1215 C3 C4A B 142 20.798 33.938 30.856 1.00 0.00 C4A C -ATOM 1216 C4 C4A B 142 21.986 34.615 30.148 1.00 0.00 C4A C -ATOM 1217 C1 C4A B 143 32.640 33.498 6.993 1.00 0.00 C4A C -ATOM 1218 C2 C4A B 143 33.488 33.472 5.707 1.00 0.00 C4A C -ATOM 1219 C3 C4A B 143 32.522 34.818 7.777 1.00 0.00 C4A C -ATOM 1220 C4 C4A B 143 31.284 34.711 8.687 1.00 0.00 C4A C -ATOM 1221 C1 C4A B 144 1.817 32.600 5.549 1.00 0.00 C4A C -ATOM 1222 C2 C4A B 144 1.115 33.717 4.756 1.00 0.00 C4A C -ATOM 1223 C3 C4A B 144 1.295 31.155 5.442 1.00 0.00 C4A C -ATOM 1224 C4 C4A B 144 2.325 30.049 5.743 1.00 0.00 C4A C -ATOM 1225 C1 C4A B 145 4.532 26.140 18.810 1.00 0.00 C4A C -ATOM 1226 C2 C4A B 145 3.742 25.512 19.973 1.00 0.00 C4A C -ATOM 1227 C3 C4A B 145 5.919 25.513 18.576 1.00 0.00 C4A C -ATOM 1228 C4 C4A B 145 6.921 26.103 19.585 1.00 0.00 C4A C -ATOM 1229 C1 C4A B 146 16.836 19.658 17.378 1.00 0.00 C4A C -ATOM 1230 C2 C4A B 146 16.169 19.050 18.626 1.00 0.00 C4A C -ATOM 1231 C3 C4A B 146 17.842 18.642 16.806 1.00 0.00 C4A C -ATOM 1232 C4 C4A B 146 18.616 19.125 15.565 1.00 0.00 C4A C -ATOM 1233 C1 C4A B 147 33.055 14.029 4.986 1.00 0.00 C4A C -ATOM 1234 C2 C4A B 147 31.769 14.774 4.584 1.00 0.00 C4A C -ATOM 1235 C3 C4A B 147 34.081 14.925 5.705 1.00 0.00 C4A C -ATOM 1236 C4 C4A B 147 34.520 16.150 4.881 1.00 0.00 C4A C -ATOM 1237 C1 C4A B 148 6.511 7.589 18.982 1.00 0.00 C4A C -ATOM 1238 C2 C4A B 148 5.698 7.617 17.675 1.00 0.00 C4A C -ATOM 1239 C3 C4A B 148 7.186 8.948 19.249 1.00 0.00 C4A C -ATOM 1240 C4 C4A B 148 7.968 8.704 20.553 1.00 0.00 C4A C -ATOM 1241 C1 C4A B 149 3.754 3.390 27.306 1.00 0.00 C4A C -ATOM 1242 C2 C4A B 149 4.707 3.817 26.174 1.00 0.00 C4A C -ATOM 1243 C3 C4A B 149 2.370 3.138 26.680 1.00 0.00 C4A C -ATOM 1244 C4 C4A B 149 1.217 3.012 27.694 1.00 0.00 C4A C -ATOM 1245 C1 C4A B 150 19.873 21.793 22.627 1.00 0.00 C4A C -ATOM 1246 C2 C4A B 150 19.539 21.209 24.012 1.00 0.00 C4A C -ATOM 1247 C3 C4A B 150 21.082 21.265 21.832 1.00 0.00 C4A C -ATOM 1248 C4 C4A B 150 21.386 21.923 20.473 1.00 0.00 C4A C -ATOM 1249 C1 C4A B 151 2.278 10.342 3.509 1.00 0.00 C4A C -ATOM 1250 C2 C4A B 151 1.387 11.134 4.484 1.00 0.00 C4A C -ATOM 1251 C3 C4A B 151 3.749 10.375 3.966 1.00 0.00 C4A C -ATOM 1252 C4 C4A B 151 4.631 9.963 2.773 1.00 0.00 C4A C -ATOM 1253 C1 C4A B 152 33.356 9.536 25.548 1.00 0.00 C4A C -ATOM 1254 C2 C4A B 152 34.155 10.851 25.601 1.00 0.00 C4A C -ATOM 1255 C3 C4A B 152 34.244 8.359 25.994 1.00 0.00 C4A C -ATOM 1256 C4 C4A B 152 33.554 7.006 26.248 1.00 0.00 C4A C -ATOM 1257 C1 C4A B 153 11.968 17.862 0.223 1.00 0.00 C4A C -ATOM 1258 C2 C4A B 153 11.736 19.372 0.421 1.00 0.00 C4A C -ATOM 1259 C3 C4A B 153 11.067 16.957 1.084 1.00 0.00 C4A C -ATOM 1260 C4 C4A B 153 11.483 16.684 2.542 1.00 0.00 C4A C -ATOM 1261 C1 C4A B 154 8.197 23.620 5.241 1.00 0.00 C4A C -ATOM 1262 C2 C4A B 154 9.339 24.343 4.503 1.00 0.00 C4A C -ATOM 1263 C3 C4A B 154 6.952 23.403 4.362 1.00 0.00 C4A C -ATOM 1264 C4 C4A B 154 5.712 22.666 4.902 1.00 0.00 C4A C -ATOM 1265 C1 C4A B 155 32.578 11.537 1.421 1.00 0.00 C4A C -ATOM 1266 C2 C4A B 155 31.891 12.399 2.497 1.00 0.00 C4A C -ATOM 1267 C3 C4A B 155 33.480 12.585 0.743 1.00 0.00 C4A C -ATOM 1268 C4 C4A B 155 34.068 13.570 1.771 1.00 0.00 C4A C -ATOM 1269 C1 C4A B 156 27.877 30.367 2.060 1.00 0.00 C4A C -ATOM 1270 C2 C4A B 156 27.548 31.850 2.313 1.00 0.00 C4A C -ATOM 1271 C3 C4A B 156 28.080 29.983 0.582 1.00 0.00 C4A C -ATOM 1272 C4 C4A B 156 27.907 28.472 0.335 1.00 0.00 C4A C -ATOM 1273 C1 C4A B 157 12.525 29.785 7.485 1.00 0.00 C4A C -ATOM 1274 C2 C4A B 157 12.652 28.399 6.827 1.00 0.00 C4A C -ATOM 1275 C3 C4A B 157 11.568 30.773 6.792 1.00 0.00 C4A C -ATOM 1276 C4 C4A B 157 12.206 32.115 6.386 1.00 0.00 C4A C -ATOM 1277 C1 C4A B 158 17.437 24.359 7.125 1.00 0.00 C4A C -ATOM 1278 C2 C4A B 158 17.004 23.313 8.168 1.00 0.00 C4A C -ATOM 1279 C3 C4A B 158 17.769 25.812 7.513 1.00 0.00 C4A C -ATOM 1280 C4 C4A B 158 18.405 26.549 6.319 1.00 0.00 C4A C -ATOM 1281 C1 C4A B 159 18.405 29.281 26.312 1.00 0.00 C4A C -ATOM 1282 C2 C4A B 159 19.385 29.148 25.131 1.00 0.00 C4A C -ATOM 1283 C3 C4A B 159 17.529 30.538 26.162 1.00 0.00 C4A C -ATOM 1284 C4 C4A B 159 17.255 31.237 27.507 1.00 0.00 C4A C -ATOM 1285 C1 C4A B 160 27.997 3.012 28.141 1.00 0.00 C4A C -ATOM 1286 C2 C4A B 160 27.439 2.401 26.843 1.00 0.00 C4A C -ATOM 1287 C3 C4A B 160 27.302 4.219 28.799 1.00 0.00 C4A C -ATOM 1288 C4 C4A B 160 27.944 4.586 30.150 1.00 0.00 C4A C -ATOM 1289 C1 C4A B 161 22.038 26.267 23.333 1.00 0.00 C4A C -ATOM 1290 C2 C4A B 161 21.747 24.848 23.857 1.00 0.00 C4A C -ATOM 1291 C3 C4A B 161 20.978 26.950 22.450 1.00 0.00 C4A C -ATOM 1292 C4 C4A B 161 21.486 28.155 21.635 1.00 0.00 C4A C -ATOM 1293 C1 C4A B 162 1.622 34.113 20.427 1.00 0.00 C4A C -ATOM 1294 C2 C4A B 162 1.423 35.573 20.872 1.00 0.00 C4A C -ATOM 1295 C3 C4A B 162 0.994 33.711 19.080 1.00 0.00 C4A C -ATOM 1296 C4 C4A B 162 1.048 32.183 18.896 1.00 0.00 C4A C -ATOM 1297 C1 C4A B 163 4.122 29.386 2.312 1.00 0.00 C4A C -ATOM 1298 C2 C4A B 163 3.204 29.047 1.123 1.00 0.00 C4A C -ATOM 1299 C3 C4A B 163 5.105 28.311 2.812 1.00 0.00 C4A C -ATOM 1300 C4 C4A B 163 6.407 28.966 3.310 1.00 0.00 C4A C -ATOM 1301 C1 C4A B 164 4.523 8.009 24.511 1.00 0.00 C4A C -ATOM 1302 C2 C4A B 164 3.968 8.802 25.709 1.00 0.00 C4A C -ATOM 1303 C3 C4A B 164 3.582 7.583 23.369 1.00 0.00 C4A C -ATOM 1304 C4 C4A B 164 4.232 6.780 22.228 1.00 0.00 C4A C -ATOM 1305 C1 C4A B 165 11.875 26.945 27.733 1.00 0.00 C4A C -ATOM 1306 C2 C4A B 165 12.143 28.262 26.980 1.00 0.00 C4A C -ATOM 1307 C3 C4A B 165 13.012 26.419 28.627 1.00 0.00 C4A C -ATOM 1308 C4 C4A B 165 13.476 27.288 29.811 1.00 0.00 C4A C -ATOM 1309 C1 C4A B 166 16.469 34.352 27.710 1.00 0.00 C4A C -ATOM 1310 C2 C4A B 166 16.761 32.891 28.102 1.00 0.00 C4A C -ATOM 1311 C3 C4A B 166 15.426 34.945 28.676 1.00 0.00 C4A C -ATOM 1312 C4 C4A B 166 14.784 36.286 28.275 1.00 0.00 C4A C -ATOM 1313 C1 C4A B 167 28.297 15.045 25.545 1.00 0.00 C4A C -ATOM 1314 C2 C4A B 167 28.193 16.352 26.352 1.00 0.00 C4A C -ATOM 1315 C3 C4A B 167 28.313 15.235 24.017 1.00 0.00 C4A C -ATOM 1316 C4 C4A B 167 27.045 15.814 23.363 1.00 0.00 C4A C -ATOM 1317 C1 C4A B 168 31.194 25.217 26.667 1.00 0.00 C4A C -ATOM 1318 C2 C4A B 168 31.675 25.624 28.072 1.00 0.00 C4A C -ATOM 1319 C3 C4A B 168 29.689 25.480 26.473 1.00 0.00 C4A C -ATOM 1320 C4 C4A B 168 29.191 25.151 25.053 1.00 0.00 C4A C -ATOM 1321 C1 C4A B 169 -0.156 5.932 12.841 1.00 0.00 C4A C -ATOM 1322 C2 C4A B 169 -0.462 6.057 11.337 1.00 0.00 C4A C -ATOM 1323 C3 C4A B 169 1.350 5.807 13.135 1.00 0.00 C4A C -ATOM 1324 C4 C4A B 169 1.841 5.851 14.594 1.00 0.00 C4A C -ATOM 1325 C1 C4A B 170 31.213 16.273 32.117 1.00 0.00 C4A C -ATOM 1326 C2 C4A B 170 32.285 16.636 33.161 1.00 0.00 C4A C -ATOM 1327 C3 C4A B 170 30.429 17.539 31.724 1.00 0.00 C4A C -ATOM 1328 C4 C4A B 170 29.101 17.365 30.965 1.00 0.00 C4A C -ATOM 1329 C1 C4A B 171 18.386 26.821 0.811 1.00 0.00 C4A C -ATOM 1330 C2 C4A B 171 18.509 26.968 2.339 1.00 0.00 C4A C -ATOM 1331 C3 C4A B 171 19.741 26.859 0.080 1.00 0.00 C4A C -ATOM 1332 C4 C4A B 171 20.326 25.441 -0.061 1.00 0.00 C4A C -ATOM 1333 C1 C4A B 172 19.556 29.065 8.217 1.00 0.00 C4A C -ATOM 1334 C2 C4A B 172 19.928 29.492 6.785 1.00 0.00 C4A C -ATOM 1335 C3 C4A B 172 20.422 29.794 9.262 1.00 0.00 C4A C -ATOM 1336 C4 C4A B 172 20.372 29.198 10.680 1.00 0.00 C4A C -ATOM 1337 C1 C4A B 173 3.739 5.726 9.889 1.00 0.00 C4A C -ATOM 1338 C2 C4A B 173 3.684 5.901 8.360 1.00 0.00 C4A C -ATOM 1339 C3 C4A B 173 4.170 7.039 10.569 1.00 0.00 C4A C -ATOM 1340 C4 C4A B 173 4.106 7.063 12.107 1.00 0.00 C4A C -ATOM 1341 C1 C4A B 174 23.542 28.127 30.693 1.00 0.00 C4A C -ATOM 1342 C2 C4A B 174 22.747 29.217 31.435 1.00 0.00 C4A C -ATOM 1343 C3 C4A B 174 24.963 28.095 31.288 1.00 0.00 C4A C -ATOM 1344 C4 C4A B 174 25.681 26.830 30.782 1.00 0.00 C4A C -ATOM 1345 C1 C4A B 175 29.645 0.257 1.038 1.00 0.00 C4A C -ATOM 1346 C2 C4A B 175 30.878 -0.305 1.771 1.00 0.00 C4A C -ATOM 1347 C3 C4A B 175 28.378 0.231 1.913 1.00 0.00 C4A C -ATOM 1348 C4 C4A B 175 28.059 1.256 3.017 1.00 0.00 C4A C -ATOM 1349 C1 C4A B 176 30.125 15.765 29.029 1.00 0.00 C4A C -ATOM 1350 C2 C4A B 176 30.753 15.142 27.769 1.00 0.00 C4A C -ATOM 1351 C3 C4A B 176 29.658 14.740 30.080 1.00 0.00 C4A C -ATOM 1352 C4 C4A B 176 28.513 13.754 29.782 1.00 0.00 C4A C -ATOM 1353 C1 C4A B 177 15.523 2.935 4.183 1.00 0.00 C4A C -ATOM 1354 C2 C4A B 177 15.058 3.432 2.801 1.00 0.00 C4A C -ATOM 1355 C3 C4A B 177 16.839 3.543 4.704 1.00 0.00 C4A C -ATOM 1356 C4 C4A B 177 16.772 5.046 5.030 1.00 0.00 C4A C -ATOM 1357 C1 C4A B 178 16.990 30.912 14.292 1.00 0.00 C4A C -ATOM 1358 C2 C4A B 178 17.761 29.595 14.084 1.00 0.00 C4A C -ATOM 1359 C3 C4A B 178 17.622 31.954 15.233 1.00 0.00 C4A C -ATOM 1360 C4 C4A B 178 16.758 33.229 15.222 1.00 0.00 C4A C -ATOM 1361 C1 C4A B 179 32.751 5.783 1.700 1.00 0.00 C4A C -ATOM 1362 C2 C4A B 179 33.317 4.386 2.018 1.00 0.00 C4A C -ATOM 1363 C3 C4A B 179 31.248 5.863 2.026 1.00 0.00 C4A C -ATOM 1364 C4 C4A B 179 30.651 7.256 2.303 1.00 0.00 C4A C -ATOM 1365 C1 C4A B 180 2.620 26.012 1.981 1.00 0.00 C4A C -ATOM 1366 C2 C4A B 180 2.815 26.832 3.269 1.00 0.00 C4A C -ATOM 1367 C3 C4A B 180 1.749 26.832 1.011 1.00 0.00 C4A C -ATOM 1368 C4 C4A B 180 2.545 27.343 -0.205 1.00 0.00 C4A C -ATOM 1369 C1 C4A B 181 15.765 20.302 12.065 1.00 0.00 C4A C -ATOM 1370 C2 C4A B 181 15.258 20.457 13.510 1.00 0.00 C4A C -ATOM 1371 C3 C4A B 181 16.975 21.187 11.711 1.00 0.00 C4A C -ATOM 1372 C4 C4A B 181 17.595 21.012 10.312 1.00 0.00 C4A C -ATOM 1373 C1 C4A B 182 5.385 13.733 29.699 1.00 0.00 C4A C -ATOM 1374 C2 C4A B 182 5.907 13.699 28.251 1.00 0.00 C4A C -ATOM 1375 C3 C4A B 182 5.238 12.427 30.502 1.00 0.00 C4A C -ATOM 1376 C4 C4A B 182 4.395 11.329 29.826 1.00 0.00 C4A C -ATOM 1377 C1 C4A B 183 26.645 18.987 5.586 1.00 0.00 C4A C -ATOM 1378 C2 C4A B 183 27.997 18.872 6.314 1.00 0.00 C4A C -ATOM 1379 C3 C4A B 183 26.667 18.634 4.087 1.00 0.00 C4A C -ATOM 1380 C4 C4A B 183 27.033 17.157 3.851 1.00 0.00 C4A C -ATOM 1381 C1 C4A B 184 15.942 26.670 26.145 1.00 0.00 C4A C -ATOM 1382 C2 C4A B 184 15.069 27.753 25.484 1.00 0.00 C4A C -ATOM 1383 C3 C4A B 184 16.744 27.069 27.397 1.00 0.00 C4A C -ATOM 1384 C4 C4A B 184 17.793 28.161 27.117 1.00 0.00 C4A C -ATOM 1385 C1 C4A B 185 26.070 16.633 23.905 1.00 0.00 C4A C -ATOM 1386 C2 C4A B 185 25.117 15.798 23.029 1.00 0.00 C4A C -ATOM 1387 C3 C4A B 185 27.019 15.766 24.753 1.00 0.00 C4A C -ATOM 1388 C4 C4A B 185 26.313 14.662 25.562 1.00 0.00 C4A C -ATOM 1389 C1 C4A B 186 5.360 26.374 29.307 1.00 0.00 C4A C -ATOM 1390 C2 C4A B 186 6.648 27.201 29.140 1.00 0.00 C4A C -ATOM 1391 C3 C4A B 186 4.760 25.823 28.000 1.00 0.00 C4A C -ATOM 1392 C4 C4A B 186 3.382 25.163 28.192 1.00 0.00 C4A C -ATOM 1393 C1 C4A B 187 5.380 27.119 27.660 1.00 0.00 C4A C -ATOM 1394 C2 C4A B 187 5.358 28.638 27.911 1.00 0.00 C4A C -ATOM 1395 C3 C4A B 187 4.543 26.670 26.448 1.00 0.00 C4A C -ATOM 1396 C4 C4A B 187 4.447 25.134 26.400 1.00 0.00 C4A C -ATOM 1397 C1 C4A B 188 31.428 15.274 30.535 1.00 0.00 C4A C -ATOM 1398 C2 C4A B 188 31.680 16.792 30.503 1.00 0.00 C4A C -ATOM 1399 C3 C4A B 188 30.022 14.789 30.936 1.00 0.00 C4A C -ATOM 1400 C4 C4A B 188 29.477 15.427 32.227 1.00 0.00 C4A C -ATOM 1401 C1 C4A B 189 21.694 26.952 15.734 1.00 0.00 C4A C -ATOM 1402 C2 C4A B 189 20.621 25.965 16.231 1.00 0.00 C4A C -ATOM 1403 C3 C4A B 189 22.638 26.365 14.668 1.00 0.00 C4A C -ATOM 1404 C4 C4A B 189 23.504 27.491 14.072 1.00 0.00 C4A C -ATOM 1405 C1 C4A B 190 4.772 22.954 10.067 1.00 0.00 C4A C -ATOM 1406 C2 C4A B 190 3.511 22.567 9.273 1.00 0.00 C4A C -ATOM 1407 C3 C4A B 190 4.836 24.251 10.895 1.00 0.00 C4A C -ATOM 1408 C4 C4A B 190 6.273 24.716 11.198 1.00 0.00 C4A C -ATOM 1409 C1 C4A B 191 10.601 21.256 23.128 1.00 0.00 C4A C -ATOM 1410 C2 C4A B 191 9.856 22.540 22.721 1.00 0.00 C4A C -ATOM 1411 C3 C4A B 191 9.845 19.958 22.790 1.00 0.00 C4A C -ATOM 1412 C4 C4A B 191 10.494 18.627 23.214 1.00 0.00 C4A C -ATOM 1413 C1 C4A B 192 32.917 3.062 22.701 1.00 0.00 C4A C -ATOM 1414 C2 C4A B 192 33.666 2.365 21.550 1.00 0.00 C4A C -ATOM 1415 C3 C4A B 192 33.748 4.119 23.450 1.00 0.00 C4A C -ATOM 1416 C4 C4A B 192 35.161 3.808 23.980 1.00 0.00 C4A C -ATOM 1417 C1 C4A B 193 7.407 25.640 4.952 1.00 0.00 C4A C -ATOM 1418 C2 C4A B 193 7.609 27.051 5.533 1.00 0.00 C4A C -ATOM 1419 C3 C4A B 193 6.558 25.595 3.668 1.00 0.00 C4A C -ATOM 1420 C4 C4A B 193 6.077 24.236 3.127 1.00 0.00 C4A C -ATOM 1421 C1 C4A B 194 25.669 7.604 13.012 1.00 0.00 C4A C -ATOM 1422 C2 C4A B 194 25.030 8.230 11.759 1.00 0.00 C4A C -ATOM 1423 C3 C4A B 194 27.003 8.269 13.398 1.00 0.00 C4A C -ATOM 1424 C4 C4A B 194 26.648 9.721 13.766 1.00 0.00 C4A C -ATOM 1425 C1 C4A B 195 11.301 16.653 18.353 1.00 0.00 C4A C -ATOM 1426 C2 C4A B 195 11.352 15.238 18.959 1.00 0.00 C4A C -ATOM 1427 C3 C4A B 195 10.339 16.664 17.151 1.00 0.00 C4A C -ATOM 1428 C4 C4A B 195 10.425 17.835 16.154 1.00 0.00 C4A C -ATOM 1429 C1 C4A B 196 5.473 20.654 32.001 1.00 0.00 C4A C -ATOM 1430 C2 C4A B 196 5.591 21.661 30.842 1.00 0.00 C4A C -ATOM 1431 C3 C4A B 196 6.113 19.321 31.570 1.00 0.00 C4A C -ATOM 1432 C4 C4A B 196 6.409 18.382 32.755 1.00 0.00 C4A C -ATOM 1433 C1 C4A B 197 2.343 1.544 24.203 1.00 0.00 C4A C -ATOM 1434 C2 C4A B 197 1.189 2.562 24.247 1.00 0.00 C4A C -ATOM 1435 C3 C4A B 197 3.071 1.189 25.513 1.00 0.00 C4A C -ATOM 1436 C4 C4A B 197 4.379 0.384 25.621 1.00 0.00 C4A C -ATOM 1437 C1 C4A B 198 16.967 28.291 16.112 1.00 0.00 C4A C -ATOM 1438 C2 C4A B 198 16.433 27.313 15.050 1.00 0.00 C4A C -ATOM 1439 C3 C4A B 198 17.517 27.737 17.439 1.00 0.00 C4A C -ATOM 1440 C4 C4A B 198 18.290 28.809 18.228 1.00 0.00 C4A C -ATOM 1441 C1 C4A B 199 4.333 19.969 23.272 1.00 0.00 C4A C -ATOM 1442 C2 C4A B 199 4.870 19.418 24.606 1.00 0.00 C4A C -ATOM 1443 C3 C4A B 199 3.692 18.909 22.358 1.00 0.00 C4A C -ATOM 1444 C4 C4A B 199 2.286 18.439 22.774 1.00 0.00 C4A C -ATOM 1445 C1 C4A B 200 12.195 8.306 9.300 1.00 0.00 C4A C -ATOM 1446 C2 C4A B 200 11.868 6.801 9.300 1.00 0.00 C4A C -ATOM 1447 C3 C4A B 200 12.552 8.891 10.679 1.00 0.00 C4A C -ATOM 1448 C4 C4A B 200 11.573 8.440 11.779 1.00 0.00 C4A C -ATOM 1449 C1 C4A B 201 33.775 5.040 25.349 1.00 0.00 C4A C -ATOM 1450 C2 C4A B 201 32.964 3.894 25.982 1.00 0.00 C4A C -ATOM 1451 C3 C4A B 201 33.162 5.403 23.984 1.00 0.00 C4A C -ATOM 1452 C4 C4A B 201 31.708 5.907 24.051 1.00 0.00 C4A C -ATOM 1453 C1 C4A B 202 10.358 3.466 19.979 1.00 0.00 C4A C -ATOM 1454 C2 C4A B 202 11.541 3.778 19.043 1.00 0.00 C4A C -ATOM 1455 C3 C4A B 202 10.229 4.529 21.085 1.00 0.00 C4A C -ATOM 1456 C4 C4A B 202 9.060 4.093 21.988 1.00 0.00 C4A C -ATOM 1457 C1 C4A B 203 32.703 26.576 17.694 1.00 0.00 C4A C -ATOM 1458 C2 C4A B 203 32.448 27.468 16.465 1.00 0.00 C4A C -ATOM 1459 C3 C4A B 203 31.531 25.609 17.945 1.00 0.00 C4A C -ATOM 1460 C4 C4A B 203 31.943 24.592 19.025 1.00 0.00 C4A C -ATOM 1461 C1 C4A B 204 25.169 24.403 24.010 1.00 0.00 C4A C -ATOM 1462 C2 C4A B 204 26.037 24.192 25.265 1.00 0.00 C4A C -ATOM 1463 C3 C4A B 204 23.823 23.656 23.981 1.00 0.00 C4A C -ATOM 1464 C4 C4A B 204 24.132 22.312 24.667 1.00 0.00 C4A C -ATOM 1465 C1 C4A B 205 16.401 20.184 23.043 1.00 0.00 C4A C -ATOM 1466 C2 C4A B 205 15.733 21.039 21.950 1.00 0.00 C4A C -ATOM 1467 C3 C4A B 205 17.200 21.079 24.009 1.00 0.00 C4A C -ATOM 1468 C4 C4A B 205 18.460 20.346 24.506 1.00 0.00 C4A C -ATOM 1469 C1 C4A B 206 25.407 6.956 15.837 1.00 0.00 C4A C -ATOM 1470 C2 C4A B 206 24.432 5.787 15.602 1.00 0.00 C4A C -ATOM 1471 C3 C4A B 206 25.650 7.360 17.303 1.00 0.00 C4A C -ATOM 1472 C4 C4A B 206 25.849 8.876 17.485 1.00 0.00 C4A C -ATOM 1473 C1 C4A B 207 26.902 9.568 9.735 1.00 0.00 C4A C -ATOM 1474 C2 C4A B 207 25.905 10.723 9.948 1.00 0.00 C4A C -ATOM 1475 C3 C4A B 207 28.421 9.785 9.862 1.00 0.00 C4A C -ATOM 1476 C4 C4A B 207 28.910 9.966 11.311 1.00 0.00 C4A C -ATOM 1477 C1 C4A B 208 31.485 20.341 15.388 1.00 0.00 C4A C -ATOM 1478 C2 C4A B 208 32.219 20.863 16.637 1.00 0.00 C4A C -ATOM 1479 C3 C4A B 208 32.300 19.318 14.575 1.00 0.00 C4A C -ATOM 1480 C4 C4A B 208 31.947 19.345 13.076 1.00 0.00 C4A C -ATOM 1481 C1 C4A B 209 26.347 9.587 30.728 1.00 0.00 C4A C -ATOM 1482 C2 C4A B 209 27.651 10.341 31.052 1.00 0.00 C4A C -ATOM 1483 C3 C4A B 209 25.678 8.774 31.852 1.00 0.00 C4A C -ATOM 1484 C4 C4A B 209 24.451 7.958 31.406 1.00 0.00 C4A C -ATOM 1485 C1 C4A B 210 33.381 15.331 30.933 1.00 0.00 C4A C -ATOM 1486 C2 C4A B 210 33.902 13.893 31.110 1.00 0.00 C4A C -ATOM 1487 C3 C4A B 210 32.159 15.337 29.997 1.00 0.00 C4A C -ATOM 1488 C4 C4A B 210 32.584 14.876 28.591 1.00 0.00 C4A C -ATOM 1489 C1 C4A B 211 22.352 3.014 10.467 1.00 0.00 C4A C -ATOM 1490 C2 C4A B 211 21.688 1.635 10.297 1.00 0.00 C4A C -ATOM 1491 C3 C4A B 211 21.637 4.118 11.267 1.00 0.00 C4A C -ATOM 1492 C4 C4A B 211 20.352 4.652 10.608 1.00 0.00 C4A C -ATOM 1493 C1 C4A B 212 0.632 27.789 14.003 1.00 0.00 C4A C -ATOM 1494 C2 C4A B 212 0.539 29.304 14.266 1.00 0.00 C4A C -ATOM 1495 C3 C4A B 212 2.059 27.213 13.965 1.00 0.00 C4A C -ATOM 1496 C4 C4A B 212 2.083 25.735 13.532 1.00 0.00 C4A C -ATOM 1497 C1 C4A B 213 28.896 19.223 25.117 1.00 0.00 C4A C -ATOM 1498 C2 C4A B 213 29.005 17.883 25.868 1.00 0.00 C4A C -ATOM 1499 C3 C4A B 213 29.884 20.305 25.592 1.00 0.00 C4A C -ATOM 1500 C4 C4A B 213 29.637 21.805 25.344 1.00 0.00 C4A C -ATOM 1501 C1 C4A B 214 29.945 21.475 2.265 1.00 0.00 C4A C -ATOM 1502 C2 C4A B 214 31.411 21.925 2.405 1.00 0.00 C4A C -ATOM 1503 C3 C4A B 214 29.605 20.696 0.981 1.00 0.00 C4A C -ATOM 1504 C4 C4A B 214 28.111 20.523 0.650 1.00 0.00 C4A C -ATOM 1505 C1 C4A B 215 25.800 11.456 9.891 1.00 0.00 C4A C -ATOM 1506 C2 C4A B 215 26.278 10.360 10.862 1.00 0.00 C4A C -ATOM 1507 C3 C4A B 215 24.750 12.450 10.421 1.00 0.00 C4A C -ATOM 1508 C4 C4A B 215 24.081 13.163 9.231 1.00 0.00 C4A C -ATOM 1509 C1 C4A B 216 22.304 7.568 27.119 1.00 0.00 C4A C -ATOM 1510 C2 C4A B 216 21.644 6.699 26.033 1.00 0.00 C4A C -ATOM 1511 C3 C4A B 216 21.455 8.768 27.578 1.00 0.00 C4A C -ATOM 1512 C4 C4A B 216 20.182 8.308 28.312 1.00 0.00 C4A C -ATOM 1513 C1 C4A B 217 34.315 0.518 24.637 1.00 0.00 C4A C -ATOM 1514 C2 C4A B 217 33.893 0.588 23.158 1.00 0.00 C4A C -ATOM 1515 C3 C4A B 217 33.516 1.335 25.670 1.00 0.00 C4A C -ATOM 1516 C4 C4A B 217 33.995 1.267 27.132 1.00 0.00 C4A C -ATOM 1517 C1 C4A B 218 6.846 16.027 30.224 1.00 0.00 C4A C -ATOM 1518 C2 C4A B 218 6.963 15.018 31.382 1.00 0.00 C4A C -ATOM 1519 C3 C4A B 218 5.421 16.584 30.051 1.00 0.00 C4A C -ATOM 1520 C4 C4A B 218 5.219 17.827 29.165 1.00 0.00 C4A C -ATOM 1521 C1 C4A B 219 29.624 2.294 10.621 1.00 0.00 C4A C -ATOM 1522 C2 C4A B 219 28.386 2.799 11.385 1.00 0.00 C4A C -ATOM 1523 C3 C4A B 219 31.012 2.272 11.289 1.00 0.00 C4A C -ATOM 1524 C4 C4A B 219 31.756 3.585 11.594 1.00 0.00 C4A C -ATOM 1525 C1 C4A B 220 29.198 28.297 21.454 1.00 0.00 C4A C -ATOM 1526 C2 C4A B 220 27.723 28.739 21.502 1.00 0.00 C4A C -ATOM 1527 C3 C4A B 220 29.621 27.335 22.580 1.00 0.00 C4A C -ATOM 1528 C4 C4A B 220 29.538 28.095 23.917 1.00 0.00 C4A C -ATOM 1529 C1 C4A B 221 27.756 16.595 13.637 1.00 0.00 C4A C -ATOM 1530 C2 C4A B 221 28.605 16.043 12.477 1.00 0.00 C4A C -ATOM 1531 C3 C4A B 221 28.132 18.066 13.894 1.00 0.00 C4A C -ATOM 1532 C4 C4A B 221 27.230 18.675 14.983 1.00 0.00 C4A C -ATOM 1533 C1 C4A B 222 4.047 10.877 33.179 1.00 0.00 C4A C -ATOM 1534 C2 C4A B 222 2.647 10.365 32.793 1.00 0.00 C4A C -ATOM 1535 C3 C4A B 222 4.382 11.129 34.661 1.00 0.00 C4A C -ATOM 1536 C4 C4A B 222 3.506 12.310 35.117 1.00 0.00 C4A C -ATOM 1537 C1 C4A B 223 13.024 27.201 19.089 1.00 0.00 C4A C -ATOM 1538 C2 C4A B 223 11.753 27.021 19.939 1.00 0.00 C4A C -ATOM 1539 C3 C4A B 223 13.793 28.532 19.006 1.00 0.00 C4A C -ATOM 1540 C4 C4A B 223 15.107 28.525 19.811 1.00 0.00 C4A C -ATOM 1541 C1 C4A B 224 19.504 9.681 24.734 1.00 0.00 C4A C -ATOM 1542 C2 C4A B 224 20.981 9.277 24.571 1.00 0.00 C4A C -ATOM 1543 C3 C4A B 224 18.653 9.617 23.452 1.00 0.00 C4A C -ATOM 1544 C4 C4A B 224 19.123 10.673 22.434 1.00 0.00 C4A C -ATOM 1545 C1 C4A B 225 20.960 33.822 32.730 1.00 0.00 C4A C -ATOM 1546 C2 C4A B 225 21.938 34.902 32.230 1.00 0.00 C4A C -ATOM 1547 C3 C4A B 225 21.161 32.391 32.198 1.00 0.00 C4A C -ATOM 1548 C4 C4A B 225 20.913 32.261 30.684 1.00 0.00 C4A C -ATOM 1549 C1 C4A B 226 24.559 7.184 25.348 1.00 0.00 C4A C -ATOM 1550 C2 C4A B 226 23.542 8.207 24.808 1.00 0.00 C4A C -ATOM 1551 C3 C4A B 226 23.890 5.926 25.932 1.00 0.00 C4A C -ATOM 1552 C4 C4A B 226 24.853 4.791 26.327 1.00 0.00 C4A C -ATOM 1553 C1 C4A B 227 24.304 29.785 22.163 1.00 0.00 C4A C -ATOM 1554 C2 C4A B 227 25.306 29.145 21.183 1.00 0.00 C4A C -ATOM 1555 C3 C4A B 227 24.397 31.321 22.213 1.00 0.00 C4A C -ATOM 1556 C4 C4A B 227 23.116 31.977 22.763 1.00 0.00 C4A C -ATOM 1557 C1 C4A B 228 26.816 34.198 23.921 1.00 0.00 C4A C -ATOM 1558 C2 C4A B 228 28.161 33.906 24.612 1.00 0.00 C4A C -ATOM 1559 C3 C4A B 228 26.387 35.676 23.882 1.00 0.00 C4A C -ATOM 1560 C4 C4A B 228 26.029 36.138 25.307 1.00 0.00 C4A C -ATOM 1561 C1 C4A B 229 25.177 32.787 18.358 1.00 0.00 C4A C -ATOM 1562 C2 C4A B 229 26.503 33.568 18.295 1.00 0.00 C4A C -ATOM 1563 C3 C4A B 229 24.418 32.253 17.130 1.00 0.00 C4A C -ATOM 1564 C4 C4A B 229 23.244 31.306 17.443 1.00 0.00 C4A C -ATOM 1565 C1 C4A B 230 10.359 19.086 21.023 1.00 0.00 C4A C -ATOM 1566 C2 C4A B 230 9.832 18.873 22.454 1.00 0.00 C4A C -ATOM 1567 C3 C4A B 230 11.856 18.862 20.739 1.00 0.00 C4A C -ATOM 1568 C4 C4A B 230 12.327 19.383 19.369 1.00 0.00 C4A C -ATOM 1569 C1 C4A B 231 32.512 30.066 11.267 1.00 0.00 C4A C -ATOM 1570 C2 C4A B 231 34.026 29.937 11.516 1.00 0.00 C4A C -ATOM 1571 C3 C4A B 231 31.674 29.037 12.050 1.00 0.00 C4A C -ATOM 1572 C4 C4A B 231 30.175 29.364 11.914 1.00 0.00 C4A C -ATOM 1573 C1 C4A B 232 11.731 18.762 15.934 1.00 0.00 C4A C -ATOM 1574 C2 C4A B 232 11.857 20.192 16.489 1.00 0.00 C4A C -ATOM 1575 C3 C4A B 232 10.600 17.911 16.540 1.00 0.00 C4A C -ATOM 1576 C4 C4A B 232 10.461 16.563 15.809 1.00 0.00 C4A C -ATOM 1577 C1 C4A B 233 9.765 30.263 13.643 1.00 0.00 C4A C -ATOM 1578 C2 C4A B 233 10.127 30.924 12.300 1.00 0.00 C4A C -ATOM 1579 C3 C4A B 233 10.904 30.417 14.668 1.00 0.00 C4A C -ATOM 1580 C4 C4A B 233 12.140 29.687 14.111 1.00 0.00 C4A C -ATOM 1581 C1 C4A B 234 20.487 4.238 0.266 1.00 0.00 C4A C -ATOM 1582 C2 C4A B 234 20.973 4.358 -1.190 1.00 0.00 C4A C -ATOM 1583 C3 C4A B 234 19.301 5.171 0.574 1.00 0.00 C4A C -ATOM 1584 C4 C4A B 234 19.046 5.439 2.069 1.00 0.00 C4A C -ATOM 1585 C1 C4A B 235 7.435 15.848 26.578 1.00 0.00 C4A C -ATOM 1586 C2 C4A B 235 6.540 16.475 25.493 1.00 0.00 C4A C -ATOM 1587 C3 C4A B 235 6.604 15.559 27.842 1.00 0.00 C4A C -ATOM 1588 C4 C4A B 235 7.383 15.146 29.105 1.00 0.00 C4A C -ATOM 1589 C1 C4A B 236 24.208 14.572 26.414 1.00 0.00 C4A C -ATOM 1590 C2 C4A B 236 22.700 14.730 26.681 1.00 0.00 C4A C -ATOM 1591 C3 C4A B 236 25.257 14.953 27.475 1.00 0.00 C4A C -ATOM 1592 C4 C4A B 236 26.693 14.493 27.162 1.00 0.00 C4A C -ATOM 1593 C1 C4A B 237 7.377 19.810 33.105 1.00 0.00 C4A C -ATOM 1594 C2 C4A B 237 7.348 19.583 34.628 1.00 0.00 C4A C -ATOM 1595 C3 C4A B 237 6.793 18.759 32.143 1.00 0.00 C4A C -ATOM 1596 C4 C4A B 237 6.468 19.340 30.754 1.00 0.00 C4A C -ATOM 1597 C1 C4A B 238 24.291 31.414 2.114 1.00 0.00 C4A C -ATOM 1598 C2 C4A B 238 23.350 30.639 3.056 1.00 0.00 C4A C -ATOM 1599 C3 C4A B 238 23.788 32.787 1.631 1.00 0.00 C4A C -ATOM 1600 C4 C4A B 238 22.769 32.741 0.477 1.00 0.00 C4A C -ATOM 1601 C1 C4A B 239 17.072 6.405 30.787 1.00 0.00 C4A C -ATOM 1602 C2 C4A B 239 17.267 6.521 32.310 1.00 0.00 C4A C -ATOM 1603 C3 C4A B 239 18.340 5.793 30.164 1.00 0.00 C4A C -ATOM 1604 C4 C4A B 239 18.365 5.683 28.628 1.00 0.00 C4A C -ATOM 1605 C1 C4A B 240 26.336 22.418 18.976 1.00 0.00 C4A C -ATOM 1606 C2 C4A B 240 27.169 21.166 18.647 1.00 0.00 C4A C -ATOM 1607 C3 C4A B 240 26.903 23.750 18.450 1.00 0.00 C4A C -ATOM 1608 C4 C4A B 240 26.092 25.047 18.634 1.00 0.00 C4A C -ATOM 1609 C1 C4A B 241 18.737 28.045 18.774 1.00 0.00 C4A C -ATOM 1610 C2 C4A B 241 20.192 27.554 18.894 1.00 0.00 C4A C -ATOM 1611 C3 C4A B 241 17.861 27.801 20.017 1.00 0.00 C4A C -ATOM 1612 C4 C4A B 241 17.999 28.677 21.276 1.00 0.00 C4A C -ATOM 1613 C1 C4A B 242 2.485 19.967 15.794 1.00 0.00 C4A C -ATOM 1614 C2 C4A B 242 1.794 20.058 14.421 1.00 0.00 C4A C -ATOM 1615 C3 C4A B 242 1.348 19.696 16.797 1.00 0.00 C4A C -ATOM 1616 C4 C4A B 242 0.098 20.585 16.660 1.00 0.00 C4A C -ATOM 1617 C1 C4A B 243 18.969 9.160 22.160 1.00 0.00 C4A C -ATOM 1618 C2 C4A B 243 17.486 9.326 21.778 1.00 0.00 C4A C -ATOM 1619 C3 C4A B 243 19.175 8.078 23.236 1.00 0.00 C4A C -ATOM 1620 C4 C4A B 243 20.636 7.597 23.316 1.00 0.00 C4A C -ATOM 1621 C1 C4A B 244 25.599 34.559 31.072 1.00 0.00 C4A C -ATOM 1622 C2 C4A B 244 24.392 34.980 30.213 1.00 0.00 C4A C -ATOM 1623 C3 C4A B 244 25.235 34.094 32.494 1.00 0.00 C4A C -ATOM 1624 C4 C4A B 244 26.401 33.858 33.471 1.00 0.00 C4A C -ATOM 1625 C1 C4A B 245 22.726 19.390 0.523 1.00 0.00 C4A C -ATOM 1626 C2 C4A B 245 22.700 19.009 2.015 1.00 0.00 C4A C -ATOM 1627 C3 C4A B 245 23.980 20.240 0.247 1.00 0.00 C4A C -ATOM 1628 C4 C4A B 245 24.238 20.471 -1.254 1.00 0.00 C4A C -ATOM 1629 C1 C4A B 246 33.102 0.248 0.656 1.00 0.00 C4A C -ATOM 1630 C2 C4A B 246 34.272 -0.682 0.287 1.00 0.00 C4A C -ATOM 1631 C3 C4A B 246 32.954 1.557 -0.142 1.00 0.00 C4A C -ATOM 1632 C4 C4A B 246 31.879 2.471 0.475 1.00 0.00 C4A C -ATOM 1633 C1 C4A B 247 32.232 18.494 21.544 1.00 0.00 C4A C -ATOM 1634 C2 C4A B 247 32.693 17.168 22.178 1.00 0.00 C4A C -ATOM 1635 C3 C4A B 247 33.224 19.010 20.485 1.00 0.00 C4A C -ATOM 1636 C4 C4A B 247 34.741 18.898 20.721 1.00 0.00 C4A C -ATOM 1637 C1 C4A B 248 4.198 10.773 24.528 1.00 0.00 C4A C -ATOM 1638 C2 C4A B 248 5.111 9.916 23.631 1.00 0.00 C4A C -ATOM 1639 C3 C4A B 248 4.831 11.555 25.694 1.00 0.00 C4A C -ATOM 1640 C4 C4A B 248 3.868 12.481 26.460 1.00 0.00 C4A C -ATOM 1641 C1 C4A B 249 5.211 17.735 2.657 1.00 0.00 C4A C -ATOM 1642 C2 C4A B 249 3.710 17.395 2.695 1.00 0.00 C4A C -ATOM 1643 C3 C4A B 249 5.539 19.214 2.932 1.00 0.00 C4A C -ATOM 1644 C4 C4A B 249 6.895 19.594 2.310 1.00 0.00 C4A C -ATOM 1645 C1 C4A B 250 22.403 19.624 8.146 1.00 0.00 C4A C -ATOM 1646 C2 C4A B 250 23.572 19.056 7.319 1.00 0.00 C4A C -ATOM 1647 C3 C4A B 250 21.665 18.763 9.188 1.00 0.00 C4A C -ATOM 1648 C4 C4A B 250 20.306 18.072 8.976 1.00 0.00 C4A C -END diff --git a/example_file/perfluorobutane_butane/setup_box_1.psf b/example_file/perfluorobutane_butane/setup_box_1.psf deleted file mode 100644 index 697681c42..000000000 --- a/example_file/perfluorobutane_butane/setup_box_1.psf +++ /dev/null @@ -1,2676 +0,0 @@ -PSF - - 4 !NTITLE - REMARKS original generated structure x-plor psf file - REMARKS topology top_mie.inp - REMARKS segment FA4 { first NONE; last NONE; auto angles dihedrals } - REMARKS segment C4A { first NONE; last NONE; auto angles dihedrals } - - 1648 !NATOM - 1 FA4 1 FA4 C1 CF2 0.000000 50.0070 0 - 2 FA4 1 FA4 C2 CF3 0.000000 69.0050 0 - 3 FA4 1 FA4 C3 CF2 0.000000 50.0070 0 - 4 FA4 1 FA4 C4 CF3 0.000000 69.0050 0 - 5 FA4 2 FA4 C1 CF2 0.000000 50.0070 0 - 6 FA4 2 FA4 C2 CF3 0.000000 69.0050 0 - 7 FA4 2 FA4 C3 CF2 0.000000 50.0070 0 - 8 FA4 2 FA4 C4 CF3 0.000000 69.0050 0 - 9 FA4 3 FA4 C1 CF2 0.000000 50.0070 0 - 10 FA4 3 FA4 C2 CF3 0.000000 69.0050 0 - 11 FA4 3 FA4 C3 CF2 0.000000 50.0070 0 - 12 FA4 3 FA4 C4 CF3 0.000000 69.0050 0 - 13 FA4 4 FA4 C1 CF2 0.000000 50.0070 0 - 14 FA4 4 FA4 C2 CF3 0.000000 69.0050 0 - 15 FA4 4 FA4 C3 CF2 0.000000 50.0070 0 - 16 FA4 4 FA4 C4 CF3 0.000000 69.0050 0 - 17 FA4 5 FA4 C1 CF2 0.000000 50.0070 0 - 18 FA4 5 FA4 C2 CF3 0.000000 69.0050 0 - 19 FA4 5 FA4 C3 CF2 0.000000 50.0070 0 - 20 FA4 5 FA4 C4 CF3 0.000000 69.0050 0 - 21 FA4 6 FA4 C1 CF2 0.000000 50.0070 0 - 22 FA4 6 FA4 C2 CF3 0.000000 69.0050 0 - 23 FA4 6 FA4 C3 CF2 0.000000 50.0070 0 - 24 FA4 6 FA4 C4 CF3 0.000000 69.0050 0 - 25 FA4 7 FA4 C1 CF2 0.000000 50.0070 0 - 26 FA4 7 FA4 C2 CF3 0.000000 69.0050 0 - 27 FA4 7 FA4 C3 CF2 0.000000 50.0070 0 - 28 FA4 7 FA4 C4 CF3 0.000000 69.0050 0 - 29 FA4 8 FA4 C1 CF2 0.000000 50.0070 0 - 30 FA4 8 FA4 C2 CF3 0.000000 69.0050 0 - 31 FA4 8 FA4 C3 CF2 0.000000 50.0070 0 - 32 FA4 8 FA4 C4 CF3 0.000000 69.0050 0 - 33 FA4 9 FA4 C1 CF2 0.000000 50.0070 0 - 34 FA4 9 FA4 C2 CF3 0.000000 69.0050 0 - 35 FA4 9 FA4 C3 CF2 0.000000 50.0070 0 - 36 FA4 9 FA4 C4 CF3 0.000000 69.0050 0 - 37 FA4 10 FA4 C1 CF2 0.000000 50.0070 0 - 38 FA4 10 FA4 C2 CF3 0.000000 69.0050 0 - 39 FA4 10 FA4 C3 CF2 0.000000 50.0070 0 - 40 FA4 10 FA4 C4 CF3 0.000000 69.0050 0 - 41 FA4 11 FA4 C1 CF2 0.000000 50.0070 0 - 42 FA4 11 FA4 C2 CF3 0.000000 69.0050 0 - 43 FA4 11 FA4 C3 CF2 0.000000 50.0070 0 - 44 FA4 11 FA4 C4 CF3 0.000000 69.0050 0 - 45 FA4 12 FA4 C1 CF2 0.000000 50.0070 0 - 46 FA4 12 FA4 C2 CF3 0.000000 69.0050 0 - 47 FA4 12 FA4 C3 CF2 0.000000 50.0070 0 - 48 FA4 12 FA4 C4 CF3 0.000000 69.0050 0 - 49 FA4 13 FA4 C1 CF2 0.000000 50.0070 0 - 50 FA4 13 FA4 C2 CF3 0.000000 69.0050 0 - 51 FA4 13 FA4 C3 CF2 0.000000 50.0070 0 - 52 FA4 13 FA4 C4 CF3 0.000000 69.0050 0 - 53 FA4 14 FA4 C1 CF2 0.000000 50.0070 0 - 54 FA4 14 FA4 C2 CF3 0.000000 69.0050 0 - 55 FA4 14 FA4 C3 CF2 0.000000 50.0070 0 - 56 FA4 14 FA4 C4 CF3 0.000000 69.0050 0 - 57 FA4 15 FA4 C1 CF2 0.000000 50.0070 0 - 58 FA4 15 FA4 C2 CF3 0.000000 69.0050 0 - 59 FA4 15 FA4 C3 CF2 0.000000 50.0070 0 - 60 FA4 15 FA4 C4 CF3 0.000000 69.0050 0 - 61 FA4 16 FA4 C1 CF2 0.000000 50.0070 0 - 62 FA4 16 FA4 C2 CF3 0.000000 69.0050 0 - 63 FA4 16 FA4 C3 CF2 0.000000 50.0070 0 - 64 FA4 16 FA4 C4 CF3 0.000000 69.0050 0 - 65 FA4 17 FA4 C1 CF2 0.000000 50.0070 0 - 66 FA4 17 FA4 C2 CF3 0.000000 69.0050 0 - 67 FA4 17 FA4 C3 CF2 0.000000 50.0070 0 - 68 FA4 17 FA4 C4 CF3 0.000000 69.0050 0 - 69 FA4 18 FA4 C1 CF2 0.000000 50.0070 0 - 70 FA4 18 FA4 C2 CF3 0.000000 69.0050 0 - 71 FA4 18 FA4 C3 CF2 0.000000 50.0070 0 - 72 FA4 18 FA4 C4 CF3 0.000000 69.0050 0 - 73 FA4 19 FA4 C1 CF2 0.000000 50.0070 0 - 74 FA4 19 FA4 C2 CF3 0.000000 69.0050 0 - 75 FA4 19 FA4 C3 CF2 0.000000 50.0070 0 - 76 FA4 19 FA4 C4 CF3 0.000000 69.0050 0 - 77 FA4 20 FA4 C1 CF2 0.000000 50.0070 0 - 78 FA4 20 FA4 C2 CF3 0.000000 69.0050 0 - 79 FA4 20 FA4 C3 CF2 0.000000 50.0070 0 - 80 FA4 20 FA4 C4 CF3 0.000000 69.0050 0 - 81 FA4 21 FA4 C1 CF2 0.000000 50.0070 0 - 82 FA4 21 FA4 C2 CF3 0.000000 69.0050 0 - 83 FA4 21 FA4 C3 CF2 0.000000 50.0070 0 - 84 FA4 21 FA4 C4 CF3 0.000000 69.0050 0 - 85 FA4 22 FA4 C1 CF2 0.000000 50.0070 0 - 86 FA4 22 FA4 C2 CF3 0.000000 69.0050 0 - 87 FA4 22 FA4 C3 CF2 0.000000 50.0070 0 - 88 FA4 22 FA4 C4 CF3 0.000000 69.0050 0 - 89 FA4 23 FA4 C1 CF2 0.000000 50.0070 0 - 90 FA4 23 FA4 C2 CF3 0.000000 69.0050 0 - 91 FA4 23 FA4 C3 CF2 0.000000 50.0070 0 - 92 FA4 23 FA4 C4 CF3 0.000000 69.0050 0 - 93 FA4 24 FA4 C1 CF2 0.000000 50.0070 0 - 94 FA4 24 FA4 C2 CF3 0.000000 69.0050 0 - 95 FA4 24 FA4 C3 CF2 0.000000 50.0070 0 - 96 FA4 24 FA4 C4 CF3 0.000000 69.0050 0 - 97 FA4 25 FA4 C1 CF2 0.000000 50.0070 0 - 98 FA4 25 FA4 C2 CF3 0.000000 69.0050 0 - 99 FA4 25 FA4 C3 CF2 0.000000 50.0070 0 - 100 FA4 25 FA4 C4 CF3 0.000000 69.0050 0 - 101 FA4 26 FA4 C1 CF2 0.000000 50.0070 0 - 102 FA4 26 FA4 C2 CF3 0.000000 69.0050 0 - 103 FA4 26 FA4 C3 CF2 0.000000 50.0070 0 - 104 FA4 26 FA4 C4 CF3 0.000000 69.0050 0 - 105 FA4 27 FA4 C1 CF2 0.000000 50.0070 0 - 106 FA4 27 FA4 C2 CF3 0.000000 69.0050 0 - 107 FA4 27 FA4 C3 CF2 0.000000 50.0070 0 - 108 FA4 27 FA4 C4 CF3 0.000000 69.0050 0 - 109 FA4 28 FA4 C1 CF2 0.000000 50.0070 0 - 110 FA4 28 FA4 C2 CF3 0.000000 69.0050 0 - 111 FA4 28 FA4 C3 CF2 0.000000 50.0070 0 - 112 FA4 28 FA4 C4 CF3 0.000000 69.0050 0 - 113 FA4 29 FA4 C1 CF2 0.000000 50.0070 0 - 114 FA4 29 FA4 C2 CF3 0.000000 69.0050 0 - 115 FA4 29 FA4 C3 CF2 0.000000 50.0070 0 - 116 FA4 29 FA4 C4 CF3 0.000000 69.0050 0 - 117 FA4 30 FA4 C1 CF2 0.000000 50.0070 0 - 118 FA4 30 FA4 C2 CF3 0.000000 69.0050 0 - 119 FA4 30 FA4 C3 CF2 0.000000 50.0070 0 - 120 FA4 30 FA4 C4 CF3 0.000000 69.0050 0 - 121 FA4 31 FA4 C1 CF2 0.000000 50.0070 0 - 122 FA4 31 FA4 C2 CF3 0.000000 69.0050 0 - 123 FA4 31 FA4 C3 CF2 0.000000 50.0070 0 - 124 FA4 31 FA4 C4 CF3 0.000000 69.0050 0 - 125 FA4 32 FA4 C1 CF2 0.000000 50.0070 0 - 126 FA4 32 FA4 C2 CF3 0.000000 69.0050 0 - 127 FA4 32 FA4 C3 CF2 0.000000 50.0070 0 - 128 FA4 32 FA4 C4 CF3 0.000000 69.0050 0 - 129 FA4 33 FA4 C1 CF2 0.000000 50.0070 0 - 130 FA4 33 FA4 C2 CF3 0.000000 69.0050 0 - 131 FA4 33 FA4 C3 CF2 0.000000 50.0070 0 - 132 FA4 33 FA4 C4 CF3 0.000000 69.0050 0 - 133 FA4 34 FA4 C1 CF2 0.000000 50.0070 0 - 134 FA4 34 FA4 C2 CF3 0.000000 69.0050 0 - 135 FA4 34 FA4 C3 CF2 0.000000 50.0070 0 - 136 FA4 34 FA4 C4 CF3 0.000000 69.0050 0 - 137 FA4 35 FA4 C1 CF2 0.000000 50.0070 0 - 138 FA4 35 FA4 C2 CF3 0.000000 69.0050 0 - 139 FA4 35 FA4 C3 CF2 0.000000 50.0070 0 - 140 FA4 35 FA4 C4 CF3 0.000000 69.0050 0 - 141 FA4 36 FA4 C1 CF2 0.000000 50.0070 0 - 142 FA4 36 FA4 C2 CF3 0.000000 69.0050 0 - 143 FA4 36 FA4 C3 CF2 0.000000 50.0070 0 - 144 FA4 36 FA4 C4 CF3 0.000000 69.0050 0 - 145 FA4 37 FA4 C1 CF2 0.000000 50.0070 0 - 146 FA4 37 FA4 C2 CF3 0.000000 69.0050 0 - 147 FA4 37 FA4 C3 CF2 0.000000 50.0070 0 - 148 FA4 37 FA4 C4 CF3 0.000000 69.0050 0 - 149 FA4 38 FA4 C1 CF2 0.000000 50.0070 0 - 150 FA4 38 FA4 C2 CF3 0.000000 69.0050 0 - 151 FA4 38 FA4 C3 CF2 0.000000 50.0070 0 - 152 FA4 38 FA4 C4 CF3 0.000000 69.0050 0 - 153 FA4 39 FA4 C1 CF2 0.000000 50.0070 0 - 154 FA4 39 FA4 C2 CF3 0.000000 69.0050 0 - 155 FA4 39 FA4 C3 CF2 0.000000 50.0070 0 - 156 FA4 39 FA4 C4 CF3 0.000000 69.0050 0 - 157 FA4 40 FA4 C1 CF2 0.000000 50.0070 0 - 158 FA4 40 FA4 C2 CF3 0.000000 69.0050 0 - 159 FA4 40 FA4 C3 CF2 0.000000 50.0070 0 - 160 FA4 40 FA4 C4 CF3 0.000000 69.0050 0 - 161 FA4 41 FA4 C1 CF2 0.000000 50.0070 0 - 162 FA4 41 FA4 C2 CF3 0.000000 69.0050 0 - 163 FA4 41 FA4 C3 CF2 0.000000 50.0070 0 - 164 FA4 41 FA4 C4 CF3 0.000000 69.0050 0 - 165 FA4 42 FA4 C1 CF2 0.000000 50.0070 0 - 166 FA4 42 FA4 C2 CF3 0.000000 69.0050 0 - 167 FA4 42 FA4 C3 CF2 0.000000 50.0070 0 - 168 FA4 42 FA4 C4 CF3 0.000000 69.0050 0 - 169 FA4 43 FA4 C1 CF2 0.000000 50.0070 0 - 170 FA4 43 FA4 C2 CF3 0.000000 69.0050 0 - 171 FA4 43 FA4 C3 CF2 0.000000 50.0070 0 - 172 FA4 43 FA4 C4 CF3 0.000000 69.0050 0 - 173 FA4 44 FA4 C1 CF2 0.000000 50.0070 0 - 174 FA4 44 FA4 C2 CF3 0.000000 69.0050 0 - 175 FA4 44 FA4 C3 CF2 0.000000 50.0070 0 - 176 FA4 44 FA4 C4 CF3 0.000000 69.0050 0 - 177 FA4 45 FA4 C1 CF2 0.000000 50.0070 0 - 178 FA4 45 FA4 C2 CF3 0.000000 69.0050 0 - 179 FA4 45 FA4 C3 CF2 0.000000 50.0070 0 - 180 FA4 45 FA4 C4 CF3 0.000000 69.0050 0 - 181 FA4 46 FA4 C1 CF2 0.000000 50.0070 0 - 182 FA4 46 FA4 C2 CF3 0.000000 69.0050 0 - 183 FA4 46 FA4 C3 CF2 0.000000 50.0070 0 - 184 FA4 46 FA4 C4 CF3 0.000000 69.0050 0 - 185 FA4 47 FA4 C1 CF2 0.000000 50.0070 0 - 186 FA4 47 FA4 C2 CF3 0.000000 69.0050 0 - 187 FA4 47 FA4 C3 CF2 0.000000 50.0070 0 - 188 FA4 47 FA4 C4 CF3 0.000000 69.0050 0 - 189 FA4 48 FA4 C1 CF2 0.000000 50.0070 0 - 190 FA4 48 FA4 C2 CF3 0.000000 69.0050 0 - 191 FA4 48 FA4 C3 CF2 0.000000 50.0070 0 - 192 FA4 48 FA4 C4 CF3 0.000000 69.0050 0 - 193 FA4 49 FA4 C1 CF2 0.000000 50.0070 0 - 194 FA4 49 FA4 C2 CF3 0.000000 69.0050 0 - 195 FA4 49 FA4 C3 CF2 0.000000 50.0070 0 - 196 FA4 49 FA4 C4 CF3 0.000000 69.0050 0 - 197 FA4 50 FA4 C1 CF2 0.000000 50.0070 0 - 198 FA4 50 FA4 C2 CF3 0.000000 69.0050 0 - 199 FA4 50 FA4 C3 CF2 0.000000 50.0070 0 - 200 FA4 50 FA4 C4 CF3 0.000000 69.0050 0 - 201 FA4 51 FA4 C1 CF2 0.000000 50.0070 0 - 202 FA4 51 FA4 C2 CF3 0.000000 69.0050 0 - 203 FA4 51 FA4 C3 CF2 0.000000 50.0070 0 - 204 FA4 51 FA4 C4 CF3 0.000000 69.0050 0 - 205 FA4 52 FA4 C1 CF2 0.000000 50.0070 0 - 206 FA4 52 FA4 C2 CF3 0.000000 69.0050 0 - 207 FA4 52 FA4 C3 CF2 0.000000 50.0070 0 - 208 FA4 52 FA4 C4 CF3 0.000000 69.0050 0 - 209 FA4 53 FA4 C1 CF2 0.000000 50.0070 0 - 210 FA4 53 FA4 C2 CF3 0.000000 69.0050 0 - 211 FA4 53 FA4 C3 CF2 0.000000 50.0070 0 - 212 FA4 53 FA4 C4 CF3 0.000000 69.0050 0 - 213 FA4 54 FA4 C1 CF2 0.000000 50.0070 0 - 214 FA4 54 FA4 C2 CF3 0.000000 69.0050 0 - 215 FA4 54 FA4 C3 CF2 0.000000 50.0070 0 - 216 FA4 54 FA4 C4 CF3 0.000000 69.0050 0 - 217 FA4 55 FA4 C1 CF2 0.000000 50.0070 0 - 218 FA4 55 FA4 C2 CF3 0.000000 69.0050 0 - 219 FA4 55 FA4 C3 CF2 0.000000 50.0070 0 - 220 FA4 55 FA4 C4 CF3 0.000000 69.0050 0 - 221 FA4 56 FA4 C1 CF2 0.000000 50.0070 0 - 222 FA4 56 FA4 C2 CF3 0.000000 69.0050 0 - 223 FA4 56 FA4 C3 CF2 0.000000 50.0070 0 - 224 FA4 56 FA4 C4 CF3 0.000000 69.0050 0 - 225 FA4 57 FA4 C1 CF2 0.000000 50.0070 0 - 226 FA4 57 FA4 C2 CF3 0.000000 69.0050 0 - 227 FA4 57 FA4 C3 CF2 0.000000 50.0070 0 - 228 FA4 57 FA4 C4 CF3 0.000000 69.0050 0 - 229 FA4 58 FA4 C1 CF2 0.000000 50.0070 0 - 230 FA4 58 FA4 C2 CF3 0.000000 69.0050 0 - 231 FA4 58 FA4 C3 CF2 0.000000 50.0070 0 - 232 FA4 58 FA4 C4 CF3 0.000000 69.0050 0 - 233 FA4 59 FA4 C1 CF2 0.000000 50.0070 0 - 234 FA4 59 FA4 C2 CF3 0.000000 69.0050 0 - 235 FA4 59 FA4 C3 CF2 0.000000 50.0070 0 - 236 FA4 59 FA4 C4 CF3 0.000000 69.0050 0 - 237 FA4 60 FA4 C1 CF2 0.000000 50.0070 0 - 238 FA4 60 FA4 C2 CF3 0.000000 69.0050 0 - 239 FA4 60 FA4 C3 CF2 0.000000 50.0070 0 - 240 FA4 60 FA4 C4 CF3 0.000000 69.0050 0 - 241 FA4 61 FA4 C1 CF2 0.000000 50.0070 0 - 242 FA4 61 FA4 C2 CF3 0.000000 69.0050 0 - 243 FA4 61 FA4 C3 CF2 0.000000 50.0070 0 - 244 FA4 61 FA4 C4 CF3 0.000000 69.0050 0 - 245 FA4 62 FA4 C1 CF2 0.000000 50.0070 0 - 246 FA4 62 FA4 C2 CF3 0.000000 69.0050 0 - 247 FA4 62 FA4 C3 CF2 0.000000 50.0070 0 - 248 FA4 62 FA4 C4 CF3 0.000000 69.0050 0 - 249 FA4 63 FA4 C1 CF2 0.000000 50.0070 0 - 250 FA4 63 FA4 C2 CF3 0.000000 69.0050 0 - 251 FA4 63 FA4 C3 CF2 0.000000 50.0070 0 - 252 FA4 63 FA4 C4 CF3 0.000000 69.0050 0 - 253 FA4 64 FA4 C1 CF2 0.000000 50.0070 0 - 254 FA4 64 FA4 C2 CF3 0.000000 69.0050 0 - 255 FA4 64 FA4 C3 CF2 0.000000 50.0070 0 - 256 FA4 64 FA4 C4 CF3 0.000000 69.0050 0 - 257 FA4 65 FA4 C1 CF2 0.000000 50.0070 0 - 258 FA4 65 FA4 C2 CF3 0.000000 69.0050 0 - 259 FA4 65 FA4 C3 CF2 0.000000 50.0070 0 - 260 FA4 65 FA4 C4 CF3 0.000000 69.0050 0 - 261 FA4 66 FA4 C1 CF2 0.000000 50.0070 0 - 262 FA4 66 FA4 C2 CF3 0.000000 69.0050 0 - 263 FA4 66 FA4 C3 CF2 0.000000 50.0070 0 - 264 FA4 66 FA4 C4 CF3 0.000000 69.0050 0 - 265 FA4 67 FA4 C1 CF2 0.000000 50.0070 0 - 266 FA4 67 FA4 C2 CF3 0.000000 69.0050 0 - 267 FA4 67 FA4 C3 CF2 0.000000 50.0070 0 - 268 FA4 67 FA4 C4 CF3 0.000000 69.0050 0 - 269 FA4 68 FA4 C1 CF2 0.000000 50.0070 0 - 270 FA4 68 FA4 C2 CF3 0.000000 69.0050 0 - 271 FA4 68 FA4 C3 CF2 0.000000 50.0070 0 - 272 FA4 68 FA4 C4 CF3 0.000000 69.0050 0 - 273 FA4 69 FA4 C1 CF2 0.000000 50.0070 0 - 274 FA4 69 FA4 C2 CF3 0.000000 69.0050 0 - 275 FA4 69 FA4 C3 CF2 0.000000 50.0070 0 - 276 FA4 69 FA4 C4 CF3 0.000000 69.0050 0 - 277 FA4 70 FA4 C1 CF2 0.000000 50.0070 0 - 278 FA4 70 FA4 C2 CF3 0.000000 69.0050 0 - 279 FA4 70 FA4 C3 CF2 0.000000 50.0070 0 - 280 FA4 70 FA4 C4 CF3 0.000000 69.0050 0 - 281 FA4 71 FA4 C1 CF2 0.000000 50.0070 0 - 282 FA4 71 FA4 C2 CF3 0.000000 69.0050 0 - 283 FA4 71 FA4 C3 CF2 0.000000 50.0070 0 - 284 FA4 71 FA4 C4 CF3 0.000000 69.0050 0 - 285 FA4 72 FA4 C1 CF2 0.000000 50.0070 0 - 286 FA4 72 FA4 C2 CF3 0.000000 69.0050 0 - 287 FA4 72 FA4 C3 CF2 0.000000 50.0070 0 - 288 FA4 72 FA4 C4 CF3 0.000000 69.0050 0 - 289 FA4 73 FA4 C1 CF2 0.000000 50.0070 0 - 290 FA4 73 FA4 C2 CF3 0.000000 69.0050 0 - 291 FA4 73 FA4 C3 CF2 0.000000 50.0070 0 - 292 FA4 73 FA4 C4 CF3 0.000000 69.0050 0 - 293 FA4 74 FA4 C1 CF2 0.000000 50.0070 0 - 294 FA4 74 FA4 C2 CF3 0.000000 69.0050 0 - 295 FA4 74 FA4 C3 CF2 0.000000 50.0070 0 - 296 FA4 74 FA4 C4 CF3 0.000000 69.0050 0 - 297 FA4 75 FA4 C1 CF2 0.000000 50.0070 0 - 298 FA4 75 FA4 C2 CF3 0.000000 69.0050 0 - 299 FA4 75 FA4 C3 CF2 0.000000 50.0070 0 - 300 FA4 75 FA4 C4 CF3 0.000000 69.0050 0 - 301 FA4 76 FA4 C1 CF2 0.000000 50.0070 0 - 302 FA4 76 FA4 C2 CF3 0.000000 69.0050 0 - 303 FA4 76 FA4 C3 CF2 0.000000 50.0070 0 - 304 FA4 76 FA4 C4 CF3 0.000000 69.0050 0 - 305 FA4 77 FA4 C1 CF2 0.000000 50.0070 0 - 306 FA4 77 FA4 C2 CF3 0.000000 69.0050 0 - 307 FA4 77 FA4 C3 CF2 0.000000 50.0070 0 - 308 FA4 77 FA4 C4 CF3 0.000000 69.0050 0 - 309 FA4 78 FA4 C1 CF2 0.000000 50.0070 0 - 310 FA4 78 FA4 C2 CF3 0.000000 69.0050 0 - 311 FA4 78 FA4 C3 CF2 0.000000 50.0070 0 - 312 FA4 78 FA4 C4 CF3 0.000000 69.0050 0 - 313 FA4 79 FA4 C1 CF2 0.000000 50.0070 0 - 314 FA4 79 FA4 C2 CF3 0.000000 69.0050 0 - 315 FA4 79 FA4 C3 CF2 0.000000 50.0070 0 - 316 FA4 79 FA4 C4 CF3 0.000000 69.0050 0 - 317 FA4 80 FA4 C1 CF2 0.000000 50.0070 0 - 318 FA4 80 FA4 C2 CF3 0.000000 69.0050 0 - 319 FA4 80 FA4 C3 CF2 0.000000 50.0070 0 - 320 FA4 80 FA4 C4 CF3 0.000000 69.0050 0 - 321 FA4 81 FA4 C1 CF2 0.000000 50.0070 0 - 322 FA4 81 FA4 C2 CF3 0.000000 69.0050 0 - 323 FA4 81 FA4 C3 CF2 0.000000 50.0070 0 - 324 FA4 81 FA4 C4 CF3 0.000000 69.0050 0 - 325 FA4 82 FA4 C1 CF2 0.000000 50.0070 0 - 326 FA4 82 FA4 C2 CF3 0.000000 69.0050 0 - 327 FA4 82 FA4 C3 CF2 0.000000 50.0070 0 - 328 FA4 82 FA4 C4 CF3 0.000000 69.0050 0 - 329 FA4 83 FA4 C1 CF2 0.000000 50.0070 0 - 330 FA4 83 FA4 C2 CF3 0.000000 69.0050 0 - 331 FA4 83 FA4 C3 CF2 0.000000 50.0070 0 - 332 FA4 83 FA4 C4 CF3 0.000000 69.0050 0 - 333 FA4 84 FA4 C1 CF2 0.000000 50.0070 0 - 334 FA4 84 FA4 C2 CF3 0.000000 69.0050 0 - 335 FA4 84 FA4 C3 CF2 0.000000 50.0070 0 - 336 FA4 84 FA4 C4 CF3 0.000000 69.0050 0 - 337 FA4 85 FA4 C1 CF2 0.000000 50.0070 0 - 338 FA4 85 FA4 C2 CF3 0.000000 69.0050 0 - 339 FA4 85 FA4 C3 CF2 0.000000 50.0070 0 - 340 FA4 85 FA4 C4 CF3 0.000000 69.0050 0 - 341 FA4 86 FA4 C1 CF2 0.000000 50.0070 0 - 342 FA4 86 FA4 C2 CF3 0.000000 69.0050 0 - 343 FA4 86 FA4 C3 CF2 0.000000 50.0070 0 - 344 FA4 86 FA4 C4 CF3 0.000000 69.0050 0 - 345 FA4 87 FA4 C1 CF2 0.000000 50.0070 0 - 346 FA4 87 FA4 C2 CF3 0.000000 69.0050 0 - 347 FA4 87 FA4 C3 CF2 0.000000 50.0070 0 - 348 FA4 87 FA4 C4 CF3 0.000000 69.0050 0 - 349 FA4 88 FA4 C1 CF2 0.000000 50.0070 0 - 350 FA4 88 FA4 C2 CF3 0.000000 69.0050 0 - 351 FA4 88 FA4 C3 CF2 0.000000 50.0070 0 - 352 FA4 88 FA4 C4 CF3 0.000000 69.0050 0 - 353 FA4 89 FA4 C1 CF2 0.000000 50.0070 0 - 354 FA4 89 FA4 C2 CF3 0.000000 69.0050 0 - 355 FA4 89 FA4 C3 CF2 0.000000 50.0070 0 - 356 FA4 89 FA4 C4 CF3 0.000000 69.0050 0 - 357 FA4 90 FA4 C1 CF2 0.000000 50.0070 0 - 358 FA4 90 FA4 C2 CF3 0.000000 69.0050 0 - 359 FA4 90 FA4 C3 CF2 0.000000 50.0070 0 - 360 FA4 90 FA4 C4 CF3 0.000000 69.0050 0 - 361 FA4 91 FA4 C1 CF2 0.000000 50.0070 0 - 362 FA4 91 FA4 C2 CF3 0.000000 69.0050 0 - 363 FA4 91 FA4 C3 CF2 0.000000 50.0070 0 - 364 FA4 91 FA4 C4 CF3 0.000000 69.0050 0 - 365 FA4 92 FA4 C1 CF2 0.000000 50.0070 0 - 366 FA4 92 FA4 C2 CF3 0.000000 69.0050 0 - 367 FA4 92 FA4 C3 CF2 0.000000 50.0070 0 - 368 FA4 92 FA4 C4 CF3 0.000000 69.0050 0 - 369 FA4 93 FA4 C1 CF2 0.000000 50.0070 0 - 370 FA4 93 FA4 C2 CF3 0.000000 69.0050 0 - 371 FA4 93 FA4 C3 CF2 0.000000 50.0070 0 - 372 FA4 93 FA4 C4 CF3 0.000000 69.0050 0 - 373 FA4 94 FA4 C1 CF2 0.000000 50.0070 0 - 374 FA4 94 FA4 C2 CF3 0.000000 69.0050 0 - 375 FA4 94 FA4 C3 CF2 0.000000 50.0070 0 - 376 FA4 94 FA4 C4 CF3 0.000000 69.0050 0 - 377 FA4 95 FA4 C1 CF2 0.000000 50.0070 0 - 378 FA4 95 FA4 C2 CF3 0.000000 69.0050 0 - 379 FA4 95 FA4 C3 CF2 0.000000 50.0070 0 - 380 FA4 95 FA4 C4 CF3 0.000000 69.0050 0 - 381 FA4 96 FA4 C1 CF2 0.000000 50.0070 0 - 382 FA4 96 FA4 C2 CF3 0.000000 69.0050 0 - 383 FA4 96 FA4 C3 CF2 0.000000 50.0070 0 - 384 FA4 96 FA4 C4 CF3 0.000000 69.0050 0 - 385 FA4 97 FA4 C1 CF2 0.000000 50.0070 0 - 386 FA4 97 FA4 C2 CF3 0.000000 69.0050 0 - 387 FA4 97 FA4 C3 CF2 0.000000 50.0070 0 - 388 FA4 97 FA4 C4 CF3 0.000000 69.0050 0 - 389 FA4 98 FA4 C1 CF2 0.000000 50.0070 0 - 390 FA4 98 FA4 C2 CF3 0.000000 69.0050 0 - 391 FA4 98 FA4 C3 CF2 0.000000 50.0070 0 - 392 FA4 98 FA4 C4 CF3 0.000000 69.0050 0 - 393 FA4 99 FA4 C1 CF2 0.000000 50.0070 0 - 394 FA4 99 FA4 C2 CF3 0.000000 69.0050 0 - 395 FA4 99 FA4 C3 CF2 0.000000 50.0070 0 - 396 FA4 99 FA4 C4 CF3 0.000000 69.0050 0 - 397 FA4 100 FA4 C1 CF2 0.000000 50.0070 0 - 398 FA4 100 FA4 C2 CF3 0.000000 69.0050 0 - 399 FA4 100 FA4 C3 CF2 0.000000 50.0070 0 - 400 FA4 100 FA4 C4 CF3 0.000000 69.0050 0 - 401 FA4 101 FA4 C1 CF2 0.000000 50.0070 0 - 402 FA4 101 FA4 C2 CF3 0.000000 69.0050 0 - 403 FA4 101 FA4 C3 CF2 0.000000 50.0070 0 - 404 FA4 101 FA4 C4 CF3 0.000000 69.0050 0 - 405 FA4 102 FA4 C1 CF2 0.000000 50.0070 0 - 406 FA4 102 FA4 C2 CF3 0.000000 69.0050 0 - 407 FA4 102 FA4 C3 CF2 0.000000 50.0070 0 - 408 FA4 102 FA4 C4 CF3 0.000000 69.0050 0 - 409 FA4 103 FA4 C1 CF2 0.000000 50.0070 0 - 410 FA4 103 FA4 C2 CF3 0.000000 69.0050 0 - 411 FA4 103 FA4 C3 CF2 0.000000 50.0070 0 - 412 FA4 103 FA4 C4 CF3 0.000000 69.0050 0 - 413 FA4 104 FA4 C1 CF2 0.000000 50.0070 0 - 414 FA4 104 FA4 C2 CF3 0.000000 69.0050 0 - 415 FA4 104 FA4 C3 CF2 0.000000 50.0070 0 - 416 FA4 104 FA4 C4 CF3 0.000000 69.0050 0 - 417 FA4 105 FA4 C1 CF2 0.000000 50.0070 0 - 418 FA4 105 FA4 C2 CF3 0.000000 69.0050 0 - 419 FA4 105 FA4 C3 CF2 0.000000 50.0070 0 - 420 FA4 105 FA4 C4 CF3 0.000000 69.0050 0 - 421 FA4 106 FA4 C1 CF2 0.000000 50.0070 0 - 422 FA4 106 FA4 C2 CF3 0.000000 69.0050 0 - 423 FA4 106 FA4 C3 CF2 0.000000 50.0070 0 - 424 FA4 106 FA4 C4 CF3 0.000000 69.0050 0 - 425 FA4 107 FA4 C1 CF2 0.000000 50.0070 0 - 426 FA4 107 FA4 C2 CF3 0.000000 69.0050 0 - 427 FA4 107 FA4 C3 CF2 0.000000 50.0070 0 - 428 FA4 107 FA4 C4 CF3 0.000000 69.0050 0 - 429 FA4 108 FA4 C1 CF2 0.000000 50.0070 0 - 430 FA4 108 FA4 C2 CF3 0.000000 69.0050 0 - 431 FA4 108 FA4 C3 CF2 0.000000 50.0070 0 - 432 FA4 108 FA4 C4 CF3 0.000000 69.0050 0 - 433 FA4 109 FA4 C1 CF2 0.000000 50.0070 0 - 434 FA4 109 FA4 C2 CF3 0.000000 69.0050 0 - 435 FA4 109 FA4 C3 CF2 0.000000 50.0070 0 - 436 FA4 109 FA4 C4 CF3 0.000000 69.0050 0 - 437 FA4 110 FA4 C1 CF2 0.000000 50.0070 0 - 438 FA4 110 FA4 C2 CF3 0.000000 69.0050 0 - 439 FA4 110 FA4 C3 CF2 0.000000 50.0070 0 - 440 FA4 110 FA4 C4 CF3 0.000000 69.0050 0 - 441 FA4 111 FA4 C1 CF2 0.000000 50.0070 0 - 442 FA4 111 FA4 C2 CF3 0.000000 69.0050 0 - 443 FA4 111 FA4 C3 CF2 0.000000 50.0070 0 - 444 FA4 111 FA4 C4 CF3 0.000000 69.0050 0 - 445 FA4 112 FA4 C1 CF2 0.000000 50.0070 0 - 446 FA4 112 FA4 C2 CF3 0.000000 69.0050 0 - 447 FA4 112 FA4 C3 CF2 0.000000 50.0070 0 - 448 FA4 112 FA4 C4 CF3 0.000000 69.0050 0 - 449 FA4 113 FA4 C1 CF2 0.000000 50.0070 0 - 450 FA4 113 FA4 C2 CF3 0.000000 69.0050 0 - 451 FA4 113 FA4 C3 CF2 0.000000 50.0070 0 - 452 FA4 113 FA4 C4 CF3 0.000000 69.0050 0 - 453 FA4 114 FA4 C1 CF2 0.000000 50.0070 0 - 454 FA4 114 FA4 C2 CF3 0.000000 69.0050 0 - 455 FA4 114 FA4 C3 CF2 0.000000 50.0070 0 - 456 FA4 114 FA4 C4 CF3 0.000000 69.0050 0 - 457 FA4 115 FA4 C1 CF2 0.000000 50.0070 0 - 458 FA4 115 FA4 C2 CF3 0.000000 69.0050 0 - 459 FA4 115 FA4 C3 CF2 0.000000 50.0070 0 - 460 FA4 115 FA4 C4 CF3 0.000000 69.0050 0 - 461 FA4 116 FA4 C1 CF2 0.000000 50.0070 0 - 462 FA4 116 FA4 C2 CF3 0.000000 69.0050 0 - 463 FA4 116 FA4 C3 CF2 0.000000 50.0070 0 - 464 FA4 116 FA4 C4 CF3 0.000000 69.0050 0 - 465 FA4 117 FA4 C1 CF2 0.000000 50.0070 0 - 466 FA4 117 FA4 C2 CF3 0.000000 69.0050 0 - 467 FA4 117 FA4 C3 CF2 0.000000 50.0070 0 - 468 FA4 117 FA4 C4 CF3 0.000000 69.0050 0 - 469 FA4 118 FA4 C1 CF2 0.000000 50.0070 0 - 470 FA4 118 FA4 C2 CF3 0.000000 69.0050 0 - 471 FA4 118 FA4 C3 CF2 0.000000 50.0070 0 - 472 FA4 118 FA4 C4 CF3 0.000000 69.0050 0 - 473 FA4 119 FA4 C1 CF2 0.000000 50.0070 0 - 474 FA4 119 FA4 C2 CF3 0.000000 69.0050 0 - 475 FA4 119 FA4 C3 CF2 0.000000 50.0070 0 - 476 FA4 119 FA4 C4 CF3 0.000000 69.0050 0 - 477 FA4 120 FA4 C1 CF2 0.000000 50.0070 0 - 478 FA4 120 FA4 C2 CF3 0.000000 69.0050 0 - 479 FA4 120 FA4 C3 CF2 0.000000 50.0070 0 - 480 FA4 120 FA4 C4 CF3 0.000000 69.0050 0 - 481 FA4 121 FA4 C1 CF2 0.000000 50.0070 0 - 482 FA4 121 FA4 C2 CF3 0.000000 69.0050 0 - 483 FA4 121 FA4 C3 CF2 0.000000 50.0070 0 - 484 FA4 121 FA4 C4 CF3 0.000000 69.0050 0 - 485 FA4 122 FA4 C1 CF2 0.000000 50.0070 0 - 486 FA4 122 FA4 C2 CF3 0.000000 69.0050 0 - 487 FA4 122 FA4 C3 CF2 0.000000 50.0070 0 - 488 FA4 122 FA4 C4 CF3 0.000000 69.0050 0 - 489 FA4 123 FA4 C1 CF2 0.000000 50.0070 0 - 490 FA4 123 FA4 C2 CF3 0.000000 69.0050 0 - 491 FA4 123 FA4 C3 CF2 0.000000 50.0070 0 - 492 FA4 123 FA4 C4 CF3 0.000000 69.0050 0 - 493 FA4 124 FA4 C1 CF2 0.000000 50.0070 0 - 494 FA4 124 FA4 C2 CF3 0.000000 69.0050 0 - 495 FA4 124 FA4 C3 CF2 0.000000 50.0070 0 - 496 FA4 124 FA4 C4 CF3 0.000000 69.0050 0 - 497 FA4 125 FA4 C1 CF2 0.000000 50.0070 0 - 498 FA4 125 FA4 C2 CF3 0.000000 69.0050 0 - 499 FA4 125 FA4 C3 CF2 0.000000 50.0070 0 - 500 FA4 125 FA4 C4 CF3 0.000000 69.0050 0 - 501 FA4 126 FA4 C1 CF2 0.000000 50.0070 0 - 502 FA4 126 FA4 C2 CF3 0.000000 69.0050 0 - 503 FA4 126 FA4 C3 CF2 0.000000 50.0070 0 - 504 FA4 126 FA4 C4 CF3 0.000000 69.0050 0 - 505 FA4 127 FA4 C1 CF2 0.000000 50.0070 0 - 506 FA4 127 FA4 C2 CF3 0.000000 69.0050 0 - 507 FA4 127 FA4 C3 CF2 0.000000 50.0070 0 - 508 FA4 127 FA4 C4 CF3 0.000000 69.0050 0 - 509 FA4 128 FA4 C1 CF2 0.000000 50.0070 0 - 510 FA4 128 FA4 C2 CF3 0.000000 69.0050 0 - 511 FA4 128 FA4 C3 CF2 0.000000 50.0070 0 - 512 FA4 128 FA4 C4 CF3 0.000000 69.0050 0 - 513 FA4 129 FA4 C1 CF2 0.000000 50.0070 0 - 514 FA4 129 FA4 C2 CF3 0.000000 69.0050 0 - 515 FA4 129 FA4 C3 CF2 0.000000 50.0070 0 - 516 FA4 129 FA4 C4 CF3 0.000000 69.0050 0 - 517 FA4 130 FA4 C1 CF2 0.000000 50.0070 0 - 518 FA4 130 FA4 C2 CF3 0.000000 69.0050 0 - 519 FA4 130 FA4 C3 CF2 0.000000 50.0070 0 - 520 FA4 130 FA4 C4 CF3 0.000000 69.0050 0 - 521 FA4 131 FA4 C1 CF2 0.000000 50.0070 0 - 522 FA4 131 FA4 C2 CF3 0.000000 69.0050 0 - 523 FA4 131 FA4 C3 CF2 0.000000 50.0070 0 - 524 FA4 131 FA4 C4 CF3 0.000000 69.0050 0 - 525 FA4 132 FA4 C1 CF2 0.000000 50.0070 0 - 526 FA4 132 FA4 C2 CF3 0.000000 69.0050 0 - 527 FA4 132 FA4 C3 CF2 0.000000 50.0070 0 - 528 FA4 132 FA4 C4 CF3 0.000000 69.0050 0 - 529 FA4 133 FA4 C1 CF2 0.000000 50.0070 0 - 530 FA4 133 FA4 C2 CF3 0.000000 69.0050 0 - 531 FA4 133 FA4 C3 CF2 0.000000 50.0070 0 - 532 FA4 133 FA4 C4 CF3 0.000000 69.0050 0 - 533 FA4 134 FA4 C1 CF2 0.000000 50.0070 0 - 534 FA4 134 FA4 C2 CF3 0.000000 69.0050 0 - 535 FA4 134 FA4 C3 CF2 0.000000 50.0070 0 - 536 FA4 134 FA4 C4 CF3 0.000000 69.0050 0 - 537 FA4 135 FA4 C1 CF2 0.000000 50.0070 0 - 538 FA4 135 FA4 C2 CF3 0.000000 69.0050 0 - 539 FA4 135 FA4 C3 CF2 0.000000 50.0070 0 - 540 FA4 135 FA4 C4 CF3 0.000000 69.0050 0 - 541 FA4 136 FA4 C1 CF2 0.000000 50.0070 0 - 542 FA4 136 FA4 C2 CF3 0.000000 69.0050 0 - 543 FA4 136 FA4 C3 CF2 0.000000 50.0070 0 - 544 FA4 136 FA4 C4 CF3 0.000000 69.0050 0 - 545 FA4 137 FA4 C1 CF2 0.000000 50.0070 0 - 546 FA4 137 FA4 C2 CF3 0.000000 69.0050 0 - 547 FA4 137 FA4 C3 CF2 0.000000 50.0070 0 - 548 FA4 137 FA4 C4 CF3 0.000000 69.0050 0 - 549 FA4 138 FA4 C1 CF2 0.000000 50.0070 0 - 550 FA4 138 FA4 C2 CF3 0.000000 69.0050 0 - 551 FA4 138 FA4 C3 CF2 0.000000 50.0070 0 - 552 FA4 138 FA4 C4 CF3 0.000000 69.0050 0 - 553 FA4 139 FA4 C1 CF2 0.000000 50.0070 0 - 554 FA4 139 FA4 C2 CF3 0.000000 69.0050 0 - 555 FA4 139 FA4 C3 CF2 0.000000 50.0070 0 - 556 FA4 139 FA4 C4 CF3 0.000000 69.0050 0 - 557 FA4 140 FA4 C1 CF2 0.000000 50.0070 0 - 558 FA4 140 FA4 C2 CF3 0.000000 69.0050 0 - 559 FA4 140 FA4 C3 CF2 0.000000 50.0070 0 - 560 FA4 140 FA4 C4 CF3 0.000000 69.0050 0 - 561 FA4 141 FA4 C1 CF2 0.000000 50.0070 0 - 562 FA4 141 FA4 C2 CF3 0.000000 69.0050 0 - 563 FA4 141 FA4 C3 CF2 0.000000 50.0070 0 - 564 FA4 141 FA4 C4 CF3 0.000000 69.0050 0 - 565 FA4 142 FA4 C1 CF2 0.000000 50.0070 0 - 566 FA4 142 FA4 C2 CF3 0.000000 69.0050 0 - 567 FA4 142 FA4 C3 CF2 0.000000 50.0070 0 - 568 FA4 142 FA4 C4 CF3 0.000000 69.0050 0 - 569 FA4 143 FA4 C1 CF2 0.000000 50.0070 0 - 570 FA4 143 FA4 C2 CF3 0.000000 69.0050 0 - 571 FA4 143 FA4 C3 CF2 0.000000 50.0070 0 - 572 FA4 143 FA4 C4 CF3 0.000000 69.0050 0 - 573 FA4 144 FA4 C1 CF2 0.000000 50.0070 0 - 574 FA4 144 FA4 C2 CF3 0.000000 69.0050 0 - 575 FA4 144 FA4 C3 CF2 0.000000 50.0070 0 - 576 FA4 144 FA4 C4 CF3 0.000000 69.0050 0 - 577 FA4 145 FA4 C1 CF2 0.000000 50.0070 0 - 578 FA4 145 FA4 C2 CF3 0.000000 69.0050 0 - 579 FA4 145 FA4 C3 CF2 0.000000 50.0070 0 - 580 FA4 145 FA4 C4 CF3 0.000000 69.0050 0 - 581 FA4 146 FA4 C1 CF2 0.000000 50.0070 0 - 582 FA4 146 FA4 C2 CF3 0.000000 69.0050 0 - 583 FA4 146 FA4 C3 CF2 0.000000 50.0070 0 - 584 FA4 146 FA4 C4 CF3 0.000000 69.0050 0 - 585 FA4 147 FA4 C1 CF2 0.000000 50.0070 0 - 586 FA4 147 FA4 C2 CF3 0.000000 69.0050 0 - 587 FA4 147 FA4 C3 CF2 0.000000 50.0070 0 - 588 FA4 147 FA4 C4 CF3 0.000000 69.0050 0 - 589 FA4 148 FA4 C1 CF2 0.000000 50.0070 0 - 590 FA4 148 FA4 C2 CF3 0.000000 69.0050 0 - 591 FA4 148 FA4 C3 CF2 0.000000 50.0070 0 - 592 FA4 148 FA4 C4 CF3 0.000000 69.0050 0 - 593 FA4 149 FA4 C1 CF2 0.000000 50.0070 0 - 594 FA4 149 FA4 C2 CF3 0.000000 69.0050 0 - 595 FA4 149 FA4 C3 CF2 0.000000 50.0070 0 - 596 FA4 149 FA4 C4 CF3 0.000000 69.0050 0 - 597 FA4 150 FA4 C1 CF2 0.000000 50.0070 0 - 598 FA4 150 FA4 C2 CF3 0.000000 69.0050 0 - 599 FA4 150 FA4 C3 CF2 0.000000 50.0070 0 - 600 FA4 150 FA4 C4 CF3 0.000000 69.0050 0 - 601 FA4 151 FA4 C1 CF2 0.000000 50.0070 0 - 602 FA4 151 FA4 C2 CF3 0.000000 69.0050 0 - 603 FA4 151 FA4 C3 CF2 0.000000 50.0070 0 - 604 FA4 151 FA4 C4 CF3 0.000000 69.0050 0 - 605 FA4 152 FA4 C1 CF2 0.000000 50.0070 0 - 606 FA4 152 FA4 C2 CF3 0.000000 69.0050 0 - 607 FA4 152 FA4 C3 CF2 0.000000 50.0070 0 - 608 FA4 152 FA4 C4 CF3 0.000000 69.0050 0 - 609 FA4 153 FA4 C1 CF2 0.000000 50.0070 0 - 610 FA4 153 FA4 C2 CF3 0.000000 69.0050 0 - 611 FA4 153 FA4 C3 CF2 0.000000 50.0070 0 - 612 FA4 153 FA4 C4 CF3 0.000000 69.0050 0 - 613 FA4 154 FA4 C1 CF2 0.000000 50.0070 0 - 614 FA4 154 FA4 C2 CF3 0.000000 69.0050 0 - 615 FA4 154 FA4 C3 CF2 0.000000 50.0070 0 - 616 FA4 154 FA4 C4 CF3 0.000000 69.0050 0 - 617 FA4 155 FA4 C1 CF2 0.000000 50.0070 0 - 618 FA4 155 FA4 C2 CF3 0.000000 69.0050 0 - 619 FA4 155 FA4 C3 CF2 0.000000 50.0070 0 - 620 FA4 155 FA4 C4 CF3 0.000000 69.0050 0 - 621 FA4 156 FA4 C1 CF2 0.000000 50.0070 0 - 622 FA4 156 FA4 C2 CF3 0.000000 69.0050 0 - 623 FA4 156 FA4 C3 CF2 0.000000 50.0070 0 - 624 FA4 156 FA4 C4 CF3 0.000000 69.0050 0 - 625 FA4 157 FA4 C1 CF2 0.000000 50.0070 0 - 626 FA4 157 FA4 C2 CF3 0.000000 69.0050 0 - 627 FA4 157 FA4 C3 CF2 0.000000 50.0070 0 - 628 FA4 157 FA4 C4 CF3 0.000000 69.0050 0 - 629 FA4 158 FA4 C1 CF2 0.000000 50.0070 0 - 630 FA4 158 FA4 C2 CF3 0.000000 69.0050 0 - 631 FA4 158 FA4 C3 CF2 0.000000 50.0070 0 - 632 FA4 158 FA4 C4 CF3 0.000000 69.0050 0 - 633 FA4 159 FA4 C1 CF2 0.000000 50.0070 0 - 634 FA4 159 FA4 C2 CF3 0.000000 69.0050 0 - 635 FA4 159 FA4 C3 CF2 0.000000 50.0070 0 - 636 FA4 159 FA4 C4 CF3 0.000000 69.0050 0 - 637 FA4 160 FA4 C1 CF2 0.000000 50.0070 0 - 638 FA4 160 FA4 C2 CF3 0.000000 69.0050 0 - 639 FA4 160 FA4 C3 CF2 0.000000 50.0070 0 - 640 FA4 160 FA4 C4 CF3 0.000000 69.0050 0 - 641 FA4 161 FA4 C1 CF2 0.000000 50.0070 0 - 642 FA4 161 FA4 C2 CF3 0.000000 69.0050 0 - 643 FA4 161 FA4 C3 CF2 0.000000 50.0070 0 - 644 FA4 161 FA4 C4 CF3 0.000000 69.0050 0 - 645 FA4 162 FA4 C1 CF2 0.000000 50.0070 0 - 646 FA4 162 FA4 C2 CF3 0.000000 69.0050 0 - 647 FA4 162 FA4 C3 CF2 0.000000 50.0070 0 - 648 FA4 162 FA4 C4 CF3 0.000000 69.0050 0 - 649 C4A 1 C4A C1 CH2 0.000000 14.0270 0 - 650 C4A 1 C4A C2 CH3 0.000000 15.0350 0 - 651 C4A 1 C4A C3 CH2 0.000000 14.0270 0 - 652 C4A 1 C4A C4 CH3 0.000000 15.0350 0 - 653 C4A 2 C4A C1 CH2 0.000000 14.0270 0 - 654 C4A 2 C4A C2 CH3 0.000000 15.0350 0 - 655 C4A 2 C4A C3 CH2 0.000000 14.0270 0 - 656 C4A 2 C4A C4 CH3 0.000000 15.0350 0 - 657 C4A 3 C4A C1 CH2 0.000000 14.0270 0 - 658 C4A 3 C4A C2 CH3 0.000000 15.0350 0 - 659 C4A 3 C4A C3 CH2 0.000000 14.0270 0 - 660 C4A 3 C4A C4 CH3 0.000000 15.0350 0 - 661 C4A 4 C4A C1 CH2 0.000000 14.0270 0 - 662 C4A 4 C4A C2 CH3 0.000000 15.0350 0 - 663 C4A 4 C4A C3 CH2 0.000000 14.0270 0 - 664 C4A 4 C4A C4 CH3 0.000000 15.0350 0 - 665 C4A 5 C4A C1 CH2 0.000000 14.0270 0 - 666 C4A 5 C4A C2 CH3 0.000000 15.0350 0 - 667 C4A 5 C4A C3 CH2 0.000000 14.0270 0 - 668 C4A 5 C4A C4 CH3 0.000000 15.0350 0 - 669 C4A 6 C4A C1 CH2 0.000000 14.0270 0 - 670 C4A 6 C4A C2 CH3 0.000000 15.0350 0 - 671 C4A 6 C4A C3 CH2 0.000000 14.0270 0 - 672 C4A 6 C4A C4 CH3 0.000000 15.0350 0 - 673 C4A 7 C4A C1 CH2 0.000000 14.0270 0 - 674 C4A 7 C4A C2 CH3 0.000000 15.0350 0 - 675 C4A 7 C4A C3 CH2 0.000000 14.0270 0 - 676 C4A 7 C4A C4 CH3 0.000000 15.0350 0 - 677 C4A 8 C4A C1 CH2 0.000000 14.0270 0 - 678 C4A 8 C4A C2 CH3 0.000000 15.0350 0 - 679 C4A 8 C4A C3 CH2 0.000000 14.0270 0 - 680 C4A 8 C4A C4 CH3 0.000000 15.0350 0 - 681 C4A 9 C4A C1 CH2 0.000000 14.0270 0 - 682 C4A 9 C4A C2 CH3 0.000000 15.0350 0 - 683 C4A 9 C4A C3 CH2 0.000000 14.0270 0 - 684 C4A 9 C4A C4 CH3 0.000000 15.0350 0 - 685 C4A 10 C4A C1 CH2 0.000000 14.0270 0 - 686 C4A 10 C4A C2 CH3 0.000000 15.0350 0 - 687 C4A 10 C4A C3 CH2 0.000000 14.0270 0 - 688 C4A 10 C4A C4 CH3 0.000000 15.0350 0 - 689 C4A 11 C4A C1 CH2 0.000000 14.0270 0 - 690 C4A 11 C4A C2 CH3 0.000000 15.0350 0 - 691 C4A 11 C4A C3 CH2 0.000000 14.0270 0 - 692 C4A 11 C4A C4 CH3 0.000000 15.0350 0 - 693 C4A 12 C4A C1 CH2 0.000000 14.0270 0 - 694 C4A 12 C4A C2 CH3 0.000000 15.0350 0 - 695 C4A 12 C4A C3 CH2 0.000000 14.0270 0 - 696 C4A 12 C4A C4 CH3 0.000000 15.0350 0 - 697 C4A 13 C4A C1 CH2 0.000000 14.0270 0 - 698 C4A 13 C4A C2 CH3 0.000000 15.0350 0 - 699 C4A 13 C4A C3 CH2 0.000000 14.0270 0 - 700 C4A 13 C4A C4 CH3 0.000000 15.0350 0 - 701 C4A 14 C4A C1 CH2 0.000000 14.0270 0 - 702 C4A 14 C4A C2 CH3 0.000000 15.0350 0 - 703 C4A 14 C4A C3 CH2 0.000000 14.0270 0 - 704 C4A 14 C4A C4 CH3 0.000000 15.0350 0 - 705 C4A 15 C4A C1 CH2 0.000000 14.0270 0 - 706 C4A 15 C4A C2 CH3 0.000000 15.0350 0 - 707 C4A 15 C4A C3 CH2 0.000000 14.0270 0 - 708 C4A 15 C4A C4 CH3 0.000000 15.0350 0 - 709 C4A 16 C4A C1 CH2 0.000000 14.0270 0 - 710 C4A 16 C4A C2 CH3 0.000000 15.0350 0 - 711 C4A 16 C4A C3 CH2 0.000000 14.0270 0 - 712 C4A 16 C4A C4 CH3 0.000000 15.0350 0 - 713 C4A 17 C4A C1 CH2 0.000000 14.0270 0 - 714 C4A 17 C4A C2 CH3 0.000000 15.0350 0 - 715 C4A 17 C4A C3 CH2 0.000000 14.0270 0 - 716 C4A 17 C4A C4 CH3 0.000000 15.0350 0 - 717 C4A 18 C4A C1 CH2 0.000000 14.0270 0 - 718 C4A 18 C4A C2 CH3 0.000000 15.0350 0 - 719 C4A 18 C4A C3 CH2 0.000000 14.0270 0 - 720 C4A 18 C4A C4 CH3 0.000000 15.0350 0 - 721 C4A 19 C4A C1 CH2 0.000000 14.0270 0 - 722 C4A 19 C4A C2 CH3 0.000000 15.0350 0 - 723 C4A 19 C4A C3 CH2 0.000000 14.0270 0 - 724 C4A 19 C4A C4 CH3 0.000000 15.0350 0 - 725 C4A 20 C4A C1 CH2 0.000000 14.0270 0 - 726 C4A 20 C4A C2 CH3 0.000000 15.0350 0 - 727 C4A 20 C4A C3 CH2 0.000000 14.0270 0 - 728 C4A 20 C4A C4 CH3 0.000000 15.0350 0 - 729 C4A 21 C4A C1 CH2 0.000000 14.0270 0 - 730 C4A 21 C4A C2 CH3 0.000000 15.0350 0 - 731 C4A 21 C4A C3 CH2 0.000000 14.0270 0 - 732 C4A 21 C4A C4 CH3 0.000000 15.0350 0 - 733 C4A 22 C4A C1 CH2 0.000000 14.0270 0 - 734 C4A 22 C4A C2 CH3 0.000000 15.0350 0 - 735 C4A 22 C4A C3 CH2 0.000000 14.0270 0 - 736 C4A 22 C4A C4 CH3 0.000000 15.0350 0 - 737 C4A 23 C4A C1 CH2 0.000000 14.0270 0 - 738 C4A 23 C4A C2 CH3 0.000000 15.0350 0 - 739 C4A 23 C4A C3 CH2 0.000000 14.0270 0 - 740 C4A 23 C4A C4 CH3 0.000000 15.0350 0 - 741 C4A 24 C4A C1 CH2 0.000000 14.0270 0 - 742 C4A 24 C4A C2 CH3 0.000000 15.0350 0 - 743 C4A 24 C4A C3 CH2 0.000000 14.0270 0 - 744 C4A 24 C4A C4 CH3 0.000000 15.0350 0 - 745 C4A 25 C4A C1 CH2 0.000000 14.0270 0 - 746 C4A 25 C4A C2 CH3 0.000000 15.0350 0 - 747 C4A 25 C4A C3 CH2 0.000000 14.0270 0 - 748 C4A 25 C4A C4 CH3 0.000000 15.0350 0 - 749 C4A 26 C4A C1 CH2 0.000000 14.0270 0 - 750 C4A 26 C4A C2 CH3 0.000000 15.0350 0 - 751 C4A 26 C4A C3 CH2 0.000000 14.0270 0 - 752 C4A 26 C4A C4 CH3 0.000000 15.0350 0 - 753 C4A 27 C4A C1 CH2 0.000000 14.0270 0 - 754 C4A 27 C4A C2 CH3 0.000000 15.0350 0 - 755 C4A 27 C4A C3 CH2 0.000000 14.0270 0 - 756 C4A 27 C4A C4 CH3 0.000000 15.0350 0 - 757 C4A 28 C4A C1 CH2 0.000000 14.0270 0 - 758 C4A 28 C4A C2 CH3 0.000000 15.0350 0 - 759 C4A 28 C4A C3 CH2 0.000000 14.0270 0 - 760 C4A 28 C4A C4 CH3 0.000000 15.0350 0 - 761 C4A 29 C4A C1 CH2 0.000000 14.0270 0 - 762 C4A 29 C4A C2 CH3 0.000000 15.0350 0 - 763 C4A 29 C4A C3 CH2 0.000000 14.0270 0 - 764 C4A 29 C4A C4 CH3 0.000000 15.0350 0 - 765 C4A 30 C4A C1 CH2 0.000000 14.0270 0 - 766 C4A 30 C4A C2 CH3 0.000000 15.0350 0 - 767 C4A 30 C4A C3 CH2 0.000000 14.0270 0 - 768 C4A 30 C4A C4 CH3 0.000000 15.0350 0 - 769 C4A 31 C4A C1 CH2 0.000000 14.0270 0 - 770 C4A 31 C4A C2 CH3 0.000000 15.0350 0 - 771 C4A 31 C4A C3 CH2 0.000000 14.0270 0 - 772 C4A 31 C4A C4 CH3 0.000000 15.0350 0 - 773 C4A 32 C4A C1 CH2 0.000000 14.0270 0 - 774 C4A 32 C4A C2 CH3 0.000000 15.0350 0 - 775 C4A 32 C4A C3 CH2 0.000000 14.0270 0 - 776 C4A 32 C4A C4 CH3 0.000000 15.0350 0 - 777 C4A 33 C4A C1 CH2 0.000000 14.0270 0 - 778 C4A 33 C4A C2 CH3 0.000000 15.0350 0 - 779 C4A 33 C4A C3 CH2 0.000000 14.0270 0 - 780 C4A 33 C4A C4 CH3 0.000000 15.0350 0 - 781 C4A 34 C4A C1 CH2 0.000000 14.0270 0 - 782 C4A 34 C4A C2 CH3 0.000000 15.0350 0 - 783 C4A 34 C4A C3 CH2 0.000000 14.0270 0 - 784 C4A 34 C4A C4 CH3 0.000000 15.0350 0 - 785 C4A 35 C4A C1 CH2 0.000000 14.0270 0 - 786 C4A 35 C4A C2 CH3 0.000000 15.0350 0 - 787 C4A 35 C4A C3 CH2 0.000000 14.0270 0 - 788 C4A 35 C4A C4 CH3 0.000000 15.0350 0 - 789 C4A 36 C4A C1 CH2 0.000000 14.0270 0 - 790 C4A 36 C4A C2 CH3 0.000000 15.0350 0 - 791 C4A 36 C4A C3 CH2 0.000000 14.0270 0 - 792 C4A 36 C4A C4 CH3 0.000000 15.0350 0 - 793 C4A 37 C4A C1 CH2 0.000000 14.0270 0 - 794 C4A 37 C4A C2 CH3 0.000000 15.0350 0 - 795 C4A 37 C4A C3 CH2 0.000000 14.0270 0 - 796 C4A 37 C4A C4 CH3 0.000000 15.0350 0 - 797 C4A 38 C4A C1 CH2 0.000000 14.0270 0 - 798 C4A 38 C4A C2 CH3 0.000000 15.0350 0 - 799 C4A 38 C4A C3 CH2 0.000000 14.0270 0 - 800 C4A 38 C4A C4 CH3 0.000000 15.0350 0 - 801 C4A 39 C4A C1 CH2 0.000000 14.0270 0 - 802 C4A 39 C4A C2 CH3 0.000000 15.0350 0 - 803 C4A 39 C4A C3 CH2 0.000000 14.0270 0 - 804 C4A 39 C4A C4 CH3 0.000000 15.0350 0 - 805 C4A 40 C4A C1 CH2 0.000000 14.0270 0 - 806 C4A 40 C4A C2 CH3 0.000000 15.0350 0 - 807 C4A 40 C4A C3 CH2 0.000000 14.0270 0 - 808 C4A 40 C4A C4 CH3 0.000000 15.0350 0 - 809 C4A 41 C4A C1 CH2 0.000000 14.0270 0 - 810 C4A 41 C4A C2 CH3 0.000000 15.0350 0 - 811 C4A 41 C4A C3 CH2 0.000000 14.0270 0 - 812 C4A 41 C4A C4 CH3 0.000000 15.0350 0 - 813 C4A 42 C4A C1 CH2 0.000000 14.0270 0 - 814 C4A 42 C4A C2 CH3 0.000000 15.0350 0 - 815 C4A 42 C4A C3 CH2 0.000000 14.0270 0 - 816 C4A 42 C4A C4 CH3 0.000000 15.0350 0 - 817 C4A 43 C4A C1 CH2 0.000000 14.0270 0 - 818 C4A 43 C4A C2 CH3 0.000000 15.0350 0 - 819 C4A 43 C4A C3 CH2 0.000000 14.0270 0 - 820 C4A 43 C4A C4 CH3 0.000000 15.0350 0 - 821 C4A 44 C4A C1 CH2 0.000000 14.0270 0 - 822 C4A 44 C4A C2 CH3 0.000000 15.0350 0 - 823 C4A 44 C4A C3 CH2 0.000000 14.0270 0 - 824 C4A 44 C4A C4 CH3 0.000000 15.0350 0 - 825 C4A 45 C4A C1 CH2 0.000000 14.0270 0 - 826 C4A 45 C4A C2 CH3 0.000000 15.0350 0 - 827 C4A 45 C4A C3 CH2 0.000000 14.0270 0 - 828 C4A 45 C4A C4 CH3 0.000000 15.0350 0 - 829 C4A 46 C4A C1 CH2 0.000000 14.0270 0 - 830 C4A 46 C4A C2 CH3 0.000000 15.0350 0 - 831 C4A 46 C4A C3 CH2 0.000000 14.0270 0 - 832 C4A 46 C4A C4 CH3 0.000000 15.0350 0 - 833 C4A 47 C4A C1 CH2 0.000000 14.0270 0 - 834 C4A 47 C4A C2 CH3 0.000000 15.0350 0 - 835 C4A 47 C4A C3 CH2 0.000000 14.0270 0 - 836 C4A 47 C4A C4 CH3 0.000000 15.0350 0 - 837 C4A 48 C4A C1 CH2 0.000000 14.0270 0 - 838 C4A 48 C4A C2 CH3 0.000000 15.0350 0 - 839 C4A 48 C4A C3 CH2 0.000000 14.0270 0 - 840 C4A 48 C4A C4 CH3 0.000000 15.0350 0 - 841 C4A 49 C4A C1 CH2 0.000000 14.0270 0 - 842 C4A 49 C4A C2 CH3 0.000000 15.0350 0 - 843 C4A 49 C4A C3 CH2 0.000000 14.0270 0 - 844 C4A 49 C4A C4 CH3 0.000000 15.0350 0 - 845 C4A 50 C4A C1 CH2 0.000000 14.0270 0 - 846 C4A 50 C4A C2 CH3 0.000000 15.0350 0 - 847 C4A 50 C4A C3 CH2 0.000000 14.0270 0 - 848 C4A 50 C4A C4 CH3 0.000000 15.0350 0 - 849 C4A 51 C4A C1 CH2 0.000000 14.0270 0 - 850 C4A 51 C4A C2 CH3 0.000000 15.0350 0 - 851 C4A 51 C4A C3 CH2 0.000000 14.0270 0 - 852 C4A 51 C4A C4 CH3 0.000000 15.0350 0 - 853 C4A 52 C4A C1 CH2 0.000000 14.0270 0 - 854 C4A 52 C4A C2 CH3 0.000000 15.0350 0 - 855 C4A 52 C4A C3 CH2 0.000000 14.0270 0 - 856 C4A 52 C4A C4 CH3 0.000000 15.0350 0 - 857 C4A 53 C4A C1 CH2 0.000000 14.0270 0 - 858 C4A 53 C4A C2 CH3 0.000000 15.0350 0 - 859 C4A 53 C4A C3 CH2 0.000000 14.0270 0 - 860 C4A 53 C4A C4 CH3 0.000000 15.0350 0 - 861 C4A 54 C4A C1 CH2 0.000000 14.0270 0 - 862 C4A 54 C4A C2 CH3 0.000000 15.0350 0 - 863 C4A 54 C4A C3 CH2 0.000000 14.0270 0 - 864 C4A 54 C4A C4 CH3 0.000000 15.0350 0 - 865 C4A 55 C4A C1 CH2 0.000000 14.0270 0 - 866 C4A 55 C4A C2 CH3 0.000000 15.0350 0 - 867 C4A 55 C4A C3 CH2 0.000000 14.0270 0 - 868 C4A 55 C4A C4 CH3 0.000000 15.0350 0 - 869 C4A 56 C4A C1 CH2 0.000000 14.0270 0 - 870 C4A 56 C4A C2 CH3 0.000000 15.0350 0 - 871 C4A 56 C4A C3 CH2 0.000000 14.0270 0 - 872 C4A 56 C4A C4 CH3 0.000000 15.0350 0 - 873 C4A 57 C4A C1 CH2 0.000000 14.0270 0 - 874 C4A 57 C4A C2 CH3 0.000000 15.0350 0 - 875 C4A 57 C4A C3 CH2 0.000000 14.0270 0 - 876 C4A 57 C4A C4 CH3 0.000000 15.0350 0 - 877 C4A 58 C4A C1 CH2 0.000000 14.0270 0 - 878 C4A 58 C4A C2 CH3 0.000000 15.0350 0 - 879 C4A 58 C4A C3 CH2 0.000000 14.0270 0 - 880 C4A 58 C4A C4 CH3 0.000000 15.0350 0 - 881 C4A 59 C4A C1 CH2 0.000000 14.0270 0 - 882 C4A 59 C4A C2 CH3 0.000000 15.0350 0 - 883 C4A 59 C4A C3 CH2 0.000000 14.0270 0 - 884 C4A 59 C4A C4 CH3 0.000000 15.0350 0 - 885 C4A 60 C4A C1 CH2 0.000000 14.0270 0 - 886 C4A 60 C4A C2 CH3 0.000000 15.0350 0 - 887 C4A 60 C4A C3 CH2 0.000000 14.0270 0 - 888 C4A 60 C4A C4 CH3 0.000000 15.0350 0 - 889 C4A 61 C4A C1 CH2 0.000000 14.0270 0 - 890 C4A 61 C4A C2 CH3 0.000000 15.0350 0 - 891 C4A 61 C4A C3 CH2 0.000000 14.0270 0 - 892 C4A 61 C4A C4 CH3 0.000000 15.0350 0 - 893 C4A 62 C4A C1 CH2 0.000000 14.0270 0 - 894 C4A 62 C4A C2 CH3 0.000000 15.0350 0 - 895 C4A 62 C4A C3 CH2 0.000000 14.0270 0 - 896 C4A 62 C4A C4 CH3 0.000000 15.0350 0 - 897 C4A 63 C4A C1 CH2 0.000000 14.0270 0 - 898 C4A 63 C4A C2 CH3 0.000000 15.0350 0 - 899 C4A 63 C4A C3 CH2 0.000000 14.0270 0 - 900 C4A 63 C4A C4 CH3 0.000000 15.0350 0 - 901 C4A 64 C4A C1 CH2 0.000000 14.0270 0 - 902 C4A 64 C4A C2 CH3 0.000000 15.0350 0 - 903 C4A 64 C4A C3 CH2 0.000000 14.0270 0 - 904 C4A 64 C4A C4 CH3 0.000000 15.0350 0 - 905 C4A 65 C4A C1 CH2 0.000000 14.0270 0 - 906 C4A 65 C4A C2 CH3 0.000000 15.0350 0 - 907 C4A 65 C4A C3 CH2 0.000000 14.0270 0 - 908 C4A 65 C4A C4 CH3 0.000000 15.0350 0 - 909 C4A 66 C4A C1 CH2 0.000000 14.0270 0 - 910 C4A 66 C4A C2 CH3 0.000000 15.0350 0 - 911 C4A 66 C4A C3 CH2 0.000000 14.0270 0 - 912 C4A 66 C4A C4 CH3 0.000000 15.0350 0 - 913 C4A 67 C4A C1 CH2 0.000000 14.0270 0 - 914 C4A 67 C4A C2 CH3 0.000000 15.0350 0 - 915 C4A 67 C4A C3 CH2 0.000000 14.0270 0 - 916 C4A 67 C4A C4 CH3 0.000000 15.0350 0 - 917 C4A 68 C4A C1 CH2 0.000000 14.0270 0 - 918 C4A 68 C4A C2 CH3 0.000000 15.0350 0 - 919 C4A 68 C4A C3 CH2 0.000000 14.0270 0 - 920 C4A 68 C4A C4 CH3 0.000000 15.0350 0 - 921 C4A 69 C4A C1 CH2 0.000000 14.0270 0 - 922 C4A 69 C4A C2 CH3 0.000000 15.0350 0 - 923 C4A 69 C4A C3 CH2 0.000000 14.0270 0 - 924 C4A 69 C4A C4 CH3 0.000000 15.0350 0 - 925 C4A 70 C4A C1 CH2 0.000000 14.0270 0 - 926 C4A 70 C4A C2 CH3 0.000000 15.0350 0 - 927 C4A 70 C4A C3 CH2 0.000000 14.0270 0 - 928 C4A 70 C4A C4 CH3 0.000000 15.0350 0 - 929 C4A 71 C4A C1 CH2 0.000000 14.0270 0 - 930 C4A 71 C4A C2 CH3 0.000000 15.0350 0 - 931 C4A 71 C4A C3 CH2 0.000000 14.0270 0 - 932 C4A 71 C4A C4 CH3 0.000000 15.0350 0 - 933 C4A 72 C4A C1 CH2 0.000000 14.0270 0 - 934 C4A 72 C4A C2 CH3 0.000000 15.0350 0 - 935 C4A 72 C4A C3 CH2 0.000000 14.0270 0 - 936 C4A 72 C4A C4 CH3 0.000000 15.0350 0 - 937 C4A 73 C4A C1 CH2 0.000000 14.0270 0 - 938 C4A 73 C4A C2 CH3 0.000000 15.0350 0 - 939 C4A 73 C4A C3 CH2 0.000000 14.0270 0 - 940 C4A 73 C4A C4 CH3 0.000000 15.0350 0 - 941 C4A 74 C4A C1 CH2 0.000000 14.0270 0 - 942 C4A 74 C4A C2 CH3 0.000000 15.0350 0 - 943 C4A 74 C4A C3 CH2 0.000000 14.0270 0 - 944 C4A 74 C4A C4 CH3 0.000000 15.0350 0 - 945 C4A 75 C4A C1 CH2 0.000000 14.0270 0 - 946 C4A 75 C4A C2 CH3 0.000000 15.0350 0 - 947 C4A 75 C4A C3 CH2 0.000000 14.0270 0 - 948 C4A 75 C4A C4 CH3 0.000000 15.0350 0 - 949 C4A 76 C4A C1 CH2 0.000000 14.0270 0 - 950 C4A 76 C4A C2 CH3 0.000000 15.0350 0 - 951 C4A 76 C4A C3 CH2 0.000000 14.0270 0 - 952 C4A 76 C4A C4 CH3 0.000000 15.0350 0 - 953 C4A 77 C4A C1 CH2 0.000000 14.0270 0 - 954 C4A 77 C4A C2 CH3 0.000000 15.0350 0 - 955 C4A 77 C4A C3 CH2 0.000000 14.0270 0 - 956 C4A 77 C4A C4 CH3 0.000000 15.0350 0 - 957 C4A 78 C4A C1 CH2 0.000000 14.0270 0 - 958 C4A 78 C4A C2 CH3 0.000000 15.0350 0 - 959 C4A 78 C4A C3 CH2 0.000000 14.0270 0 - 960 C4A 78 C4A C4 CH3 0.000000 15.0350 0 - 961 C4A 79 C4A C1 CH2 0.000000 14.0270 0 - 962 C4A 79 C4A C2 CH3 0.000000 15.0350 0 - 963 C4A 79 C4A C3 CH2 0.000000 14.0270 0 - 964 C4A 79 C4A C4 CH3 0.000000 15.0350 0 - 965 C4A 80 C4A C1 CH2 0.000000 14.0270 0 - 966 C4A 80 C4A C2 CH3 0.000000 15.0350 0 - 967 C4A 80 C4A C3 CH2 0.000000 14.0270 0 - 968 C4A 80 C4A C4 CH3 0.000000 15.0350 0 - 969 C4A 81 C4A C1 CH2 0.000000 14.0270 0 - 970 C4A 81 C4A C2 CH3 0.000000 15.0350 0 - 971 C4A 81 C4A C3 CH2 0.000000 14.0270 0 - 972 C4A 81 C4A C4 CH3 0.000000 15.0350 0 - 973 C4A 82 C4A C1 CH2 0.000000 14.0270 0 - 974 C4A 82 C4A C2 CH3 0.000000 15.0350 0 - 975 C4A 82 C4A C3 CH2 0.000000 14.0270 0 - 976 C4A 82 C4A C4 CH3 0.000000 15.0350 0 - 977 C4A 83 C4A C1 CH2 0.000000 14.0270 0 - 978 C4A 83 C4A C2 CH3 0.000000 15.0350 0 - 979 C4A 83 C4A C3 CH2 0.000000 14.0270 0 - 980 C4A 83 C4A C4 CH3 0.000000 15.0350 0 - 981 C4A 84 C4A C1 CH2 0.000000 14.0270 0 - 982 C4A 84 C4A C2 CH3 0.000000 15.0350 0 - 983 C4A 84 C4A C3 CH2 0.000000 14.0270 0 - 984 C4A 84 C4A C4 CH3 0.000000 15.0350 0 - 985 C4A 85 C4A C1 CH2 0.000000 14.0270 0 - 986 C4A 85 C4A C2 CH3 0.000000 15.0350 0 - 987 C4A 85 C4A C3 CH2 0.000000 14.0270 0 - 988 C4A 85 C4A C4 CH3 0.000000 15.0350 0 - 989 C4A 86 C4A C1 CH2 0.000000 14.0270 0 - 990 C4A 86 C4A C2 CH3 0.000000 15.0350 0 - 991 C4A 86 C4A C3 CH2 0.000000 14.0270 0 - 992 C4A 86 C4A C4 CH3 0.000000 15.0350 0 - 993 C4A 87 C4A C1 CH2 0.000000 14.0270 0 - 994 C4A 87 C4A C2 CH3 0.000000 15.0350 0 - 995 C4A 87 C4A C3 CH2 0.000000 14.0270 0 - 996 C4A 87 C4A C4 CH3 0.000000 15.0350 0 - 997 C4A 88 C4A C1 CH2 0.000000 14.0270 0 - 998 C4A 88 C4A C2 CH3 0.000000 15.0350 0 - 999 C4A 88 C4A C3 CH2 0.000000 14.0270 0 - 1000 C4A 88 C4A C4 CH3 0.000000 15.0350 0 - 1001 C4A 89 C4A C1 CH2 0.000000 14.0270 0 - 1002 C4A 89 C4A C2 CH3 0.000000 15.0350 0 - 1003 C4A 89 C4A C3 CH2 0.000000 14.0270 0 - 1004 C4A 89 C4A C4 CH3 0.000000 15.0350 0 - 1005 C4A 90 C4A C1 CH2 0.000000 14.0270 0 - 1006 C4A 90 C4A C2 CH3 0.000000 15.0350 0 - 1007 C4A 90 C4A C3 CH2 0.000000 14.0270 0 - 1008 C4A 90 C4A C4 CH3 0.000000 15.0350 0 - 1009 C4A 91 C4A C1 CH2 0.000000 14.0270 0 - 1010 C4A 91 C4A C2 CH3 0.000000 15.0350 0 - 1011 C4A 91 C4A C3 CH2 0.000000 14.0270 0 - 1012 C4A 91 C4A C4 CH3 0.000000 15.0350 0 - 1013 C4A 92 C4A C1 CH2 0.000000 14.0270 0 - 1014 C4A 92 C4A C2 CH3 0.000000 15.0350 0 - 1015 C4A 92 C4A C3 CH2 0.000000 14.0270 0 - 1016 C4A 92 C4A C4 CH3 0.000000 15.0350 0 - 1017 C4A 93 C4A C1 CH2 0.000000 14.0270 0 - 1018 C4A 93 C4A C2 CH3 0.000000 15.0350 0 - 1019 C4A 93 C4A C3 CH2 0.000000 14.0270 0 - 1020 C4A 93 C4A C4 CH3 0.000000 15.0350 0 - 1021 C4A 94 C4A C1 CH2 0.000000 14.0270 0 - 1022 C4A 94 C4A C2 CH3 0.000000 15.0350 0 - 1023 C4A 94 C4A C3 CH2 0.000000 14.0270 0 - 1024 C4A 94 C4A C4 CH3 0.000000 15.0350 0 - 1025 C4A 95 C4A C1 CH2 0.000000 14.0270 0 - 1026 C4A 95 C4A C2 CH3 0.000000 15.0350 0 - 1027 C4A 95 C4A C3 CH2 0.000000 14.0270 0 - 1028 C4A 95 C4A C4 CH3 0.000000 15.0350 0 - 1029 C4A 96 C4A C1 CH2 0.000000 14.0270 0 - 1030 C4A 96 C4A C2 CH3 0.000000 15.0350 0 - 1031 C4A 96 C4A C3 CH2 0.000000 14.0270 0 - 1032 C4A 96 C4A C4 CH3 0.000000 15.0350 0 - 1033 C4A 97 C4A C1 CH2 0.000000 14.0270 0 - 1034 C4A 97 C4A C2 CH3 0.000000 15.0350 0 - 1035 C4A 97 C4A C3 CH2 0.000000 14.0270 0 - 1036 C4A 97 C4A C4 CH3 0.000000 15.0350 0 - 1037 C4A 98 C4A C1 CH2 0.000000 14.0270 0 - 1038 C4A 98 C4A C2 CH3 0.000000 15.0350 0 - 1039 C4A 98 C4A C3 CH2 0.000000 14.0270 0 - 1040 C4A 98 C4A C4 CH3 0.000000 15.0350 0 - 1041 C4A 99 C4A C1 CH2 0.000000 14.0270 0 - 1042 C4A 99 C4A C2 CH3 0.000000 15.0350 0 - 1043 C4A 99 C4A C3 CH2 0.000000 14.0270 0 - 1044 C4A 99 C4A C4 CH3 0.000000 15.0350 0 - 1045 C4A 100 C4A C1 CH2 0.000000 14.0270 0 - 1046 C4A 100 C4A C2 CH3 0.000000 15.0350 0 - 1047 C4A 100 C4A C3 CH2 0.000000 14.0270 0 - 1048 C4A 100 C4A C4 CH3 0.000000 15.0350 0 - 1049 C4A 101 C4A C1 CH2 0.000000 14.0270 0 - 1050 C4A 101 C4A C2 CH3 0.000000 15.0350 0 - 1051 C4A 101 C4A C3 CH2 0.000000 14.0270 0 - 1052 C4A 101 C4A C4 CH3 0.000000 15.0350 0 - 1053 C4A 102 C4A C1 CH2 0.000000 14.0270 0 - 1054 C4A 102 C4A C2 CH3 0.000000 15.0350 0 - 1055 C4A 102 C4A C3 CH2 0.000000 14.0270 0 - 1056 C4A 102 C4A C4 CH3 0.000000 15.0350 0 - 1057 C4A 103 C4A C1 CH2 0.000000 14.0270 0 - 1058 C4A 103 C4A C2 CH3 0.000000 15.0350 0 - 1059 C4A 103 C4A C3 CH2 0.000000 14.0270 0 - 1060 C4A 103 C4A C4 CH3 0.000000 15.0350 0 - 1061 C4A 104 C4A C1 CH2 0.000000 14.0270 0 - 1062 C4A 104 C4A C2 CH3 0.000000 15.0350 0 - 1063 C4A 104 C4A C3 CH2 0.000000 14.0270 0 - 1064 C4A 104 C4A C4 CH3 0.000000 15.0350 0 - 1065 C4A 105 C4A C1 CH2 0.000000 14.0270 0 - 1066 C4A 105 C4A C2 CH3 0.000000 15.0350 0 - 1067 C4A 105 C4A C3 CH2 0.000000 14.0270 0 - 1068 C4A 105 C4A C4 CH3 0.000000 15.0350 0 - 1069 C4A 106 C4A C1 CH2 0.000000 14.0270 0 - 1070 C4A 106 C4A C2 CH3 0.000000 15.0350 0 - 1071 C4A 106 C4A C3 CH2 0.000000 14.0270 0 - 1072 C4A 106 C4A C4 CH3 0.000000 15.0350 0 - 1073 C4A 107 C4A C1 CH2 0.000000 14.0270 0 - 1074 C4A 107 C4A C2 CH3 0.000000 15.0350 0 - 1075 C4A 107 C4A C3 CH2 0.000000 14.0270 0 - 1076 C4A 107 C4A C4 CH3 0.000000 15.0350 0 - 1077 C4A 108 C4A C1 CH2 0.000000 14.0270 0 - 1078 C4A 108 C4A C2 CH3 0.000000 15.0350 0 - 1079 C4A 108 C4A C3 CH2 0.000000 14.0270 0 - 1080 C4A 108 C4A C4 CH3 0.000000 15.0350 0 - 1081 C4A 109 C4A C1 CH2 0.000000 14.0270 0 - 1082 C4A 109 C4A C2 CH3 0.000000 15.0350 0 - 1083 C4A 109 C4A C3 CH2 0.000000 14.0270 0 - 1084 C4A 109 C4A C4 CH3 0.000000 15.0350 0 - 1085 C4A 110 C4A C1 CH2 0.000000 14.0270 0 - 1086 C4A 110 C4A C2 CH3 0.000000 15.0350 0 - 1087 C4A 110 C4A C3 CH2 0.000000 14.0270 0 - 1088 C4A 110 C4A C4 CH3 0.000000 15.0350 0 - 1089 C4A 111 C4A C1 CH2 0.000000 14.0270 0 - 1090 C4A 111 C4A C2 CH3 0.000000 15.0350 0 - 1091 C4A 111 C4A C3 CH2 0.000000 14.0270 0 - 1092 C4A 111 C4A C4 CH3 0.000000 15.0350 0 - 1093 C4A 112 C4A C1 CH2 0.000000 14.0270 0 - 1094 C4A 112 C4A C2 CH3 0.000000 15.0350 0 - 1095 C4A 112 C4A C3 CH2 0.000000 14.0270 0 - 1096 C4A 112 C4A C4 CH3 0.000000 15.0350 0 - 1097 C4A 113 C4A C1 CH2 0.000000 14.0270 0 - 1098 C4A 113 C4A C2 CH3 0.000000 15.0350 0 - 1099 C4A 113 C4A C3 CH2 0.000000 14.0270 0 - 1100 C4A 113 C4A C4 CH3 0.000000 15.0350 0 - 1101 C4A 114 C4A C1 CH2 0.000000 14.0270 0 - 1102 C4A 114 C4A C2 CH3 0.000000 15.0350 0 - 1103 C4A 114 C4A C3 CH2 0.000000 14.0270 0 - 1104 C4A 114 C4A C4 CH3 0.000000 15.0350 0 - 1105 C4A 115 C4A C1 CH2 0.000000 14.0270 0 - 1106 C4A 115 C4A C2 CH3 0.000000 15.0350 0 - 1107 C4A 115 C4A C3 CH2 0.000000 14.0270 0 - 1108 C4A 115 C4A C4 CH3 0.000000 15.0350 0 - 1109 C4A 116 C4A C1 CH2 0.000000 14.0270 0 - 1110 C4A 116 C4A C2 CH3 0.000000 15.0350 0 - 1111 C4A 116 C4A C3 CH2 0.000000 14.0270 0 - 1112 C4A 116 C4A C4 CH3 0.000000 15.0350 0 - 1113 C4A 117 C4A C1 CH2 0.000000 14.0270 0 - 1114 C4A 117 C4A C2 CH3 0.000000 15.0350 0 - 1115 C4A 117 C4A C3 CH2 0.000000 14.0270 0 - 1116 C4A 117 C4A C4 CH3 0.000000 15.0350 0 - 1117 C4A 118 C4A C1 CH2 0.000000 14.0270 0 - 1118 C4A 118 C4A C2 CH3 0.000000 15.0350 0 - 1119 C4A 118 C4A C3 CH2 0.000000 14.0270 0 - 1120 C4A 118 C4A C4 CH3 0.000000 15.0350 0 - 1121 C4A 119 C4A C1 CH2 0.000000 14.0270 0 - 1122 C4A 119 C4A C2 CH3 0.000000 15.0350 0 - 1123 C4A 119 C4A C3 CH2 0.000000 14.0270 0 - 1124 C4A 119 C4A C4 CH3 0.000000 15.0350 0 - 1125 C4A 120 C4A C1 CH2 0.000000 14.0270 0 - 1126 C4A 120 C4A C2 CH3 0.000000 15.0350 0 - 1127 C4A 120 C4A C3 CH2 0.000000 14.0270 0 - 1128 C4A 120 C4A C4 CH3 0.000000 15.0350 0 - 1129 C4A 121 C4A C1 CH2 0.000000 14.0270 0 - 1130 C4A 121 C4A C2 CH3 0.000000 15.0350 0 - 1131 C4A 121 C4A C3 CH2 0.000000 14.0270 0 - 1132 C4A 121 C4A C4 CH3 0.000000 15.0350 0 - 1133 C4A 122 C4A C1 CH2 0.000000 14.0270 0 - 1134 C4A 122 C4A C2 CH3 0.000000 15.0350 0 - 1135 C4A 122 C4A C3 CH2 0.000000 14.0270 0 - 1136 C4A 122 C4A C4 CH3 0.000000 15.0350 0 - 1137 C4A 123 C4A C1 CH2 0.000000 14.0270 0 - 1138 C4A 123 C4A C2 CH3 0.000000 15.0350 0 - 1139 C4A 123 C4A C3 CH2 0.000000 14.0270 0 - 1140 C4A 123 C4A C4 CH3 0.000000 15.0350 0 - 1141 C4A 124 C4A C1 CH2 0.000000 14.0270 0 - 1142 C4A 124 C4A C2 CH3 0.000000 15.0350 0 - 1143 C4A 124 C4A C3 CH2 0.000000 14.0270 0 - 1144 C4A 124 C4A C4 CH3 0.000000 15.0350 0 - 1145 C4A 125 C4A C1 CH2 0.000000 14.0270 0 - 1146 C4A 125 C4A C2 CH3 0.000000 15.0350 0 - 1147 C4A 125 C4A C3 CH2 0.000000 14.0270 0 - 1148 C4A 125 C4A C4 CH3 0.000000 15.0350 0 - 1149 C4A 126 C4A C1 CH2 0.000000 14.0270 0 - 1150 C4A 126 C4A C2 CH3 0.000000 15.0350 0 - 1151 C4A 126 C4A C3 CH2 0.000000 14.0270 0 - 1152 C4A 126 C4A C4 CH3 0.000000 15.0350 0 - 1153 C4A 127 C4A C1 CH2 0.000000 14.0270 0 - 1154 C4A 127 C4A C2 CH3 0.000000 15.0350 0 - 1155 C4A 127 C4A C3 CH2 0.000000 14.0270 0 - 1156 C4A 127 C4A C4 CH3 0.000000 15.0350 0 - 1157 C4A 128 C4A C1 CH2 0.000000 14.0270 0 - 1158 C4A 128 C4A C2 CH3 0.000000 15.0350 0 - 1159 C4A 128 C4A C3 CH2 0.000000 14.0270 0 - 1160 C4A 128 C4A C4 CH3 0.000000 15.0350 0 - 1161 C4A 129 C4A C1 CH2 0.000000 14.0270 0 - 1162 C4A 129 C4A C2 CH3 0.000000 15.0350 0 - 1163 C4A 129 C4A C3 CH2 0.000000 14.0270 0 - 1164 C4A 129 C4A C4 CH3 0.000000 15.0350 0 - 1165 C4A 130 C4A C1 CH2 0.000000 14.0270 0 - 1166 C4A 130 C4A C2 CH3 0.000000 15.0350 0 - 1167 C4A 130 C4A C3 CH2 0.000000 14.0270 0 - 1168 C4A 130 C4A C4 CH3 0.000000 15.0350 0 - 1169 C4A 131 C4A C1 CH2 0.000000 14.0270 0 - 1170 C4A 131 C4A C2 CH3 0.000000 15.0350 0 - 1171 C4A 131 C4A C3 CH2 0.000000 14.0270 0 - 1172 C4A 131 C4A C4 CH3 0.000000 15.0350 0 - 1173 C4A 132 C4A C1 CH2 0.000000 14.0270 0 - 1174 C4A 132 C4A C2 CH3 0.000000 15.0350 0 - 1175 C4A 132 C4A C3 CH2 0.000000 14.0270 0 - 1176 C4A 132 C4A C4 CH3 0.000000 15.0350 0 - 1177 C4A 133 C4A C1 CH2 0.000000 14.0270 0 - 1178 C4A 133 C4A C2 CH3 0.000000 15.0350 0 - 1179 C4A 133 C4A C3 CH2 0.000000 14.0270 0 - 1180 C4A 133 C4A C4 CH3 0.000000 15.0350 0 - 1181 C4A 134 C4A C1 CH2 0.000000 14.0270 0 - 1182 C4A 134 C4A C2 CH3 0.000000 15.0350 0 - 1183 C4A 134 C4A C3 CH2 0.000000 14.0270 0 - 1184 C4A 134 C4A C4 CH3 0.000000 15.0350 0 - 1185 C4A 135 C4A C1 CH2 0.000000 14.0270 0 - 1186 C4A 135 C4A C2 CH3 0.000000 15.0350 0 - 1187 C4A 135 C4A C3 CH2 0.000000 14.0270 0 - 1188 C4A 135 C4A C4 CH3 0.000000 15.0350 0 - 1189 C4A 136 C4A C1 CH2 0.000000 14.0270 0 - 1190 C4A 136 C4A C2 CH3 0.000000 15.0350 0 - 1191 C4A 136 C4A C3 CH2 0.000000 14.0270 0 - 1192 C4A 136 C4A C4 CH3 0.000000 15.0350 0 - 1193 C4A 137 C4A C1 CH2 0.000000 14.0270 0 - 1194 C4A 137 C4A C2 CH3 0.000000 15.0350 0 - 1195 C4A 137 C4A C3 CH2 0.000000 14.0270 0 - 1196 C4A 137 C4A C4 CH3 0.000000 15.0350 0 - 1197 C4A 138 C4A C1 CH2 0.000000 14.0270 0 - 1198 C4A 138 C4A C2 CH3 0.000000 15.0350 0 - 1199 C4A 138 C4A C3 CH2 0.000000 14.0270 0 - 1200 C4A 138 C4A C4 CH3 0.000000 15.0350 0 - 1201 C4A 139 C4A C1 CH2 0.000000 14.0270 0 - 1202 C4A 139 C4A C2 CH3 0.000000 15.0350 0 - 1203 C4A 139 C4A C3 CH2 0.000000 14.0270 0 - 1204 C4A 139 C4A C4 CH3 0.000000 15.0350 0 - 1205 C4A 140 C4A C1 CH2 0.000000 14.0270 0 - 1206 C4A 140 C4A C2 CH3 0.000000 15.0350 0 - 1207 C4A 140 C4A C3 CH2 0.000000 14.0270 0 - 1208 C4A 140 C4A C4 CH3 0.000000 15.0350 0 - 1209 C4A 141 C4A C1 CH2 0.000000 14.0270 0 - 1210 C4A 141 C4A C2 CH3 0.000000 15.0350 0 - 1211 C4A 141 C4A C3 CH2 0.000000 14.0270 0 - 1212 C4A 141 C4A C4 CH3 0.000000 15.0350 0 - 1213 C4A 142 C4A C1 CH2 0.000000 14.0270 0 - 1214 C4A 142 C4A C2 CH3 0.000000 15.0350 0 - 1215 C4A 142 C4A C3 CH2 0.000000 14.0270 0 - 1216 C4A 142 C4A C4 CH3 0.000000 15.0350 0 - 1217 C4A 143 C4A C1 CH2 0.000000 14.0270 0 - 1218 C4A 143 C4A C2 CH3 0.000000 15.0350 0 - 1219 C4A 143 C4A C3 CH2 0.000000 14.0270 0 - 1220 C4A 143 C4A C4 CH3 0.000000 15.0350 0 - 1221 C4A 144 C4A C1 CH2 0.000000 14.0270 0 - 1222 C4A 144 C4A C2 CH3 0.000000 15.0350 0 - 1223 C4A 144 C4A C3 CH2 0.000000 14.0270 0 - 1224 C4A 144 C4A C4 CH3 0.000000 15.0350 0 - 1225 C4A 145 C4A C1 CH2 0.000000 14.0270 0 - 1226 C4A 145 C4A C2 CH3 0.000000 15.0350 0 - 1227 C4A 145 C4A C3 CH2 0.000000 14.0270 0 - 1228 C4A 145 C4A C4 CH3 0.000000 15.0350 0 - 1229 C4A 146 C4A C1 CH2 0.000000 14.0270 0 - 1230 C4A 146 C4A C2 CH3 0.000000 15.0350 0 - 1231 C4A 146 C4A C3 CH2 0.000000 14.0270 0 - 1232 C4A 146 C4A C4 CH3 0.000000 15.0350 0 - 1233 C4A 147 C4A C1 CH2 0.000000 14.0270 0 - 1234 C4A 147 C4A C2 CH3 0.000000 15.0350 0 - 1235 C4A 147 C4A C3 CH2 0.000000 14.0270 0 - 1236 C4A 147 C4A C4 CH3 0.000000 15.0350 0 - 1237 C4A 148 C4A C1 CH2 0.000000 14.0270 0 - 1238 C4A 148 C4A C2 CH3 0.000000 15.0350 0 - 1239 C4A 148 C4A C3 CH2 0.000000 14.0270 0 - 1240 C4A 148 C4A C4 CH3 0.000000 15.0350 0 - 1241 C4A 149 C4A C1 CH2 0.000000 14.0270 0 - 1242 C4A 149 C4A C2 CH3 0.000000 15.0350 0 - 1243 C4A 149 C4A C3 CH2 0.000000 14.0270 0 - 1244 C4A 149 C4A C4 CH3 0.000000 15.0350 0 - 1245 C4A 150 C4A C1 CH2 0.000000 14.0270 0 - 1246 C4A 150 C4A C2 CH3 0.000000 15.0350 0 - 1247 C4A 150 C4A C3 CH2 0.000000 14.0270 0 - 1248 C4A 150 C4A C4 CH3 0.000000 15.0350 0 - 1249 C4A 151 C4A C1 CH2 0.000000 14.0270 0 - 1250 C4A 151 C4A C2 CH3 0.000000 15.0350 0 - 1251 C4A 151 C4A C3 CH2 0.000000 14.0270 0 - 1252 C4A 151 C4A C4 CH3 0.000000 15.0350 0 - 1253 C4A 152 C4A C1 CH2 0.000000 14.0270 0 - 1254 C4A 152 C4A C2 CH3 0.000000 15.0350 0 - 1255 C4A 152 C4A C3 CH2 0.000000 14.0270 0 - 1256 C4A 152 C4A C4 CH3 0.000000 15.0350 0 - 1257 C4A 153 C4A C1 CH2 0.000000 14.0270 0 - 1258 C4A 153 C4A C2 CH3 0.000000 15.0350 0 - 1259 C4A 153 C4A C3 CH2 0.000000 14.0270 0 - 1260 C4A 153 C4A C4 CH3 0.000000 15.0350 0 - 1261 C4A 154 C4A C1 CH2 0.000000 14.0270 0 - 1262 C4A 154 C4A C2 CH3 0.000000 15.0350 0 - 1263 C4A 154 C4A C3 CH2 0.000000 14.0270 0 - 1264 C4A 154 C4A C4 CH3 0.000000 15.0350 0 - 1265 C4A 155 C4A C1 CH2 0.000000 14.0270 0 - 1266 C4A 155 C4A C2 CH3 0.000000 15.0350 0 - 1267 C4A 155 C4A C3 CH2 0.000000 14.0270 0 - 1268 C4A 155 C4A C4 CH3 0.000000 15.0350 0 - 1269 C4A 156 C4A C1 CH2 0.000000 14.0270 0 - 1270 C4A 156 C4A C2 CH3 0.000000 15.0350 0 - 1271 C4A 156 C4A C3 CH2 0.000000 14.0270 0 - 1272 C4A 156 C4A C4 CH3 0.000000 15.0350 0 - 1273 C4A 157 C4A C1 CH2 0.000000 14.0270 0 - 1274 C4A 157 C4A C2 CH3 0.000000 15.0350 0 - 1275 C4A 157 C4A C3 CH2 0.000000 14.0270 0 - 1276 C4A 157 C4A C4 CH3 0.000000 15.0350 0 - 1277 C4A 158 C4A C1 CH2 0.000000 14.0270 0 - 1278 C4A 158 C4A C2 CH3 0.000000 15.0350 0 - 1279 C4A 158 C4A C3 CH2 0.000000 14.0270 0 - 1280 C4A 158 C4A C4 CH3 0.000000 15.0350 0 - 1281 C4A 159 C4A C1 CH2 0.000000 14.0270 0 - 1282 C4A 159 C4A C2 CH3 0.000000 15.0350 0 - 1283 C4A 159 C4A C3 CH2 0.000000 14.0270 0 - 1284 C4A 159 C4A C4 CH3 0.000000 15.0350 0 - 1285 C4A 160 C4A C1 CH2 0.000000 14.0270 0 - 1286 C4A 160 C4A C2 CH3 0.000000 15.0350 0 - 1287 C4A 160 C4A C3 CH2 0.000000 14.0270 0 - 1288 C4A 160 C4A C4 CH3 0.000000 15.0350 0 - 1289 C4A 161 C4A C1 CH2 0.000000 14.0270 0 - 1290 C4A 161 C4A C2 CH3 0.000000 15.0350 0 - 1291 C4A 161 C4A C3 CH2 0.000000 14.0270 0 - 1292 C4A 161 C4A C4 CH3 0.000000 15.0350 0 - 1293 C4A 162 C4A C1 CH2 0.000000 14.0270 0 - 1294 C4A 162 C4A C2 CH3 0.000000 15.0350 0 - 1295 C4A 162 C4A C3 CH2 0.000000 14.0270 0 - 1296 C4A 162 C4A C4 CH3 0.000000 15.0350 0 - 1297 C4A 163 C4A C1 CH2 0.000000 14.0270 0 - 1298 C4A 163 C4A C2 CH3 0.000000 15.0350 0 - 1299 C4A 163 C4A C3 CH2 0.000000 14.0270 0 - 1300 C4A 163 C4A C4 CH3 0.000000 15.0350 0 - 1301 C4A 164 C4A C1 CH2 0.000000 14.0270 0 - 1302 C4A 164 C4A C2 CH3 0.000000 15.0350 0 - 1303 C4A 164 C4A C3 CH2 0.000000 14.0270 0 - 1304 C4A 164 C4A C4 CH3 0.000000 15.0350 0 - 1305 C4A 165 C4A C1 CH2 0.000000 14.0270 0 - 1306 C4A 165 C4A C2 CH3 0.000000 15.0350 0 - 1307 C4A 165 C4A C3 CH2 0.000000 14.0270 0 - 1308 C4A 165 C4A C4 CH3 0.000000 15.0350 0 - 1309 C4A 166 C4A C1 CH2 0.000000 14.0270 0 - 1310 C4A 166 C4A C2 CH3 0.000000 15.0350 0 - 1311 C4A 166 C4A C3 CH2 0.000000 14.0270 0 - 1312 C4A 166 C4A C4 CH3 0.000000 15.0350 0 - 1313 C4A 167 C4A C1 CH2 0.000000 14.0270 0 - 1314 C4A 167 C4A C2 CH3 0.000000 15.0350 0 - 1315 C4A 167 C4A C3 CH2 0.000000 14.0270 0 - 1316 C4A 167 C4A C4 CH3 0.000000 15.0350 0 - 1317 C4A 168 C4A C1 CH2 0.000000 14.0270 0 - 1318 C4A 168 C4A C2 CH3 0.000000 15.0350 0 - 1319 C4A 168 C4A C3 CH2 0.000000 14.0270 0 - 1320 C4A 168 C4A C4 CH3 0.000000 15.0350 0 - 1321 C4A 169 C4A C1 CH2 0.000000 14.0270 0 - 1322 C4A 169 C4A C2 CH3 0.000000 15.0350 0 - 1323 C4A 169 C4A C3 CH2 0.000000 14.0270 0 - 1324 C4A 169 C4A C4 CH3 0.000000 15.0350 0 - 1325 C4A 170 C4A C1 CH2 0.000000 14.0270 0 - 1326 C4A 170 C4A C2 CH3 0.000000 15.0350 0 - 1327 C4A 170 C4A C3 CH2 0.000000 14.0270 0 - 1328 C4A 170 C4A C4 CH3 0.000000 15.0350 0 - 1329 C4A 171 C4A C1 CH2 0.000000 14.0270 0 - 1330 C4A 171 C4A C2 CH3 0.000000 15.0350 0 - 1331 C4A 171 C4A C3 CH2 0.000000 14.0270 0 - 1332 C4A 171 C4A C4 CH3 0.000000 15.0350 0 - 1333 C4A 172 C4A C1 CH2 0.000000 14.0270 0 - 1334 C4A 172 C4A C2 CH3 0.000000 15.0350 0 - 1335 C4A 172 C4A C3 CH2 0.000000 14.0270 0 - 1336 C4A 172 C4A C4 CH3 0.000000 15.0350 0 - 1337 C4A 173 C4A C1 CH2 0.000000 14.0270 0 - 1338 C4A 173 C4A C2 CH3 0.000000 15.0350 0 - 1339 C4A 173 C4A C3 CH2 0.000000 14.0270 0 - 1340 C4A 173 C4A C4 CH3 0.000000 15.0350 0 - 1341 C4A 174 C4A C1 CH2 0.000000 14.0270 0 - 1342 C4A 174 C4A C2 CH3 0.000000 15.0350 0 - 1343 C4A 174 C4A C3 CH2 0.000000 14.0270 0 - 1344 C4A 174 C4A C4 CH3 0.000000 15.0350 0 - 1345 C4A 175 C4A C1 CH2 0.000000 14.0270 0 - 1346 C4A 175 C4A C2 CH3 0.000000 15.0350 0 - 1347 C4A 175 C4A C3 CH2 0.000000 14.0270 0 - 1348 C4A 175 C4A C4 CH3 0.000000 15.0350 0 - 1349 C4A 176 C4A C1 CH2 0.000000 14.0270 0 - 1350 C4A 176 C4A C2 CH3 0.000000 15.0350 0 - 1351 C4A 176 C4A C3 CH2 0.000000 14.0270 0 - 1352 C4A 176 C4A C4 CH3 0.000000 15.0350 0 - 1353 C4A 177 C4A C1 CH2 0.000000 14.0270 0 - 1354 C4A 177 C4A C2 CH3 0.000000 15.0350 0 - 1355 C4A 177 C4A C3 CH2 0.000000 14.0270 0 - 1356 C4A 177 C4A C4 CH3 0.000000 15.0350 0 - 1357 C4A 178 C4A C1 CH2 0.000000 14.0270 0 - 1358 C4A 178 C4A C2 CH3 0.000000 15.0350 0 - 1359 C4A 178 C4A C3 CH2 0.000000 14.0270 0 - 1360 C4A 178 C4A C4 CH3 0.000000 15.0350 0 - 1361 C4A 179 C4A C1 CH2 0.000000 14.0270 0 - 1362 C4A 179 C4A C2 CH3 0.000000 15.0350 0 - 1363 C4A 179 C4A C3 CH2 0.000000 14.0270 0 - 1364 C4A 179 C4A C4 CH3 0.000000 15.0350 0 - 1365 C4A 180 C4A C1 CH2 0.000000 14.0270 0 - 1366 C4A 180 C4A C2 CH3 0.000000 15.0350 0 - 1367 C4A 180 C4A C3 CH2 0.000000 14.0270 0 - 1368 C4A 180 C4A C4 CH3 0.000000 15.0350 0 - 1369 C4A 181 C4A C1 CH2 0.000000 14.0270 0 - 1370 C4A 181 C4A C2 CH3 0.000000 15.0350 0 - 1371 C4A 181 C4A C3 CH2 0.000000 14.0270 0 - 1372 C4A 181 C4A C4 CH3 0.000000 15.0350 0 - 1373 C4A 182 C4A C1 CH2 0.000000 14.0270 0 - 1374 C4A 182 C4A C2 CH3 0.000000 15.0350 0 - 1375 C4A 182 C4A C3 CH2 0.000000 14.0270 0 - 1376 C4A 182 C4A C4 CH3 0.000000 15.0350 0 - 1377 C4A 183 C4A C1 CH2 0.000000 14.0270 0 - 1378 C4A 183 C4A C2 CH3 0.000000 15.0350 0 - 1379 C4A 183 C4A C3 CH2 0.000000 14.0270 0 - 1380 C4A 183 C4A C4 CH3 0.000000 15.0350 0 - 1381 C4A 184 C4A C1 CH2 0.000000 14.0270 0 - 1382 C4A 184 C4A C2 CH3 0.000000 15.0350 0 - 1383 C4A 184 C4A C3 CH2 0.000000 14.0270 0 - 1384 C4A 184 C4A C4 CH3 0.000000 15.0350 0 - 1385 C4A 185 C4A C1 CH2 0.000000 14.0270 0 - 1386 C4A 185 C4A C2 CH3 0.000000 15.0350 0 - 1387 C4A 185 C4A C3 CH2 0.000000 14.0270 0 - 1388 C4A 185 C4A C4 CH3 0.000000 15.0350 0 - 1389 C4A 186 C4A C1 CH2 0.000000 14.0270 0 - 1390 C4A 186 C4A C2 CH3 0.000000 15.0350 0 - 1391 C4A 186 C4A C3 CH2 0.000000 14.0270 0 - 1392 C4A 186 C4A C4 CH3 0.000000 15.0350 0 - 1393 C4A 187 C4A C1 CH2 0.000000 14.0270 0 - 1394 C4A 187 C4A C2 CH3 0.000000 15.0350 0 - 1395 C4A 187 C4A C3 CH2 0.000000 14.0270 0 - 1396 C4A 187 C4A C4 CH3 0.000000 15.0350 0 - 1397 C4A 188 C4A C1 CH2 0.000000 14.0270 0 - 1398 C4A 188 C4A C2 CH3 0.000000 15.0350 0 - 1399 C4A 188 C4A C3 CH2 0.000000 14.0270 0 - 1400 C4A 188 C4A C4 CH3 0.000000 15.0350 0 - 1401 C4A 189 C4A C1 CH2 0.000000 14.0270 0 - 1402 C4A 189 C4A C2 CH3 0.000000 15.0350 0 - 1403 C4A 189 C4A C3 CH2 0.000000 14.0270 0 - 1404 C4A 189 C4A C4 CH3 0.000000 15.0350 0 - 1405 C4A 190 C4A C1 CH2 0.000000 14.0270 0 - 1406 C4A 190 C4A C2 CH3 0.000000 15.0350 0 - 1407 C4A 190 C4A C3 CH2 0.000000 14.0270 0 - 1408 C4A 190 C4A C4 CH3 0.000000 15.0350 0 - 1409 C4A 191 C4A C1 CH2 0.000000 14.0270 0 - 1410 C4A 191 C4A C2 CH3 0.000000 15.0350 0 - 1411 C4A 191 C4A C3 CH2 0.000000 14.0270 0 - 1412 C4A 191 C4A C4 CH3 0.000000 15.0350 0 - 1413 C4A 192 C4A C1 CH2 0.000000 14.0270 0 - 1414 C4A 192 C4A C2 CH3 0.000000 15.0350 0 - 1415 C4A 192 C4A C3 CH2 0.000000 14.0270 0 - 1416 C4A 192 C4A C4 CH3 0.000000 15.0350 0 - 1417 C4A 193 C4A C1 CH2 0.000000 14.0270 0 - 1418 C4A 193 C4A C2 CH3 0.000000 15.0350 0 - 1419 C4A 193 C4A C3 CH2 0.000000 14.0270 0 - 1420 C4A 193 C4A C4 CH3 0.000000 15.0350 0 - 1421 C4A 194 C4A C1 CH2 0.000000 14.0270 0 - 1422 C4A 194 C4A C2 CH3 0.000000 15.0350 0 - 1423 C4A 194 C4A C3 CH2 0.000000 14.0270 0 - 1424 C4A 194 C4A C4 CH3 0.000000 15.0350 0 - 1425 C4A 195 C4A C1 CH2 0.000000 14.0270 0 - 1426 C4A 195 C4A C2 CH3 0.000000 15.0350 0 - 1427 C4A 195 C4A C3 CH2 0.000000 14.0270 0 - 1428 C4A 195 C4A C4 CH3 0.000000 15.0350 0 - 1429 C4A 196 C4A C1 CH2 0.000000 14.0270 0 - 1430 C4A 196 C4A C2 CH3 0.000000 15.0350 0 - 1431 C4A 196 C4A C3 CH2 0.000000 14.0270 0 - 1432 C4A 196 C4A C4 CH3 0.000000 15.0350 0 - 1433 C4A 197 C4A C1 CH2 0.000000 14.0270 0 - 1434 C4A 197 C4A C2 CH3 0.000000 15.0350 0 - 1435 C4A 197 C4A C3 CH2 0.000000 14.0270 0 - 1436 C4A 197 C4A C4 CH3 0.000000 15.0350 0 - 1437 C4A 198 C4A C1 CH2 0.000000 14.0270 0 - 1438 C4A 198 C4A C2 CH3 0.000000 15.0350 0 - 1439 C4A 198 C4A C3 CH2 0.000000 14.0270 0 - 1440 C4A 198 C4A C4 CH3 0.000000 15.0350 0 - 1441 C4A 199 C4A C1 CH2 0.000000 14.0270 0 - 1442 C4A 199 C4A C2 CH3 0.000000 15.0350 0 - 1443 C4A 199 C4A C3 CH2 0.000000 14.0270 0 - 1444 C4A 199 C4A C4 CH3 0.000000 15.0350 0 - 1445 C4A 200 C4A C1 CH2 0.000000 14.0270 0 - 1446 C4A 200 C4A C2 CH3 0.000000 15.0350 0 - 1447 C4A 200 C4A C3 CH2 0.000000 14.0270 0 - 1448 C4A 200 C4A C4 CH3 0.000000 15.0350 0 - 1449 C4A 201 C4A C1 CH2 0.000000 14.0270 0 - 1450 C4A 201 C4A C2 CH3 0.000000 15.0350 0 - 1451 C4A 201 C4A C3 CH2 0.000000 14.0270 0 - 1452 C4A 201 C4A C4 CH3 0.000000 15.0350 0 - 1453 C4A 202 C4A C1 CH2 0.000000 14.0270 0 - 1454 C4A 202 C4A C2 CH3 0.000000 15.0350 0 - 1455 C4A 202 C4A C3 CH2 0.000000 14.0270 0 - 1456 C4A 202 C4A C4 CH3 0.000000 15.0350 0 - 1457 C4A 203 C4A C1 CH2 0.000000 14.0270 0 - 1458 C4A 203 C4A C2 CH3 0.000000 15.0350 0 - 1459 C4A 203 C4A C3 CH2 0.000000 14.0270 0 - 1460 C4A 203 C4A C4 CH3 0.000000 15.0350 0 - 1461 C4A 204 C4A C1 CH2 0.000000 14.0270 0 - 1462 C4A 204 C4A C2 CH3 0.000000 15.0350 0 - 1463 C4A 204 C4A C3 CH2 0.000000 14.0270 0 - 1464 C4A 204 C4A C4 CH3 0.000000 15.0350 0 - 1465 C4A 205 C4A C1 CH2 0.000000 14.0270 0 - 1466 C4A 205 C4A C2 CH3 0.000000 15.0350 0 - 1467 C4A 205 C4A C3 CH2 0.000000 14.0270 0 - 1468 C4A 205 C4A C4 CH3 0.000000 15.0350 0 - 1469 C4A 206 C4A C1 CH2 0.000000 14.0270 0 - 1470 C4A 206 C4A C2 CH3 0.000000 15.0350 0 - 1471 C4A 206 C4A C3 CH2 0.000000 14.0270 0 - 1472 C4A 206 C4A C4 CH3 0.000000 15.0350 0 - 1473 C4A 207 C4A C1 CH2 0.000000 14.0270 0 - 1474 C4A 207 C4A C2 CH3 0.000000 15.0350 0 - 1475 C4A 207 C4A C3 CH2 0.000000 14.0270 0 - 1476 C4A 207 C4A C4 CH3 0.000000 15.0350 0 - 1477 C4A 208 C4A C1 CH2 0.000000 14.0270 0 - 1478 C4A 208 C4A C2 CH3 0.000000 15.0350 0 - 1479 C4A 208 C4A C3 CH2 0.000000 14.0270 0 - 1480 C4A 208 C4A C4 CH3 0.000000 15.0350 0 - 1481 C4A 209 C4A C1 CH2 0.000000 14.0270 0 - 1482 C4A 209 C4A C2 CH3 0.000000 15.0350 0 - 1483 C4A 209 C4A C3 CH2 0.000000 14.0270 0 - 1484 C4A 209 C4A C4 CH3 0.000000 15.0350 0 - 1485 C4A 210 C4A C1 CH2 0.000000 14.0270 0 - 1486 C4A 210 C4A C2 CH3 0.000000 15.0350 0 - 1487 C4A 210 C4A C3 CH2 0.000000 14.0270 0 - 1488 C4A 210 C4A C4 CH3 0.000000 15.0350 0 - 1489 C4A 211 C4A C1 CH2 0.000000 14.0270 0 - 1490 C4A 211 C4A C2 CH3 0.000000 15.0350 0 - 1491 C4A 211 C4A C3 CH2 0.000000 14.0270 0 - 1492 C4A 211 C4A C4 CH3 0.000000 15.0350 0 - 1493 C4A 212 C4A C1 CH2 0.000000 14.0270 0 - 1494 C4A 212 C4A C2 CH3 0.000000 15.0350 0 - 1495 C4A 212 C4A C3 CH2 0.000000 14.0270 0 - 1496 C4A 212 C4A C4 CH3 0.000000 15.0350 0 - 1497 C4A 213 C4A C1 CH2 0.000000 14.0270 0 - 1498 C4A 213 C4A C2 CH3 0.000000 15.0350 0 - 1499 C4A 213 C4A C3 CH2 0.000000 14.0270 0 - 1500 C4A 213 C4A C4 CH3 0.000000 15.0350 0 - 1501 C4A 214 C4A C1 CH2 0.000000 14.0270 0 - 1502 C4A 214 C4A C2 CH3 0.000000 15.0350 0 - 1503 C4A 214 C4A C3 CH2 0.000000 14.0270 0 - 1504 C4A 214 C4A C4 CH3 0.000000 15.0350 0 - 1505 C4A 215 C4A C1 CH2 0.000000 14.0270 0 - 1506 C4A 215 C4A C2 CH3 0.000000 15.0350 0 - 1507 C4A 215 C4A C3 CH2 0.000000 14.0270 0 - 1508 C4A 215 C4A C4 CH3 0.000000 15.0350 0 - 1509 C4A 216 C4A C1 CH2 0.000000 14.0270 0 - 1510 C4A 216 C4A C2 CH3 0.000000 15.0350 0 - 1511 C4A 216 C4A C3 CH2 0.000000 14.0270 0 - 1512 C4A 216 C4A C4 CH3 0.000000 15.0350 0 - 1513 C4A 217 C4A C1 CH2 0.000000 14.0270 0 - 1514 C4A 217 C4A C2 CH3 0.000000 15.0350 0 - 1515 C4A 217 C4A C3 CH2 0.000000 14.0270 0 - 1516 C4A 217 C4A C4 CH3 0.000000 15.0350 0 - 1517 C4A 218 C4A C1 CH2 0.000000 14.0270 0 - 1518 C4A 218 C4A C2 CH3 0.000000 15.0350 0 - 1519 C4A 218 C4A C3 CH2 0.000000 14.0270 0 - 1520 C4A 218 C4A C4 CH3 0.000000 15.0350 0 - 1521 C4A 219 C4A C1 CH2 0.000000 14.0270 0 - 1522 C4A 219 C4A C2 CH3 0.000000 15.0350 0 - 1523 C4A 219 C4A C3 CH2 0.000000 14.0270 0 - 1524 C4A 219 C4A C4 CH3 0.000000 15.0350 0 - 1525 C4A 220 C4A C1 CH2 0.000000 14.0270 0 - 1526 C4A 220 C4A C2 CH3 0.000000 15.0350 0 - 1527 C4A 220 C4A C3 CH2 0.000000 14.0270 0 - 1528 C4A 220 C4A C4 CH3 0.000000 15.0350 0 - 1529 C4A 221 C4A C1 CH2 0.000000 14.0270 0 - 1530 C4A 221 C4A C2 CH3 0.000000 15.0350 0 - 1531 C4A 221 C4A C3 CH2 0.000000 14.0270 0 - 1532 C4A 221 C4A C4 CH3 0.000000 15.0350 0 - 1533 C4A 222 C4A C1 CH2 0.000000 14.0270 0 - 1534 C4A 222 C4A C2 CH3 0.000000 15.0350 0 - 1535 C4A 222 C4A C3 CH2 0.000000 14.0270 0 - 1536 C4A 222 C4A C4 CH3 0.000000 15.0350 0 - 1537 C4A 223 C4A C1 CH2 0.000000 14.0270 0 - 1538 C4A 223 C4A C2 CH3 0.000000 15.0350 0 - 1539 C4A 223 C4A C3 CH2 0.000000 14.0270 0 - 1540 C4A 223 C4A C4 CH3 0.000000 15.0350 0 - 1541 C4A 224 C4A C1 CH2 0.000000 14.0270 0 - 1542 C4A 224 C4A C2 CH3 0.000000 15.0350 0 - 1543 C4A 224 C4A C3 CH2 0.000000 14.0270 0 - 1544 C4A 224 C4A C4 CH3 0.000000 15.0350 0 - 1545 C4A 225 C4A C1 CH2 0.000000 14.0270 0 - 1546 C4A 225 C4A C2 CH3 0.000000 15.0350 0 - 1547 C4A 225 C4A C3 CH2 0.000000 14.0270 0 - 1548 C4A 225 C4A C4 CH3 0.000000 15.0350 0 - 1549 C4A 226 C4A C1 CH2 0.000000 14.0270 0 - 1550 C4A 226 C4A C2 CH3 0.000000 15.0350 0 - 1551 C4A 226 C4A C3 CH2 0.000000 14.0270 0 - 1552 C4A 226 C4A C4 CH3 0.000000 15.0350 0 - 1553 C4A 227 C4A C1 CH2 0.000000 14.0270 0 - 1554 C4A 227 C4A C2 CH3 0.000000 15.0350 0 - 1555 C4A 227 C4A C3 CH2 0.000000 14.0270 0 - 1556 C4A 227 C4A C4 CH3 0.000000 15.0350 0 - 1557 C4A 228 C4A C1 CH2 0.000000 14.0270 0 - 1558 C4A 228 C4A C2 CH3 0.000000 15.0350 0 - 1559 C4A 228 C4A C3 CH2 0.000000 14.0270 0 - 1560 C4A 228 C4A C4 CH3 0.000000 15.0350 0 - 1561 C4A 229 C4A C1 CH2 0.000000 14.0270 0 - 1562 C4A 229 C4A C2 CH3 0.000000 15.0350 0 - 1563 C4A 229 C4A C3 CH2 0.000000 14.0270 0 - 1564 C4A 229 C4A C4 CH3 0.000000 15.0350 0 - 1565 C4A 230 C4A C1 CH2 0.000000 14.0270 0 - 1566 C4A 230 C4A C2 CH3 0.000000 15.0350 0 - 1567 C4A 230 C4A C3 CH2 0.000000 14.0270 0 - 1568 C4A 230 C4A C4 CH3 0.000000 15.0350 0 - 1569 C4A 231 C4A C1 CH2 0.000000 14.0270 0 - 1570 C4A 231 C4A C2 CH3 0.000000 15.0350 0 - 1571 C4A 231 C4A C3 CH2 0.000000 14.0270 0 - 1572 C4A 231 C4A C4 CH3 0.000000 15.0350 0 - 1573 C4A 232 C4A C1 CH2 0.000000 14.0270 0 - 1574 C4A 232 C4A C2 CH3 0.000000 15.0350 0 - 1575 C4A 232 C4A C3 CH2 0.000000 14.0270 0 - 1576 C4A 232 C4A C4 CH3 0.000000 15.0350 0 - 1577 C4A 233 C4A C1 CH2 0.000000 14.0270 0 - 1578 C4A 233 C4A C2 CH3 0.000000 15.0350 0 - 1579 C4A 233 C4A C3 CH2 0.000000 14.0270 0 - 1580 C4A 233 C4A C4 CH3 0.000000 15.0350 0 - 1581 C4A 234 C4A C1 CH2 0.000000 14.0270 0 - 1582 C4A 234 C4A C2 CH3 0.000000 15.0350 0 - 1583 C4A 234 C4A C3 CH2 0.000000 14.0270 0 - 1584 C4A 234 C4A C4 CH3 0.000000 15.0350 0 - 1585 C4A 235 C4A C1 CH2 0.000000 14.0270 0 - 1586 C4A 235 C4A C2 CH3 0.000000 15.0350 0 - 1587 C4A 235 C4A C3 CH2 0.000000 14.0270 0 - 1588 C4A 235 C4A C4 CH3 0.000000 15.0350 0 - 1589 C4A 236 C4A C1 CH2 0.000000 14.0270 0 - 1590 C4A 236 C4A C2 CH3 0.000000 15.0350 0 - 1591 C4A 236 C4A C3 CH2 0.000000 14.0270 0 - 1592 C4A 236 C4A C4 CH3 0.000000 15.0350 0 - 1593 C4A 237 C4A C1 CH2 0.000000 14.0270 0 - 1594 C4A 237 C4A C2 CH3 0.000000 15.0350 0 - 1595 C4A 237 C4A C3 CH2 0.000000 14.0270 0 - 1596 C4A 237 C4A C4 CH3 0.000000 15.0350 0 - 1597 C4A 238 C4A C1 CH2 0.000000 14.0270 0 - 1598 C4A 238 C4A C2 CH3 0.000000 15.0350 0 - 1599 C4A 238 C4A C3 CH2 0.000000 14.0270 0 - 1600 C4A 238 C4A C4 CH3 0.000000 15.0350 0 - 1601 C4A 239 C4A C1 CH2 0.000000 14.0270 0 - 1602 C4A 239 C4A C2 CH3 0.000000 15.0350 0 - 1603 C4A 239 C4A C3 CH2 0.000000 14.0270 0 - 1604 C4A 239 C4A C4 CH3 0.000000 15.0350 0 - 1605 C4A 240 C4A C1 CH2 0.000000 14.0270 0 - 1606 C4A 240 C4A C2 CH3 0.000000 15.0350 0 - 1607 C4A 240 C4A C3 CH2 0.000000 14.0270 0 - 1608 C4A 240 C4A C4 CH3 0.000000 15.0350 0 - 1609 C4A 241 C4A C1 CH2 0.000000 14.0270 0 - 1610 C4A 241 C4A C2 CH3 0.000000 15.0350 0 - 1611 C4A 241 C4A C3 CH2 0.000000 14.0270 0 - 1612 C4A 241 C4A C4 CH3 0.000000 15.0350 0 - 1613 C4A 242 C4A C1 CH2 0.000000 14.0270 0 - 1614 C4A 242 C4A C2 CH3 0.000000 15.0350 0 - 1615 C4A 242 C4A C3 CH2 0.000000 14.0270 0 - 1616 C4A 242 C4A C4 CH3 0.000000 15.0350 0 - 1617 C4A 243 C4A C1 CH2 0.000000 14.0270 0 - 1618 C4A 243 C4A C2 CH3 0.000000 15.0350 0 - 1619 C4A 243 C4A C3 CH2 0.000000 14.0270 0 - 1620 C4A 243 C4A C4 CH3 0.000000 15.0350 0 - 1621 C4A 244 C4A C1 CH2 0.000000 14.0270 0 - 1622 C4A 244 C4A C2 CH3 0.000000 15.0350 0 - 1623 C4A 244 C4A C3 CH2 0.000000 14.0270 0 - 1624 C4A 244 C4A C4 CH3 0.000000 15.0350 0 - 1625 C4A 245 C4A C1 CH2 0.000000 14.0270 0 - 1626 C4A 245 C4A C2 CH3 0.000000 15.0350 0 - 1627 C4A 245 C4A C3 CH2 0.000000 14.0270 0 - 1628 C4A 245 C4A C4 CH3 0.000000 15.0350 0 - 1629 C4A 246 C4A C1 CH2 0.000000 14.0270 0 - 1630 C4A 246 C4A C2 CH3 0.000000 15.0350 0 - 1631 C4A 246 C4A C3 CH2 0.000000 14.0270 0 - 1632 C4A 246 C4A C4 CH3 0.000000 15.0350 0 - 1633 C4A 247 C4A C1 CH2 0.000000 14.0270 0 - 1634 C4A 247 C4A C2 CH3 0.000000 15.0350 0 - 1635 C4A 247 C4A C3 CH2 0.000000 14.0270 0 - 1636 C4A 247 C4A C4 CH3 0.000000 15.0350 0 - 1637 C4A 248 C4A C1 CH2 0.000000 14.0270 0 - 1638 C4A 248 C4A C2 CH3 0.000000 15.0350 0 - 1639 C4A 248 C4A C3 CH2 0.000000 14.0270 0 - 1640 C4A 248 C4A C4 CH3 0.000000 15.0350 0 - 1641 C4A 249 C4A C1 CH2 0.000000 14.0270 0 - 1642 C4A 249 C4A C2 CH3 0.000000 15.0350 0 - 1643 C4A 249 C4A C3 CH2 0.000000 14.0270 0 - 1644 C4A 249 C4A C4 CH3 0.000000 15.0350 0 - 1645 C4A 250 C4A C1 CH2 0.000000 14.0270 0 - 1646 C4A 250 C4A C2 CH3 0.000000 15.0350 0 - 1647 C4A 250 C4A C3 CH2 0.000000 14.0270 0 - 1648 C4A 250 C4A C4 CH3 0.000000 15.0350 0 - - 1236 !NBOND: bonds - 1 3 2 1 3 4 5 7 - 6 5 7 8 9 11 10 9 - 11 12 13 15 14 13 15 16 - 17 19 18 17 19 20 21 23 - 22 21 23 24 25 27 26 25 - 27 28 29 31 30 29 31 32 - 33 35 34 33 35 36 37 39 - 38 37 39 40 41 43 42 41 - 43 44 45 47 46 45 47 48 - 49 51 50 49 51 52 53 55 - 54 53 55 56 57 59 58 57 - 59 60 61 63 62 61 63 64 - 65 67 66 65 67 68 69 71 - 70 69 71 72 73 75 74 73 - 75 76 77 79 78 77 79 80 - 81 83 82 81 83 84 85 87 - 86 85 87 88 89 91 90 89 - 91 92 93 95 94 93 95 96 - 97 99 98 97 99 100 101 103 - 102 101 103 104 105 107 106 105 - 107 108 109 111 110 109 111 112 - 113 115 114 113 115 116 117 119 - 118 117 119 120 121 123 122 121 - 123 124 125 127 126 125 127 128 - 129 131 130 129 131 132 133 135 - 134 133 135 136 137 139 138 137 - 139 140 141 143 142 141 143 144 - 145 147 146 145 147 148 149 151 - 150 149 151 152 153 155 154 153 - 155 156 157 159 158 157 159 160 - 161 163 162 161 163 164 165 167 - 166 165 167 168 169 171 170 169 - 171 172 173 175 174 173 175 176 - 177 179 178 177 179 180 181 183 - 182 181 183 184 185 187 186 185 - 187 188 189 191 190 189 191 192 - 193 195 194 193 195 196 197 199 - 198 197 199 200 201 203 202 201 - 203 204 205 207 206 205 207 208 - 209 211 210 209 211 212 213 215 - 214 213 215 216 217 219 218 217 - 219 220 221 223 222 221 223 224 - 225 227 226 225 227 228 229 231 - 230 229 231 232 233 235 234 233 - 235 236 237 239 238 237 239 240 - 241 243 242 241 243 244 245 247 - 246 245 247 248 249 251 250 249 - 251 252 253 255 254 253 255 256 - 257 259 258 257 259 260 261 263 - 262 261 263 264 265 267 266 265 - 267 268 269 271 270 269 271 272 - 273 275 274 273 275 276 277 279 - 278 277 279 280 281 283 282 281 - 283 284 285 287 286 285 287 288 - 289 291 290 289 291 292 293 295 - 294 293 295 296 297 299 298 297 - 299 300 301 303 302 301 303 304 - 305 307 306 305 307 308 309 311 - 310 309 311 312 313 315 314 313 - 315 316 317 319 318 317 319 320 - 321 323 322 321 323 324 325 327 - 326 325 327 328 329 331 330 329 - 331 332 333 335 334 333 335 336 - 337 339 338 337 339 340 341 343 - 342 341 343 344 345 347 346 345 - 347 348 349 351 350 349 351 352 - 353 355 354 353 355 356 357 359 - 358 357 359 360 361 363 362 361 - 363 364 365 367 366 365 367 368 - 369 371 370 369 371 372 373 375 - 374 373 375 376 377 379 378 377 - 379 380 381 383 382 381 383 384 - 385 387 386 385 387 388 389 391 - 390 389 391 392 393 395 394 393 - 395 396 397 399 398 397 399 400 - 401 403 402 401 403 404 405 407 - 406 405 407 408 409 411 410 409 - 411 412 413 415 414 413 415 416 - 417 419 418 417 419 420 421 423 - 422 421 423 424 425 427 426 425 - 427 428 429 431 430 429 431 432 - 433 435 434 433 435 436 437 439 - 438 437 439 440 441 443 442 441 - 443 444 445 447 446 445 447 448 - 449 451 450 449 451 452 453 455 - 454 453 455 456 457 459 458 457 - 459 460 461 463 462 461 463 464 - 465 467 466 465 467 468 469 471 - 470 469 471 472 473 475 474 473 - 475 476 477 479 478 477 479 480 - 481 483 482 481 483 484 485 487 - 486 485 487 488 489 491 490 489 - 491 492 493 495 494 493 495 496 - 497 499 498 497 499 500 501 503 - 502 501 503 504 505 507 506 505 - 507 508 509 511 510 509 511 512 - 513 515 514 513 515 516 517 519 - 518 517 519 520 521 523 522 521 - 523 524 525 527 526 525 527 528 - 529 531 530 529 531 532 533 535 - 534 533 535 536 537 539 538 537 - 539 540 541 543 542 541 543 544 - 545 547 546 545 547 548 549 551 - 550 549 551 552 553 555 554 553 - 555 556 557 559 558 557 559 560 - 561 563 562 561 563 564 565 567 - 566 565 567 568 569 571 570 569 - 571 572 573 575 574 573 575 576 - 577 579 578 577 579 580 581 583 - 582 581 583 584 585 587 586 585 - 587 588 589 591 590 589 591 592 - 593 595 594 593 595 596 597 599 - 598 597 599 600 601 603 602 601 - 603 604 605 607 606 605 607 608 - 609 611 610 609 611 612 613 615 - 614 613 615 616 617 619 618 617 - 619 620 621 623 622 621 623 624 - 625 627 626 625 627 628 629 631 - 630 629 631 632 633 635 634 633 - 635 636 637 639 638 637 639 640 - 641 643 642 641 643 644 645 647 - 646 645 647 648 649 651 650 649 - 651 652 653 655 654 653 655 656 - 657 659 658 657 659 660 661 663 - 662 661 663 664 665 667 666 665 - 667 668 669 671 670 669 671 672 - 673 675 674 673 675 676 677 679 - 678 677 679 680 681 683 682 681 - 683 684 685 687 686 685 687 688 - 689 691 690 689 691 692 693 695 - 694 693 695 696 697 699 698 697 - 699 700 701 703 702 701 703 704 - 705 707 706 705 707 708 709 711 - 710 709 711 712 713 715 714 713 - 715 716 717 719 718 717 719 720 - 721 723 722 721 723 724 725 727 - 726 725 727 728 729 731 730 729 - 731 732 733 735 734 733 735 736 - 737 739 738 737 739 740 741 743 - 742 741 743 744 745 747 746 745 - 747 748 749 751 750 749 751 752 - 753 755 754 753 755 756 757 759 - 758 757 759 760 761 763 762 761 - 763 764 765 767 766 765 767 768 - 769 771 770 769 771 772 773 775 - 774 773 775 776 777 779 778 777 - 779 780 781 783 782 781 783 784 - 785 787 786 785 787 788 789 791 - 790 789 791 792 793 795 794 793 - 795 796 797 799 798 797 799 800 - 801 803 802 801 803 804 805 807 - 806 805 807 808 809 811 810 809 - 811 812 813 815 814 813 815 816 - 817 819 818 817 819 820 821 823 - 822 821 823 824 825 827 826 825 - 827 828 829 831 830 829 831 832 - 833 835 834 833 835 836 837 839 - 838 837 839 840 841 843 842 841 - 843 844 845 847 846 845 847 848 - 849 851 850 849 851 852 853 855 - 854 853 855 856 857 859 858 857 - 859 860 861 863 862 861 863 864 - 865 867 866 865 867 868 869 871 - 870 869 871 872 873 875 874 873 - 875 876 877 879 878 877 879 880 - 881 883 882 881 883 884 885 887 - 886 885 887 888 889 891 890 889 - 891 892 893 895 894 893 895 896 - 897 899 898 897 899 900 901 903 - 902 901 903 904 905 907 906 905 - 907 908 909 911 910 909 911 912 - 913 915 914 913 915 916 917 919 - 918 917 919 920 921 923 922 921 - 923 924 925 927 926 925 927 928 - 929 931 930 929 931 932 933 935 - 934 933 935 936 937 939 938 937 - 939 940 941 943 942 941 943 944 - 945 947 946 945 947 948 949 951 - 950 949 951 952 953 955 954 953 - 955 956 957 959 958 957 959 960 - 961 963 962 961 963 964 965 967 - 966 965 967 968 969 971 970 969 - 971 972 973 975 974 973 975 976 - 977 979 978 977 979 980 981 983 - 982 981 983 984 985 987 986 985 - 987 988 989 991 990 989 991 992 - 993 995 994 993 995 996 997 999 - 998 997 999 1000 1001 1003 1002 1001 - 1003 1004 1005 1007 1006 1005 1007 1008 - 1009 1011 1010 1009 1011 1012 1013 1015 - 1014 1013 1015 1016 1017 1019 1018 1017 - 1019 1020 1021 1023 1022 1021 1023 1024 - 1025 1027 1026 1025 1027 1028 1029 1031 - 1030 1029 1031 1032 1033 1035 1034 1033 - 1035 1036 1037 1039 1038 1037 1039 1040 - 1041 1043 1042 1041 1043 1044 1045 1047 - 1046 1045 1047 1048 1049 1051 1050 1049 - 1051 1052 1053 1055 1054 1053 1055 1056 - 1057 1059 1058 1057 1059 1060 1061 1063 - 1062 1061 1063 1064 1065 1067 1066 1065 - 1067 1068 1069 1071 1070 1069 1071 1072 - 1073 1075 1074 1073 1075 1076 1077 1079 - 1078 1077 1079 1080 1081 1083 1082 1081 - 1083 1084 1085 1087 1086 1085 1087 1088 - 1089 1091 1090 1089 1091 1092 1093 1095 - 1094 1093 1095 1096 1097 1099 1098 1097 - 1099 1100 1101 1103 1102 1101 1103 1104 - 1105 1107 1106 1105 1107 1108 1109 1111 - 1110 1109 1111 1112 1113 1115 1114 1113 - 1115 1116 1117 1119 1118 1117 1119 1120 - 1121 1123 1122 1121 1123 1124 1125 1127 - 1126 1125 1127 1128 1129 1131 1130 1129 - 1131 1132 1133 1135 1134 1133 1135 1136 - 1137 1139 1138 1137 1139 1140 1141 1143 - 1142 1141 1143 1144 1145 1147 1146 1145 - 1147 1148 1149 1151 1150 1149 1151 1152 - 1153 1155 1154 1153 1155 1156 1157 1159 - 1158 1157 1159 1160 1161 1163 1162 1161 - 1163 1164 1165 1167 1166 1165 1167 1168 - 1169 1171 1170 1169 1171 1172 1173 1175 - 1174 1173 1175 1176 1177 1179 1178 1177 - 1179 1180 1181 1183 1182 1181 1183 1184 - 1185 1187 1186 1185 1187 1188 1189 1191 - 1190 1189 1191 1192 1193 1195 1194 1193 - 1195 1196 1197 1199 1198 1197 1199 1200 - 1201 1203 1202 1201 1203 1204 1205 1207 - 1206 1205 1207 1208 1209 1211 1210 1209 - 1211 1212 1213 1215 1214 1213 1215 1216 - 1217 1219 1218 1217 1219 1220 1221 1223 - 1222 1221 1223 1224 1225 1227 1226 1225 - 1227 1228 1229 1231 1230 1229 1231 1232 - 1233 1235 1234 1233 1235 1236 1237 1239 - 1238 1237 1239 1240 1241 1243 1242 1241 - 1243 1244 1245 1247 1246 1245 1247 1248 - 1249 1251 1250 1249 1251 1252 1253 1255 - 1254 1253 1255 1256 1257 1259 1258 1257 - 1259 1260 1261 1263 1262 1261 1263 1264 - 1265 1267 1266 1265 1267 1268 1269 1271 - 1270 1269 1271 1272 1273 1275 1274 1273 - 1275 1276 1277 1279 1278 1277 1279 1280 - 1281 1283 1282 1281 1283 1284 1285 1287 - 1286 1285 1287 1288 1289 1291 1290 1289 - 1291 1292 1293 1295 1294 1293 1295 1296 - 1297 1299 1298 1297 1299 1300 1301 1303 - 1302 1301 1303 1304 1305 1307 1306 1305 - 1307 1308 1309 1311 1310 1309 1311 1312 - 1313 1315 1314 1313 1315 1316 1317 1319 - 1318 1317 1319 1320 1321 1323 1322 1321 - 1323 1324 1325 1327 1326 1325 1327 1328 - 1329 1331 1330 1329 1331 1332 1333 1335 - 1334 1333 1335 1336 1337 1339 1338 1337 - 1339 1340 1341 1343 1342 1341 1343 1344 - 1345 1347 1346 1345 1347 1348 1349 1351 - 1350 1349 1351 1352 1353 1355 1354 1353 - 1355 1356 1357 1359 1358 1357 1359 1360 - 1361 1363 1362 1361 1363 1364 1365 1367 - 1366 1365 1367 1368 1369 1371 1370 1369 - 1371 1372 1373 1375 1374 1373 1375 1376 - 1377 1379 1378 1377 1379 1380 1381 1383 - 1382 1381 1383 1384 1385 1387 1386 1385 - 1387 1388 1389 1391 1390 1389 1391 1392 - 1393 1395 1394 1393 1395 1396 1397 1399 - 1398 1397 1399 1400 1401 1403 1402 1401 - 1403 1404 1405 1407 1406 1405 1407 1408 - 1409 1411 1410 1409 1411 1412 1413 1415 - 1414 1413 1415 1416 1417 1419 1418 1417 - 1419 1420 1421 1423 1422 1421 1423 1424 - 1425 1427 1426 1425 1427 1428 1429 1431 - 1430 1429 1431 1432 1433 1435 1434 1433 - 1435 1436 1437 1439 1438 1437 1439 1440 - 1441 1443 1442 1441 1443 1444 1445 1447 - 1446 1445 1447 1448 1449 1451 1450 1449 - 1451 1452 1453 1455 1454 1453 1455 1456 - 1457 1459 1458 1457 1459 1460 1461 1463 - 1462 1461 1463 1464 1465 1467 1466 1465 - 1467 1468 1469 1471 1470 1469 1471 1472 - 1473 1475 1474 1473 1475 1476 1477 1479 - 1478 1477 1479 1480 1481 1483 1482 1481 - 1483 1484 1485 1487 1486 1485 1487 1488 - 1489 1491 1490 1489 1491 1492 1493 1495 - 1494 1493 1495 1496 1497 1499 1498 1497 - 1499 1500 1501 1503 1502 1501 1503 1504 - 1505 1507 1506 1505 1507 1508 1509 1511 - 1510 1509 1511 1512 1513 1515 1514 1513 - 1515 1516 1517 1519 1518 1517 1519 1520 - 1521 1523 1522 1521 1523 1524 1525 1527 - 1526 1525 1527 1528 1529 1531 1530 1529 - 1531 1532 1533 1535 1534 1533 1535 1536 - 1537 1539 1538 1537 1539 1540 1541 1543 - 1542 1541 1543 1544 1545 1547 1546 1545 - 1547 1548 1549 1551 1550 1549 1551 1552 - 1553 1555 1554 1553 1555 1556 1557 1559 - 1558 1557 1559 1560 1561 1563 1562 1561 - 1563 1564 1565 1567 1566 1565 1567 1568 - 1569 1571 1570 1569 1571 1572 1573 1575 - 1574 1573 1575 1576 1577 1579 1578 1577 - 1579 1580 1581 1583 1582 1581 1583 1584 - 1585 1587 1586 1585 1587 1588 1589 1591 - 1590 1589 1591 1592 1593 1595 1594 1593 - 1595 1596 1597 1599 1598 1597 1599 1600 - 1601 1603 1602 1601 1603 1604 1605 1607 - 1606 1605 1607 1608 1609 1611 1610 1609 - 1611 1612 1613 1615 1614 1613 1615 1616 - 1617 1619 1618 1617 1619 1620 1621 1623 - 1622 1621 1623 1624 1625 1627 1626 1625 - 1627 1628 1629 1631 1630 1629 1631 1632 - 1633 1635 1634 1633 1635 1636 1637 1639 - 1638 1637 1639 1640 1641 1643 1642 1641 - 1643 1644 1645 1647 1646 1645 1647 1648 - - 824 !NTHETA: angles - 1 3 4 2 1 3 5 7 8 - 6 5 7 9 11 12 10 9 11 - 13 15 16 14 13 15 17 19 20 - 18 17 19 21 23 24 22 21 23 - 25 27 28 26 25 27 29 31 32 - 30 29 31 33 35 36 34 33 35 - 37 39 40 38 37 39 41 43 44 - 42 41 43 45 47 48 46 45 47 - 49 51 52 50 49 51 53 55 56 - 54 53 55 57 59 60 58 57 59 - 61 63 64 62 61 63 65 67 68 - 66 65 67 69 71 72 70 69 71 - 73 75 76 74 73 75 77 79 80 - 78 77 79 81 83 84 82 81 83 - 85 87 88 86 85 87 89 91 92 - 90 89 91 93 95 96 94 93 95 - 97 99 100 98 97 99 101 103 104 - 102 101 103 105 107 108 106 105 107 - 109 111 112 110 109 111 113 115 116 - 114 113 115 117 119 120 118 117 119 - 121 123 124 122 121 123 125 127 128 - 126 125 127 129 131 132 130 129 131 - 133 135 136 134 133 135 137 139 140 - 138 137 139 141 143 144 142 141 143 - 145 147 148 146 145 147 149 151 152 - 150 149 151 153 155 156 154 153 155 - 157 159 160 158 157 159 161 163 164 - 162 161 163 165 167 168 166 165 167 - 169 171 172 170 169 171 173 175 176 - 174 173 175 177 179 180 178 177 179 - 181 183 184 182 181 183 185 187 188 - 186 185 187 189 191 192 190 189 191 - 193 195 196 194 193 195 197 199 200 - 198 197 199 201 203 204 202 201 203 - 205 207 208 206 205 207 209 211 212 - 210 209 211 213 215 216 214 213 215 - 217 219 220 218 217 219 221 223 224 - 222 221 223 225 227 228 226 225 227 - 229 231 232 230 229 231 233 235 236 - 234 233 235 237 239 240 238 237 239 - 241 243 244 242 241 243 245 247 248 - 246 245 247 249 251 252 250 249 251 - 253 255 256 254 253 255 257 259 260 - 258 257 259 261 263 264 262 261 263 - 265 267 268 266 265 267 269 271 272 - 270 269 271 273 275 276 274 273 275 - 277 279 280 278 277 279 281 283 284 - 282 281 283 285 287 288 286 285 287 - 289 291 292 290 289 291 293 295 296 - 294 293 295 297 299 300 298 297 299 - 301 303 304 302 301 303 305 307 308 - 306 305 307 309 311 312 310 309 311 - 313 315 316 314 313 315 317 319 320 - 318 317 319 321 323 324 322 321 323 - 325 327 328 326 325 327 329 331 332 - 330 329 331 333 335 336 334 333 335 - 337 339 340 338 337 339 341 343 344 - 342 341 343 345 347 348 346 345 347 - 349 351 352 350 349 351 353 355 356 - 354 353 355 357 359 360 358 357 359 - 361 363 364 362 361 363 365 367 368 - 366 365 367 369 371 372 370 369 371 - 373 375 376 374 373 375 377 379 380 - 378 377 379 381 383 384 382 381 383 - 385 387 388 386 385 387 389 391 392 - 390 389 391 393 395 396 394 393 395 - 397 399 400 398 397 399 401 403 404 - 402 401 403 405 407 408 406 405 407 - 409 411 412 410 409 411 413 415 416 - 414 413 415 417 419 420 418 417 419 - 421 423 424 422 421 423 425 427 428 - 426 425 427 429 431 432 430 429 431 - 433 435 436 434 433 435 437 439 440 - 438 437 439 441 443 444 442 441 443 - 445 447 448 446 445 447 449 451 452 - 450 449 451 453 455 456 454 453 455 - 457 459 460 458 457 459 461 463 464 - 462 461 463 465 467 468 466 465 467 - 469 471 472 470 469 471 473 475 476 - 474 473 475 477 479 480 478 477 479 - 481 483 484 482 481 483 485 487 488 - 486 485 487 489 491 492 490 489 491 - 493 495 496 494 493 495 497 499 500 - 498 497 499 501 503 504 502 501 503 - 505 507 508 506 505 507 509 511 512 - 510 509 511 513 515 516 514 513 515 - 517 519 520 518 517 519 521 523 524 - 522 521 523 525 527 528 526 525 527 - 529 531 532 530 529 531 533 535 536 - 534 533 535 537 539 540 538 537 539 - 541 543 544 542 541 543 545 547 548 - 546 545 547 549 551 552 550 549 551 - 553 555 556 554 553 555 557 559 560 - 558 557 559 561 563 564 562 561 563 - 565 567 568 566 565 567 569 571 572 - 570 569 571 573 575 576 574 573 575 - 577 579 580 578 577 579 581 583 584 - 582 581 583 585 587 588 586 585 587 - 589 591 592 590 589 591 593 595 596 - 594 593 595 597 599 600 598 597 599 - 601 603 604 602 601 603 605 607 608 - 606 605 607 609 611 612 610 609 611 - 613 615 616 614 613 615 617 619 620 - 618 617 619 621 623 624 622 621 623 - 625 627 628 626 625 627 629 631 632 - 630 629 631 633 635 636 634 633 635 - 637 639 640 638 637 639 641 643 644 - 642 641 643 645 647 648 646 645 647 - 649 651 652 650 649 651 653 655 656 - 654 653 655 657 659 660 658 657 659 - 661 663 664 662 661 663 665 667 668 - 666 665 667 669 671 672 670 669 671 - 673 675 676 674 673 675 677 679 680 - 678 677 679 681 683 684 682 681 683 - 685 687 688 686 685 687 689 691 692 - 690 689 691 693 695 696 694 693 695 - 697 699 700 698 697 699 701 703 704 - 702 701 703 705 707 708 706 705 707 - 709 711 712 710 709 711 713 715 716 - 714 713 715 717 719 720 718 717 719 - 721 723 724 722 721 723 725 727 728 - 726 725 727 729 731 732 730 729 731 - 733 735 736 734 733 735 737 739 740 - 738 737 739 741 743 744 742 741 743 - 745 747 748 746 745 747 749 751 752 - 750 749 751 753 755 756 754 753 755 - 757 759 760 758 757 759 761 763 764 - 762 761 763 765 767 768 766 765 767 - 769 771 772 770 769 771 773 775 776 - 774 773 775 777 779 780 778 777 779 - 781 783 784 782 781 783 785 787 788 - 786 785 787 789 791 792 790 789 791 - 793 795 796 794 793 795 797 799 800 - 798 797 799 801 803 804 802 801 803 - 805 807 808 806 805 807 809 811 812 - 810 809 811 813 815 816 814 813 815 - 817 819 820 818 817 819 821 823 824 - 822 821 823 825 827 828 826 825 827 - 829 831 832 830 829 831 833 835 836 - 834 833 835 837 839 840 838 837 839 - 841 843 844 842 841 843 845 847 848 - 846 845 847 849 851 852 850 849 851 - 853 855 856 854 853 855 857 859 860 - 858 857 859 861 863 864 862 861 863 - 865 867 868 866 865 867 869 871 872 - 870 869 871 873 875 876 874 873 875 - 877 879 880 878 877 879 881 883 884 - 882 881 883 885 887 888 886 885 887 - 889 891 892 890 889 891 893 895 896 - 894 893 895 897 899 900 898 897 899 - 901 903 904 902 901 903 905 907 908 - 906 905 907 909 911 912 910 909 911 - 913 915 916 914 913 915 917 919 920 - 918 917 919 921 923 924 922 921 923 - 925 927 928 926 925 927 929 931 932 - 930 929 931 933 935 936 934 933 935 - 937 939 940 938 937 939 941 943 944 - 942 941 943 945 947 948 946 945 947 - 949 951 952 950 949 951 953 955 956 - 954 953 955 957 959 960 958 957 959 - 961 963 964 962 961 963 965 967 968 - 966 965 967 969 971 972 970 969 971 - 973 975 976 974 973 975 977 979 980 - 978 977 979 981 983 984 982 981 983 - 985 987 988 986 985 987 989 991 992 - 990 989 991 993 995 996 994 993 995 - 997 999 1000 998 997 999 1001 1003 1004 - 1002 1001 1003 1005 1007 1008 1006 1005 1007 - 1009 1011 1012 1010 1009 1011 1013 1015 1016 - 1014 1013 1015 1017 1019 1020 1018 1017 1019 - 1021 1023 1024 1022 1021 1023 1025 1027 1028 - 1026 1025 1027 1029 1031 1032 1030 1029 1031 - 1033 1035 1036 1034 1033 1035 1037 1039 1040 - 1038 1037 1039 1041 1043 1044 1042 1041 1043 - 1045 1047 1048 1046 1045 1047 1049 1051 1052 - 1050 1049 1051 1053 1055 1056 1054 1053 1055 - 1057 1059 1060 1058 1057 1059 1061 1063 1064 - 1062 1061 1063 1065 1067 1068 1066 1065 1067 - 1069 1071 1072 1070 1069 1071 1073 1075 1076 - 1074 1073 1075 1077 1079 1080 1078 1077 1079 - 1081 1083 1084 1082 1081 1083 1085 1087 1088 - 1086 1085 1087 1089 1091 1092 1090 1089 1091 - 1093 1095 1096 1094 1093 1095 1097 1099 1100 - 1098 1097 1099 1101 1103 1104 1102 1101 1103 - 1105 1107 1108 1106 1105 1107 1109 1111 1112 - 1110 1109 1111 1113 1115 1116 1114 1113 1115 - 1117 1119 1120 1118 1117 1119 1121 1123 1124 - 1122 1121 1123 1125 1127 1128 1126 1125 1127 - 1129 1131 1132 1130 1129 1131 1133 1135 1136 - 1134 1133 1135 1137 1139 1140 1138 1137 1139 - 1141 1143 1144 1142 1141 1143 1145 1147 1148 - 1146 1145 1147 1149 1151 1152 1150 1149 1151 - 1153 1155 1156 1154 1153 1155 1157 1159 1160 - 1158 1157 1159 1161 1163 1164 1162 1161 1163 - 1165 1167 1168 1166 1165 1167 1169 1171 1172 - 1170 1169 1171 1173 1175 1176 1174 1173 1175 - 1177 1179 1180 1178 1177 1179 1181 1183 1184 - 1182 1181 1183 1185 1187 1188 1186 1185 1187 - 1189 1191 1192 1190 1189 1191 1193 1195 1196 - 1194 1193 1195 1197 1199 1200 1198 1197 1199 - 1201 1203 1204 1202 1201 1203 1205 1207 1208 - 1206 1205 1207 1209 1211 1212 1210 1209 1211 - 1213 1215 1216 1214 1213 1215 1217 1219 1220 - 1218 1217 1219 1221 1223 1224 1222 1221 1223 - 1225 1227 1228 1226 1225 1227 1229 1231 1232 - 1230 1229 1231 1233 1235 1236 1234 1233 1235 - 1237 1239 1240 1238 1237 1239 1241 1243 1244 - 1242 1241 1243 1245 1247 1248 1246 1245 1247 - 1249 1251 1252 1250 1249 1251 1253 1255 1256 - 1254 1253 1255 1257 1259 1260 1258 1257 1259 - 1261 1263 1264 1262 1261 1263 1265 1267 1268 - 1266 1265 1267 1269 1271 1272 1270 1269 1271 - 1273 1275 1276 1274 1273 1275 1277 1279 1280 - 1278 1277 1279 1281 1283 1284 1282 1281 1283 - 1285 1287 1288 1286 1285 1287 1289 1291 1292 - 1290 1289 1291 1293 1295 1296 1294 1293 1295 - 1297 1299 1300 1298 1297 1299 1301 1303 1304 - 1302 1301 1303 1305 1307 1308 1306 1305 1307 - 1309 1311 1312 1310 1309 1311 1313 1315 1316 - 1314 1313 1315 1317 1319 1320 1318 1317 1319 - 1321 1323 1324 1322 1321 1323 1325 1327 1328 - 1326 1325 1327 1329 1331 1332 1330 1329 1331 - 1333 1335 1336 1334 1333 1335 1337 1339 1340 - 1338 1337 1339 1341 1343 1344 1342 1341 1343 - 1345 1347 1348 1346 1345 1347 1349 1351 1352 - 1350 1349 1351 1353 1355 1356 1354 1353 1355 - 1357 1359 1360 1358 1357 1359 1361 1363 1364 - 1362 1361 1363 1365 1367 1368 1366 1365 1367 - 1369 1371 1372 1370 1369 1371 1373 1375 1376 - 1374 1373 1375 1377 1379 1380 1378 1377 1379 - 1381 1383 1384 1382 1381 1383 1385 1387 1388 - 1386 1385 1387 1389 1391 1392 1390 1389 1391 - 1393 1395 1396 1394 1393 1395 1397 1399 1400 - 1398 1397 1399 1401 1403 1404 1402 1401 1403 - 1405 1407 1408 1406 1405 1407 1409 1411 1412 - 1410 1409 1411 1413 1415 1416 1414 1413 1415 - 1417 1419 1420 1418 1417 1419 1421 1423 1424 - 1422 1421 1423 1425 1427 1428 1426 1425 1427 - 1429 1431 1432 1430 1429 1431 1433 1435 1436 - 1434 1433 1435 1437 1439 1440 1438 1437 1439 - 1441 1443 1444 1442 1441 1443 1445 1447 1448 - 1446 1445 1447 1449 1451 1452 1450 1449 1451 - 1453 1455 1456 1454 1453 1455 1457 1459 1460 - 1458 1457 1459 1461 1463 1464 1462 1461 1463 - 1465 1467 1468 1466 1465 1467 1469 1471 1472 - 1470 1469 1471 1473 1475 1476 1474 1473 1475 - 1477 1479 1480 1478 1477 1479 1481 1483 1484 - 1482 1481 1483 1485 1487 1488 1486 1485 1487 - 1489 1491 1492 1490 1489 1491 1493 1495 1496 - 1494 1493 1495 1497 1499 1500 1498 1497 1499 - 1501 1503 1504 1502 1501 1503 1505 1507 1508 - 1506 1505 1507 1509 1511 1512 1510 1509 1511 - 1513 1515 1516 1514 1513 1515 1517 1519 1520 - 1518 1517 1519 1521 1523 1524 1522 1521 1523 - 1525 1527 1528 1526 1525 1527 1529 1531 1532 - 1530 1529 1531 1533 1535 1536 1534 1533 1535 - 1537 1539 1540 1538 1537 1539 1541 1543 1544 - 1542 1541 1543 1545 1547 1548 1546 1545 1547 - 1549 1551 1552 1550 1549 1551 1553 1555 1556 - 1554 1553 1555 1557 1559 1560 1558 1557 1559 - 1561 1563 1564 1562 1561 1563 1565 1567 1568 - 1566 1565 1567 1569 1571 1572 1570 1569 1571 - 1573 1575 1576 1574 1573 1575 1577 1579 1580 - 1578 1577 1579 1581 1583 1584 1582 1581 1583 - 1585 1587 1588 1586 1585 1587 1589 1591 1592 - 1590 1589 1591 1593 1595 1596 1594 1593 1595 - 1597 1599 1600 1598 1597 1599 1601 1603 1604 - 1602 1601 1603 1605 1607 1608 1606 1605 1607 - 1609 1611 1612 1610 1609 1611 1613 1615 1616 - 1614 1613 1615 1617 1619 1620 1618 1617 1619 - 1621 1623 1624 1622 1621 1623 1625 1627 1628 - 1626 1625 1627 1629 1631 1632 1630 1629 1631 - 1633 1635 1636 1634 1633 1635 1637 1639 1640 - 1638 1637 1639 1641 1643 1644 1642 1641 1643 - 1645 1647 1648 1646 1645 1647 - - 412 !NPHI: dihedrals - 2 1 3 4 6 5 7 8 - 10 9 11 12 14 13 15 16 - 18 17 19 20 22 21 23 24 - 26 25 27 28 30 29 31 32 - 34 33 35 36 38 37 39 40 - 42 41 43 44 46 45 47 48 - 50 49 51 52 54 53 55 56 - 58 57 59 60 62 61 63 64 - 66 65 67 68 70 69 71 72 - 74 73 75 76 78 77 79 80 - 82 81 83 84 86 85 87 88 - 90 89 91 92 94 93 95 96 - 98 97 99 100 102 101 103 104 - 106 105 107 108 110 109 111 112 - 114 113 115 116 118 117 119 120 - 122 121 123 124 126 125 127 128 - 130 129 131 132 134 133 135 136 - 138 137 139 140 142 141 143 144 - 146 145 147 148 150 149 151 152 - 154 153 155 156 158 157 159 160 - 162 161 163 164 166 165 167 168 - 170 169 171 172 174 173 175 176 - 178 177 179 180 182 181 183 184 - 186 185 187 188 190 189 191 192 - 194 193 195 196 198 197 199 200 - 202 201 203 204 206 205 207 208 - 210 209 211 212 214 213 215 216 - 218 217 219 220 222 221 223 224 - 226 225 227 228 230 229 231 232 - 234 233 235 236 238 237 239 240 - 242 241 243 244 246 245 247 248 - 250 249 251 252 254 253 255 256 - 258 257 259 260 262 261 263 264 - 266 265 267 268 270 269 271 272 - 274 273 275 276 278 277 279 280 - 282 281 283 284 286 285 287 288 - 290 289 291 292 294 293 295 296 - 298 297 299 300 302 301 303 304 - 306 305 307 308 310 309 311 312 - 314 313 315 316 318 317 319 320 - 322 321 323 324 326 325 327 328 - 330 329 331 332 334 333 335 336 - 338 337 339 340 342 341 343 344 - 346 345 347 348 350 349 351 352 - 354 353 355 356 358 357 359 360 - 362 361 363 364 366 365 367 368 - 370 369 371 372 374 373 375 376 - 378 377 379 380 382 381 383 384 - 386 385 387 388 390 389 391 392 - 394 393 395 396 398 397 399 400 - 402 401 403 404 406 405 407 408 - 410 409 411 412 414 413 415 416 - 418 417 419 420 422 421 423 424 - 426 425 427 428 430 429 431 432 - 434 433 435 436 438 437 439 440 - 442 441 443 444 446 445 447 448 - 450 449 451 452 454 453 455 456 - 458 457 459 460 462 461 463 464 - 466 465 467 468 470 469 471 472 - 474 473 475 476 478 477 479 480 - 482 481 483 484 486 485 487 488 - 490 489 491 492 494 493 495 496 - 498 497 499 500 502 501 503 504 - 506 505 507 508 510 509 511 512 - 514 513 515 516 518 517 519 520 - 522 521 523 524 526 525 527 528 - 530 529 531 532 534 533 535 536 - 538 537 539 540 542 541 543 544 - 546 545 547 548 550 549 551 552 - 554 553 555 556 558 557 559 560 - 562 561 563 564 566 565 567 568 - 570 569 571 572 574 573 575 576 - 578 577 579 580 582 581 583 584 - 586 585 587 588 590 589 591 592 - 594 593 595 596 598 597 599 600 - 602 601 603 604 606 605 607 608 - 610 609 611 612 614 613 615 616 - 618 617 619 620 622 621 623 624 - 626 625 627 628 630 629 631 632 - 634 633 635 636 638 637 639 640 - 642 641 643 644 646 645 647 648 - 650 649 651 652 654 653 655 656 - 658 657 659 660 662 661 663 664 - 666 665 667 668 670 669 671 672 - 674 673 675 676 678 677 679 680 - 682 681 683 684 686 685 687 688 - 690 689 691 692 694 693 695 696 - 698 697 699 700 702 701 703 704 - 706 705 707 708 710 709 711 712 - 714 713 715 716 718 717 719 720 - 722 721 723 724 726 725 727 728 - 730 729 731 732 734 733 735 736 - 738 737 739 740 742 741 743 744 - 746 745 747 748 750 749 751 752 - 754 753 755 756 758 757 759 760 - 762 761 763 764 766 765 767 768 - 770 769 771 772 774 773 775 776 - 778 777 779 780 782 781 783 784 - 786 785 787 788 790 789 791 792 - 794 793 795 796 798 797 799 800 - 802 801 803 804 806 805 807 808 - 810 809 811 812 814 813 815 816 - 818 817 819 820 822 821 823 824 - 826 825 827 828 830 829 831 832 - 834 833 835 836 838 837 839 840 - 842 841 843 844 846 845 847 848 - 850 849 851 852 854 853 855 856 - 858 857 859 860 862 861 863 864 - 866 865 867 868 870 869 871 872 - 874 873 875 876 878 877 879 880 - 882 881 883 884 886 885 887 888 - 890 889 891 892 894 893 895 896 - 898 897 899 900 902 901 903 904 - 906 905 907 908 910 909 911 912 - 914 913 915 916 918 917 919 920 - 922 921 923 924 926 925 927 928 - 930 929 931 932 934 933 935 936 - 938 937 939 940 942 941 943 944 - 946 945 947 948 950 949 951 952 - 954 953 955 956 958 957 959 960 - 962 961 963 964 966 965 967 968 - 970 969 971 972 974 973 975 976 - 978 977 979 980 982 981 983 984 - 986 985 987 988 990 989 991 992 - 994 993 995 996 998 997 999 1000 - 1002 1001 1003 1004 1006 1005 1007 1008 - 1010 1009 1011 1012 1014 1013 1015 1016 - 1018 1017 1019 1020 1022 1021 1023 1024 - 1026 1025 1027 1028 1030 1029 1031 1032 - 1034 1033 1035 1036 1038 1037 1039 1040 - 1042 1041 1043 1044 1046 1045 1047 1048 - 1050 1049 1051 1052 1054 1053 1055 1056 - 1058 1057 1059 1060 1062 1061 1063 1064 - 1066 1065 1067 1068 1070 1069 1071 1072 - 1074 1073 1075 1076 1078 1077 1079 1080 - 1082 1081 1083 1084 1086 1085 1087 1088 - 1090 1089 1091 1092 1094 1093 1095 1096 - 1098 1097 1099 1100 1102 1101 1103 1104 - 1106 1105 1107 1108 1110 1109 1111 1112 - 1114 1113 1115 1116 1118 1117 1119 1120 - 1122 1121 1123 1124 1126 1125 1127 1128 - 1130 1129 1131 1132 1134 1133 1135 1136 - 1138 1137 1139 1140 1142 1141 1143 1144 - 1146 1145 1147 1148 1150 1149 1151 1152 - 1154 1153 1155 1156 1158 1157 1159 1160 - 1162 1161 1163 1164 1166 1165 1167 1168 - 1170 1169 1171 1172 1174 1173 1175 1176 - 1178 1177 1179 1180 1182 1181 1183 1184 - 1186 1185 1187 1188 1190 1189 1191 1192 - 1194 1193 1195 1196 1198 1197 1199 1200 - 1202 1201 1203 1204 1206 1205 1207 1208 - 1210 1209 1211 1212 1214 1213 1215 1216 - 1218 1217 1219 1220 1222 1221 1223 1224 - 1226 1225 1227 1228 1230 1229 1231 1232 - 1234 1233 1235 1236 1238 1237 1239 1240 - 1242 1241 1243 1244 1246 1245 1247 1248 - 1250 1249 1251 1252 1254 1253 1255 1256 - 1258 1257 1259 1260 1262 1261 1263 1264 - 1266 1265 1267 1268 1270 1269 1271 1272 - 1274 1273 1275 1276 1278 1277 1279 1280 - 1282 1281 1283 1284 1286 1285 1287 1288 - 1290 1289 1291 1292 1294 1293 1295 1296 - 1298 1297 1299 1300 1302 1301 1303 1304 - 1306 1305 1307 1308 1310 1309 1311 1312 - 1314 1313 1315 1316 1318 1317 1319 1320 - 1322 1321 1323 1324 1326 1325 1327 1328 - 1330 1329 1331 1332 1334 1333 1335 1336 - 1338 1337 1339 1340 1342 1341 1343 1344 - 1346 1345 1347 1348 1350 1349 1351 1352 - 1354 1353 1355 1356 1358 1357 1359 1360 - 1362 1361 1363 1364 1366 1365 1367 1368 - 1370 1369 1371 1372 1374 1373 1375 1376 - 1378 1377 1379 1380 1382 1381 1383 1384 - 1386 1385 1387 1388 1390 1389 1391 1392 - 1394 1393 1395 1396 1398 1397 1399 1400 - 1402 1401 1403 1404 1406 1405 1407 1408 - 1410 1409 1411 1412 1414 1413 1415 1416 - 1418 1417 1419 1420 1422 1421 1423 1424 - 1426 1425 1427 1428 1430 1429 1431 1432 - 1434 1433 1435 1436 1438 1437 1439 1440 - 1442 1441 1443 1444 1446 1445 1447 1448 - 1450 1449 1451 1452 1454 1453 1455 1456 - 1458 1457 1459 1460 1462 1461 1463 1464 - 1466 1465 1467 1468 1470 1469 1471 1472 - 1474 1473 1475 1476 1478 1477 1479 1480 - 1482 1481 1483 1484 1486 1485 1487 1488 - 1490 1489 1491 1492 1494 1493 1495 1496 - 1498 1497 1499 1500 1502 1501 1503 1504 - 1506 1505 1507 1508 1510 1509 1511 1512 - 1514 1513 1515 1516 1518 1517 1519 1520 - 1522 1521 1523 1524 1526 1525 1527 1528 - 1530 1529 1531 1532 1534 1533 1535 1536 - 1538 1537 1539 1540 1542 1541 1543 1544 - 1546 1545 1547 1548 1550 1549 1551 1552 - 1554 1553 1555 1556 1558 1557 1559 1560 - 1562 1561 1563 1564 1566 1565 1567 1568 - 1570 1569 1571 1572 1574 1573 1575 1576 - 1578 1577 1579 1580 1582 1581 1583 1584 - 1586 1585 1587 1588 1590 1589 1591 1592 - 1594 1593 1595 1596 1598 1597 1599 1600 - 1602 1601 1603 1604 1606 1605 1607 1608 - 1610 1609 1611 1612 1614 1613 1615 1616 - 1618 1617 1619 1620 1622 1621 1623 1624 - 1626 1625 1627 1628 1630 1629 1631 1632 - 1634 1633 1635 1636 1638 1637 1639 1640 - 1642 1641 1643 1644 1646 1645 1647 1648 - - 0 !NIMPHI: impropers - - - 0 !NDON: donors - - - 0 !NACC: acceptors - - - 0 !NNB - - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 - - - 1 0 !NGRP - 0 0 0 - From b370332aaa3f219034b67ff627fa470c5f6ddd82 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 5 Jul 2018 11:58:25 -0400 Subject: [PATCH 045/199] Update acceptance criteria for crank shaft move --- src/CrankShaft.h | 172 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 src/CrankShaft.h diff --git a/src/CrankShaft.h b/src/CrankShaft.h new file mode 100644 index 000000000..34d69da9a --- /dev/null +++ b/src/CrankShaft.h @@ -0,0 +1,172 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef CRANKSHAFT_H +#define CRANKSHAFT_H + + +#include "MoveBase.h" +#include "TrialMol.h" + +//#define DEBUG_MOVES + +class CrankShaft : public MoveBase +{ +public: + + CrankShaft(System &sys, StaticVals const& statV) : + ffRef(statV.forcefield), molLookRef(sys.molLookupRef), + MoveBase(sys, statV) {} + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); +private: + uint GetBoxAndMol(const double subDraw, const double movPerc); + MolPick molPick; + uint sourceBox, destBox; + uint pStart, pLen; + uint molIndex, kindIndex; + + double W_recip, W_bonded; + double correct_old, correct_new; + cbmc::TrialMol oldMol, newMol; + Intermolecular recipDiff; + MoleculeLookup & molLookRef; + Forcefield const& ffRef; +}; + +inline uint CrankShaft::GetBoxAndMol +(const double subDraw, const double movPerc) +{ + +#if ENSEMBLE == GCMC + sourceBox = mv::BOX0; + uint state = prng.PickMol(molIndex, kindIndex, sourceBox, subDraw, movPerc); +#else + uint state = prng.PickMolAndBox(molIndex, kindIndex, sourceBox, subDraw, + movPerc); +#endif + + //molecule will be removed and insert in same box + destBox = sourceBox; + + if (state != mv::fail_state::NO_MOL_OF_KIND_IN_BOX) { + pStart = pLen = 0; + molRef.GetRangeStartLength(pStart, pLen, molIndex); + } + return state; +} + +inline uint CrankShaft::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxAndMol(subDraw, movPerc); + newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); + oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); + oldMol.SetCoords(coordCurrRef, pStart); + return state; +} + + +inline uint CrankShaft::Transform() +{ + cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); + molRef.kinds[kindIndex].CrankShaft(oldMol, newMol, molIndex); + return mv::fail_state::NO_FAIL; +} + +inline void CrankShaft::CalcEn() +{ + // since number of molecules would not change in the box, + W_recip = 1.0; + W_bonded = 1.0; + correct_old = 0.0; + correct_new = 0.0; + //Calculate bonded and intra-nonbonded energy + calcEnRef.MoleculeIntra(newMol, molIndex); + calcEnRef.MoleculeIntra(oldMol, molIndex); + + W_bonded = exp(-1.0 * ffRef.beta * ((newMol.GetEnergy().intraBond + + newMol.GetEnergy().intraNonbond) - + (oldMol.GetEnergy().intraBond + + oldMol.GetEnergy().intraNonbond))); + + + if (newMol.GetWeight() != 0.0) { + correct_new = calcEwald->SwapCorrection(newMol); + correct_old = calcEwald->SwapCorrection(oldMol); + recipDiff.energy = calcEwald->MolReciprocal(newMol.GetCoords(), molIndex, + sourceBox); + //self energy is same + W_recip = exp(-1.0 * ffRef.beta * (recipDiff.energy + correct_new - + correct_old)); + } +} + + +inline void CrankShaft::Accept(const uint rejectState, const uint step) +{ + bool result; + //If we didn't skip the move calculation + if(rejectState == mv::fail_state::NO_FAIL) { + double Wo = oldMol.GetWeight(); + double Wn = newMol.GetWeight(); + double Wrat = Wn / Wo * W_recip * W_bonded; + + //safety to make sure move will be rejected in overlap case + if((newMol.GetEnergy().real < 1.0e15) && + (oldMol.GetEnergy().real < 1.0e15)) { + result = prng() < Wrat; + } else + result = false; + + + if(result) { + //Add rest of energy. + sysPotRef.boxEnergy[sourceBox] -= oldMol.GetEnergy(); + sysPotRef.boxEnergy[destBox] += newMol.GetEnergy(); + //Add Reciprocal energy difference + sysPotRef.boxEnergy[destBox].recip += recipDiff.energy; + //Add correction energy + sysPotRef.boxEnergy[sourceBox].correction -= correct_old; + sysPotRef.boxEnergy[destBox].correction += correct_new; + + //Set coordinates, new COM; shift index to new box's list + newMol.GetCoords().CopyRange(coordCurrRef, 0, pStart, pLen); + comCurrRef.SetNew(molIndex, destBox); + cellList.AddMol(molIndex, destBox, coordCurrRef); + + + //Zero out box energies to prevent small number + //errors in double. + if (molLookRef.NumInBox(sourceBox) == 1) { + sysPotRef.boxEnergy[sourceBox].inter = 0; + sysPotRef.boxVirial[sourceBox].inter = 0; + sysPotRef.boxEnergy[sourceBox].real = 0; + sysPotRef.boxVirial[sourceBox].real = 0; + } + + calcEwald->UpdateRecip(sourceBox); + //Retotal + sysPotRef.Total(); + } else { + cellList.AddMol(molIndex, sourceBox, coordCurrRef); + + //when weight is 0, MolDestSwap() will not be executed, thus cos/sin + //molRef will not be changed. Also since no memcpy, doing restore + //results in memory overwrite + if (newMol.GetWeight() != 0.0) + calcEwald->RestoreMol(molIndex); + } + } else //else we didn't even try because we knew it would fail + result = false; + + subPick = mv::GetMoveSubIndex(mv::CRANKSHAFT, sourceBox); + moveSetRef.Update(result, subPick, step); +} + +#endif From 9b3042b8e16f3e60cc5090c51527aac5aa14c617 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 5 Jul 2018 12:12:37 -0400 Subject: [PATCH 046/199] Add CBMC function to DCLinear to support crank shaft move. --- src/CBMC.h | 8 + src/CrankShaft.h | 3 + src/MoleculeKind.h | 7 + src/cbmc/DCGraph.cpp | 912 +++++++++++++++++++++--------------------- src/cbmc/DCGraph.h | 1 + src/cbmc/DCLinear.cpp | 275 ++++++------- src/cbmc/DCLinear.h | 1 + 7 files changed, 617 insertions(+), 590 deletions(-) diff --git a/src/CBMC.h b/src/CBMC.h index 78960f022..7ad5f70c5 100644 --- a/src/CBMC.h +++ b/src/CBMC.h @@ -31,14 +31,22 @@ class CBMC //Builds a new molecule using a CBMC algorithm, oldMol and newMol //will be modified to contain the energies of the old and new sites virtual void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) = 0; + //Regrowing the molecule using a CBMC algorithm, oldMol and newMol virtual void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) = 0; + + //Rotate the atoms between two nodes arounde the vector that connects two + //nodes using crank shaft algorithm, oldMol and newMol + virtual void CrankShaft(TrialMol& oldMol, TrialMol& newMol,uint molIndex) = 0; + //Rigid insertion of molecule and perform position and rotational trial virtual void BuildIDNew(TrialMol& newMol, uint molIndex) = 0; virtual void BuildIDOld(TrialMol& oldMol, uint molIndex) = 0; + //Build the molecule using CD-CBMC virtual void BuildNew(TrialMol& newMol, uint molIndex) = 0; virtual void BuildOld(TrialMol& oldMol, uint molIndex) = 0; + //Grow the molecule from predefined atom (node) virtual void BuildGrowNew(TrialMol& newMol, uint molIndex) = 0; virtual void BuildGrowOld(TrialMol& oldMol, uint molIndex) = 0; diff --git a/src/CrankShaft.h b/src/CrankShaft.h index 34d69da9a..eb7dae91c 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -68,6 +68,9 @@ inline uint CrankShaft::Prep(const double subDraw, const double movPerc) newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); oldMol.SetCoords(coordCurrRef, pStart); + //Set the newMol coordinate same as oldMol. Later after Transform, coordinates + //will be updated. + newMol.SetCoords(coordCurrRef, pStart); return state; } diff --git a/src/MoleculeKind.h b/src/MoleculeKind.h index 917ef5cbd..a3cc95667 100644 --- a/src/MoleculeKind.h +++ b/src/MoleculeKind.h @@ -94,6 +94,13 @@ class MoleculeKind builder->Regrowth(oldMol, newMol, molIndex); } + //Crank Shaft move + void CrankShaft(cbmc::TrialMol& oldMol, cbmc::TrialMol& newMol, + const uint molIndex) + { + builder->CrankShaft(oldMol, newMol, molIndex); + } + //Used in MEMC move void BuildIDNew(cbmc::TrialMol& newMol, const uint molIndex) { diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index b5f3f4eb1..96750e88e 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -1,357 +1,357 @@ -/******************************************************************************* -GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 -Copyright (C) 2018 GOMC Group -A copy of the GNU General Public License can be found in the COPYRIGHT.txt -along with this program, also can be found at . -********************************************************************************/ -#include "DCGraph.h" -#include "DCFreeHedron.h" -#include "DCLinkedHedron.h" -#include "DCFreeHedronSeed.h" -#include "DCRotateCOM.h" -#include "MolSetup.h" -#include "Setup.h" -#include "MoleculeKind.h" -#include -#include - -namespace cbmc -{ -DCGraph::DCGraph(System& sys, const Forcefield& ff, - const MoleculeKind& kind, const Setup& set) - : data(sys, ff, set) -{ - using namespace mol_setup; - MolMap::const_iterator it = set.mol.kindMap.find(kind.name); - assert(it != set.mol.kindMap.end()); - const MolKind setupKind = it->second; - - idExchange = new DCRotateCOM(&data, setupKind); - - std::vector atomToNode(setupKind.atoms.size(), 0); - std::vector bondCount(setupKind.atoms.size(), 0); - //Count the number of bonds for each atom - for (uint b = 0; b < setupKind.bonds.size(); ++b) { - const Bond& bond = setupKind.bonds[b]; - ++bondCount[bond.a0]; - ++bondCount[bond.a1]; - } - - //Find the node (number of bound > 1) - //Construct the starting node (DCFreeHedron) - //Construct the Linking node (DCLinkHedron) - for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { - if (bondCount[atom] < 2) { - atomToNode[atom] = -1; - } else { - //Get the information of other Atoms that are bonded to the atom - std::vector bonds = AtomBonds(setupKind, atom); - atomToNode[atom] = nodes.size(); - //Add atom to the node list and initialize it with DCFreeHedron, atom and - // the first partner of the atom - nodes.push_back(Node()); - Node& node = nodes.back(); - //Atoms bonded to atom will be build from focus (atom) in random loc. - node.starting = new DCFreeHedron(&data, setupKind, atom, - bonds[0].a1); - //Atoms bonded to atom will be build from focus (atom) in specified loc. - node.restarting = new DCFreeHedronSeed(&data, setupKind, atom, - bonds[0].a1); - //set the atom index of the node - node.atomIndex = atom; - //Loop through all the bonds - for (uint i = 0; i < bonds.size(); ++i) { - uint partner = bonds[i].a1; - //Store partner index for each node - node.partnerIndex.push_back(partner); - if(bondCount[partner] == 1) { - continue; - } - //Add partner to the edge list of node and initialize it with partner - //and the atom in DCLinkedHedron - //Atoms will be build from prev(atom) to focus (partner) - Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner, - atom)); - node.edges.push_back(e); - } - } - } - - //reassign destination values from atom indices to node indices - for (uint i = 0; i < nodes.size(); ++i) { - for (uint j = 0; j < nodes[i].edges.size(); ++j) { - uint& dest = nodes[i].edges[j].destination; - dest = atomToNode[dest]; - assert(dest != -1); - } - } -} - -void DCGraph::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) -{ - //Randomely pick a node to call DCFreeHedron on it - uint current = data.prng.randIntExc(nodes.size()); - visited.assign(nodes.size(), false); - //Visiting the node - visited[current] = true; - DCComponent* comp = nodes[current].starting; - //Call DCFreeHedron to build all Atoms connected to the node - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - //Advance along edges, building as we go - BuildEdges(oldMol, newMol, molIndex, current); -} - -void DCGraph::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, - const uint cur) -{ - uint current = cur; - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //Advance along edges, building as we go - while (!fringe.empty()) { - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - - //travel to new node, remove traversed edge - //Current node is the edge that we picked - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - //Visiting the node - visited[current] = true; - - //add edges to unvisited nodes - for(uint i = 0; i < nodes[current].edges.size(); ++i) { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) { - fringe.push_back(e); - } - } - } -} - -void DCGraph::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) -{ - //Randomely pick a node to keep it fix and not grow it - uint current = data.prng.randIntExc(nodes.size()); - visited.assign(nodes.size(), false); - //Visiting the node - visited[current] = true; - //Copy the current node's focus coordinate - uint seedInx = nodes[current].atomIndex; - newMol.AddAtom(seedInx, oldMol.AtomPosition(seedInx)); - oldMol.ConfirmOldAtom(seedInx); - //check if we want to grow all atoms from node's focus or not - bool growAll = data.prng() < 1.0 / nodes.size(); - if(growAll) { - DCComponent* comp = nodes[current].restarting; - //Call DCFreeHedronSeed to build all Atoms connected to the node's focus - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - //Build all edges - BuildEdges(oldMol, newMol, molIndex, current); - } else { - //Copy the all atoms bonded to node's focus - for(uint b = 0; b < nodes[current].partnerIndex.size(); b++) { - uint partner = nodes[current].partnerIndex[b]; - newMol.AddAtom(partner, oldMol.AtomPosition(partner)); - oldMol.ConfirmOldAtom(partner); - } - - if(nodes[current].edges.size() == 1) { - //If current is the terminal node, continue building all edges - BuildEdges(oldMol, newMol, molIndex, current); - } else { - //First we pick a edge and continue copying the coordinate - //Then continue to build the rest of the molecule from current - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //randomely pick one one of the edges connected to fixNode - uint pickFixEdg = data.prng.randIntExc(fringe.size()); - //Travel to picked edges and make it as new fixNode - uint fixNode = fringe[pickFixEdg].destination; - visited[fixNode] = true; - //Copy the all atoms bonded to fixNode's focus - for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { - uint partner = nodes[fixNode].partnerIndex[b]; - newMol.AddAtom(partner, oldMol.AtomPosition(partner)); - oldMol.ConfirmOldAtom(partner); - } - //Copy the edges of the new node to fringe - fringe = nodes[fixNode].edges; - //remove the edge that we travelled from - for( uint f = 0; f < fringe.size(); f++) { - if(fringe[f].destination == current) - fringe.erase(fringe.begin() + f); - } - //Continue along picked edges and copy the coordinates - while(!fringe.empty()) { - fixNode = fringe[0].destination; - //Copy the all atoms bonded to fixNode's focus - for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { - uint partner = nodes[fixNode].partnerIndex[b]; - newMol.AddAtom(partner, oldMol.AtomPosition(partner)); - oldMol.ConfirmOldAtom(partner); - } - //Travel to new fixNode, remove traversed edge - fringe[0] = fringe.back(); - fringe.pop_back(); - visited[fixNode] = true; - //Add edges to unvisited nodes - for(uint i = 0; i < nodes[fixNode].edges.size(); ++i) { - Edge& e = nodes[fixNode].edges[i]; - if(!visited[e.destination]) { - fringe.push_back(e); - } - } - } - //Now Start building the rest of the molecule from current - //Copy the edges of the current node to fringe - fringe = nodes[current].edges; - //Remove the fixed edge from fringe - fringe.erase(fringe.begin() + pickFixEdg); - //Advance along edges, building as we go - while(!fringe.empty()) { - //Randomely pick one of the edges connected to node - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - visited[current] = true; - for(uint i = 0; i < nodes[current].edges.size(); ++i) { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) { - fringe.push_back(e); - } - } - } - } - } -} - -void DCGraph::BuildIDNew(TrialMol& newMol, uint molIndex) -{ - idExchange->PrepareNew(newMol, molIndex); - idExchange->BuildNew(newMol, molIndex); -} - -void DCGraph::BuildIDOld(TrialMol& oldMol, uint molIndex) -{ - idExchange->PrepareOld(oldMol, molIndex); - idExchange->BuildOld(oldMol, molIndex); -} - -void DCGraph::BuildOld(TrialMol& oldMol, uint molIndex) -{ - //Randomely pick a node to call DCFreeHedron on it - uint current = data.prng.randIntExc(nodes.size()); - visited.assign(nodes.size(), false); - //Visiting the node - visited[current] = true; - DCComponent* comp = nodes[current].starting; - //Call DCFreeHedron to build all Atoms connected to the node - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - //Advance along edges, building as we go - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //Advance along edges, building as we go - while(!fringe.empty()) - { - //Randomely pick one of the edges connected to node - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - - //Travel to new node, remove traversed edge - //Current node is the edge that we picked - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - //Visiting the node - visited[current] = true; - - //Add edges to unvisited nodes - for(uint i = 0; i < nodes[current].edges.size(); ++i) - { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) - { - fringe.push_back(e); - } - } - } -} - -void DCGraph::BuildNew(TrialMol& newMol, uint molIndex) -{ - //Randomely pick a node to call DCFreeHedron on it - uint current = data.prng.randIntExc(nodes.size()); - visited.assign(nodes.size(), false); - //Visiting the node - visited[current] = true; - DCComponent* comp = nodes[current].starting; - //Call DCFreeHedron to build all Atoms connected to the node - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - //Advance along edges, building as we go - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //Advance along edges, building as we go - while(!fringe.empty()) - { - //Randomely pick one of the edges connected to node - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - - //Travel to new node, remove traversed edge - //Current node is the edge that we picked - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - //Visiting the node - visited[current] = true; - - //Add edges to unvisited nodes - for(uint i = 0; i < nodes[current].edges.size(); ++i) - { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) - { - fringe.push_back(e); - } - } - } -} - -void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include "DCGraph.h" +#include "DCFreeHedron.h" +#include "DCLinkedHedron.h" +#include "DCFreeHedronSeed.h" +#include "DCRotateCOM.h" +#include "MolSetup.h" +#include "Setup.h" +#include "MoleculeKind.h" +#include +#include + +namespace cbmc { - visited.assign(nodes.size(), false); +DCGraph::DCGraph(System& sys, const Forcefield& ff, + const MoleculeKind& kind, const Setup& set) + : data(sys, ff, set) +{ + using namespace mol_setup; + MolMap::const_iterator it = set.mol.kindMap.find(kind.name); + assert(it != set.mol.kindMap.end()); + const MolKind setupKind = it->second; + + idExchange = new DCRotateCOM(&data, setupKind); + + std::vector atomToNode(setupKind.atoms.size(), 0); + std::vector bondCount(setupKind.atoms.size(), 0); + //Count the number of bonds for each atom + for (uint b = 0; b < setupKind.bonds.size(); ++b) { + const Bond& bond = setupKind.bonds[b]; + ++bondCount[bond.a0]; + ++bondCount[bond.a1]; + } + + //Find the node (number of bound > 1) + //Construct the starting node (DCFreeHedron) + //Construct the Linking node (DCLinkHedron) + for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { + if (bondCount[atom] < 2) { + atomToNode[atom] = -1; + } else { + //Get the information of other Atoms that are bonded to the atom + std::vector bonds = AtomBonds(setupKind, atom); + atomToNode[atom] = nodes.size(); + //Add atom to the node list and initialize it with DCFreeHedron, atom and + // the first partner of the atom + nodes.push_back(Node()); + Node& node = nodes.back(); + //Atoms bonded to atom will be build from focus (atom) in random loc. + node.starting = new DCFreeHedron(&data, setupKind, atom, + bonds[0].a1); + //Atoms bonded to atom will be build from focus (atom) in specified loc. + node.restarting = new DCFreeHedronSeed(&data, setupKind, atom, + bonds[0].a1); + //set the atom index of the node + node.atomIndex = atom; + //Loop through all the bonds + for (uint i = 0; i < bonds.size(); ++i) { + uint partner = bonds[i].a1; + //Store partner index for each node + node.partnerIndex.push_back(partner); + if(bondCount[partner] == 1) { + continue; + } + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron + //Atoms will be build from prev(atom) to focus (partner) + Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner, + atom)); + node.edges.push_back(e); + } + } + } + + //reassign destination values from atom indices to node indices + for (uint i = 0; i < nodes.size(); ++i) { + for (uint j = 0; j < nodes[i].edges.size(); ++j) { + uint& dest = nodes[i].edges[j].destination; + dest = atomToNode[dest]; + assert(dest != -1); + } + } +} + +void DCGraph::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + BuildEdges(oldMol, newMol, molIndex, current); +} + +void DCGraph::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, + const uint cur) +{ + uint current = cur; + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while (!fringe.empty()) { + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } +} + +void DCGraph::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to keep it fix and not grow it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + //Copy the current node's focus coordinate + uint seedInx = nodes[current].atomIndex; + newMol.AddAtom(seedInx, oldMol.AtomPosition(seedInx)); + oldMol.ConfirmOldAtom(seedInx); + //check if we want to grow all atoms from node's focus or not + bool growAll = data.prng() < 1.0 / nodes.size(); + if(growAll) { + DCComponent* comp = nodes[current].restarting; + //Call DCFreeHedronSeed to build all Atoms connected to the node's focus + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Build all edges + BuildEdges(oldMol, newMol, molIndex, current); + } else { + //Copy the all atoms bonded to node's focus + for(uint b = 0; b < nodes[current].partnerIndex.size(); b++) { + uint partner = nodes[current].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + + if(nodes[current].edges.size() == 1) { + //If current is the terminal node, continue building all edges + BuildEdges(oldMol, newMol, molIndex, current); + } else { + //First we pick a edge and continue copying the coordinate + //Then continue to build the rest of the molecule from current + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //randomely pick one one of the edges connected to fixNode + uint pickFixEdg = data.prng.randIntExc(fringe.size()); + //Travel to picked edges and make it as new fixNode + uint fixNode = fringe[pickFixEdg].destination; + visited[fixNode] = true; + //Copy the all atoms bonded to fixNode's focus + for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { + uint partner = nodes[fixNode].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + //Copy the edges of the new node to fringe + fringe = nodes[fixNode].edges; + //remove the edge that we travelled from + for( uint f = 0; f < fringe.size(); f++) { + if(fringe[f].destination == current) + fringe.erase(fringe.begin() + f); + } + //Continue along picked edges and copy the coordinates + while(!fringe.empty()) { + fixNode = fringe[0].destination; + //Copy the all atoms bonded to fixNode's focus + for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { + uint partner = nodes[fixNode].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + //Travel to new fixNode, remove traversed edge + fringe[0] = fringe.back(); + fringe.pop_back(); + visited[fixNode] = true; + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[fixNode].edges.size(); ++i) { + Edge& e = nodes[fixNode].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } + //Now Start building the rest of the molecule from current + //Copy the edges of the current node to fringe + fringe = nodes[current].edges; + //Remove the fixed edge from fringe + fringe.erase(fringe.begin() + pickFixEdg); + //Advance along edges, building as we go + while(!fringe.empty()) { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + visited[current] = true; + for(uint i = 0; i < nodes[current].edges.size(); ++i) { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } + } + } +} + +void DCGraph::BuildIDNew(TrialMol& newMol, uint molIndex) +{ + idExchange->PrepareNew(newMol, molIndex); + idExchange->BuildNew(newMol, molIndex); +} + +void DCGraph::BuildIDOld(TrialMol& oldMol, uint molIndex) +{ + idExchange->PrepareOld(oldMol, molIndex); + idExchange->BuildOld(oldMol, molIndex); +} + +void DCGraph::BuildOld(TrialMol& oldMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCGraph::BuildNew(TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) +{ + visited.assign(nodes.size(), false); //Use backbone atom to start the node uint current = -1; for(uint i = 0; i < nodes.size(); i++) { @@ -359,58 +359,58 @@ void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) current = i; break; } - } - - if(current == -1) { + } + + if(current == -1) { std::cout << "In MEMC-3 move, atom index "<< oldMol.GetAtomBB(0)<< - " must be a node." - << "This atom must be bounded to two or more atoms! \n"; - exit(1); + " must be a node." + << "This atom must be bounded to two or more atoms! \n"; + exit(1); } //Visiting the node - visited[current] = true; - DCComponent* comp = nodes[current].starting; - //Call DCFreeHedron to build all Atoms connected to the node - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - //Advance along edges, building as we go - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //Advance along edges, building as we go - while(!fringe.empty()) - { - //Randomely pick one of the edges connected to node - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareOld(oldMol, molIndex); - comp->BuildOld(oldMol, molIndex); - - //Travel to new node, remove traversed edge - //Current node is the edge that we picked - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - //Visiting the node - visited[current] = true; - - //Add edges to unvisited nodes - for(uint i = 0; i < nodes[current].edges.size(); ++i) - { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) - { - fringe.push_back(e); - } - } - } -} - - -void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) -{ + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + + +void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) +{ visited.assign(nodes.size(), false); //Use backbone atom to start the node uint current = -1; @@ -429,58 +429,58 @@ void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) } //Visiting the node - visited[current] = true; - DCComponent* comp = nodes[current].starting; - //Call DCFreeHedron to build all Atoms connected to the node - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - //Advance along edges, building as we go - //Copy the edges of the node to fringe - fringe = nodes[current].edges; - //Advance along edges, building as we go - while(!fringe.empty()) - { - //Randomely pick one of the edges connected to node - uint pick = data.prng.randIntExc(fringe.size()); - DCComponent* comp = fringe[pick].component; - //Call DCLinkedHedron and build all Atoms connected to selected edge - comp->PrepareNew(newMol, molIndex); - comp->BuildNew(newMol, molIndex); - - //Travel to new node, remove traversed edge - //Current node is the edge that we picked - current = fringe[pick].destination; - //Remove the edge that we visited - fringe[pick] = fringe.back(); - fringe.pop_back(); - //Visiting the node - visited[current] = true; - - //Add edges to unvisited nodes - for(uint i = 0; i < nodes[current].edges.size(); ++i) - { - Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) - { - fringe.push_back(e); - } - } - } -} - - -DCGraph::~DCGraph() -{ - for(uint v = 0; v < nodes.size(); ++v) { - Node& node = nodes[v]; - delete node.starting; - delete node.restarting; - for(uint e = 0; e < node.edges.size(); ++ e) { - delete node.edges[e].component; - } - } - delete idExchange; -} - - -} + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].component; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + + +DCGraph::~DCGraph() +{ + for(uint v = 0; v < nodes.size(); ++v) { + Node& node = nodes[v]; + delete node.starting; + delete node.restarting; + for(uint e = 0; e < node.edges.size(); ++ e) { + delete node.edges[e].component; + } + } + delete idExchange; +} + + +} diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index 4c5896e2e..8f33efcd7 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -30,6 +30,7 @@ class DCGraph : public CBMC void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, const uint current); void BuildIDNew(TrialMol& newMol, uint molIndex); diff --git a/src/cbmc/DCLinear.cpp b/src/cbmc/DCLinear.cpp index 0e82c8783..82fbd948d 100644 --- a/src/cbmc/DCLinear.cpp +++ b/src/cbmc/DCLinear.cpp @@ -1,135 +1,142 @@ -/******************************************************************************* -GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 -Copyright (C) 2018 GOMC Group -A copy of the GNU General Public License can be found in the COPYRIGHT.txt -along with this program, also can be found at . -********************************************************************************/ -#include -#include "DCLinear.h" -#include "DCSingle.h" -#include "DCOnSphere.h" -#include "DCRotateCOM.h" - -using namespace cbmc; - -DCLinear::DCLinear(System& sys, const Forcefield& ff, - const MoleculeKind& kind, const Setup& set) : - data(sys, ff, set) -{ - mol_setup::MolMap::const_iterator it = set.mol.kindMap.find(kind.name); - assert(it != set.mol.kindMap.end()); - const mol_setup::MolKind setupKind = it->second; - uint size = kind.NumAtoms(); - atomSize = size; - - idExchange = new DCRotateCOM(&data, setupKind); - //First atom of the molecule - forward.push_back(new DCSingle(&data, 0)); - backward.push_back(new DCSingle(&data, size - 1)); - //second atom of the molecule - if(atomSize > 1) { - forward.push_back(new DCOnSphere(&data, setupKind, 1, 0)); - backward.push_back(new DCOnSphere(&data, setupKind, size - 2, size - 1)); - } -} - -DCLinear::~DCLinear() -{ - for(uint i = 0; i < forward.size(); ++i) { - delete forward[i]; - delete backward[i]; - } - delete idExchange; -} - -void DCLinear::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) -{ - std::vector& comps = data.prng.randInt(1) ? forward : backward; - for(uint i = 0; i < comps.size(); ++i) { - comps[i]->PrepareNew(newMol, molIndex); - comps[i]->BuildNew(newMol, molIndex); - } - - for(uint i = 0; i < comps.size(); ++i) { - comps[i]->PrepareOld(oldMol, molIndex); - comps[i]->BuildOld(oldMol, molIndex); - } -} - -void DCLinear::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) -{ - //perform Intra-Swap move within the same box - if(atomSize < 2) { - Build(oldMol, newMol, molIndex); - return; - } else { - //we only have two atoms in molecule: atom 0, 1 - uint fix = data.prng.randInt(1); - uint grow = 1 - fix; - //If fix == 0, forward (build atom 1), else backward (build atom 0) - std::vector& comps = fix ? backward : forward; - - //copy the coordinate of the fix atom - newMol.AddAtom(fix, oldMol.AtomPosition(fix)); - oldMol.ConfirmOldAtom(fix); - //build the second atom - comps[1]->PrepareNew(newMol, molIndex); - comps[1]->BuildNew(newMol, molIndex); - comps[1]->PrepareOld(oldMol, molIndex); - comps[1]->BuildOld(oldMol, molIndex); - } -} - -void DCLinear::BuildIDNew(TrialMol& newMol, uint molIndex) -{ - idExchange->PrepareNew(newMol, molIndex); - idExchange->BuildNew(newMol, molIndex); -} - -void DCLinear::BuildIDOld(TrialMol& oldMol, uint molIndex) -{ - idExchange->PrepareOld(oldMol, molIndex); - idExchange->BuildOld(oldMol, molIndex); -} - -void DCLinear::BuildOld(TrialMol& oldMol, uint molIndex) -{ - std::vector& comps =data.prng.randInt(1) ? forward : backward; - for(uint i = 0; i < comps.size(); ++i) - { - comps[i]->PrepareOld(oldMol, molIndex); - comps[i]->BuildOld(oldMol, molIndex); - } -} - -void DCLinear::BuildNew(TrialMol& newMol, uint molIndex) -{ - std::vector& comps =data.prng.randInt(1) ? forward : backward; - for(uint i = 0; i < comps.size(); ++i) - { - comps[i]->PrepareNew(newMol, molIndex); - comps[i]->BuildNew(newMol, molIndex); - } -} - -void DCLinear::BuildGrowOld(TrialMol& oldMol, uint molIndex) -{ - //If backbone is atom 0, we use forward, otherwise backward - std::vector& comps = oldMol.GetAtomBB(0) ? backward : forward; - for(uint i = 0; i < comps.size(); ++i) - { - comps[i]->PrepareOld(oldMol, molIndex); - comps[i]->BuildOld(oldMol, molIndex); - } -} - -void DCLinear::BuildGrowNew(TrialMol& newMol, uint molIndex) -{ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include +#include "DCLinear.h" +#include "DCSingle.h" +#include "DCOnSphere.h" +#include "DCRotateCOM.h" + +using namespace cbmc; + +DCLinear::DCLinear(System& sys, const Forcefield& ff, + const MoleculeKind& kind, const Setup& set) : + data(sys, ff, set) +{ + mol_setup::MolMap::const_iterator it = set.mol.kindMap.find(kind.name); + assert(it != set.mol.kindMap.end()); + const mol_setup::MolKind setupKind = it->second; + uint size = kind.NumAtoms(); + atomSize = size; + + idExchange = new DCRotateCOM(&data, setupKind); + //First atom of the molecule + forward.push_back(new DCSingle(&data, 0)); + backward.push_back(new DCSingle(&data, size - 1)); + //second atom of the molecule + if(atomSize > 1) { + forward.push_back(new DCOnSphere(&data, setupKind, 1, 0)); + backward.push_back(new DCOnSphere(&data, setupKind, size - 2, size - 1)); + } +} + +DCLinear::~DCLinear() +{ + for(uint i = 0; i < forward.size(); ++i) { + delete forward[i]; + delete backward[i]; + } + delete idExchange; +} + +void DCLinear::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + std::vector& comps = data.prng.randInt(1) ? forward : backward; + for(uint i = 0; i < comps.size(); ++i) { + comps[i]->PrepareNew(newMol, molIndex); + comps[i]->BuildNew(newMol, molIndex); + } + + for(uint i = 0; i < comps.size(); ++i) { + comps[i]->PrepareOld(oldMol, molIndex); + comps[i]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //perform Intra-Swap move within the same box + if(atomSize < 2) { + Build(oldMol, newMol, molIndex); + return; + } else { + //we only have two atoms in molecule: atom 0, 1 + uint fix = data.prng.randInt(1); + uint grow = 1 - fix; + //If fix == 0, forward (build atom 1), else backward (build atom 0) + std::vector& comps = fix ? backward : forward; + + //copy the coordinate of the fix atom + newMol.AddAtom(fix, oldMol.AtomPosition(fix)); + oldMol.ConfirmOldAtom(fix); + //build the second atom + comps[1]->PrepareNew(newMol, molIndex); + comps[1]->BuildNew(newMol, molIndex); + comps[1]->PrepareOld(oldMol, molIndex); + comps[1]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //No crank shaft move for molecule with two atoms. + //Instead we perform Intra-Swap move within the same box + Build(oldMol, newMol, molIndex); +} + +void DCLinear::BuildIDNew(TrialMol& newMol, uint molIndex) +{ + idExchange->PrepareNew(newMol, molIndex); + idExchange->BuildNew(newMol, molIndex); +} + +void DCLinear::BuildIDOld(TrialMol& oldMol, uint molIndex) +{ + idExchange->PrepareOld(oldMol, molIndex); + idExchange->BuildOld(oldMol, molIndex); +} + +void DCLinear::BuildOld(TrialMol& oldMol, uint molIndex) +{ + std::vector& comps =data.prng.randInt(1) ? forward : backward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareOld(oldMol, molIndex); + comps[i]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::BuildNew(TrialMol& newMol, uint molIndex) +{ + std::vector& comps =data.prng.randInt(1) ? forward : backward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareNew(newMol, molIndex); + comps[i]->BuildNew(newMol, molIndex); + } +} + +void DCLinear::BuildGrowOld(TrialMol& oldMol, uint molIndex) +{ //If backbone is atom 0, we use forward, otherwise backward - std::vector& comps = newMol.GetAtomBB(0) ? backward : forward; - for(uint i = 0; i < comps.size(); ++i) - { - comps[i]->PrepareNew(newMol, molIndex); - comps[i]->BuildNew(newMol, molIndex); - } -} + std::vector& comps = oldMol.GetAtomBB(0) ? backward : forward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareOld(oldMol, molIndex); + comps[i]->BuildOld(oldMol, molIndex); + } +} + +void DCLinear::BuildGrowNew(TrialMol& newMol, uint molIndex) +{ + //If backbone is atom 0, we use forward, otherwise backward + std::vector& comps = newMol.GetAtomBB(0) ? backward : forward; + for(uint i = 0; i < comps.size(); ++i) + { + comps[i]->PrepareNew(newMol, molIndex); + comps[i]->BuildNew(newMol, molIndex); + } +} diff --git a/src/cbmc/DCLinear.h b/src/cbmc/DCLinear.h index b582e274f..7520a2914 100644 --- a/src/cbmc/DCLinear.h +++ b/src/cbmc/DCLinear.h @@ -27,6 +27,7 @@ class DCLinear : public CBMC void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void BuildIDNew(TrialMol& newMol, uint molIndex); void BuildIDOld(TrialMol& oldMol, uint molIndex); void BuildNew(TrialMol& newMol, uint molIndex); From 4d7b6125d5107d34d7c0c3b8fec031dd36857c89 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 5 Jul 2018 14:44:08 -0400 Subject: [PATCH 047/199] Build a class for crank shaft in DCGraph. --- src/cbmc/DCGraph.cpp | 28 ++++++++++++++++++++++++++++ src/cbmc/DCGraph.h | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 96750e88e..2b5941d76 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -85,6 +85,34 @@ DCGraph::DCGraph(System& sys, const Forcefield& ff, assert(dest != -1); } } + + InitCrankShaft(setupKind); +} + + +void DCGraph::InitCrankShaft(mol_setup::MolKind& kind) +{ + using namespace mol_setup; + using namespace std; + vector tempNodes = nodes; + while(!tempNodes.empty()) { + //start from last node, find the atom index of the node + uint a0 = tempNodes.back().atomIndex; + //Find the dihedrals that end with a0 + vector dihs = AtomEndDihs(kind, a0); + while(!dihs.empty()) { + //find the last atomindex in the dihedral + uint a3 = dihs.back().a3; + //Check if the a3 is a node or not + for(uint n = 0; n < tempNodes.size(); n++) { + if(tempNodes[n].atomIndex == a3) { + shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a3)); + } + } + dihs.pop_back(); + } + tempNodes.pop_back(); + } } void DCGraph::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index 8f33efcd7..56660cbc7 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -9,6 +9,7 @@ along with this program, also can be found at . #include "CBMC.h" #include "DCComponent.h" #include "DCData.h" +#include "MoleculeKind.h" #include #include @@ -42,6 +43,8 @@ class DCGraph : public CBMC ~DCGraph(); private: + //Find the two nodes that are forming dihedral or angle and initialize it. + void InitCrankShaft(mol_setup::MolKind& kind); //Store edge's atom that are connected to node and has more than 1 bond //Each edge is a node as well struct Edge { @@ -69,6 +72,7 @@ class DCGraph : public CBMC std::vector nodes; std::vector fringe; std::vector visited; + std::vector shaftNodesDih; }; } From 93ad68240a25edd1874995f580d8669b49cb9680 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 6 Jul 2018 10:32:02 -0400 Subject: [PATCH 048/199] Creating CrankShaft function in DCGraph.cpp --- src/cbmc/DCGraph.cpp | 17 +++++++++++++++++ src/cbmc/DCLinear.cpp | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 2b5941d76..9cfd8ddac 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -115,6 +115,23 @@ void DCGraph::InitCrankShaft(mol_setup::MolKind& kind) } } +void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + if(nodes.size() < 4) { + //No crank shaft move for molecule with less than 4 nodes. + //Instead we perform Regrowth move within the same box + Regrowth(oldMol, newMol, molIndex); + } else { + //Pick a random node pair + uint pick = data.prng.randIntExc(shaftNodesDih.size()); + //Call DCCrankShaftDih and rotate a1 and a2 nodes around a0-a3 shaft + shaftNodesDih[pick]->PrepareNew(newMol, molIndex); + shaftNodesDih[pick]->BuildNew(newMol, molIndex); + shaftNodesDih[pick]->PrepareOld(oldMol, molIndex); + shaftNodesDih[pick]->BuildOld(oldMol, molIndex); + } +} + void DCGraph::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { //Randomely pick a node to call DCFreeHedron on it diff --git a/src/cbmc/DCLinear.cpp b/src/cbmc/DCLinear.cpp index 82fbd948d..e8e979561 100644 --- a/src/cbmc/DCLinear.cpp +++ b/src/cbmc/DCLinear.cpp @@ -83,8 +83,8 @@ void DCLinear::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) void DCLinear::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { //No crank shaft move for molecule with two atoms. - //Instead we perform Intra-Swap move within the same box - Build(oldMol, newMol, molIndex); + //Instead we perform Regrowth move within the same box + Regrowth(oldMol, newMol, molIndex); } void DCLinear::BuildIDNew(TrialMol& newMol, uint molIndex) From 4f19e51c49c0aa1b7c5ecc639499c0fdee00c65a Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 6 Jul 2018 16:11:50 -0400 Subject: [PATCH 049/199] Detect atomIndex within two end of dihedral. --- src/cbmc/DCCrankShaftDih.cpp | 90 ++++++++++++++++++++++++++++++++++++ src/cbmc/DCCrankShaftDih.h | 40 ++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 src/cbmc/DCCrankShaftDih.cpp create mode 100644 src/cbmc/DCCrankShaftDih.h diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp new file mode 100644 index 000000000..992c67e6d --- /dev/null +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -0,0 +1,90 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include "DCSingle.h" +#include "TrialMol.h" +#include "DCData.h" +#include "PRNG.h" +#include "CalculateEnergy.h" +#include "XYZArray.h" +#include "Forcefield.h" + +namespace cbmc +{ +DCSingle::DCSingle(DCData* data, uint atom) : data(data), atom(atom) +{ + if(data->nLJTrialsFirst < 1) { + std::cout << "Error: CBMC first atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } +} + +void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) +{ + PRNG& prng = data->prng; + XYZArray& positions = data->positions; + uint nLJTrials = data->nLJTrialsFirst; + double* inter = data->inter; + double* real = data->real; + double stepWeight = 0; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + + if(oldMol.COMFix()) { + nLJTrials = 1; + } else { + prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); + } + positions.Set(0, data->axes.WrapPBC(oldMol.AtomPosition(atom), oldMol.GetBox())); + data->calc.ParticleInter(inter, real, positions, atom, molIndex, + oldMol.GetBox(), nLJTrials); + + for (uint trial = 0; trial < nLJTrials; ++trial) { + stepWeight += exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + } + oldMol.MultWeight(stepWeight / nLJTrials); + oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], + 0.0, 0.0, 0.0)); + oldMol.ConfirmOldAtom(atom); +} + +void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) +{ + PRNG& prng = data->prng; + XYZArray& positions = data->positions; + uint nLJTrials = data->nLJTrialsFirst; + double* inter = data->inter; + double* real = data->real; + double* ljWeights = data->ljWeights; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + + if(newMol.COMFix()) { + nLJTrials = 1; + positions.Set(0, data->axes.WrapPBC(newMol.GetCavityCenter(), newMol.GetBox())); + } else { + prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); + } + data->calc.ParticleInter(inter, real, positions, atom, molIndex, + newMol.GetBox(), nLJTrials); + + double stepWeight = 0; + for (uint trial = 0; trial < nLJTrials; ++trial) { + ljWeights[trial] = exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + stepWeight += ljWeights[trial]; + } + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); + newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], + 0.0, 0.0, 0.0)); + newMol.AddAtom(atom, positions[winner]); +} +} diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h new file mode 100644 index 000000000..984a355c9 --- /dev/null +++ b/src/cbmc/DCCrankShaftDih.h @@ -0,0 +1,40 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCSINGLE_H +#define DCSINGLE_H + +#include "DCComponent.h" +#include "BasicTypes.h" + +namespace mol_setup +{ +class MolKind; +} + +namespace cbmc +{ +class DCData; + +class DCSingle : public DCComponent +{ +public: + DCSingle(DCData* data, uint atom); + void PrepareNew(TrialMol& newMol, uint molIndex) {}; + void PrepareOld(TrialMol& oldMol, uint molIndex) {}; + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + DCComponent* Clone() + { + return new DCSingle(*this); + } + +private: + DCData* data; + uint atom; +}; +} +#endif From 8b4c684a82b042905409c662f85c150d1d874d5f Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 6 Jul 2018 16:57:06 -0400 Subject: [PATCH 050/199] Detect atoms between the shaft. Fix the bonded energy calculation using new position in CalculateEnergy.cpp. --- src/CalculateEnergy.cpp | 27 ++++++++---- src/CalculateEnergy.h | 6 +++ src/MolSetup.cpp | 18 ++++++++ src/MolSetup.h | 2 + src/cbmc/DCCrankShaftDih.cpp | 84 +++++++++++++++++++++++++++++++++--- src/cbmc/DCCrankShaftDih.h | 25 ++++++----- src/cbmc/DCGraph.cpp | 14 +++--- src/cbmc/DCGraph.h | 4 +- 8 files changed, 147 insertions(+), 33 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index e6f9afcbf..df85b85cd 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -614,17 +614,11 @@ void CalculateEnergy::MoleculeIntra(const uint molIndex, XYZArray bondVec(molKind.bondList.count * 2); BondVectors(bondVec, molKind, molIndex, box); - MolBond(bondEn[0], molKind, bondVec, box); - MolAngle(bondEn[0], molKind, bondVec, box); - MolDihedral(bondEn[0], molKind, bondVec, box); - MolNonbond(bondEn[1], molKind, molIndex, box); - MolNonbond_1_4(bondEn[1], molKind, molIndex, box); - MolNonbond_1_3(bondEn[1], molKind, molIndex, box); } @@ -637,8 +631,8 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; // *2 because we'll be storing inverse bond vectors XYZArray bondVec(molKind.bondList.count * 2); - BondVectors(bondVec, molKind, molIndex, box); - + + BondVectors(bondVec, mol.GetCoords(), molKind, molIndex, box); MolBond(bondEn, molKind, bondVec, box); MolAngle(bondEn, molKind, bondVec, box); MolDihedral(bondEn, molKind, bondVec, box); @@ -665,6 +659,23 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, } } +void CalculateEnergy::BondVectors(XYZArray & vecs, XYZArray const& pos, + MoleculeKind const& molKind, + const uint molIndex, + const uint box) const +{ + for (uint i = 0; i < molKind.bondList.count; ++i) { + uint p1 = molKind.bondList.part1[i]; + uint p2 = molKind.bondList.part2[i]; + XYZ dist = pos.Difference(p2, p1); + dist = currentAxes.MinImage(dist, box); + + //store inverse vectors at i+count + vecs.Set(i, dist); + vecs.Set(i + molKind.bondList.count, -dist.x, -dist.y, -dist.z); + } +} + void CalculateEnergy::MolBond(double & energy, MoleculeKind const& molKind, diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 255e57916..cc9a473a2 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -170,6 +170,12 @@ class CalculateEnergy MoleculeKind const& molKind, const uint molIndex, const uint box) const; + + //! Calculates bond vectors using pos, stores them in vecs + void BondVectors(XYZArray & vecs, XYZArray const& pos, + MoleculeKind const& molKind, + const uint molIndex, + const uint box) const; //! Calculates bond stretch intramolecular energy of a full molecule void MolBond(double & energy, diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index 3c0615178..9f4e1b337 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -95,6 +95,24 @@ std::vector mol_setup::AtomEndDihs(const MolKind& molKind, uint atom) return result; } +//List of dihedrals with atom0 at one end, and atom3 at the other end, atom0 first +std::vector mol_setup::AtomStartEndDihs(const MolKind& molKind, uint atom0, uint atom3) +{ + std::vector result; + typedef std::vector::const_iterator Diter; + for (Diter it = molKind.dihedrals.begin(), end = molKind.dihedrals.end(); it < end; ++it) { + if ((it->a0 == atom0 && it->a3 == atom3) || (it->a0 == atom3 && it->a3 == atom0)) { + result.push_back(*it); + } + + if (it->a3 == atom0) { + std::swap(result.back().a0, result.back().a3); + std::swap(result.back().a1, result.back().a2); + } + } + return result; +} + std::vector mol_setup::DihsOnBond(const MolKind& molKind, uint atom, uint partner) { std::vector result; diff --git a/src/MolSetup.h b/src/MolSetup.h index d18fafacb..b63c2d714 100644 --- a/src/MolSetup.h +++ b/src/MolSetup.h @@ -99,6 +99,8 @@ class MolKind //List of dihedrals with atom at one end, atom first std::vector AtomEndDihs(const MolKind& molKind, uint atom); +//List of dihedrals with atom0 at one end, and atom3 at the other end, atom0 first +std::vector AtomStartEndDihs(const MolKind& molKind, uint atom0, uint atom3); //List of dihedrals with atom and partner in middle, atom in a1 std::vector DihsOnBond(const MolKind& molKind, uint atom, uint partner); //List of angles with atom at one end, atom first diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 992c67e6d..92741c1fb 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -4,25 +4,95 @@ Copyright (C) 2018 GOMC Group A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ -#include "DCSingle.h" +#include "DCCrankShaftDih.h" #include "TrialMol.h" #include "DCData.h" #include "PRNG.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "NumLib.h" #include "CalculateEnergy.h" #include "XYZArray.h" -#include "Forcefield.h" +#include +#include namespace cbmc { -DCSingle::DCSingle(DCData* data, uint atom) : data(data), atom(atom) + struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) { + return (b.a1 == x); + } + uint x; +}; + +DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2, uint a3) : + data(data), a0(a0), a1(a1), a2(a2), a3(a3) { - if(data->nLJTrialsFirst < 1) { - std::cout << "Error: CBMC first atom trials must be greater than 0.\n"; + using namespace mol_setup; + using namespace std; + vector visited(kind.atoms.size(), false); + //Find all the atoms that bonds with atoms a1 + vector bonds = AtomBonds(kind, a1); + //Remove the a0-a1 bond + bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a0)), bonds.end()); + + //Loop through atoms that are bonded to a1 + for(uint b = 0; b < bonds.size(); b++) { + //Store the atom index if it doesnot exist + if(!visited[bonds[b].a0]) { + atoms.push_back(bonds[b].a0); + visited[bonds[b].a0] = true; + } + + vector temp = AtomBonds(kind, bonds[b].a1); + //Remove a2-a3 bonds + temp.erase(remove_if(temp.begin(), temp.end(), FindA1(a3)), temp.end()); + for(uint i = 0; i < temp.size(); i++) { + if(!visited[temp[i].a0]) { + bonds.push_back(temp[i]); + } + } + } + + numAtom = atoms.size(); + + multiPosRotions = new XYZArray[numAtom]; + for(uint i = 0; i < numAtom; ++i) { + multiPosRotions[i] = XYZArray(data->nLJTrialsNth); + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; exit(EXIT_FAILURE); } } + +void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ coord = data->axes.UnwrapPBC(oldMol.AtomPosition(atoms[i]), oldMol.GetBox(), + oldMol.AtomPosition(a0)); + multiPosRotions[i].Set(0, coord); + + } +} + +void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) +{ + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ coord = data->axes.UnwrapPBC(newMol.AtomPosition(atoms[i]), newMol.GetBox(), + newMol.AtomPosition(a0)); + multiPosRotions[i].Set(0, coord); + + } +} + -void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) +void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) { PRNG& prng = data->prng; XYZArray& positions = data->positions; @@ -53,7 +123,7 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.ConfirmOldAtom(atom); } -void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) +void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) { PRNG& prng = data->prng; XYZArray& positions = data->positions; diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index 984a355c9..2016dac2f 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -4,37 +4,42 @@ Copyright (C) 2018 GOMC Group A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ -#ifndef DCSINGLE_H -#define DCSINGLE_H +#ifndef DCCRANKSHAFT_H +#define DCCRANKSHAFT_H #include "DCComponent.h" #include "BasicTypes.h" +#include "TransformMatrix.h" namespace mol_setup { -class MolKind; + class MolKind; } namespace cbmc { -class DCData; +class DCCrankShaftDih; -class DCSingle : public DCComponent +class DCCrankShaftDih : public DCComponent { public: - DCSingle(DCData* data, uint atom); - void PrepareNew(TrialMol& newMol, uint molIndex) {}; - void PrepareOld(TrialMol& oldMol, uint molIndex) {}; + DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2, uint a3); + ~DCCrankShaftDih() {delete[] multiPosRotions;} + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); void BuildOld(TrialMol& oldMol, uint molIndex); void BuildNew(TrialMol& newMol, uint molIndex); DCComponent* Clone() { - return new DCSingle(*this); + return new DCCrankShaftDih(*this); } private: DCData* data; - uint atom; + XYZArray *multiPosRotions; + uint a0, a1, a2, a3, numAtom; + std::vector atoms; }; } #endif diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 9cfd8ddac..f323f8b6e 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -9,9 +9,7 @@ along with this program, also can be found at . #include "DCLinkedHedron.h" #include "DCFreeHedronSeed.h" #include "DCRotateCOM.h" -#include "MolSetup.h" -#include "Setup.h" -#include "MoleculeKind.h" +#include "DCCrankShaftDih.h" #include #include @@ -90,7 +88,7 @@ DCGraph::DCGraph(System& sys, const Forcefield& ff, } -void DCGraph::InitCrankShaft(mol_setup::MolKind& kind) +void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) { using namespace mol_setup; using namespace std; @@ -103,11 +101,13 @@ void DCGraph::InitCrankShaft(mol_setup::MolKind& kind) while(!dihs.empty()) { //find the last atomindex in the dihedral uint a3 = dihs.back().a3; + uint a2 = dihs.back().a2; + uint a1 = dihs.back().a1; //Check if the a3 is a node or not for(uint n = 0; n < tempNodes.size(); n++) { - if(tempNodes[n].atomIndex == a3) { - shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a3)); - } + if(tempNodes[n].atomIndex == a3) { + shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + } } dihs.pop_back(); } diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index 56660cbc7..ae4b3b119 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -9,6 +9,8 @@ along with this program, also can be found at . #include "CBMC.h" #include "DCComponent.h" #include "DCData.h" +#include "MolSetup.h" +#include "Setup.h" #include "MoleculeKind.h" #include #include @@ -44,7 +46,7 @@ class DCGraph : public CBMC private: //Find the two nodes that are forming dihedral or angle and initialize it. - void InitCrankShaft(mol_setup::MolKind& kind); + void InitCrankShaft(const mol_setup::MolKind& kind); //Store edge's atom that are connected to node and has more than 1 bond //Each edge is a node as well struct Edge { From e645d35c7b5d53e684886cff61ba47c2e6a72286 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 6 Jul 2018 18:00:44 -0400 Subject: [PATCH 051/199] Finishing class DCCrankShaftDih --- src/cbmc/DCCrankShaftDih.cpp | 113 +++++++++++++++++++++++++---------- src/cbmc/DCCrankShaftDih.h | 2 +- 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 92741c1fb..7f0506002 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -33,6 +33,7 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, using namespace mol_setup; using namespace std; vector visited(kind.atoms.size(), false); + totAtoms = kind.atoms.size(); //Find all the atoms that bonds with atoms a1 vector bonds = AtomBonds(kind, a1); //Remove the a0-a1 bond @@ -71,23 +72,27 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) { + XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { //Unwrap the coordinates with respect to a0. - XYZ coord = data->axes.UnwrapPBC(oldMol.AtomPosition(atoms[i]), oldMol.GetBox(), - oldMol.AtomPosition(a0)); - multiPosRotions[i].Set(0, coord); - + XYZ coord = data->axes.UnwrapPBC(oldMol.AtomPosition(atoms[i]), + oldMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); } } void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) { + XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { //Unwrap the coordinates with respect to a0. - XYZ coord = data->axes.UnwrapPBC(newMol.AtomPosition(atoms[i]), newMol.GetBox(), - newMol.AtomPosition(a0)); - multiPosRotions[i].Set(0, coord); - + XYZ coord = data->axes.UnwrapPBC(newMol.AtomPosition(atoms[i]), + newMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); } } @@ -95,8 +100,7 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) { PRNG& prng = data->prng; - XYZArray& positions = data->positions; - uint nLJTrials = data->nLJTrialsFirst; + uint nLJTrials = data->nLJTrialsNth; double* inter = data->inter; double* real = data->real; double stepWeight = 0; @@ -104,14 +108,35 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); - if(oldMol.COMFix()) { - nLJTrials = 1; - } else { - prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); + //Set up rotation matrix using a0-a3 axis. + XYZ center = oldMol.AtomPosition(a0); + XYZ rotAxis = oldMol.AtomPosition(a0) - oldMol.AtomPosition(a3); + rotAxis = data->axes.MinImage(rotAxis, oldMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Spin all nLJTrial except the original coordinates + for (uint lj = nLJTrials; lj-- > 1;) { + double theta = data->prng.rand(M_PI * 2.0); + RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } + } + + for (uint a = 0; a < numAtom; a++) { + //Shift original coordinate back. + multiPosRotions[a].Add(0, center); + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, + oldMol.GetBox(), nLJTrials); } - positions.Set(0, data->axes.WrapPBC(oldMol.AtomPosition(atom), oldMol.GetBox())); - data->calc.ParticleInter(inter, real, positions, atom, molIndex, - oldMol.GetBox(), nLJTrials); for (uint trial = 0; trial < nLJTrials; ++trial) { stepWeight += exp(-1 * data->ff.beta * @@ -120,33 +145,54 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); - oldMol.ConfirmOldAtom(atom); + + for (uint a = 0; a < totAtoms; a++) { + oldMol.ConfirmOldAtom(a); + } } void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) { PRNG& prng = data->prng; - XYZArray& positions = data->positions; - uint nLJTrials = data->nLJTrialsFirst; + uint nLJTrials = data->nLJTrialsNth; double* inter = data->inter; double* real = data->real; double* ljWeights = data->ljWeights; + double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); - if(newMol.COMFix()) { - nLJTrials = 1; - positions.Set(0, data->axes.WrapPBC(newMol.GetCavityCenter(), newMol.GetBox())); - } else { - prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); + //Set up rotation matrix using a0-a3 axis. + XYZ center = newMol.AtomPosition(a0); + XYZ rotAxis = newMol.AtomPosition(a0) - newMol.AtomPosition(a3); + rotAxis = data->axes.MinImage(rotAxis, newMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Go backward to to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + double theta = data->prng.rand(M_PI * 2.0); + RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } } - data->calc.ParticleInter(inter, real, positions, atom, molIndex, - newMol.GetBox(), nLJTrials); - double stepWeight = 0; - for (uint trial = 0; trial < nLJTrials; ++trial) { + for (uint a = 0; a < numAtom; a++) { + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, + newMol.GetBox(), nLJTrials); + } + + for (uint trial = 0; trial < nLJTrials; trial++) { ljWeights[trial] = exp(-1 * data->ff.beta * (inter[trial] + real[trial])); stepWeight += ljWeights[trial]; @@ -155,6 +201,13 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, 0.0)); - newMol.AddAtom(atom, positions[winner]); + + for (uint a = 0; a < numAtom; a++) { + newMol.AddAtom(atoms[a], multiPosRotions[a][winner]); + } + + for (uint a = 0; a < totAtoms; a++) { + newMol.ConfirmOldAtom(a); + } } } diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index 2016dac2f..e74da6c79 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -38,7 +38,7 @@ class DCCrankShaftDih : public DCComponent private: DCData* data; XYZArray *multiPosRotions; - uint a0, a1, a2, a3, numAtom; + uint a0, a1, a2, a3, numAtom, totAtoms; std::vector atoms; }; } From 01ccd37e30748b8d4c1d1b985964db14def105e3 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 6 Jul 2018 18:26:37 -0400 Subject: [PATCH 052/199] Add file to Cmake, fix compiling error. --- CMake/FileLists.cmake | 3 +++ src/cbmc/DCCrankShaftDih.cpp | 9 ++++----- src/cbmc/DCCrankShaftDih.h | 2 ++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 5324d7870..73382c525 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -37,6 +37,7 @@ set(sources src/Simulation.cpp src/StaticVals.cpp src/System.cpp + src/cbmc/DCCrankShaftDih.cpp src/cbmc/DCGraph.cpp src/cbmc/DCFreeHedron.cpp src/cbmc/DCFreeHedronSeed.cpp @@ -62,6 +63,7 @@ set(headers src/ConstField.h src/Coordinates.h src/CoordinateSetup.h + src/CrankShaft.h src/CPUSide.h src/EnergyTypes.h src/EnPartCntSampleOutput.h @@ -124,6 +126,7 @@ set(headers src/Writer.h src/XYZArray.h src/cbmc/DCComponent.h + src/cbmc/DCCrankShaftDih.h src/cbmc/DCData.h src/cbmc/DCFreeHedron.h src/cbmc/DCFreeHedronSeed.h diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 7f0506002..e618cda49 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -6,7 +6,6 @@ along with this program, also can be found at . ********************************************************************************/ #include "DCCrankShaftDih.h" #include "TrialMol.h" -#include "DCData.h" #include "PRNG.h" #include "MolSetup.h" #include "Forcefield.h" @@ -75,8 +74,8 @@ void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { //Unwrap the coordinates with respect to a0. - XYZ coord = data->axes.UnwrapPBC(oldMol.AtomPosition(atoms[i]), - oldMol.GetBox(), center); + XYZ temp = oldMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); //Shift the atoms to origin coord -= center; multiPosRotions[i].Set(0, coord); @@ -88,8 +87,8 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { //Unwrap the coordinates with respect to a0. - XYZ coord = data->axes.UnwrapPBC(newMol.AtomPosition(atoms[i]), - newMol.GetBox(), center); + XYZ temp = newMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); //Shift the atoms to origin coord -= center; multiPosRotions[i].Set(0, coord); diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index e74da6c79..a47ed71af 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -8,8 +8,10 @@ along with this program, also can be found at . #define DCCRANKSHAFT_H #include "DCComponent.h" +#include "DCData.h" #include "BasicTypes.h" #include "TransformMatrix.h" +#include namespace mol_setup { From 4ad62fa9fd1af53cc7aa4937f613082aef214696 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 8 Jul 2018 20:02:59 -0400 Subject: [PATCH 053/199] Read CrankShaftFreq tag, set up the calling function to perform the move --- src/ConfigSetup.cpp | 23 +++++++++++++++++----- src/ConfigSetup.h | 2 +- src/MoveConst.h | 40 ++++++++++++++++++++++---------------- src/StaticVals.cpp | 3 +++ src/System.cpp | 4 ++++ src/cbmc/DCCrankShaftDih.h | 4 ++-- 6 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 2fd84dc0f..00b19cfb3 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -81,6 +81,7 @@ ConfigSetup::ConfigSetup(void) sys.moves.rotate = DBL_MAX; sys.moves.intraSwap = DBL_MAX; sys.moves.regrowth = DBL_MAX; + sys.moves.crankShaft = DBL_MAX; out.state.settings.enable = true; out.restart.settings.enable = true; out.console.enable = true; @@ -400,6 +401,10 @@ void ConfigSetup::Init(const char *fileName) sys.moves.regrowth = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Regrowth move frequency", sys.moves.regrowth); + } else if(line[0] == "CrankShaftFreq") { + sys.moves.crankShaft = stringtod(line[1]); + printf("%-40s %-4.4f \n", "Info: Crank-Shaft move frequency", + sys.moves.crankShaft); } else if(line[0] == "RotFreq") { sys.moves.rotate = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Rotation move frequency", @@ -735,6 +740,12 @@ void ConfigSetup::fillDefaults(void) sys.moves.regrowth); } + if(sys.moves.crankShaft == DBL_MAX) { + sys.moves.crankShaft = 0.000; + printf("%-40s %-4.4f \n", "Default: Crank-Shaft move frequency", + sys.moves.crankShaft); + } + #ifdef VARIABLE_PARTICLE_NUMBER if(sys.moves.memc == DBL_MAX) { @@ -951,7 +962,7 @@ void ConfigSetup::verifyInputs(void) } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.transfer + sys.moves.intraSwap + sys.moves.volume + sys.moves.regrowth + - sys.moves.memc + sys.moves.intraMemc - 1.0) > 0.01) { + sys.moves.memc + sys.moves.intraMemc + sys.moves.crankShaft - 1.0) > 0.001) { std::cout << "Error: Sum of move frequncies are not equal to one!\n"; exit(EXIT_FAILURE); } @@ -961,7 +972,8 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.volume + sys.moves.regrowth + sys.moves.intraMemc - 1.0) > 0.01) { + sys.moves.volume + sys.moves.regrowth + sys.moves.intraMemc + + sys.moves.crankShaft - 1.0) > 0.001) { std::cout << "Error: Sum of move frequncies are not equal to one!\n"; exit(EXIT_FAILURE); } @@ -972,14 +984,15 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.transfer + sys.moves.regrowth + sys.moves.memc - + sys.moves.intraMemc - 1.0) > 0.01) { + sys.moves.transfer + sys.moves.regrowth + sys.moves.memc + + sys.moves.intraMemc + sys.moves.crankShaft - 1.0) > 0.001) { std::cout << "Error: Sum of move frequncies are not equal to one!!\n"; exit(EXIT_FAILURE); } #else if(abs(sys.moves.displace + sys.moves.rotate + sys.moves.intraSwap + - sys.moves.regrowth + sys.moves.intraMemc - 1.0) > 0.01) { + sys.moves.regrowth + sys.moves.intraMemc + sys.moves.crankShaft - + 1.0) > 0.001) { std::cout << "Error: Sum of move frequncies are not equal to one!!\n"; exit(EXIT_FAILURE); } diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index d6bba15f9..dbfe71675 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -155,7 +155,7 @@ struct Step { //Holds the percentage of each kind of move for this ensemble. struct MovePercents { - double displace, rotate, intraSwap, intraMemc, regrowth; + double displace, rotate, intraSwap, intraMemc, regrowth, crankShaft; #ifdef VARIABLE_VOLUME double volume; #endif diff --git a/src/MoveConst.h b/src/MoveConst.h index 44ca0f947..b86ac84ad 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -32,28 +32,32 @@ const uint ROTATE = 1; const uint INTRA_SWAP = 2; const uint REGROWTH = 3; const uint INTRA_MEMC = 4; -const uint MOVE_KINDS_TOTAL = 5; +const uint CRANKSHAFT = 5; +const uint MOVE_KINDS_TOTAL = 6; #elif ENSEMBLE == GCMC const uint INTRA_SWAP = 2; const uint REGROWTH = 3; const uint INTRA_MEMC = 4; -const uint MEMC = 5; -const uint MOL_TRANSFER = 6; -const uint MOVE_KINDS_TOTAL = 7; +const uint CRANKSHAFT = 5; +const uint MEMC = 6; +const uint MOL_TRANSFER = 7; +const uint MOVE_KINDS_TOTAL = 8; #elif ENSEMBLE == GEMC const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; const uint REGROWTH = 4; const uint INTRA_MEMC = 5; -const uint MEMC = 6; -const uint MOL_TRANSFER = 7; -const uint MOVE_KINDS_TOTAL = 8; +const uint CRANKSHAFT = 6; +const uint MEMC = 7; +const uint MOL_TRANSFER = 8; +const uint MOVE_KINDS_TOTAL = 9; #elif ENSEMBLE == NPT const uint VOL_TRANSFER = 2; const uint INTRA_SWAP = 3; const uint REGROWTH = 4; const uint INTRA_MEMC = 5; -const uint MOVE_KINDS_TOTAL = 6; +const uint CRANKSHAFT = 6; +const uint MOVE_KINDS_TOTAL = 7; #endif const uint BOX0 = 0; @@ -109,11 +113,11 @@ const uint IT_KINDS_TOTAL = 2; ////////////////////////////////////////////////////////// //NVT : 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) 5. IntraMEMC (box 0) +// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. CrankShaft (box 0) // //GCMC: 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. MEMC (box 0) -// 7. Deletion (box 0) 8. Insertion (box 0) +// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. CrankShaft (box 0) +// 7. MEMC (box 0) 8. Deletion (box 0) 9. Insertion (box 0) // //GEMC: 1. Disp (box 0) 2. Disp (box 1) // 3. Rotate (box 0) 4. Rotate (box 1) @@ -121,23 +125,25 @@ const uint IT_KINDS_TOTAL = 2; // 7. IntraSwap (box 0) 8. IntraSwap (box 1) // 9. Regrowth (box 0) 10. Regrowth (box 1) // 11. IntraMEMC (box 0) 12. IntraMEMC (box 1) -// 13. MEMC (box 0) 14. MEMC (box 1) -// 15. Mol Trans (b0->b1), 16. Mol Trans (b1->b0) +// 13. CrankShaft (box 0) 14. CrankShaft (box 1) +// 15. MEMC (box 0) 16. MEMC (box 1) +// 17. Mol Trans (b0->b1), 18. Mol Trans (b1->b0) // //NPT : 1. Disp (box 0) 2. Rotate (box 0) 3. Vol. (box 0) // 4. IntraSwap (box 0) 5. Regrowth (box 0) 6. IntraMEMC (box 0) +// 7. CrankShaft (box 0) #if ENSEMBLE == NVT -const uint COUNT = 5; +const uint COUNT = 6; const uint SCALEABLE = 2; #elif ENSEMBLE == GCMC -const uint COUNT = 8; +const uint COUNT = 9; const uint SCALEABLE = 2; #elif ENSEMBLE == GEMC -const uint COUNT = 16; +const uint COUNT = 18; const uint SCALEABLE = 6; #elif ENSEMBLE == NPT -const uint COUNT = 6; +const uint COUNT = 7; const uint SCALEABLE = 3; #endif diff --git a/src/StaticVals.cpp b/src/StaticVals.cpp index 0c2fd8d6f..47c9b7316 100644 --- a/src/StaticVals.cpp +++ b/src/StaticVals.cpp @@ -58,6 +58,9 @@ void StaticVals::InitMovePercents(config_setup::MovePercents const& perc) case mv::INTRA_MEMC: movePerc[m] = perc.intraMemc; break; + case mv::CRANKSHAFT: + movePerc[m] = perc.crankShaft; + break; #ifdef VARIABLE_VOLUME case mv::VOL_TRANSFER : movePerc[m] = perc.volume; diff --git a/src/System.cpp b/src/System.cpp index 6ab4cee75..c18c16446 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -27,6 +27,7 @@ along with this program, also can be found at . #include "IntraMoleculeExchange1.h" #include "IntraMoleculeExchange2.h" #include "IntraMoleculeExchange3.h" +#include "CrankShaft.h" System::System(StaticVals& statics) : statV(statics), @@ -62,6 +63,7 @@ System::~System() delete moves[mv::INTRA_SWAP]; delete moves[mv::REGROWTH]; delete moves[mv::INTRA_MEMC]; + delete moves[mv::CRANKSHAFT]; #if ENSEMBLE == GEMC || ENSEMBLE == NPT delete moves[mv::VOL_TRANSFER]; #endif @@ -124,6 +126,7 @@ void System::InitMoves(Setup const& set) moves[mv::ROTATE] = new Rotate(*this, statV); moves[mv::INTRA_SWAP] = new IntraSwap(*this, statV); moves[mv::REGROWTH] = new Regrowth(*this, statV); + moves[mv::CRANKSHAFT] = new CrankShaft(*this, statV); if(set.config.sys.intraMemcVal.MEMC1) { moves[mv::INTRA_MEMC] = new IntraMoleculeExchange1(*this, statV); } else if (set.config.sys.intraMemcVal.MEMC2) { @@ -209,6 +212,7 @@ void System::PrintTime() printf("%-30s %10.4f sec.\n", "Intra-Swap:", moveTime[mv::INTRA_SWAP]); printf("%-30s %10.4f sec.\n", "Regrowth:", moveTime[mv::REGROWTH]); printf("%-30s %10.4f sec.\n", "Intra-MEMC:", moveTime[mv::INTRA_MEMC]); + printf("%-30s %10.4f sec.\n", "Crank-Shaft:", moveTime[mv::CRANKSHAFT]); #if ENSEMBLE == GEMC || ENSEMBLE == GCMC printf("%-30s %10.4f sec.\n", "Molecule-Transfer:", diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index a47ed71af..ab85260ed 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -4,8 +4,8 @@ Copyright (C) 2018 GOMC Group A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ -#ifndef DCCRANKSHAFT_H -#define DCCRANKSHAFT_H +#ifndef DCCRANKSHAFTDIH_H +#define DCCRANKSHAFTDIH_H #include "DCComponent.h" #include "DCData.h" From 0fa47c4e8311d43335d5ffa33d34fb3d429f45a6 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 8 Jul 2018 20:08:38 -0400 Subject: [PATCH 054/199] Print crank shaft acceptance in console output. --- src/ConsoleOutput.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index c27d97295..51cf1c43b 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -119,6 +119,11 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const printElement(var->GetAccepted(sub), elementWidth); printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::GetMoveSubIndex(mv::CRANKSHAFT, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + #if ENSEMBLE == GCMC } #endif @@ -303,6 +308,10 @@ void ConsoleOutput::PrintMoveTitle() printElement("INTMOLEXCACCEPT", elementWidth); printElement("INTMOLEXACCEPT%", elementWidth); + printElement("CRANKSHAFT", elementWidth); + printElement("CRSHAFTACCEPT", elementWidth); + printElement("CRSHAFTACCEPT%", elementWidth); + #if ENSEMBLE == GEMC || ENSEMBLE == GCMC printElement("TRANSFER", elementWidth); printElement("TRANACCEPT", elementWidth); From 7fb87fc0ca832254f047d9908ded78587c0e2271 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 8 Jul 2018 20:40:55 -0400 Subject: [PATCH 055/199] Fix debug printing information --- src/Simulation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulation.cpp b/src/Simulation.cpp index cd363133c..327e79212 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -87,7 +87,7 @@ void Simulation::RunningCheck(const uint step) << std::endl << "-------------------------" << std::endl << " STEP: " << step + 1 << std::endl << "-------------------------" << std::endl - << "Energy INTRA B | INTRA NB | INTER | TC | REAL | SELF | CORRECTION | RECIP" + << "Energy INTRA B | INTRA NB | INTER | TC | REAL | SELF | CORRECTION | RECIP" << std::endl << "System: " << std::setw(12) << system->potential.totalEnergy.intraBond << " | " From ae7ce23a9cabb5767b31e48f356529d42d231e15 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 8 Jul 2018 21:14:30 -0400 Subject: [PATCH 056/199] Fix intra-nonbonded energy calculation. Remove the constrain that start atom a0, and end atom a3 in dihedral must be a node. Only one of them is enough to be node. --- src/CalculateEnergy.cpp | 106 ++++++++++++++++++++++++++++++++++++++-- src/CalculateEnergy.h | 17 ++++++- src/cbmc/DCGraph.cpp | 8 +-- 3 files changed, 121 insertions(+), 10 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index df85b85cd..51741fb57 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -632,13 +632,13 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, // *2 because we'll be storing inverse bond vectors XYZArray bondVec(molKind.bondList.count * 2); - BondVectors(bondVec, mol.GetCoords(), molKind, molIndex, box); + BondVectors(bondVec, mol.GetCoords(), molKind, box); MolBond(bondEn, molKind, bondVec, box); MolAngle(bondEn, molKind, bondVec, box); MolDihedral(bondEn, molKind, bondVec, box); - MolNonbond(intraNonbondEn, molKind, molIndex, box); - MolNonbond_1_4(intraNonbondEn, molKind, molIndex, box); - MolNonbond_1_3(intraNonbondEn, molKind, molIndex, box); + MolNonbond(intraNonbondEn, mol.GetCoords(), molKind, box); + MolNonbond_1_4(intraNonbondEn, mol.GetCoords(), molKind, box); + MolNonbond_1_3(intraNonbondEn, mol.GetCoords(), molKind, box); mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); } @@ -661,7 +661,6 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, void CalculateEnergy::BondVectors(XYZArray & vecs, XYZArray const& pos, MoleculeKind const& molKind, - const uint molIndex, const uint box) const { for (uint i = 0; i < molKind.bondList.count; ++i) { @@ -755,6 +754,39 @@ void CalculateEnergy::MolNonbond(double & energy, } +// Calculate 1-N nonbonded intra energy uisng pos +void CalculateEnergy::MolNonbond(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded.count; ++i) { + uint p1 = molKind.nonBonded.part1[i]; + uint p2 = molKind.nonBonded.part2[i]; + + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind + (molKind.nonBonded.part1[i]), + molKind.AtomKind + (molKind.nonBonded.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded.part1[i]) * + molKind.AtomCharge(molKind.nonBonded.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, true); + } + } + } + +} + // Calculate 1-4 nonbonded intra energy void CalculateEnergy::MolNonbond_1_4(double & energy, MoleculeKind const& molKind, @@ -788,6 +820,38 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, } } +// Calculate 1-4 nonbonded intra energy using pos +void CalculateEnergy::MolNonbond_1_4(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded_1_4.count; ++i) { + uint p1 = molKind.nonBonded_1_4.part1[i]; + uint p2 = molKind.nonBonded_1_4.part2[i]; + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + molKind.AtomKind + (molKind.nonBonded_1_4.part1[i]), + molKind.AtomKind + (molKind.nonBonded_1_4.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded_1_4.part1[i]) * + molKind.AtomCharge(molKind.nonBonded_1_4.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } + } + } +} + // Calculate 1-3 nonbonded intra energy void CalculateEnergy::MolNonbond_1_3(double & energy, MoleculeKind const& molKind, @@ -821,6 +885,38 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, } } +// Calculate 1-3 nonbonded intra energy +void CalculateEnergy::MolNonbond_1_3(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded_1_3.count; ++i) { + uint p1 = molKind.nonBonded_1_3.part1[i]; + uint p2 = molKind.nonBonded_1_3.part2[i]; + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + molKind.AtomKind + (molKind.nonBonded_1_3.part1[i]), + molKind.AtomKind + (molKind.nonBonded_1_3.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded_1_3.part1[i]) * + molKind.AtomCharge(molKind.nonBonded_1_3.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } + } + } +} + // Calculate 1-3 nonbonded intra energy double CalculateEnergy::IntraEnergy_1_3(const double distSq, const uint atom1, const uint atom2, const uint molIndex) const diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index cc9a473a2..f38ed7057 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -174,7 +174,6 @@ class CalculateEnergy //! Calculates bond vectors using pos, stores them in vecs void BondVectors(XYZArray & vecs, XYZArray const& pos, MoleculeKind const& molKind, - const uint molIndex, const uint box) const; //! Calculates bond stretch intramolecular energy of a full molecule @@ -201,12 +200,22 @@ class CalculateEnergy const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_N intramolecule energy of a full molecule using pos + void MolNonbond(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule void MolNonbond_1_4(double & energy, MoleculeKind const& molKind, const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule using pos + void MolNonbond_1_4(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule //for Martini forcefield void MolNonbond_1_3(double & energy, @@ -214,6 +223,12 @@ class CalculateEnergy const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule using pos + //for Martini forcefield + void MolNonbond_1_3(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! For particles in main coordinates array determines if they belong //! to same molecule, using internal arrays. bool SameMolecule(const uint p1, const uint p2) const diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index f323f8b6e..229dfdca6 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -104,11 +104,11 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) uint a2 = dihs.back().a2; uint a1 = dihs.back().a1; //Check if the a3 is a node or not - for(uint n = 0; n < tempNodes.size(); n++) { - if(tempNodes[n].atomIndex == a3) { + //for(uint n = 0; n < tempNodes.size(); n++) { + // if(tempNodes[n].atomIndex == a3) { shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); - } - } + // } + // } dihs.pop_back(); } tempNodes.pop_back(); From d80724deff8c2babc40ce14a5c8f59dbb3016dda Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 8 Jul 2018 22:52:51 -0400 Subject: [PATCH 057/199] Avoid duplicating number of dihedral count. If number of nodes <= 2, we perfomr Regrowth move. --- src/cbmc/DCGraph.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 229dfdca6..f5861ff2b 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -93,6 +93,7 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) using namespace mol_setup; using namespace std; vector tempNodes = nodes; + vector visited(kind.atoms.size(), false); while(!tempNodes.empty()) { //start from last node, find the atom index of the node uint a0 = tempNodes.back().atomIndex; @@ -106,7 +107,13 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) //Check if the a3 is a node or not //for(uint n = 0; n < tempNodes.size(); n++) { // if(tempNodes[n].atomIndex == a3) { + if(!(visited[a0] && visited[a1] && visited[a2] && visited[a3])) { shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + visited[a0] = true; + visited[a1] = true; + visited[a2] = true; + visited[a3] = true; + } // } // } dihs.pop_back(); @@ -117,7 +124,7 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { - if(nodes.size() < 4) { + if(shaftNodesDih.size() == 0) { //No crank shaft move for molecule with less than 4 nodes. //Instead we perform Regrowth move within the same box Regrowth(oldMol, newMol, molIndex); From 2d5f4d2b82c7eba216f283fefb225d1e5ea03b9e Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 9 Jul 2018 13:15:37 -0400 Subject: [PATCH 058/199] Be able to perform rotation around atoms that form angles. NOt completed. --- src/cbmc/DCCrankShaftAng.cpp | 212 +++++++++++++++++++++++++++++++++++ src/cbmc/DCCrankShaftAng.h | 47 ++++++++ 2 files changed, 259 insertions(+) create mode 100644 src/cbmc/DCCrankShaftAng.cpp create mode 100644 src/cbmc/DCCrankShaftAng.h diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp new file mode 100644 index 000000000..e618cda49 --- /dev/null +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -0,0 +1,212 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include "DCCrankShaftDih.h" +#include "TrialMol.h" +#include "PRNG.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "NumLib.h" +#include "CalculateEnergy.h" +#include "XYZArray.h" +#include +#include + +namespace cbmc +{ + struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) { + return (b.a1 == x); + } + uint x; +}; + +DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2, uint a3) : + data(data), a0(a0), a1(a1), a2(a2), a3(a3) +{ + using namespace mol_setup; + using namespace std; + vector visited(kind.atoms.size(), false); + totAtoms = kind.atoms.size(); + //Find all the atoms that bonds with atoms a1 + vector bonds = AtomBonds(kind, a1); + //Remove the a0-a1 bond + bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a0)), bonds.end()); + + //Loop through atoms that are bonded to a1 + for(uint b = 0; b < bonds.size(); b++) { + //Store the atom index if it doesnot exist + if(!visited[bonds[b].a0]) { + atoms.push_back(bonds[b].a0); + visited[bonds[b].a0] = true; + } + + vector temp = AtomBonds(kind, bonds[b].a1); + //Remove a2-a3 bonds + temp.erase(remove_if(temp.begin(), temp.end(), FindA1(a3)), temp.end()); + for(uint i = 0; i < temp.size(); i++) { + if(!visited[temp[i].a0]) { + bonds.push_back(temp[i]); + } + } + } + + numAtom = atoms.size(); + + multiPosRotions = new XYZArray[numAtom]; + for(uint i = 0; i < numAtom; ++i) { + multiPosRotions[i] = XYZArray(data->nLJTrialsNth); + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } +} + +void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + XYZ center = oldMol.AtomPosition(a0); + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ temp = oldMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); + } +} + +void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) +{ + XYZ center = newMol.AtomPosition(a0); + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ temp = newMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); + } +} + + +void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) +{ + PRNG& prng = data->prng; + uint nLJTrials = data->nLJTrialsNth; + double* inter = data->inter; + double* real = data->real; + double stepWeight = 0; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + + //Set up rotation matrix using a0-a3 axis. + XYZ center = oldMol.AtomPosition(a0); + XYZ rotAxis = oldMol.AtomPosition(a0) - oldMol.AtomPosition(a3); + rotAxis = data->axes.MinImage(rotAxis, oldMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Spin all nLJTrial except the original coordinates + for (uint lj = nLJTrials; lj-- > 1;) { + double theta = data->prng.rand(M_PI * 2.0); + RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } + } + + for (uint a = 0; a < numAtom; a++) { + //Shift original coordinate back. + multiPosRotions[a].Add(0, center); + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, + oldMol.GetBox(), nLJTrials); + } + + for (uint trial = 0; trial < nLJTrials; ++trial) { + stepWeight += exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + } + oldMol.MultWeight(stepWeight / nLJTrials); + oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], + 0.0, 0.0, 0.0)); + + for (uint a = 0; a < totAtoms; a++) { + oldMol.ConfirmOldAtom(a); + } +} + +void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) +{ + PRNG& prng = data->prng; + uint nLJTrials = data->nLJTrialsNth; + double* inter = data->inter; + double* real = data->real; + double* ljWeights = data->ljWeights; + double stepWeight = 0; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + + //Set up rotation matrix using a0-a3 axis. + XYZ center = newMol.AtomPosition(a0); + XYZ rotAxis = newMol.AtomPosition(a0) - newMol.AtomPosition(a3); + rotAxis = data->axes.MinImage(rotAxis, newMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Go backward to to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + double theta = data->prng.rand(M_PI * 2.0); + RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } + } + + for (uint a = 0; a < numAtom; a++) { + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, + newMol.GetBox(), nLJTrials); + } + + for (uint trial = 0; trial < nLJTrials; trial++) { + ljWeights[trial] = exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + stepWeight += ljWeights[trial]; + } + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.MultWeight(stepWeight / nLJTrials); + newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], + 0.0, 0.0, 0.0)); + + for (uint a = 0; a < numAtom; a++) { + newMol.AddAtom(atoms[a], multiPosRotions[a][winner]); + } + + for (uint a = 0; a < totAtoms; a++) { + newMol.ConfirmOldAtom(a); + } +} +} diff --git a/src/cbmc/DCCrankShaftAng.h b/src/cbmc/DCCrankShaftAng.h new file mode 100644 index 000000000..ab85260ed --- /dev/null +++ b/src/cbmc/DCCrankShaftAng.h @@ -0,0 +1,47 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCCRANKSHAFTDIH_H +#define DCCRANKSHAFTDIH_H + +#include "DCComponent.h" +#include "DCData.h" +#include "BasicTypes.h" +#include "TransformMatrix.h" +#include + +namespace mol_setup +{ + class MolKind; +} + +namespace cbmc +{ +class DCCrankShaftDih; + +class DCCrankShaftDih : public DCComponent +{ +public: + DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2, uint a3); + ~DCCrankShaftDih() {delete[] multiPosRotions;} + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + DCComponent* Clone() + { + return new DCCrankShaftDih(*this); + } + +private: + DCData* data; + XYZArray *multiPosRotions; + uint a0, a1, a2, a3, numAtom, totAtoms; + std::vector atoms; +}; +} +#endif From 4d17944f8c2e43c285d551f5e04d7c331b0979df Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 9 Jul 2018 13:16:11 -0400 Subject: [PATCH 059/199] Be able to perform rotation around atoms that form angles. NOt completed. --- CMake/FileLists.cmake | 2 + src/cbmc/DCCrankShaftAng.cpp | 22 +++++------ src/cbmc/DCCrankShaftAng.h | 18 ++++----- src/cbmc/DCGraph.cpp | 72 ++++++++++++++++++++++++++---------- src/cbmc/DCGraph.h | 2 +- 5 files changed, 75 insertions(+), 41 deletions(-) diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 73382c525..d6b3483bc 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -37,6 +37,7 @@ set(sources src/Simulation.cpp src/StaticVals.cpp src/System.cpp + src/cbmc/DCCrankShaftAng.cpp src/cbmc/DCCrankShaftDih.cpp src/cbmc/DCGraph.cpp src/cbmc/DCFreeHedron.cpp @@ -126,6 +127,7 @@ set(headers src/Writer.h src/XYZArray.h src/cbmc/DCComponent.h + src/cbmc/DCCrankShaftAng.h src/cbmc/DCCrankShaftDih.h src/cbmc/DCData.h src/cbmc/DCFreeHedron.h diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index e618cda49..35061f172 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -4,7 +4,7 @@ Copyright (C) 2018 GOMC Group A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ -#include "DCCrankShaftDih.h" +#include "DCCrankShaftAng.h" #include "TrialMol.h" #include "PRNG.h" #include "MolSetup.h" @@ -25,9 +25,9 @@ namespace cbmc uint x; }; -DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, - uint a0, uint a1, uint a2, uint a3) : - data(data), a0(a0), a1(a1), a2(a2), a3(a3) +DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2) : + data(data), a0(a0), a1(a1), a2(a2) { using namespace mol_setup; using namespace std; @@ -48,7 +48,7 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, vector temp = AtomBonds(kind, bonds[b].a1); //Remove a2-a3 bonds - temp.erase(remove_if(temp.begin(), temp.end(), FindA1(a3)), temp.end()); + temp.erase(remove_if(temp.begin(), temp.end(), FindA1(a1)), temp.end()); for(uint i = 0; i < temp.size(); i++) { if(!visited[temp[i].a0]) { bonds.push_back(temp[i]); @@ -69,7 +69,7 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, } } -void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) +void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) { XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { @@ -82,7 +82,7 @@ void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) } } -void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) +void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) { XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { @@ -96,7 +96,7 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) } -void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) +void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; @@ -109,7 +109,7 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); - XYZ rotAxis = oldMol.AtomPosition(a0) - oldMol.AtomPosition(a3); + XYZ rotAxis = oldMol.AtomPosition(a0) - oldMol.AtomPosition(a2); rotAxis = data->axes.MinImage(rotAxis, oldMol.GetBox()); rotAxis.Normalize(); RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); @@ -150,7 +150,7 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) } } -void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) +void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; @@ -165,7 +165,7 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) //Set up rotation matrix using a0-a3 axis. XYZ center = newMol.AtomPosition(a0); - XYZ rotAxis = newMol.AtomPosition(a0) - newMol.AtomPosition(a3); + XYZ rotAxis = newMol.AtomPosition(a0) - newMol.AtomPosition(a2); rotAxis = data->axes.MinImage(rotAxis, newMol.GetBox()); rotAxis.Normalize(); RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); diff --git a/src/cbmc/DCCrankShaftAng.h b/src/cbmc/DCCrankShaftAng.h index ab85260ed..159a8ce2f 100644 --- a/src/cbmc/DCCrankShaftAng.h +++ b/src/cbmc/DCCrankShaftAng.h @@ -4,8 +4,8 @@ Copyright (C) 2018 GOMC Group A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ -#ifndef DCCRANKSHAFTDIH_H -#define DCCRANKSHAFTDIH_H +#ifndef DCCRANKSHAFTANG_H +#define DCCRANKSHAFTANG_H #include "DCComponent.h" #include "DCData.h" @@ -20,27 +20,27 @@ namespace mol_setup namespace cbmc { -class DCCrankShaftDih; +class DCCrankShaftAng; -class DCCrankShaftDih : public DCComponent +class DCCrankShaftAng : public DCComponent { public: - DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, - uint a0, uint a1, uint a2, uint a3); - ~DCCrankShaftDih() {delete[] multiPosRotions;} + DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2); + ~DCCrankShaftAng() {delete[] multiPosRotions;} void PrepareNew(TrialMol& newMol, uint molIndex); void PrepareOld(TrialMol& oldMol, uint molIndex); void BuildOld(TrialMol& oldMol, uint molIndex); void BuildNew(TrialMol& newMol, uint molIndex); DCComponent* Clone() { - return new DCCrankShaftDih(*this); + return new DCCrankShaftAng(*this); } private: DCData* data; XYZArray *multiPosRotions; - uint a0, a1, a2, a3, numAtom, totAtoms; + uint a0, a1, a2, numAtom, totAtoms; std::vector atoms; }; } diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index f5861ff2b..d524d30a3 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -10,6 +10,7 @@ along with this program, also can be found at . #include "DCFreeHedronSeed.h" #include "DCRotateCOM.h" #include "DCCrankShaftDih.h" +#include "DCCrankShaftAng.h" #include #include @@ -94,6 +95,7 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) using namespace std; vector tempNodes = nodes; vector visited(kind.atoms.size(), false); + //Start with atoms that form dihedral while(!tempNodes.empty()) { //start from last node, find the atom index of the node uint a0 = tempNodes.back().atomIndex; @@ -101,41 +103,71 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) vector dihs = AtomEndDihs(kind, a0); while(!dihs.empty()) { //find the last atomindex in the dihedral - uint a3 = dihs.back().a3; - uint a2 = dihs.back().a2; uint a1 = dihs.back().a1; - //Check if the a3 is a node or not - //for(uint n = 0; n < tempNodes.size(); n++) { - // if(tempNodes[n].atomIndex == a3) { - if(!(visited[a0] && visited[a1] && visited[a2] && visited[a3])) { - shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); - visited[a0] = true; - visited[a1] = true; - visited[a2] = true; - visited[a3] = true; - } - // } - // } + uint a2 = dihs.back().a2; + uint a3 = dihs.back().a3; + + if(!(visited[a0] && visited[a1] && visited[a2] && visited[a3])) { + shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + visited[a0] = true; + visited[a1] = true; + visited[a2] = true; + visited[a3] = true; + } dihs.pop_back(); } tempNodes.pop_back(); } + + //Continue with the atoms that form angles. + tempNodes = nodes; + visited.assign(kind.atoms.size(), false); + while(!tempNodes.empty()) { + //start from last node, find the atom index of the node + uint a0 = tempNodes.back().atomIndex; + //Find the angle that end with a0 + vector angles = AtomEndAngles(kind, a0); + while(!angles.empty()) { + //find the last atomindex in the dihedral + uint a1 = angles.back().a1; + uint a2 = angles.back().a2; + + if(!(visited[a0] && visited[a1] && visited[a2])) { + shaftNodesAng.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + visited[a0] = true; + visited[a1] = true; + visited[a2] = true; + } + angles.pop_back(); + } + tempNodes.pop_back(); + } + + if(shaftNodesDih.size() == 0) { + if(shaftNodesAng.size() != 0) { + shaftNodesDih = shaftNodesAng; + } + } + } void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { - if(shaftNodesDih.size() == 0) { + if(shaftNodesAng.size() == 0) { //No crank shaft move for molecule with less than 4 nodes. //Instead we perform Regrowth move within the same box Regrowth(oldMol, newMol, molIndex); } else { + //Decide to perform rotation around two atoms that form angle or dihedral + // std::vector& shaftNodes = data.prng.randInt(1) ? shaftNodesDih : shaftNodesAng; + std::vector& shaftNodes = shaftNodesAng; //Pick a random node pair - uint pick = data.prng.randIntExc(shaftNodesDih.size()); + uint pick = data.prng.randIntExc(shaftNodes.size()); //Call DCCrankShaftDih and rotate a1 and a2 nodes around a0-a3 shaft - shaftNodesDih[pick]->PrepareNew(newMol, molIndex); - shaftNodesDih[pick]->BuildNew(newMol, molIndex); - shaftNodesDih[pick]->PrepareOld(oldMol, molIndex); - shaftNodesDih[pick]->BuildOld(oldMol, molIndex); + shaftNodes[pick]->PrepareNew(newMol, molIndex); + shaftNodes[pick]->BuildNew(newMol, molIndex); + shaftNodes[pick]->PrepareOld(oldMol, molIndex); + shaftNodes[pick]->BuildOld(oldMol, molIndex); } } diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index ae4b3b119..bbc57ab51 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -74,7 +74,7 @@ class DCGraph : public CBMC std::vector nodes; std::vector fringe; std::vector visited; - std::vector shaftNodesDih; + std::vector shaftNodesDih, shaftNodesAng; }; } From 6f78b4d26826cbd949dbd63fdc5012a6afd4e8b3 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 9 Jul 2018 15:08:33 -0400 Subject: [PATCH 060/199] Fix to crankshaft move when we rotate around angles --- src/ConfigSetup.cpp | 5 +++-- src/MoveConst.h | 2 +- src/cbmc/DCCrankShaftAng.cpp | 10 ++++++---- src/cbmc/DCGraph.cpp | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 00b19cfb3..0ae9cfd79 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -82,6 +82,8 @@ ConfigSetup::ConfigSetup(void) sys.moves.intraSwap = DBL_MAX; sys.moves.regrowth = DBL_MAX; sys.moves.crankShaft = DBL_MAX; + sys.moves.memc = DBL_MAX; + sys.moves.intraMemc = DBL_MAX; out.state.settings.enable = true; out.restart.settings.enable = true; out.console.enable = true; @@ -727,8 +729,7 @@ void ConfigSetup::fillDefaults(void) sys.moves.intraSwap); } - if(sys.moves.intraMemc == DBL_MAX) - { + if(sys.moves.intraMemc == DBL_MAX) { sys.moves.intraMemc = 0.0; printf("%-40s %-4.4f \n", "Default: Intra-MEMC move frequency", sys.moves.intraMemc); diff --git a/src/MoveConst.h b/src/MoveConst.h index b86ac84ad..3c97ec821 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -116,7 +116,7 @@ const uint IT_KINDS_TOTAL = 2; // 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. CrankShaft (box 0) // //GCMC: 1. Disp (box 0) 2. Rotate (box 0) 3. IntraSwap (box 0) -// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. CrankShaft (box 0) +// 4. Regrowth (box 0) 5. IntraMEMC (box 0) 6. CrankShaft (box 0) // 7. MEMC (box 0) 8. Deletion (box 0) 9. Insertion (box 0) // //GEMC: 1. Disp (box 0) 2. Disp (box 1) diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 35061f172..d94f9e5a4 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -35,10 +35,14 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, totAtoms = kind.atoms.size(); //Find all the atoms that bonds with atoms a1 vector bonds = AtomBonds(kind, a1); - //Remove the a0-a1 bond + //Remove the a0-a1 and a1-a2 bond bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a0)), bonds.end()); + bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a2)), bonds.end()); + //Store the a1 index + atoms.push_back(a1); + visited[a1] = true; - //Loop through atoms that are bonded to a1 + //Loop through other atoms that are bonded to a1 for(uint b = 0; b < bonds.size(); b++) { //Store the atom index if it doesnot exist if(!visited[bonds[b].a0]) { @@ -47,8 +51,6 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, } vector temp = AtomBonds(kind, bonds[b].a1); - //Remove a2-a3 bonds - temp.erase(remove_if(temp.begin(), temp.end(), FindA1(a1)), temp.end()); for(uint i = 0; i < temp.size(); i++) { if(!visited[temp[i].a0]) { bonds.push_back(temp[i]); diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index d524d30a3..e8d85854e 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -159,8 +159,8 @@ void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) Regrowth(oldMol, newMol, molIndex); } else { //Decide to perform rotation around two atoms that form angle or dihedral - // std::vector& shaftNodes = data.prng.randInt(1) ? shaftNodesDih : shaftNodesAng; - std::vector& shaftNodes = shaftNodesAng; + std::vector& shaftNodes = data.prng.randInt(1) ? + shaftNodesDih : shaftNodesAng; //Pick a random node pair uint pick = data.prng.randIntExc(shaftNodes.size()); //Call DCCrankShaftDih and rotate a1 and a2 nodes around a0-a3 shaft From bb93dcfd7afdbf188bf56b9b02ef90835674045a Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 9 Jul 2018 15:41:02 -0400 Subject: [PATCH 061/199] Only print move statistic in console, when we perform them. --- src/ConsoleOutput.cpp | 175 +++++++++++++++++++++++++----------------- src/OutputVars.cpp | 5 ++ src/OutputVars.h | 1 + 3 files changed, 111 insertions(+), 70 deletions(-) diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 51cf1c43b..91bec8ed6 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -92,60 +92,78 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const #if ENSEMBLE == GCMC if(box == mv::BOX0) { #endif - sub = mv::GetMoveSubIndex(mv::DISPLACE, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + if(var->Perfromed(mv::DISPLACE)) { + sub = mv::GetMoveSubIndex(mv::DISPLACE, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + printElement(var->GetScale(sub), elementWidth); + } - sub = mv::GetMoveSubIndex(mv::ROTATE, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + if(var->Perfromed(mv::ROTATE)) { + sub = mv::GetMoveSubIndex(mv::ROTATE, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + printElement(var->GetScale(sub), elementWidth); + } - sub = mv::GetMoveSubIndex(mv::INTRA_SWAP, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + if(var->Perfromed(mv::INTRA_SWAP)) { + sub = mv::GetMoveSubIndex(mv::INTRA_SWAP, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + } - sub = mv::GetMoveSubIndex(mv::REGROWTH, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + if(var->Perfromed(mv::REGROWTH)) { + sub = mv::GetMoveSubIndex(mv::REGROWTH, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + } + + if(var->Perfromed(mv::INTRA_MEMC)) { + sub = mv::GetMoveSubIndex(mv::INTRA_MEMC, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + } + + if(var->Perfromed(mv::CRANKSHAFT)) { + sub = mv::GetMoveSubIndex(mv::CRANKSHAFT, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + } - sub = mv::GetMoveSubIndex(mv::INTRA_MEMC, box); +#if ENSEMBLE == GCMC + } +#endif + +#if ENSEMBLE == GEMC || ENSEMBLE == GCMC + if(var->Perfromed(mv::MOL_TRANSFER)) { + sub = mv::GetMoveSubIndex(mv::MOL_TRANSFER, box); printElement(var->GetTries(sub), elementWidth); printElement(var->GetAccepted(sub), elementWidth); printElement(var->GetAcceptPercent(sub), elementWidth); + } - sub = mv::GetMoveSubIndex(mv::CRANKSHAFT, box); + if(var->Perfromed(mv::MEMC)) { + sub = mv::GetMoveSubIndex(mv::MEMC, box); printElement(var->GetTries(sub), elementWidth); printElement(var->GetAccepted(sub), elementWidth); printElement(var->GetAcceptPercent(sub), elementWidth); - -#if ENSEMBLE == GCMC } #endif -#if ENSEMBLE == GEMC || ENSEMBLE == GCMC - sub = mv::GetMoveSubIndex(mv::MOL_TRANSFER, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - - sub = mv::GetMoveSubIndex(mv::MEMC, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); -#endif - #if ENSEMBLE == GEMC || ENSEMBLE == NPT - sub = mv::GetMoveSubIndex(mv::VOL_TRANSFER, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + if(var->Perfromed(mv::VOL_TRANSFER)) { + sub = mv::GetMoveSubIndex(mv::VOL_TRANSFER, box); + printElement(var->GetTries(sub), elementWidth); + printElement(var->GetAccepted(sub), elementWidth); + printElement(var->GetAcceptPercent(sub), elementWidth); + printElement(var->GetScale(sub), elementWidth); + } #endif std::cout << std::endl; @@ -285,48 +303,65 @@ void ConsoleOutput::PrintMoveTitle() std::string title = "MTITLE:"; title += " STEP"; printElement(title, elementWidth); + if(var->Perfromed(mv::DISPLACE)) { + printElement("DISTRY", elementWidth); + printElement("DISACCEPT", elementWidth); + printElement("DISACCEPT%", elementWidth); + printElement("DISMAX", elementWidth); + } - printElement("DISTRY", elementWidth); - printElement("DISACCEPT", elementWidth); - printElement("DISACCEPT%", elementWidth); - printElement("DISMAX", elementWidth); - - printElement("ROTATE", elementWidth); - printElement("ROTACCEPT", elementWidth); - printElement("ROTACCEPT%", elementWidth); - printElement("ROTMAX", elementWidth); + if(var->Perfromed(mv::ROTATE)) { + printElement("ROTATE", elementWidth); + printElement("ROTACCEPT", elementWidth); + printElement("ROTACCEPT%", elementWidth); + printElement("ROTMAX", elementWidth); + } - printElement("INTRASWAP", elementWidth); - printElement("INTACCEPT", elementWidth); - printElement("INTACCEPT%", elementWidth); + if(var->Perfromed(mv::INTRA_SWAP)) { + printElement("INTRASWAP", elementWidth); + printElement("INTACCEPT", elementWidth); + printElement("INTACCEPT%", elementWidth); + } - printElement("REGROWTH", elementWidth); - printElement("REGROWACCEPT", elementWidth); - printElement("REGROWACCEPT%", elementWidth); + if(var->Perfromed(mv::REGROWTH)) { + printElement("REGROWTH", elementWidth); + printElement("REGROWACCEPT", elementWidth); + printElement("REGROWACCEPT%", elementWidth); + } - printElement("INTRAMOLEXCHANGE", elementWidth); - printElement("INTMOLEXCACCEPT", elementWidth); - printElement("INTMOLEXACCEPT%", elementWidth); + if(var->Perfromed(mv::INTRA_MEMC)) { + printElement("INTRAMOLEXCHANGE", elementWidth); + printElement("INTMOLEXCACCEPT", elementWidth); + printElement("INTMOLEXACCEPT%", elementWidth); + } - printElement("CRANKSHAFT", elementWidth); - printElement("CRSHAFTACCEPT", elementWidth); - printElement("CRSHAFTACCEPT%", elementWidth); + if(var->Perfromed(mv::CRANKSHAFT)) { + printElement("CRANKSHAFT", elementWidth); + printElement("CRKSHAFTACCEPT", elementWidth); + printElement("CRKSHAFTACCEPT%", elementWidth); + } #if ENSEMBLE == GEMC || ENSEMBLE == GCMC - printElement("TRANSFER", elementWidth); - printElement("TRANACCEPT", elementWidth); - printElement("TRANACCEPT%", elementWidth); + if(var->Perfromed(mv::MOL_TRANSFER)) { + printElement("TRANSFER", elementWidth); + printElement("TRANACCEPT", elementWidth); + printElement("TRANACCEPT%", elementWidth); + } - printElement("MOLEXCHANGE", elementWidth); - printElement("MOLEXACCEPT", elementWidth); - printElement("MOLEXACCEPT%", elementWidth); + if(var->Perfromed(mv::MEMC)) { + printElement("MOLEXCHANGE", elementWidth); + printElement("MOLEXACCEPT", elementWidth); + printElement("MOLEXACCEPT%", elementWidth); + } #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT - printElement("VOLUME", elementWidth); - printElement("VOLACCEPT", elementWidth); - printElement("VOLACCEPT%", elementWidth); - printElement("VOLMAX", elementWidth); + if(var->Perfromed(mv::VOL_TRANSFER)) { + printElement("VOLUME", elementWidth); + printElement("VOLACCEPT", elementWidth); + printElement("VOLACCEPT%", elementWidth); + printElement("VOLMAX", elementWidth); + } #endif std::cout << std::endl; diff --git a/src/OutputVars.cpp b/src/OutputVars.cpp index 229cab08f..acde5a9e9 100644 --- a/src/OutputVars.cpp +++ b/src/OutputVars.cpp @@ -40,6 +40,11 @@ void OutputVars::InitRef(System & sys, StaticVals const& statV) virial = new Virial[BOXES_WITH_U_NB]; } +bool OutputVars::Perfromed(uint moveKind) +{ + return (movePercRef[moveKind] > 0.0); +} + uint OutputVars::GetTries(uint sub) { return (sub < mv::SCALEABLE ? diff --git a/src/OutputVars.h b/src/OutputVars.h index 1d28edaa0..2026c1d80 100644 --- a/src/OutputVars.h +++ b/src/OutputVars.h @@ -30,6 +30,7 @@ class OutputVars void InitRef(System & sys, StaticVals const& statV); void CalcAndConvert(ulong step); + bool Perfromed(uint moveKind); uint GetTries(uint sub); uint GetAccepted(uint sub); double GetAcceptPercent(uint sub); From 0c15c4526e3820d69d3edc6f54e4636cdb99c649 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 11:26:57 -0400 Subject: [PATCH 062/199] Update Bonded and Intra-nonbonded energy to use new molecule coordinates rather than system coordinates. --- src/CalculateEnergy.cpp | 129 ++++++++++++++++++++++++++++++++++++---- src/CalculateEnergy.h | 21 +++++++ 2 files changed, 139 insertions(+), 11 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index e6f9afcbf..51741fb57 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -614,17 +614,11 @@ void CalculateEnergy::MoleculeIntra(const uint molIndex, XYZArray bondVec(molKind.bondList.count * 2); BondVectors(bondVec, molKind, molIndex, box); - MolBond(bondEn[0], molKind, bondVec, box); - MolAngle(bondEn[0], molKind, bondVec, box); - MolDihedral(bondEn[0], molKind, bondVec, box); - MolNonbond(bondEn[1], molKind, molIndex, box); - MolNonbond_1_4(bondEn[1], molKind, molIndex, box); - MolNonbond_1_3(bondEn[1], molKind, molIndex, box); } @@ -637,14 +631,14 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; // *2 because we'll be storing inverse bond vectors XYZArray bondVec(molKind.bondList.count * 2); - BondVectors(bondVec, molKind, molIndex, box); - + + BondVectors(bondVec, mol.GetCoords(), molKind, box); MolBond(bondEn, molKind, bondVec, box); MolAngle(bondEn, molKind, bondVec, box); MolDihedral(bondEn, molKind, bondVec, box); - MolNonbond(intraNonbondEn, molKind, molIndex, box); - MolNonbond_1_4(intraNonbondEn, molKind, molIndex, box); - MolNonbond_1_3(intraNonbondEn, molKind, molIndex, box); + MolNonbond(intraNonbondEn, mol.GetCoords(), molKind, box); + MolNonbond_1_4(intraNonbondEn, mol.GetCoords(), molKind, box); + MolNonbond_1_3(intraNonbondEn, mol.GetCoords(), molKind, box); mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); } @@ -665,6 +659,22 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, } } +void CalculateEnergy::BondVectors(XYZArray & vecs, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + for (uint i = 0; i < molKind.bondList.count; ++i) { + uint p1 = molKind.bondList.part1[i]; + uint p2 = molKind.bondList.part2[i]; + XYZ dist = pos.Difference(p2, p1); + dist = currentAxes.MinImage(dist, box); + + //store inverse vectors at i+count + vecs.Set(i, dist); + vecs.Set(i + molKind.bondList.count, -dist.x, -dist.y, -dist.z); + } +} + void CalculateEnergy::MolBond(double & energy, MoleculeKind const& molKind, @@ -744,6 +754,39 @@ void CalculateEnergy::MolNonbond(double & energy, } +// Calculate 1-N nonbonded intra energy uisng pos +void CalculateEnergy::MolNonbond(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded.count; ++i) { + uint p1 = molKind.nonBonded.part1[i]; + uint p2 = molKind.nonBonded.part2[i]; + + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind + (molKind.nonBonded.part1[i]), + molKind.AtomKind + (molKind.nonBonded.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded.part1[i]) * + molKind.AtomCharge(molKind.nonBonded.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, true); + } + } + } + +} + // Calculate 1-4 nonbonded intra energy void CalculateEnergy::MolNonbond_1_4(double & energy, MoleculeKind const& molKind, @@ -777,6 +820,38 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, } } +// Calculate 1-4 nonbonded intra energy using pos +void CalculateEnergy::MolNonbond_1_4(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded_1_4.count; ++i) { + uint p1 = molKind.nonBonded_1_4.part1[i]; + uint p2 = molKind.nonBonded_1_4.part2[i]; + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + molKind.AtomKind + (molKind.nonBonded_1_4.part1[i]), + molKind.AtomKind + (molKind.nonBonded_1_4.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded_1_4.part1[i]) * + molKind.AtomCharge(molKind.nonBonded_1_4.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } + } + } +} + // Calculate 1-3 nonbonded intra energy void CalculateEnergy::MolNonbond_1_3(double & energy, MoleculeKind const& molKind, @@ -810,6 +885,38 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, } } +// Calculate 1-3 nonbonded intra energy +void CalculateEnergy::MolNonbond_1_3(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const +{ + if (box >= BOXES_WITH_U_B) + return; + + double distSq; + double qi_qj_Fact; + + for (uint i = 0; i < molKind.nonBonded_1_3.count; ++i) { + uint p1 = molKind.nonBonded_1_3.part1[i]; + uint p2 = molKind.nonBonded_1_3.part2[i]; + if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + molKind.AtomKind + (molKind.nonBonded_1_3.part1[i]), + molKind.AtomKind + (molKind.nonBonded_1_3.part2[i])); + if (electrostatic) { + qi_qj_Fact = num::qqFact * + molKind.AtomCharge(molKind.nonBonded_1_3.part1[i]) * + molKind.AtomCharge(molKind.nonBonded_1_3.part2[i]); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } + } + } +} + // Calculate 1-3 nonbonded intra energy double CalculateEnergy::IntraEnergy_1_3(const double distSq, const uint atom1, const uint atom2, const uint molIndex) const diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 255e57916..f38ed7057 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -170,6 +170,11 @@ class CalculateEnergy MoleculeKind const& molKind, const uint molIndex, const uint box) const; + + //! Calculates bond vectors using pos, stores them in vecs + void BondVectors(XYZArray & vecs, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; //! Calculates bond stretch intramolecular energy of a full molecule void MolBond(double & energy, @@ -195,12 +200,22 @@ class CalculateEnergy const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_N intramolecule energy of a full molecule using pos + void MolNonbond(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule void MolNonbond_1_4(double & energy, MoleculeKind const& molKind, const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule using pos + void MolNonbond_1_4(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule //for Martini forcefield void MolNonbond_1_3(double & energy, @@ -208,6 +223,12 @@ class CalculateEnergy const uint molIndex, const uint box) const; + //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule using pos + //for Martini forcefield + void MolNonbond_1_3(double & energy, XYZArray const& pos, + MoleculeKind const& molKind, + const uint box) const; + //! For particles in main coordinates array determines if they belong //! to same molecule, using internal arrays. bool SameMolecule(const uint p1, const uint p2) const From 04039032864fd0d818db553af399625ff3ca4dc5 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 16:22:30 -0400 Subject: [PATCH 063/199] Fix acceptance criterial for IntraMEMC move. --- src/IntraMoleculeExchange1.h | 2 +- src/IntraMoleculeExchange2.h | 9 +++++++++ src/IntraMoleculeExchange3.h | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 5861e6070..41418423e 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -66,7 +66,7 @@ class IntraMoleculeExchange1 : public MoveBase void ShiftMol(const uint n, const bool kindA); void RecoverMol(const uint n, const bool kindA); virtual uint PickMolInCav(); - double GetCoeff() const; + virtual double GetCoeff() const; uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool enableID; diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 0aafefcc7..c512eb456 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -40,6 +40,7 @@ class IntraMoleculeExchange2 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); virtual uint PickMolInCav(); + virtual double GetCoeff() const; uint smallBB[2]; }; @@ -316,6 +317,14 @@ inline void IntraMoleculeExchange2::CalcEn() IntraMoleculeExchange1::CalcEn(); } +inline double IntraMoleculeExchange2::GetCoeff() const +{ + double ratioF = num::Factorial(numSCavA - 1) * num::Factorial(numSCavB) / + (num::Factorial(numSCavA - exchangeRatio) * + num::Factorial(numSCavB + exchangeRatio - 1)); + + return ratioF; +} inline void IntraMoleculeExchange2::Accept(const uint rejectState, const uint step) diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index e8fbfeb9c..1c26f1d74 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -39,6 +39,7 @@ class IntraMoleculeExchange3 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); virtual uint PickMolInCav(); + virtual double GetCoeff() const; }; inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) @@ -283,6 +284,14 @@ inline void IntraMoleculeExchange3::CalcEn() correctDiff)); } +inline double IntraMoleculeExchange3::GetCoeff() const +{ + double ratioF = num::Factorial(numSCavA - 1) * num::Factorial(numSCavB) / + (num::Factorial(numSCavA - exchangeRatio) * + num::Factorial(numSCavB + exchangeRatio - 1)); + + return ratioF; +} inline void IntraMoleculeExchange3::Accept(const uint rejectState, const uint step) From 7129dfa8db7b055b4449abc22e3c9514328c1b53 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 16:49:55 -0400 Subject: [PATCH 064/199] Fix acceptance criteria for IntraMEMC move. --- src/IntraMoleculeExchange1.h | 2 +- src/IntraMoleculeExchange2.h | 9 +++++++++ src/IntraMoleculeExchange3.h | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 5861e6070..41418423e 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -66,7 +66,7 @@ class IntraMoleculeExchange1 : public MoveBase void ShiftMol(const uint n, const bool kindA); void RecoverMol(const uint n, const bool kindA); virtual uint PickMolInCav(); - double GetCoeff() const; + virtual double GetCoeff() const; uint GetBoxPairAndMol(const double subDraw, const double movPerc); bool enableID; diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 0aafefcc7..c512eb456 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -40,6 +40,7 @@ class IntraMoleculeExchange2 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); virtual uint PickMolInCav(); + virtual double GetCoeff() const; uint smallBB[2]; }; @@ -316,6 +317,14 @@ inline void IntraMoleculeExchange2::CalcEn() IntraMoleculeExchange1::CalcEn(); } +inline double IntraMoleculeExchange2::GetCoeff() const +{ + double ratioF = num::Factorial(numSCavA - 1) * num::Factorial(numSCavB) / + (num::Factorial(numSCavA - exchangeRatio) * + num::Factorial(numSCavB + exchangeRatio - 1)); + + return ratioF; +} inline void IntraMoleculeExchange2::Accept(const uint rejectState, const uint step) diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index e8fbfeb9c..1c26f1d74 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -39,6 +39,7 @@ class IntraMoleculeExchange3 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); virtual uint PickMolInCav(); + virtual double GetCoeff() const; }; inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) @@ -283,6 +284,14 @@ inline void IntraMoleculeExchange3::CalcEn() correctDiff)); } +inline double IntraMoleculeExchange3::GetCoeff() const +{ + double ratioF = num::Factorial(numSCavA - 1) * num::Factorial(numSCavB) / + (num::Factorial(numSCavA - exchangeRatio) * + num::Factorial(numSCavB + exchangeRatio - 1)); + + return ratioF; +} inline void IntraMoleculeExchange3::Accept(const uint rejectState, const uint step) From 96b0a7faddd5f2368a387fa7890c9fa949ac673f Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 17:50:02 -0400 Subject: [PATCH 065/199] Exclude the node that has fix angle before performing crankshaft move. --- src/MolSetup.cpp | 16 +++++++++++++++- src/MolSetup.h | 2 ++ src/cbmc/DCGraph.cpp | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index 9f4e1b337..7af70c76b 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -145,7 +145,6 @@ std::vector mol_setup::AtomEndAngles(const MolKind& molKind, uint atom) return result; } - std::vector mol_setup::AtomMidAngles(const MolKind& molKind, uint atom) { std::vector result; @@ -158,6 +157,21 @@ std::vector mol_setup::AtomMidAngles(const MolKind& molKind, uint atom) return result; } +//List of angles with atom at one end, and mid in middle, atom first +std::vector mol_setup::AtomMidEndAngles(const MolKind& molKind, uint mid, uint atom) +{ + std::vector result; + typedef std::vector::const_iterator Aiter; + for (Aiter it = molKind.angles.begin(), end = molKind.angles.end(); it < end; ++it) { + if ((it->a0 == atom || it->a2 == atom) && (it->a1 == mid)) { + result.push_back(*it); + } + if (it->a2 == atom) { + std::swap(result.back().a0, result.back().a2); + } + } + return result; +} //List of bonds with atom at one end, atom first std::vector mol_setup::AtomBonds(const MolKind& molKind, uint atom) diff --git a/src/MolSetup.h b/src/MolSetup.h index b63c2d714..eff7e42dd 100644 --- a/src/MolSetup.h +++ b/src/MolSetup.h @@ -107,6 +107,8 @@ std::vector DihsOnBond(const MolKind& molKind, uint atom, uint partner std::vector AtomEndAngles(const MolKind& molKind, uint atom); //List of angles with atom in middle std::vector AtomMidAngles(const MolKind& molKind, uint atom); +//List of angles with atom at one end, and mid in middle, atom first +std::vector AtomMidEndAngles(const MolKind& molKind, uint mid, uint atom); //List of bonds with atom at one end, atom first std::vector AtomBonds(const MolKind& molKind, uint atom); diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index e8d85854e..ff674eb47 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -108,7 +108,23 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) uint a3 = dihs.back().a3; if(!(visited[a0] && visited[a1] && visited[a2] && visited[a3])) { - shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a2-a3-x + vector tempAng = AtomMidEndAngles(kind, a3, a2); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint a = 0; a < angle.size(); a++) { + if(data.ff.angles->AngleFixed(angle[a].kind)) { + fixAngle = true; + } + } + //If there was no fix angles, we create DCCrankShaftDih + if(!fixAngle) { + shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + } visited[a0] = true; visited[a1] = true; visited[a2] = true; @@ -133,7 +149,23 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) uint a2 = angles.back().a2; if(!(visited[a0] && visited[a1] && visited[a2])) { - shaftNodesAng.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a1-a2-x + vector tempAng = AtomMidEndAngles(kind, a2, a1); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint a = 0; a < angle.size(); a++) { + if(data.ff.angles->AngleFixed(angle[a].kind)) { + fixAngle = true; + } + } + //If there was no fix angles, we create DCCrankShaftDih + if(!fixAngle) { + shaftNodesAng.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + } visited[a0] = true; visited[a1] = true; visited[a2] = true; From 0eda38f1d7af247c0a23361d115cac13766db246 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 17:58:02 -0400 Subject: [PATCH 066/199] Fix the AtomMidEndAngles function --- src/MolSetup.cpp | 25 ++++--------------------- src/MolSetup.h | 2 -- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index 7af70c76b..f7d2ea66e 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -95,24 +95,6 @@ std::vector mol_setup::AtomEndDihs(const MolKind& molKind, uint atom) return result; } -//List of dihedrals with atom0 at one end, and atom3 at the other end, atom0 first -std::vector mol_setup::AtomStartEndDihs(const MolKind& molKind, uint atom0, uint atom3) -{ - std::vector result; - typedef std::vector::const_iterator Diter; - for (Diter it = molKind.dihedrals.begin(), end = molKind.dihedrals.end(); it < end; ++it) { - if ((it->a0 == atom0 && it->a3 == atom3) || (it->a0 == atom3 && it->a3 == atom0)) { - result.push_back(*it); - } - - if (it->a3 == atom0) { - std::swap(result.back().a0, result.back().a3); - std::swap(result.back().a1, result.back().a2); - } - } - return result; -} - std::vector mol_setup::DihsOnBond(const MolKind& molKind, uint atom, uint partner) { std::vector result; @@ -165,9 +147,10 @@ std::vector mol_setup::AtomMidEndAngles(const MolKind& molKind, uint mid, for (Aiter it = molKind.angles.begin(), end = molKind.angles.end(); it < end; ++it) { if ((it->a0 == atom || it->a2 == atom) && (it->a1 == mid)) { result.push_back(*it); - } - if (it->a2 == atom) { - std::swap(result.back().a0, result.back().a2); + + if (it->a2 == atom) { + std::swap(result.back().a0, result.back().a2); + } } } return result; diff --git a/src/MolSetup.h b/src/MolSetup.h index eff7e42dd..1a76d17cc 100644 --- a/src/MolSetup.h +++ b/src/MolSetup.h @@ -99,8 +99,6 @@ class MolKind //List of dihedrals with atom at one end, atom first std::vector AtomEndDihs(const MolKind& molKind, uint atom); -//List of dihedrals with atom0 at one end, and atom3 at the other end, atom0 first -std::vector AtomStartEndDihs(const MolKind& molKind, uint atom0, uint atom3); //List of dihedrals with atom and partner in middle, atom in a1 std::vector DihsOnBond(const MolKind& molKind, uint atom, uint partner); //List of angles with atom at one end, atom first From c80d482df4ba72b7eda95b5283e6d549d11edc23 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 11 Jul 2018 18:48:36 -0400 Subject: [PATCH 067/199] Fix to the issue when Regrowth move is called instead of crankshaft and energy did not match. --- src/CalculateEnergy.cpp | 5 ++++- src/cbmc/DCGraph.cpp | 14 +++++++++++--- src/cbmc/DCGraph.h | 1 + src/cbmc/TrialMol.h | 5 +++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 51741fb57..84fcc1c0d 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -629,6 +629,7 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, uint box = mol.GetBox(); double bondEn = 0.0, intraNonbondEn = 0.0; MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; + Energy en = mol.GetEnergy(); // *2 because we'll be storing inverse bond vectors XYZArray bondVec(molKind.bondList.count * 2); @@ -639,7 +640,9 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, MolNonbond(intraNonbondEn, mol.GetCoords(), molKind, box); MolNonbond_1_4(intraNonbondEn, mol.GetCoords(), molKind, box); MolNonbond_1_3(intraNonbondEn, mol.GetCoords(), molKind, box); - mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); + en.intraBond = bondEn; + en.intraNonbond = intraNonbondEn; + mol.SetEnergy(en); } void CalculateEnergy::BondVectors(XYZArray & vecs, diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index ff674eb47..c096a79e0 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -175,17 +175,25 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) tempNodes.pop_back(); } - if(shaftNodesDih.size() == 0) { - if(shaftNodesAng.size() != 0) { + hasCrankShaft = true; + if((shaftNodesAng.size() == 0) || (shaftNodesDih.size() == 0)) { + if(shaftNodesAng.size() == 0) { + shaftNodesAng = shaftNodesDih; + } else { shaftNodesDih = shaftNodesAng; } } + if((shaftNodesAng.size() == 0) && (shaftNodesDih.size() == 0)) { + hasCrankShaft = false; + } + + } void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { - if(shaftNodesAng.size() == 0) { + if(!hasCrankShaft) { //No crank shaft move for molecule with less than 4 nodes. //Instead we perform Regrowth move within the same box Regrowth(oldMol, newMol, molIndex); diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index bbc57ab51..edf73dae6 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -71,6 +71,7 @@ class DCGraph : public CBMC DCComponent *idExchange; DCData data; + bool hasCrankShaft; std::vector nodes; std::vector fringe; std::vector visited; diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index a1dfdf553..79db816c9 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -49,6 +49,11 @@ class TrialMol en += energy; } + void SetEnergy(const Energy& energy) + { + en = energy; + } + //!Confirms that atom at index i has been built (used for oldMols) void ConfirmOldAtom(uint i); From 33b7f7cd08ac0538edfad247e2ca6be7b987dfed Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 12 Jul 2018 11:08:22 -0400 Subject: [PATCH 068/199] Calculate bonded energy and weight inside CrankShaft function to avoid conflict when regrowth move is called instead of crankshaft move. --- src/CalculateEnergy.cpp | 5 +---- src/CrankShaft.h | 14 ++------------ src/cbmc/DCCrankShaftAng.cpp | 10 ++++++++++ src/cbmc/DCCrankShaftDih.cpp | 10 ++++++++++ src/cbmc/TrialMol.h | 5 ----- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 84fcc1c0d..51741fb57 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -629,7 +629,6 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, uint box = mol.GetBox(); double bondEn = 0.0, intraNonbondEn = 0.0; MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; - Energy en = mol.GetEnergy(); // *2 because we'll be storing inverse bond vectors XYZArray bondVec(molKind.bondList.count * 2); @@ -640,9 +639,7 @@ void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, MolNonbond(intraNonbondEn, mol.GetCoords(), molKind, box); MolNonbond_1_4(intraNonbondEn, mol.GetCoords(), molKind, box); MolNonbond_1_3(intraNonbondEn, mol.GetCoords(), molKind, box); - en.intraBond = bondEn; - en.intraNonbond = intraNonbondEn; - mol.SetEnergy(en); + mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); } void CalculateEnergy::BondVectors(XYZArray & vecs, diff --git a/src/CrankShaft.h b/src/CrankShaft.h index eb7dae91c..44fcdd780 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -32,7 +32,7 @@ class CrankShaft : public MoveBase uint pStart, pLen; uint molIndex, kindIndex; - double W_recip, W_bonded; + double W_recip; double correct_old, correct_new; cbmc::TrialMol oldMol, newMol; Intermolecular recipDiff; @@ -86,18 +86,8 @@ inline void CrankShaft::CalcEn() { // since number of molecules would not change in the box, W_recip = 1.0; - W_bonded = 1.0; correct_old = 0.0; correct_new = 0.0; - //Calculate bonded and intra-nonbonded energy - calcEnRef.MoleculeIntra(newMol, molIndex); - calcEnRef.MoleculeIntra(oldMol, molIndex); - - W_bonded = exp(-1.0 * ffRef.beta * ((newMol.GetEnergy().intraBond + - newMol.GetEnergy().intraNonbond) - - (oldMol.GetEnergy().intraBond + - oldMol.GetEnergy().intraNonbond))); - if (newMol.GetWeight() != 0.0) { correct_new = calcEwald->SwapCorrection(newMol); @@ -118,7 +108,7 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) if(rejectState == mv::fail_state::NO_FAIL) { double Wo = oldMol.GetWeight(); double Wn = newMol.GetWeight(); - double Wrat = Wn / Wo * W_recip * W_bonded; + double Wrat = Wn / Wo * W_recip; //safety to make sure move will be rejected in overlap case if((newMol.GetEnergy().real < 1.0e15) && diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index d94f9e5a4..7ac728014 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -150,6 +150,11 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) for (uint a = 0; a < totAtoms; a++) { oldMol.ConfirmOldAtom(a); } + //Calculate bonded energy and weight + data->calc.MoleculeIntra(oldMol, molIndex); + double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + + oldMol.GetEnergy().intraNonbond)); + oldMol.MultWeight(W_bonded); } void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) @@ -210,5 +215,10 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) for (uint a = 0; a < totAtoms; a++) { newMol.ConfirmOldAtom(a); } + //Calculate bonded energy and weight + data->calc.MoleculeIntra(newMol, molIndex); + double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + + newMol.GetEnergy().intraNonbond)); + newMol.MultWeight(W_bonded); } } diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index e618cda49..c4c21ffdd 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -148,6 +148,11 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) for (uint a = 0; a < totAtoms; a++) { oldMol.ConfirmOldAtom(a); } + //Calculate bonded energy and weight + data->calc.MoleculeIntra(oldMol, molIndex); + double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + + oldMol.GetEnergy().intraNonbond)); + oldMol.MultWeight(W_bonded); } void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) @@ -208,5 +213,10 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) for (uint a = 0; a < totAtoms; a++) { newMol.ConfirmOldAtom(a); } + //Calculate bonded energy and weight + data->calc.MoleculeIntra(newMol, molIndex); + double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + + newMol.GetEnergy().intraNonbond)); + newMol.MultWeight(W_bonded); } } diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 79db816c9..a1dfdf553 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -49,11 +49,6 @@ class TrialMol en += energy; } - void SetEnergy(const Energy& energy) - { - en = energy; - } - //!Confirms that atom at index i has been built (used for oldMols) void ConfirmOldAtom(uint i); From ebfdc0102fe6abcb4c84f31c121c31120a9b9094 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 17 Jul 2018 14:41:55 -0400 Subject: [PATCH 069/199] Add new features to MEMC, where multiple exchange pair can be defined. For each pair, exchange ratio, backbone, smallKind and largeKind must be defined. --- src/ConfigSetup.cpp | 138 +++++++++++++++++++++++++---------- src/ConfigSetup.h | 8 +- src/IntraMoleculeExchange1.h | 47 ++++++++---- src/IntraMoleculeExchange2.h | 41 +++++++---- src/IntraMoleculeExchange3.h | 24 ++++-- src/MoleculeExchange1.h | 92 ++++++++++++++--------- src/MoleculeExchange2.h | 42 +++++++---- src/MoleculeExchange3.h | 24 ++++-- 8 files changed, 277 insertions(+), 139 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 2fd84dc0f..1e28b3b54 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -167,7 +167,7 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isEXOTIC = false; in.ffKind.isMARTINI = false; in.ffKind.isCHARMM = true; - printf("Info: PARAMETER file: CHARMM format!\n"); + printf("%-40s %-s \n", "Info: PARAMETER file", "CHARMM format!"); } } else if(line[0] == "ParaTypeEXOTIC") { if(checkBool(line[1])) { @@ -175,7 +175,7 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isCHARMM = false; in.ffKind.isMARTINI = false; in.ffKind.isEXOTIC = true; - printf("Info: PARAMETER file: EXOTIC format!\n"); + printf("%-40s %-s \n", "Info: PARAMETER file", "EXOTIC format!"); } } else if(line[0] == "ParaTypeMARTINI") { if(checkBool(line[1])) { @@ -183,7 +183,7 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isEXOTIC = false; in.ffKind.isMARTINI = true; in.ffKind.isCHARMM = true; - printf("Info: PARAMETER file: MARTINI using CHARMM format!\n"); + printf("%-40s %-s \n", "Info: PARAMETER file", "MARTINI using CHARMM format!"); } } else if(line[0] == "Parameters") { in.files.param.name = line[1]; @@ -262,57 +262,89 @@ void ConfigSetup::Init(const char *fileName) sys.intraMemcVal.readVol = true; } } else if(line[0] == "ExchangeRatio") { - if(line.size() == 2) { - uint val = stringtoi(line[1]); - sys.memcVal.exchangeRatio = val; - sys.intraMemcVal.exchangeRatio = val; + if(line.size() >= 2) { + printf("%-41s", "Info: ExchangeRatio"); + for(uint i = 1; i < line.size(); i++) { + uint val = stringtoi(line[i]); + sys.memcVal.exchangeRatio.push_back(val); + sys.intraMemcVal.exchangeRatio.push_back(val); + printf("%-5d", val); + } + std::cout << endl; sys.memcVal.readRatio = true; sys.intraMemcVal.readRatio = true; - printf("%-40s %-d \n", "Info: ExchangeRatio", val); } } else if(line[0] == "ExchangeLargeKind") { - if(line.size() == 2) { - std::string resName = line[1]; - sys.memcVal.largeKind = resName; - sys.intraMemcVal.largeKind = resName; + if(line.size() >= 2) { + printf("%-41s", "Info: Exchange Large Kind"); + for(uint i = 1; i < line.size(); i++) { + std::string resName = line[i]; + sys.memcVal.largeKind.push_back(resName); + sys.intraMemcVal.largeKind.push_back(resName); + printf("%-5s", resName.c_str()); + } + std::cout << endl; sys.memcVal.readLK = true; sys.intraMemcVal.readLK = true; - printf("%-40s %-s \n", "Info: Exchange Large Kind", resName.c_str()); } } else if(line[0] == "ExchangeSmallKind") { - if(line.size() == 2) { - std::string resName = line[1]; - sys.memcVal.smallKind = resName; - sys.intraMemcVal.smallKind = resName; + if(line.size() >= 2) { + printf("%-41s", "Info: Exchange Small Kind"); + for(uint i = 1; i < line.size(); i++) { + std::string resName = line[i]; + sys.memcVal.smallKind.push_back(resName); + sys.intraMemcVal.smallKind.push_back(resName); + printf("%-5s", resName.c_str()); + } + std::cout << endl; sys.memcVal.readSK = true; sys.intraMemcVal.readSK = true; - printf("%-40s %-s \n", "Info: Exchange Small Kind", resName.c_str()); } } else if(line[0] == "SmallKindBackBone") { - if(line.size() == 3) { - std::string atom1 = line[1]; - std::string atom2 = line[2]; - sys.memcVal.smallBBAtom1 = atom1; - sys.memcVal.smallBBAtom2 = atom2; + if((line.size() % 2) == 0) { + std::cout <<"Error: Atom Names in Small Kind BackBone must be in pair!\n"; + exit(EXIT_FAILURE); + } + if(line.size() >= 3) { + printf("%-41s", "Info: Atom Names in Small Kind BackBone"); + for(uint i = 1; i < line.size() - 1; i += 2) { + if(i != 1) { + printf(" , "); + } + std::string atom1 = line[i]; + std::string atom2 = line[i+1]; + sys.memcVal.smallBBAtom1.push_back(atom1); + sys.memcVal.smallBBAtom2.push_back(atom2); + sys.intraMemcVal.smallBBAtom1.push_back(atom1); + sys.intraMemcVal.smallBBAtom2.push_back(atom2); + printf("%-s - %-s", atom1.c_str(), atom2.c_str()); + } + std::cout << endl; sys.memcVal.readSmallBB = true; - sys.intraMemcVal.smallBBAtom1 = atom1; - sys.intraMemcVal.smallBBAtom2 = atom2; sys.intraMemcVal.readSmallBB = true; - printf("%-40s %-s - %-s \n", "Info: Atom Names in Small Kind BackBone", - atom1.c_str(), atom2.c_str()); } } else if(line[0] == "LargeKindBackBone") { - if(line.size() == 3) { - std::string atom1 = line[1]; - std::string atom2 = line[2]; - sys.memcVal.largeBBAtom1 = atom1; - sys.memcVal.largeBBAtom2 = atom2; + if((line.size() % 2) == 0) { + std::cout <<"Error: Atom Names in Large Kind BackBone must be in pair!\n"; + exit(EXIT_FAILURE); + } + if(line.size() >= 3) { + printf("%-41s", "Info: Atom Names in Large Kind BackBone"); + for(uint i = 1; i < line.size() - 1; i += 2) { + if(i != 1) { + printf(" , "); + } + std::string atom1 = line[i]; + std::string atom2 = line[i+1]; + sys.memcVal.largeBBAtom1.push_back(atom1); + sys.memcVal.largeBBAtom2.push_back(atom2); + sys.intraMemcVal.largeBBAtom1.push_back(atom1); + sys.intraMemcVal.largeBBAtom2.push_back(atom2); + printf("%-s - %-s", atom1.c_str(), atom2.c_str()); + } + std::cout << endl; sys.memcVal.readLargeBB = true; - sys.intraMemcVal.largeBBAtom1 = atom1; - sys.intraMemcVal.largeBBAtom2 = atom2; sys.intraMemcVal.readLargeBB = true; - printf("%-40s %-s - %-s \n", "Info: Atom Names in Large Kind BackBone", - atom1.c_str(), atom2.c_str()); } } else if(line[0] == "Rcut") { sys.ff.cutoff = stringtod(line[1]); @@ -330,7 +362,6 @@ void ConfigSetup::Init(const char *fileName) } else if(line[1] == sys.exclude.EXC_ONEFOUR) { sys.exclude.EXCLUDE_KIND = sys.exclude.EXC_ONEFOUR_KIND; printf("%-40s %-s \n", "Info: Exclude", "ONE-FOUR"); - printf("Warning: Modified 1-4 VDW parameters will be ignored!\n"); } } else if(line[0] == "Ewald") { sys.elect.ewald = checkBool(line[1]); @@ -404,7 +435,7 @@ void ConfigSetup::Init(const char *fileName) sys.moves.rotate = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Rotation move frequency", sys.moves.rotate); - }else if(line[0] == "IntraMEMC-1Freq") { + } else if(line[0] == "IntraMEMC-1Freq") { sys.moves.intraMemc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: IntraMEMC-1 move frequency", sys.moves.intraMemc); @@ -1056,6 +1087,12 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: In MEMC method, Exchange Ratio is not specified!\n"; exit(EXIT_FAILURE); } + if(sys.memcVal.largeKind.size() != sys.memcVal.exchangeRatio.size()) { + std::cout << "Error: In MEMC method, specified number of Large Kinds is " << + sys.memcVal.largeKind.size() << ", but " << sys.memcVal.exchangeRatio.size() + << " exchange ratio is specified!\n"; + exit(EXIT_FAILURE); + } if(!sys.memcVal.readSK || !sys.intraMemcVal.readSK) { std::cout << "Error: In MEMC method, Small Kind is not specified!\n"; exit(EXIT_FAILURE); @@ -1064,16 +1101,37 @@ void ConfigSetup::verifyInputs(void) std::cout << "Error: In MEMC method, Large Kind is not specified!\n"; exit(EXIT_FAILURE); } + if((sys.memcVal.largeKind.size() != sys.memcVal.smallKind.size()) || + (sys.intraMemcVal.largeKind.size() != sys.intraMemcVal.smallKind.size())) { + std::cout << "Error: In MEMC method, specified number of Large Kinds is not " << + " equal as specified number of Small Kinds!\n"; + exit(EXIT_FAILURE); + } if(!sys.memcVal.readLargeBB || !sys.intraMemcVal.readLargeBB) { std::cout << "Error: In MEMC method, Large Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } + if(sys.memcVal.largeKind.size() != sys.memcVal.largeBBAtom1.size()) { + std::cout << "Error: In MEMC method, specified number of Large Kinds is " << + sys.memcVal.largeKind.size() << ", but " << sys.memcVal.largeBBAtom1.size() + << " sets of Large Molecule BackBone is specified!\n"; + exit(EXIT_FAILURE); + } if(sys.memcVal.MEMC2 && !sys.memcVal.readSmallBB) { - std::cout << "Error: In MEMC method, Small Kind BackBone is not specified!\n"; + std::cout << "Error: In MEMC-2 method, Small Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } + + if(sys.memcVal.MEMC2 && (sys.memcVal.smallKind.size() != + sys.memcVal.smallBBAtom1.size())) { + std::cout << "Error: In MEMC-2 method, specified number of Small Kinds is " << + sys.memcVal.smallKind.size() << ", but " << sys.memcVal.smallBBAtom1.size() + << " sets of Small Molecule BackBone is specified!\n"; + exit(EXIT_FAILURE); + } + if(sys.intraMemcVal.MEMC2 && !sys.intraMemcVal.readSmallBB) { - std::cout << "Error: In Intra-MEMC method, Small Kind BackBone is not specified!\n"; + std::cout << "Error: In Intra-MEMC-2 method, Small Kind BackBone is not specified!\n"; exit(EXIT_FAILURE); } if(sys.memcVal.enable && sys.intraMemcVal.enable) { diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index d6bba15f9..b3b31ae4f 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -213,10 +213,10 @@ struct MEMCVal { bool readSK, readLK; bool MEMC1, MEMC2, MEMC3; XYZ subVol; - std::string smallKind, largeKind; - uint exchangeRatio; - std::string smallBBAtom1, smallBBAtom2; - std::string largeBBAtom1, largeBBAtom2; + std::vector smallKind, largeKind; + std::vector exchangeRatio; + std::vector smallBBAtom1, smallBBAtom2; + std::vector largeBBAtom1, largeBBAtom2; MEMCVal(void) { MEMC1 = MEMC2 = MEMC3 = false; readVol = readRatio = readSmallBB = false; diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 41418423e..634fbc696 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -22,12 +22,10 @@ class IntraMoleculeExchange1 : public MoveBase IntraMoleculeExchange1(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.intraMemcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + cavity(statV.intraMemcVal.subVol), cavA(3), invCavA(3), perAdjust(statV.GetPerAdjust()), cavB(3), invCavB(3) { enableID = statV.intraMemcVal.enable; - largeBB[0] = -1; - largeBB[1] = -1; if(enableID) { if(molLookRef.GetNumCanSwapKind() < 2) { @@ -42,7 +40,7 @@ class IntraMoleculeExchange1 : public MoveBase cavity.x = cavity.y; volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.intraMemcVal.exchangeRatio; + exchangeRatioVec = statV.intraMemcVal.exchangeRatio; SetMEMC(statV); @@ -63,6 +61,7 @@ class IntraMoleculeExchange1 : public MoveBase virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); void ShiftMol(const uint n, const bool kindA); void RecoverMol(const uint n, const bool kindA); virtual uint PickMolInCav(); @@ -78,6 +77,9 @@ class IntraMoleculeExchange1 : public MoveBase vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector oldMolA, newMolA, oldMolB, newMolB; vector< vector > molInCav; + //To store total sets of exchange pairs + vector exchangeRatioVec, kindSVec, kindLVec; + vector< vector > largeBBVec; int exDiff, exchangeRatio; double volCav, lastAccept; @@ -92,31 +94,33 @@ class IntraMoleculeExchange1 : public MoveBase inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) { + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + kindS = kindL = largeBB[0] = largeBB[1] = -1; for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.intraMemcVal.largeKind) { + if(molRef.kinds[k].name == statV.intraMemcVal.largeKind[t]) { kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind) { + } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind[t]) { kindS = molLookRef.GetCanSwapKind(k); } } if(kindS == -1) { printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", - statV.intraMemcVal.smallKind.c_str()); + statV.intraMemcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", - statV.intraMemcVal.largeKind.c_str()); + statV.intraMemcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1) { + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom1[t]) { largeBB[0] = i; } - if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] == statV.intraMemcVal.largeBBAtom2[t]){ largeBB[1] = i; } } @@ -124,9 +128,9 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) for(uint i = 0; i < 2; i++) { if(largeBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.intraMemcVal.largeBBAtom1.c_str(), - statV.intraMemcVal.largeBBAtom2.c_str(), - statV.intraMemcVal.largeKind.c_str()); + statV.intraMemcVal.largeBBAtom1[t].c_str(), + statV.intraMemcVal.largeBBAtom2[t].c_str(), + statV.intraMemcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } } @@ -139,6 +143,11 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) } } } + kindSVec.push_back(kindS); + kindLVec.push_back(kindL); + vector temp(largeBB, largeBB + 2); + largeBBVec.push_back(temp); + } } inline void IntraMoleculeExchange1::AdjustExRatio() @@ -171,6 +180,16 @@ inline void IntraMoleculeExchange1::AdjustExRatio() } } +inline void IntraMoleculeExchange1::SetExchangeData() +{ + uint exType = prng.randIntExc(exchangeRatioVec.size()); + kindS = kindSVec[exType]; + kindL = kindLVec[exType]; + exchangeRatio = exchangeRatioVec[exType]; + largeBB[0] = largeBBVec[exType][0]; + largeBB[1] = largeBBVec[exType][1]; +} + inline uint IntraMoleculeExchange1::PickMolInCav() { uint state = mv::fail_state::NO_FAIL; @@ -244,6 +263,8 @@ inline uint IntraMoleculeExchange1::GetBoxPairAndMol(const double subDraw, prng.PickBox(sourceBox, subDraw, movPerc); #endif + SetExchangeData(); + molIndexA.clear(); kindIndexA.clear(); molIndexB.clear(); diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index c512eb456..19c1b522f 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -23,8 +23,6 @@ class IntraMoleculeExchange2 : public IntraMoleculeExchange1 IntraMoleculeExchange2(System &sys, StaticVals const& statV) : IntraMoleculeExchange1(sys, statV) { - smallBB[0] = -1; - smallBB[1] = -1; if(enableID) { SetMEMC(statV); } @@ -39,19 +37,24 @@ class IntraMoleculeExchange2 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); virtual uint PickMolInCav(); virtual double GetCoeff() const; uint smallBB[2]; + //To store total sets of exchange pairs + vector< vector > smallBBVec; }; inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) { + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + smallBB[0] = smallBB[1] = -1; for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames[i] == statV.intraMemcVal.smallBBAtom1) { + if(molRef.kinds[kindS].atomNames[i] == statV.intraMemcVal.smallBBAtom1[t]) { smallBB[0] = i; } - if(molRef.kinds[kindS].atomNames[i] ==statV.intraMemcVal.smallBBAtom2){ + if(molRef.kinds[kindS].atomNames[i] ==statV.intraMemcVal.smallBBAtom2[t]){ smallBB[1] = i; } } @@ -59,26 +62,22 @@ inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) for(uint i = 0; i < 2; i++) { if(smallBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.intraMemcVal.smallBBAtom1.c_str(), - statV.intraMemcVal.smallBBAtom2.c_str(), - statV.intraMemcVal.smallKind.c_str()); + statV.intraMemcVal.smallBBAtom1[t].c_str(), + statV.intraMemcVal.smallBBAtom2[t].c_str(), + statV.intraMemcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } } - if(molRef.kinds[kindL].NumAtoms() > 1) { - if(largeBB[0] == largeBB[1]) { - printf("Error: Atom names in large molecule backbone cannot be same!\n"); - exit(EXIT_FAILURE); - } - } - - if(molRef.kinds[kindS].NumAtoms() > 1) { + if(molRef.kinds[kindSVec[t]].NumAtoms() > 1) { if(smallBB[0] == smallBB[1]) { printf("Error: Atom names in small molecule backbone cannot be same!\n"); exit(EXIT_FAILURE); } } + vector temp(smallBB, smallBB + 2); + smallBBVec.push_back(temp); + } } inline void IntraMoleculeExchange2::AdjustExRatio() @@ -109,6 +108,18 @@ inline void IntraMoleculeExchange2::AdjustExRatio() } } +inline void IntraMoleculeExchange2::SetExchangeData() +{ + uint exType = prng.randIntExc(exchangeRatioVec.size()); + kindS = kindSVec[exType]; + kindL = kindLVec[exType]; + exchangeRatio = exchangeRatioVec[exType]; + largeBB[0] = largeBBVec[exType][0]; + largeBB[1] = largeBBVec[exType][1]; + smallBB[0] = smallBBVec[exType][0]; + smallBB[1] = smallBBVec[exType][1]; +} + inline uint IntraMoleculeExchange2::PickMolInCav() { uint state = mv::fail_state::NO_FAIL; diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 1c26f1d74..89b25e757 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -38,20 +38,23 @@ class IntraMoleculeExchange3 : public IntraMoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); virtual uint PickMolInCav(); virtual double GetCoeff() const; }; inline void IntraMoleculeExchange3::SetMEMC(StaticVals const& statV) { - if(largeBB[0] != largeBB[1]) { - printf("Error: In ME-3 move, atom name of backbone should be same.\n"); - printf("Atom names in backbone was set to %s or %s in %s residue.\n", - statV.intraMemcVal.largeBBAtom1.c_str(), - statV.intraMemcVal.largeBBAtom2.c_str(), - statV.intraMemcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + if(largeBBVec[t][0] != largeBBVec[t][1]) { + printf("Error: In ME-3 move, atom name of backbone should be same.\n"); + printf("Atom names in backbone was set to %s or %s in %s residue.\n", + statV.intraMemcVal.largeBBAtom1[t].c_str(), + statV.intraMemcVal.largeBBAtom2[t].c_str(), + statV.intraMemcVal.largeKind[t].c_str()); + exit(EXIT_FAILURE); + } + } } inline void IntraMoleculeExchange3::AdjustExRatio() @@ -82,6 +85,11 @@ inline void IntraMoleculeExchange3::AdjustExRatio() } } +inline void IntraMoleculeExchange3::SetExchangeData() +{ + IntraMoleculeExchange1::SetExchangeData(); +} + inline uint IntraMoleculeExchange3::PickMolInCav() { uint state = mv::fail_state::NO_FAIL; diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index a091f5343..3d41441ed 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -25,12 +25,10 @@ class MoleculeExchange1 : public MoveBase MoleculeExchange1(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), MoveBase(sys, statV), - cavity(statV.memcVal.subVol), cavA(3), invCavA(3), kindS(-1), kindL(-1), + cavity(statV.memcVal.subVol), cavA(3), invCavA(3), perAdjust(statV.GetPerAdjust()) { enableID = statV.memcVal.enable; - largeBB[0] = -1; - largeBB[1] = -1; if(enableID) { if(molLookRef.GetNumCanSwapKind() < 2) { @@ -45,7 +43,7 @@ class MoleculeExchange1 : public MoveBase cavity.x = cavity.y; volCav = cavity.x * cavity.y * cavity.z; - exchangeRatio = statV.memcVal.exchangeRatio; + exchangeRatioVec = statV.memcVal.exchangeRatio; SetMEMC(statV); @@ -66,6 +64,7 @@ class MoleculeExchange1 : public MoveBase virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); void SetBox(); void ShiftMol(const bool A, const uint n, const uint from, const uint to); void RecoverMol(const bool A, const uint n, const uint from, const uint to); @@ -84,6 +83,9 @@ class MoleculeExchange1 : public MoveBase vector molIndexA, kindIndexA, molIndexB, kindIndexB; vector< vector > molInCav; vector oldMolA, newMolA, oldMolB, newMolB; + //To store total sets of exchange pairs + vector exchangeRatioVec, kindSVec, kindLVec; + vector< vector > largeBBVec; int exDiff, exchangeRatio; double volCav, lastAccept; @@ -101,31 +103,33 @@ class MoleculeExchange1 : public MoveBase inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) { + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + kindS = kindL = largeBB[0] = largeBB[1] = -1; for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind) { + if(molRef.kinds[k].name == statV.memcVal.largeKind[t]) { kindL = molLookRef.GetCanSwapKind(k); - } else if(molRef.kinds[k].name == statV.memcVal.smallKind) { + } else if(molRef.kinds[k].name == statV.memcVal.smallKind[t]) { kindS = molLookRef.GetCanSwapKind(k); } } if(kindS == -1) { printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", - statV.memcVal.smallKind.c_str()); + statV.memcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", - statV.memcVal.largeKind.c_str()); + statV.memcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } for(uint i = 0; i < molRef.kinds[kindL].NumAtoms(); i++) { - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1) { + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom1[t]) { largeBB[0] = i; } - if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom2){ + if(molRef.kinds[kindL].atomNames[i] == statV.memcVal.largeBBAtom2[t]){ largeBB[1] = i; } } @@ -133,9 +137,9 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) for(uint i = 0; i < 2; i++) { if(largeBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); + statV.memcVal.largeBBAtom1[t].c_str(), + statV.memcVal.largeBBAtom2[t].c_str(), + statV.memcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } } @@ -148,6 +152,11 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) } } } + kindSVec.push_back(kindS); + kindLVec.push_back(kindL); + vector temp(largeBB, largeBB + 2); + largeBBVec.push_back(temp); + } } inline void MoleculeExchange1::AdjustExRatio() @@ -183,30 +192,29 @@ inline void MoleculeExchange1::AdjustExRatio() inline void MoleculeExchange1::SetBox() { #if ENSEMBLE == GEMC - double density; - double maxDens = 0.0; - uint densB; - //choose the sourceBox to be the dense phase - for(uint b = 0; b < BOX_TOTAL; b++) - { - density = 0.0; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) - { - density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * - molRef.kinds[k].molMass; - } - if(density > maxDens) - { - maxDens = density; - densB = b; - } - } + uint densB = mv::BOX0; + if(((counter + 1) % perAdjust) == 0) { + double density; + double maxDens = 0.0; + //choose the sourceBox to be the dense phase + for(uint b = 0; b < BOX_TOTAL; b++) { + density = 0.0; + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { + density += molLookRef.NumKindInBox(k, b) * boxDimRef.volInv[b] * + molRef.kinds[k].molMass; + } + if(density > maxDens) { + maxDens = density; + densB = b; + } + } + } - //Pick box in dense phase - sourceBox = densB; - //Pick the destination box - prng.SetOtherBox(destBox, sourceBox); - //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); + //Pick box in dense phase + sourceBox = densB; + //Pick the destination box + prng.SetOtherBox(destBox, sourceBox); + //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); #elif ENSEMBLE == GCMC sourceBox = 0; @@ -214,6 +222,16 @@ inline void MoleculeExchange1::SetBox() #endif } +inline void MoleculeExchange1::SetExchangeData() +{ + uint exType = prng.randIntExc(exchangeRatioVec.size()); + kindS = kindSVec[exType]; + kindL = kindLVec[exType]; + exchangeRatio = exchangeRatioVec[exType]; + largeBB[0] = largeBBVec[exType][0]; + largeBB[1] = largeBBVec[exType][1]; +} + inline uint MoleculeExchange1::PickMolInCav() { @@ -296,6 +314,8 @@ inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, prng.PickBool(insertL, subDraw, movPerc); //Set the source and dest Box. SetBox(); + //pick one of the exchange type + SetExchangeData(); //adjust exchange rate based on number of small kind in cavity //AdjustExRatio(); diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 3e2bd5c68..765348a7f 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -25,8 +25,6 @@ class MoleculeExchange2 : public MoleculeExchange1 MoleculeExchange2(System &sys, StaticVals const& statV) : MoleculeExchange1(sys, statV) { - smallBB[0] = -1; - smallBB[1] = -1; if(enableID) { SetMEMC(statV); } @@ -41,20 +39,25 @@ class MoleculeExchange2 : public MoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); virtual uint PickMolInCav(); virtual uint ReplaceMolecule(); virtual double GetCoeff() const; uint smallBB[2]; + //To store total sets of exchange pairs + vector< vector > smallBBVec; }; inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) { + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + smallBB[0] = smallBB[1] = -1; for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1) { + if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1[t]) { smallBB[0] = i; } - if(molRef.kinds[kindS].atomNames[i] ==statV.memcVal.smallBBAtom2){ + if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom2[t]){ smallBB[1] = i; } } @@ -62,26 +65,22 @@ inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) for(uint i = 0; i < 2; i++) { if(smallBB[i] == -1) { printf("Error: Atom name %s or %s was not found in %s residue.\n", - statV.memcVal.smallBBAtom1.c_str(), - statV.memcVal.smallBBAtom2.c_str(), - statV.memcVal.smallKind.c_str()); + statV.memcVal.smallBBAtom1[t].c_str(), + statV.memcVal.smallBBAtom2[t].c_str(), + statV.memcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } } - if(molRef.kinds[kindL].NumAtoms() > 1) { - if(largeBB[0] == largeBB[1]) { - printf("Error: Atom names in large molecule backbone cannot be same!\n"); - exit(EXIT_FAILURE); - } - } - - if(molRef.kinds[kindS].NumAtoms() > 1) { + if(molRef.kinds[kindSVec[t]].NumAtoms() > 1) { if(smallBB[0] == smallBB[1]) { printf("Error: Atom names in small molecule backbone cannot be same!\n"); exit(EXIT_FAILURE); } } + vector temp(smallBB, smallBB + 2); + smallBBVec.push_back(temp); + } } inline void MoleculeExchange2::AdjustExRatio() @@ -109,6 +108,19 @@ inline void MoleculeExchange2::AdjustExRatio() counter = 0; } } + + +inline void MoleculeExchange2::SetExchangeData() +{ + uint exType = prng.randIntExc(exchangeRatioVec.size()); + kindS = kindSVec[exType]; + kindL = kindLVec[exType]; + exchangeRatio = exchangeRatioVec[exType]; + largeBB[0] = largeBBVec[exType][0]; + largeBB[1] = largeBBVec[exType][1]; + smallBB[0] = smallBBVec[exType][0]; + smallBB[1] = smallBBVec[exType][1]; +} inline uint MoleculeExchange2::PickMolInCav() { diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index f968992c9..75068681a 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -40,6 +40,7 @@ class MoleculeExchange3 : public MoleculeExchange1 virtual void AdjustExRatio(); virtual void SetMEMC(StaticVals const& statV); + virtual void SetExchangeData(); virtual uint PickMolInCav(); virtual uint ReplaceMolecule(); virtual double GetCoeff() const; @@ -47,14 +48,16 @@ class MoleculeExchange3 : public MoleculeExchange1 inline void MoleculeExchange3::SetMEMC(StaticVals const& statV) { - if(largeBB[0] != largeBB[1]) { - printf("Error: In ME-3 move, atom name of backbone should be same.\n"); - printf("Atom names in backbone was set to %s or %s in %s residue.\n", - statV.memcVal.largeBBAtom1.c_str(), - statV.memcVal.largeBBAtom2.c_str(), - statV.memcVal.largeKind.c_str()); - exit(EXIT_FAILURE); - } + for(uint t = 0; t < exchangeRatioVec.size(); t++) { + if(largeBBVec[t][0] != largeBBVec[t][1]) { + printf("Error: In ME-3 move, atom name of backbone should be same.\n"); + printf("Atom names in backbone was set to %s or %s in %s residue.\n", + statV.memcVal.largeBBAtom1[t].c_str(), + statV.memcVal.largeBBAtom2[t].c_str(), + statV.memcVal.largeKind[t].c_str()); + exit(EXIT_FAILURE); + } + } } inline void MoleculeExchange3::AdjustExRatio() @@ -83,6 +86,11 @@ inline void MoleculeExchange3::AdjustExRatio() } } +inline void MoleculeExchange3::SetExchangeData() +{ + MoleculeExchange1::SetExchangeData(); +} + inline uint MoleculeExchange3::PickMolInCav() { uint state = mv::fail_state::NO_FAIL; From 77593824505514ac7fa354b299d4954c2054cef7 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 17 Jul 2018 16:06:59 -0400 Subject: [PATCH 070/199] Fix to error checking for MEMC-2 --- src/IntraMoleculeExchange2.h | 6 +++--- src/MoleculeExchange2.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 19c1b522f..cce6534a9 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -50,11 +50,11 @@ inline void IntraMoleculeExchange2::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { smallBB[0] = smallBB[1] = -1; - for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames[i] == statV.intraMemcVal.smallBBAtom1[t]) { + for(uint i = 0; i < molRef.kinds[kindSVec[t]].NumAtoms(); i++) { + if(molRef.kinds[kindSVec[t]].atomNames[i] == statV.intraMemcVal.smallBBAtom1[t]) { smallBB[0] = i; } - if(molRef.kinds[kindS].atomNames[i] ==statV.intraMemcVal.smallBBAtom2[t]){ + if(molRef.kinds[kindSVec[t]].atomNames[i] == statV.intraMemcVal.smallBBAtom2[t]) { smallBB[1] = i; } } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 765348a7f..80905496d 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -53,11 +53,11 @@ inline void MoleculeExchange2::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { smallBB[0] = smallBB[1] = -1; - for(uint i = 0; i < molRef.kinds[kindS].NumAtoms(); i++) { - if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom1[t]) { + for(uint i = 0; i < molRef.kinds[kindSVec[t]].NumAtoms(); i++) { + if(molRef.kinds[kindSVec[t]].atomNames[i] == statV.memcVal.smallBBAtom1[t]) { smallBB[0] = i; } - if(molRef.kinds[kindS].atomNames[i] == statV.memcVal.smallBBAtom2[t]){ + if(molRef.kinds[kindSVec[t]].atomNames[i] == statV.memcVal.smallBBAtom2[t]){ smallBB[1] = i; } } From 70724b043a154c0c375f5955f56391e4b3143a1b Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 18 Jul 2018 12:56:33 -0400 Subject: [PATCH 071/199] Avoid counting small kind molecule number in cavity for MEMC-2 and MEMC-3 when exchange ratio is 1. This would speed up the MEMC move. --- src/IntraMoleculeExchange2.h | 30 ++++++++++++++++++----------- src/IntraMoleculeExchange3.h | 30 ++++++++++++++++++----------- src/MoleculeExchange2.h | 37 ++++++++++++++++++++++-------------- src/MoleculeExchange3.h | 28 +++++++++++++++++---------- 4 files changed, 79 insertions(+), 46 deletions(-) diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index cce6534a9..7fb16d1f9 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -140,18 +140,22 @@ inline uint IntraMoleculeExchange2::PickMolInCav() TransposeMatrix(invCavA, cavA); //Find the small molecule kind in the cavityA - if(calcEnRef.FindMolInCavity(molInCav, centerA, cavity, invCavA, - sourceBox, kindS, exchangeRatio)) { + if((exchangeRatio == 1) || calcEnRef.FindMolInCavity(molInCav, centerA, + cavity, invCavA, sourceBox, kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kindS in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); - numSCavA = molInCav[kindS].size(); - //delete the picked small molecule from list - for(uint s = 0; s < numSCavA; s++) { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); + if(exchangeRatio == 1) { + numSCavA = 1; + } else { + numSCavA = molInCav[kindS].size(); + //delete the picked small molecule from list + for(uint s = 0; s < numSCavA; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } } for(uint n = 1; n < numInCavA; n++) { @@ -189,10 +193,14 @@ inline uint IntraMoleculeExchange2::PickMolInCav() } //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavB, cavB); - //find how many of KindS exist in this centerB (COM of kindL) - calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, - sourceBox, kindS, exchangeRatio); - numSCavB = molInCav[kindS].size(); + if(exchangeRatio == 1) { + numSCavB = 0; + } else { + //find how many of KindS exist in this centerB (COM of kindL) + calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, + sourceBox, kindS, exchangeRatio); + numSCavB = molInCav[kindS].size(); + } } return state; } diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 89b25e757..7fb41228a 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -104,18 +104,22 @@ inline uint IntraMoleculeExchange3::PickMolInCav() TransposeMatrix(invCavA, cavA); //Find the small molecule kind in the cavityA - if(calcEnRef.FindMolInCavity(molInCav, centerA, cavity, invCavA, - sourceBox, kindS, exchangeRatio)) { + if((exchangeRatio == 1) || calcEnRef.FindMolInCavity(molInCav, centerA, + cavity, invCavA, sourceBox, kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kindS in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); - numSCavA = molInCav[kindS].size(); - //delete the picked small molecule from list - for(uint s = 0; s < numSCavA; s++) { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); + if(exchangeRatio == 1) { + numSCavA = 1; + } else { + numSCavA = molInCav[kindS].size(); + //delete the picked small molecule from list + for(uint s = 0; s < numSCavA; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } } for(uint n = 1; n < numInCavA; n++) { @@ -148,10 +152,14 @@ inline uint IntraMoleculeExchange3::PickMolInCav() SetBasis(cavB, prng.RandomUnitVect()); //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavB, cavB); - //find how many of KindS exist in this centerB (COM of kindL) - calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, - sourceBox, kindS, exchangeRatio); - numSCavB = molInCav[kindS].size(); + if(exchangeRatio == 1) { + numSCavB = 0; + } else { + //find how many of KindS exist in this centerB (COM of kindL) + calcEnRef.FindMolInCavity(molInCav, centerB, cavity, invCavB, + sourceBox, kindS, exchangeRatio); + numSCavB = molInCav[kindS].size(); + } } return state; } diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 80905496d..c35e9c3a7 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -142,19 +142,24 @@ inline uint MoleculeExchange2::PickMolInCav() TransposeMatrix(invCavA, cavA); //Find the molecule kind 0 in the cavity - if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio)) { + if((exchangeRatio == 1) || calcEnRef.FindMolInCavity(molInCav, center, + cavity, invCavA, sourceBox, kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); - kindIndexA.push_back(pickedKS); - totMolInCav = molInCav[kindS].size(); - //delete the picked small molecule from list - for(uint s = 0; s < totMolInCav; s++) { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); - } + kindIndexA.push_back(pickedKS); + if(exchangeRatio == 1) { + totMolInCav = 1; + } else { + totMolInCav = molInCav[kindS].size(); + //delete the picked small molecule from list + for(uint s = 0; s < totMolInCav; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } + } + for(uint n = 1; n < numInCavA; n++) { //pick random exchangeRatio number of kindS in cavity uint picked = prng.randIntExc(molInCav[kindS].size()); @@ -199,11 +204,15 @@ inline uint MoleculeExchange2::ReplaceMolecule() //Calculate inverse matrix for cav. Here Inv = Transpose TransposeMatrix(invCavA, cavA); //Use to shift to the COM of new molecule - center = comCurrRef.Get(molIndexA[0]); - //find how many of KindS exist in this center - calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio); - totMolInCav = molInCav[kindS].size(); + center = comCurrRef.Get(molIndexA[0]); + if(exchangeRatio == 1) { + totMolInCav = 0; + } else { + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRatio); + totMolInCav = molInCav[kindS].size(); + } //pick exchangeRatio number of Small molecule from dest box state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 75068681a..32de04ecc 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -106,17 +106,21 @@ inline uint MoleculeExchange3::PickMolInCav() TransposeMatrix(invCavA, cavA); //Find the molecule kind 0 in the cavity - if(calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio)) { + if((exchangeRatio == 1) || calcEnRef.FindMolInCavity(molInCav, center, + cavity, invCavA, sourceBox, kindS, exchangeRatio)) { //Find the exchangeRatio number of molecules kind 0 in cavity numInCavA = exchangeRatio; //add the random picked small molecule to the list. molIndexA.push_back(pickedS); kindIndexA.push_back(pickedKS); - totMolInCav = molInCav[kindS].size(); - for(uint s = 0; s < totMolInCav; s++) { - if(pickedS == molInCav[kindS][s]) - molInCav[kindS].erase(molInCav[kindS].begin() + s); + if(exchangeRatio == 1) { + totMolInCav = 1; + } else { + totMolInCav = molInCav[kindS].size(); + for(uint s = 0; s < totMolInCav; s++) { + if(pickedS == molInCav[kindS][s]) + molInCav[kindS].erase(molInCav[kindS].begin() + s); + } } for(uint n = 1; n < numInCavA; n++) { @@ -159,10 +163,14 @@ inline uint MoleculeExchange3::ReplaceMolecule() //use the predefine atom in kindL as the center uint start = molRef.MolStart(molIndexA[0]) + largeBB[0]; center = coordCurrRef.Get(start); - //find how many of KindS exist in this center - calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, - kindS, exchangeRatio); - totMolInCav = molInCav[kindS].size(); + if(exchangeRatio == 1) { + totMolInCav = 0; + } else { + //find how many of KindS exist in this center + calcEnRef.FindMolInCavity(molInCav, center, cavity, invCavA, sourceBox, + kindS, exchangeRatio); + totMolInCav = molInCav[kindS].size(); + } //pick exchangeRatio number of Small molecule from dest box state = prng.PickMol(kindS, kindIndexB, molIndexB, numInCavB, destBox); } From d3dbda96ac1a774f0457eaccbd0edf9ecee365c3 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 19 Jul 2018 18:27:53 -0400 Subject: [PATCH 072/199] Print acceptance move for each molecule kind. --- src/CrankShaft.h | 18 ++++++++- src/IntraMoleculeExchange1.h | 25 ++++++++++++ src/IntraSwap.h | 26 +++++++++++-- src/MoleculeExchange1.h | 26 +++++++++++++ src/MoleculeTransfer.h | 26 +++++++++++-- src/MoveBase.h | 75 +++++++++++++++++++++++++++++++++++- src/Regrowth.h | 26 +++++++++++-- src/Simulation.cpp | 1 + src/System.cpp | 40 ++++++++++++++----- src/System.h | 3 ++ 10 files changed, 244 insertions(+), 22 deletions(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index 44fcdd780..cf5e91907 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -25,6 +25,7 @@ class CrankShaft : public MoveBase virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); private: uint GetBoxAndMol(const double subDraw, const double movPerc); MolPick molPick; @@ -40,8 +41,20 @@ class CrankShaft : public MoveBase Forcefield const& ffRef; }; -inline uint CrankShaft::GetBoxAndMol -(const double subDraw, const double movPerc) +void CrankShaft::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Crank-Shaft ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint CrankShaft::GetBoxAndMol(const double subDraw, const double movPerc) { #if ENSEMBLE == GCMC @@ -160,6 +173,7 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::CRANKSHAFT, sourceBox); moveSetRef.Update(result, subPick, step); + AcceptKind(result, kindIndex, sourceBox); } #endif diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 634fbc696..4ad62ae7e 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -49,13 +49,18 @@ class IntraMoleculeExchange1 : public MoveBase molInCavCount = 0; lastAccept = 0.0; exDiff = 1; + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); + accepted[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); } + } } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); protected: @@ -92,6 +97,23 @@ class IntraMoleculeExchange1 : public MoveBase Forcefield const& ffRef; }; +void IntraMoleculeExchange1::PrintAcceptKind() { + for(uint k = 0; k < kindLVec.size(); k++) { + uint ks = kindSVec[k]; + uint kl = kindLVec[k]; + uint index = ks * molRef.GetKindsCount() + kl; + printf("%-22s %5s - %-5s ", "% Accepted Intra-MEMC ", molRef.kinds[kl].name.c_str(), + molRef.kinds[ks].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][index] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][index]/trial[b][index])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { @@ -539,6 +561,9 @@ inline void IntraMoleculeExchange1::Accept(const uint rejectState, subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); moveSetRef.Update(result, subPick, step); + //If we consider total aceeptance of S->L and L->S + AcceptKind(result, kindS * molRef.GetKindsCount() + kindL, sourceBox); + AcceptKind(result, kindL * molRef.GetKindsCount() + kindS, sourceBox); } diff --git a/src/IntraSwap.h b/src/IntraSwap.h index 954444d8a..e9207e5d6 100644 --- a/src/IntraSwap.h +++ b/src/IntraSwap.h @@ -19,12 +19,19 @@ class IntraSwap : public MoveBase IntraSwap(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) {} + MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); private: uint GetBoxAndMol(const double subDraw, const double movPerc); MolPick molPick; @@ -40,8 +47,20 @@ class IntraSwap : public MoveBase Forcefield const& ffRef; }; -inline uint IntraSwap::GetBoxAndMol -(const double subDraw, const double movPerc) +void IntraSwap::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Intra-Swap ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint IntraSwap::GetBoxAndMol(const double subDraw, const double movPerc) { #if ENSEMBLE == GCMC @@ -160,6 +179,7 @@ inline void IntraSwap::Accept(const uint rejectState, const uint step) result = false; subPick = mv::GetMoveSubIndex(mv::INTRA_SWAP, sourceBox); moveSetRef.Update(result, subPick, step); + AcceptKind(result, kindIndex, sourceBox); } #endif diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 3d41441ed..f301941b5 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -52,13 +52,18 @@ class MoleculeExchange1 : public MoveBase molInCavCount = 0; lastAccept = 0.0; exDiff = 1; + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); + accepted[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); } + } } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); protected: @@ -101,6 +106,23 @@ class MoleculeExchange1 : public MoveBase Forcefield const& ffRef; }; +void MoleculeExchange1::PrintAcceptKind() { + for(uint k = 0; k < kindLVec.size(); k++) { + uint ks = kindSVec[k]; + uint kl = kindLVec[k]; + uint index = ks + kl * molRef.GetKindsCount(); + printf("%-22s %5s - %-5s ", "% Accepted MEMC ", molRef.kinds[kl].name.c_str(), + molRef.kinds[ks].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][index] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][index]/trial[b][index])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { @@ -738,6 +760,10 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::MEMC); moveSetRef.Update(result, subPick, step); #endif + //If we consider total aceeptance of S->L and L->S + AcceptKind(result, kindS + kindL * molRef.GetKindsCount(), sourceBox); + AcceptKind(result, kindS + kindL * molRef.GetKindsCount(), destBox); + } #endif diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index 00ba525bb..dc8cc1bd6 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -20,12 +20,19 @@ class MoleculeTransfer : public MoveBase MoleculeTransfer(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) {} + MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); private: @@ -44,8 +51,20 @@ class MoleculeTransfer : public MoveBase Forcefield const& ffRef; }; -inline uint MoleculeTransfer::GetBoxPairAndMol -(const double subDraw, const double movPerc) +void MoleculeTransfer::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Mol-Transfer ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint MoleculeTransfer::GetBoxPairAndMol(const double subDraw, const double movPerc) { // Need to call a function to pick a molecule that is not fixed but cannot be // swap between boxes. (beta != 1, beta !=2) @@ -222,6 +241,7 @@ inline void MoleculeTransfer::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::MOL_TRANSFER, sourceBox); moveSetRef.Update(result, subPick, step); + AcceptKind(result, kindIndex, destBox); } #endif diff --git a/src/MoveBase.h b/src/MoveBase.h index 72f0cbbf9..08dd9e0bf 100644 --- a/src/MoveBase.h +++ b/src/MoveBase.h @@ -48,6 +48,8 @@ class MoveBase #if ENSEMBLE == GEMC || ENSEMBLE == NPT fixBox0 = statV.fixVolBox0; #endif + trial.resize(BOX_TOTAL); + accepted.resize(BOX_TOTAL); } //Based on the random draw, determine the move kind, box, and @@ -65,6 +67,13 @@ class MoveBase //This function carries out actions based on the internal acceptance state. virtual void Accept(const uint rejectState, const uint step) = 0; + //This function carries out actions based on the internal acceptance state and + //molecule kind + void AcceptKind(const uint rejectState, const uint kind, const uint box); + + //This function print the internal acceptance state for each molecule kind + virtual void PrintAcceptKind() = 0; + virtual ~MoveBase() {} protected: @@ -84,8 +93,18 @@ class MoveBase const bool ewald; CellList& cellList; bool molRemoved, fixBox0; + //For move acceptance of each molecule kind + std::vector< std::vector > trial, accepted; }; +inline void MoveBase::AcceptKind(const uint rejectState, const uint kind, + const uint box) +{ + trial[box][kind]++; + if(rejectState) + accepted[box][kind]++; +} + //Data needed for transforming a molecule's position via inter or intrabox //moves. class MolTransformBase @@ -137,18 +156,38 @@ class Translate : public MoveBase, public MolTransformBase { public: - Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) {} + Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); uint ReplaceRot(Rotate const& other); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint rejectState, const uint step); + virtual void PrintAcceptKind(); private: Intermolecular inter_LJ, inter_Real, recip; XYZ newCOM; }; +void Translate::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Displacement ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + inline uint Translate::Prep(const double subDraw, const double movPerc) { return GetBoxAndMol(prng, molRef, subDraw, movPerc); @@ -212,21 +251,42 @@ inline void Translate::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); moveSetRef.Update(result, subPick, step); + AcceptKind(result, mk, b); } class Rotate : public MoveBase, public MolTransformBase { public: - Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) {} + Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); private: Intermolecular inter_LJ, inter_Real, recip; }; +void Rotate::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Rotation ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + inline uint Rotate::Prep(const double subDraw, const double movPerc) { uint state = GetBoxAndMol(prng, molRef, subDraw, movPerc); @@ -299,6 +359,7 @@ inline void Rotate::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::ROTATE, b); moveSetRef.Update(result, subPick, step); + AcceptKind(result, mk, b); } #if ENSEMBLE == GEMC || ENSEMBLE == NPT @@ -313,6 +374,7 @@ class VolumeTransfer : public MoveBase virtual uint Transform(); double GetCoeff() const; virtual void Accept(const uint rejectState, const uint step); + virtual void PrintAcceptKind(); private: //Note: This is only used for GEMC-NPT uint bPick[BOX_TOTAL], subPick, subPickT[BOX_TOTAL]; @@ -342,6 +404,15 @@ inline VolumeTransfer::VolumeTransfer(System &sys, StaticVals const& statV) : isOrth = statV.isOrthogonal; } +void VolumeTransfer::PrintAcceptKind() { + printf("%-37s", "% Accepted Volume-Transfer "); + for(uint b = 0; b < BOX_TOTAL; b++) { + uint index = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); + printf("%10.5f ", 100.0 * moveSetRef.GetAccept(index)); + } + std::cout << std::endl; +} + inline uint VolumeTransfer::Prep(const double subDraw, const double movPerc) { uint state = mv::fail_state::NO_FAIL; diff --git a/src/Regrowth.h b/src/Regrowth.h index 1067db78b..cd1bebbf9 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -19,12 +19,19 @@ class Regrowth : public MoveBase Regrowth(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) {} + MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); private: uint GetBoxAndMol(const double subDraw, const double movPerc); MolPick molPick; @@ -40,8 +47,20 @@ class Regrowth : public MoveBase Forcefield const& ffRef; }; -inline uint Regrowth::GetBoxAndMol -(const double subDraw, const double movPerc) +void Regrowth::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Regrowth ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint Regrowth::GetBoxAndMol(const double subDraw, const double movPerc) { #if ENSEMBLE == GCMC @@ -157,6 +176,7 @@ inline void Regrowth::Accept(const uint rejectState, const uint step) subPick = mv::GetMoveSubIndex(mv::REGROWTH, sourceBox); moveSetRef.Update(result, subPick, step); + AcceptKind(result, kindIndex, sourceBox); } #endif diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 327e79212..5fe9fb12d 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -73,6 +73,7 @@ void Simulation::RunSimulation(void) RunningCheck(step); #endif } + system->PrintAcceptance(); system->PrintTime(); } diff --git a/src/System.cpp b/src/System.cpp index c18c16446..0d9250c6b 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -204,22 +204,44 @@ void System::Accept(const uint kind, const uint rejectState, const uint step) moves[kind]->Accept(rejectState, step); } +void System::PrintAcceptance() +{ + std::cout << std::endl; + printf("%-24s %-15s", "Move Type", "Mol. Kind"); + for(uint b = 0; b < BOX_TOTAL; b++) { + sstrm::Converter toStr; + std::string numStr = ""; + toStr << b; + toStr >> numStr; + numStr = "BOX_" + numStr; + printf("%-11s", numStr.c_str()); + } + std::cout << std::endl; + + for(uint m = 0; m < mv::MOVE_KINDS_TOTAL; m++) { + if(statV.movePerc[m] > 0.0) + moves[m]->PrintAcceptKind(); + } + std::cout << std::endl; +} + void System::PrintTime() { //std::cout << "MC moves Execution time:\n"; - printf("%-30s %10.4f sec.\n", "Displacement:", moveTime[mv::DISPLACE]); - printf("%-30s %10.4f sec.\n", "Rotation:", moveTime[mv::ROTATE]); - printf("%-30s %10.4f sec.\n", "Intra-Swap:", moveTime[mv::INTRA_SWAP]); - printf("%-30s %10.4f sec.\n", "Regrowth:", moveTime[mv::REGROWTH]); - printf("%-30s %10.4f sec.\n", "Intra-MEMC:", moveTime[mv::INTRA_MEMC]); - printf("%-30s %10.4f sec.\n", "Crank-Shaft:", moveTime[mv::CRANKSHAFT]); + printf("%-36s %10.4f sec.\n", "Displacement:", moveTime[mv::DISPLACE]); + printf("%-36s %10.4f sec.\n", "Rotation:", moveTime[mv::ROTATE]); + printf("%-36s %10.4f sec.\n", "Intra-Swap:", moveTime[mv::INTRA_SWAP]); + printf("%-36s %10.4f sec.\n", "Regrowth:", moveTime[mv::REGROWTH]); + printf("%-36s %10.4f sec.\n", "Intra-MEMC:", moveTime[mv::INTRA_MEMC]); + printf("%-36s %10.4f sec.\n", "Crank-Shaft:", moveTime[mv::CRANKSHAFT]); #if ENSEMBLE == GEMC || ENSEMBLE == GCMC - printf("%-30s %10.4f sec.\n", "Molecule-Transfer:", + printf("%-36s %10.4f sec.\n", "Mol-Transfer:", moveTime[mv::MOL_TRANSFER]); - printf("%-30s %10.4f sec.\n", "Molecule-Exchange:", moveTime[mv::MEMC]); + printf("%-36s %10.4f sec.\n", "MEMC:", moveTime[mv::MEMC]); #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT - printf("%-30s %10.4f sec.\n", "Volume-Transfer:", moveTime[mv::VOL_TRANSFER]); + printf("%-36s %10.4f sec.\n", "Vol-Transfer:", moveTime[mv::VOL_TRANSFER]); #endif + std::cout << std::endl; } diff --git a/src/System.h b/src/System.h index a78a4974a..49bc71c64 100644 --- a/src/System.h +++ b/src/System.h @@ -42,6 +42,9 @@ class System //print move time void PrintTime(); + //print move time + void PrintAcceptance(); + // return ewald Ewald * GetEwald() { From ccb9e51d97564fa648c76eabac90a5085a5cf4fe Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 20 Jul 2018 14:03:28 -0400 Subject: [PATCH 073/199] Read combining rule for LJ sigma from config file. Use the tag 'VDWGeometricSigma true' to activate the geometric mean to combine LJ sigma. The default is false which arithmetic mean will be used to combine LJ sigma. --- src/ConfigSetup.cpp | 5 +++++ src/ConfigSetup.h | 2 +- src/FFParticle.cpp | 15 +++++++++++++-- src/FFParticle.h | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index f191f1fdb..dd9693ca3 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -77,6 +77,7 @@ ConfigSetup::ConfigSetup(void) sys.ff.rswitch = DBL_MAX; sys.ff.cutoff = DBL_MAX; sys.ff.cutoffLow = DBL_MAX; + sys.ff.vdwGeometricSigma = false; sys.moves.displace = DBL_MAX; sys.moves.rotate = DBL_MAX; sys.moves.intraSwap = DBL_MAX; @@ -349,6 +350,10 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readLargeBB = true; sys.intraMemcVal.readLargeBB = true; } + } else if(line[0] == "VDWGeometricSigma") { + sys.ff.vdwGeometricSigma = checkBool(line[1]); + if(sys.ff.vdwGeometricSigma) + printf("%-40s %-s A\n", "Info: Geometric mean to combine LJ sigma", "Active"); } else if(line[0] == "Rcut") { sys.ff.cutoff = stringtod(line[1]); printf("%-40s %-4.4f A\n", "Info: Cutoff", sys.ff.cutoff); diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index be4dbbc12..f810a16cb 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -130,7 +130,7 @@ struct VDWSwitch : public PotentialConfig { struct FFValues { uint VDW_KIND; double cutoff, cutoffLow, rswitch, oneFourScale; - bool doTailCorr; + bool doTailCorr, vdwGeometricSigma; std::string kind; static const std::string VDW, VDW_SHIFT, VDW_SWITCH; diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 4eca391fa..19fad8a43 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -83,6 +83,7 @@ void FFParticle::Init(ff_setup::Particle const& mie, //Size LJ particle kind arrays mass = new double [count]; vdwKind = sys.ff.VDW_KIND; + vdwGeometricSigma = sys.ff.vdwGeometricSigma; //Size LJ-LJ pair arrays uint size = num::Sq(count); @@ -280,10 +281,20 @@ void FFParticle::Blend(ff_setup::Particle const& mie, const double rCut) n[idx] = num::MeanA(mie.n, mie.n, i, j); n_1_4[idx] = num::MeanA(mie.n_1_4, mie.n_1_4, i, j); double cn = n[idx] / (n[idx] - 6) * pow(n[idx] / 6, (6 / (n[idx] - 6))); - double sigma = num::MeanA(mie.sigma, mie.sigma, i, j); double cn_1_4 = n_1_4[idx] / (n_1_4[idx] - 6) * pow(n_1_4[idx] / 6, (6 / (n_1_4[idx] - 6))); - double sigma_1_4 = num::MeanA(mie.sigma_1_4, mie.sigma_1_4, i, j); + + double sigma, sigma_1_4; + sigma = sigma_1_4 = 0.0; + + if(vdwGeometricSigma) { + sigma = num::MeanG(mie.sigma, mie.sigma, i, j); + sigma_1_4 = num::MeanG(mie.sigma_1_4, mie.sigma_1_4, i, j); + } else { + sigma = num::MeanA(mie.sigma, mie.sigma, i, j); + sigma_1_4 = num::MeanA(mie.sigma_1_4, mie.sigma_1_4, i, j); + } + double tc = 1.0; double rRat = sigma / rCut; // calculate sig^2 and tc*sig^3 diff --git a/src/FFParticle.h b/src/FFParticle.h index c8f9755ac..87f9f42d0 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -135,7 +135,7 @@ struct FFParticle { double rCutLow, rCutLowSq; uint count, vdwKind; - bool isMartini, ewald; + bool isMartini, ewald, vdwGeometricSigma; #ifdef GOMC_CUDA VariablesCUDA *varCUDA; #endif From b46a171239f1cce0ba8d5449ef5fcdad8279d69d Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 20 Jul 2018 15:08:09 -0400 Subject: [PATCH 074/199] Fix to the issue #98. --- lib/BasicTypes.h | 10 ++++++++++ src/BoxDimensions.cpp | 7 ++++++- src/BoxDimensionsNonOrth.cpp | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/BasicTypes.h b/lib/BasicTypes.h index 2acd2543a..a80ba5c0f 100644 --- a/lib/BasicTypes.h +++ b/lib/BasicTypes.h @@ -126,6 +126,16 @@ struct XYZ { m = z; return m; } + + double Min() const + { + double m = x; + if(y < m) + m = y; + if(z < m) + m = z; + return m; + } }; inline std::ostream& operator << (std::ostream & stream, const XYZ& p) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index aa5bffebb..083cbe980 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -45,7 +45,7 @@ void BoxDimensions::Init(config_setup::RestartSettings const& restart, confVolume.axis[b].CopyRange(cellBasis[b], 0, 0, 3); } else { fprintf(stderr, - "Error: Cell Basis not specified in PDB or in.dat files.\n"); + "Error: Cell Basis not specified in PDB or in.conf files.\n"); exit(EXIT_FAILURE); } @@ -66,6 +66,11 @@ void BoxDimensions::Init(config_setup::RestartSettings const& restart, axis.Set(b, cellBasis[b].Length(0), cellBasis[b].Length(1), cellBasis[b].Length(2)); + + if(axis.Get(b).Min() < 2.0 * rCut) { + printf("Error: Cutoff value is large than half of minimum BOX%d length!\n", b); + exit(EXIT_FAILURE); + } //Find Cosine Angle of alpha, beta and gamma cosAngle[b][0] = Dot(cellBasis[b].Get(1), cellBasis[b].Get(2)) / (axis.Get(b).y * axis.Get(b).z); diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index 1180697c7..83adfcbdc 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -45,7 +45,7 @@ void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, confVolume.axis[b].CopyRange(cellBasis[b], 0, 0, 3); } else { fprintf(stderr, - "Error: Cell Basis not specified in PDB or in.dat files.\n"); + "Error: Cell Basis not specified in PDB or in.conf files.\n"); exit(EXIT_FAILURE); } @@ -93,6 +93,12 @@ void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, //XYZ unslant = TransformUnSlant(cellLength.Get(b), b); //axis.Set(b, unslant.x, unslant.y, unslant.z); axis.Set(b, cellLength[b]); + + XYZ unslant = TransformUnSlant(cellLength.Get(b), b); + if(unslant.Min() < 2.0 * rCut) { + printf("Error: Cutoff value is large than half of minimum BOX%d length!\n", b); + exit(EXIT_FAILURE); + } } //Set half axis axis.CopyRange(halfAx, 0, 0, BOX_TOTAL); From 8e0deefa3440406168dc00ae1f0f70bcc2750049 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 20 Jul 2018 16:54:33 -0400 Subject: [PATCH 075/199] Error Checking to make sure all cellBasisVectors are defined. Fix to the error #98 --- src/BoxDimensionsNonOrth.cpp | 3 +- src/ConfigSetup.cpp | 58 ++++++++++++++++++++++-------------- src/ConfigSetup.h | 16 ++++++++-- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index 83adfcbdc..2e8dfeff9 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -94,8 +94,7 @@ void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, //axis.Set(b, unslant.x, unslant.y, unslant.z); axis.Set(b, cellLength[b]); - XYZ unslant = TransformUnSlant(cellLength.Get(b), b); - if(unslant.Min() < 2.0 * rCut) { + if(axis.Get(b).Min() < 2.0 * rCut) { printf("Error: Cutoff value is large than half of minimum BOX%d length!\n", b); exit(EXIT_FAILURE); } diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index dd9693ca3..9d4b4318f 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -527,13 +527,15 @@ void ConfigSetup::Init(const char *fileName) else if(line[0] == "CellBasisVector1") { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { - XYZ temp; - sys.volume.boxCoordRead++; - sys.volume.hasVolume = (sys.volume.boxCoordRead == 3 * BOX_TOTAL); - temp.x = stringtod(line[2]); - temp.y = stringtod(line[3]); - temp.z = stringtod(line[4]); - sys.volume.axis[box].Set(0, temp); + if(!sys.volume.readCellBasis[box][0]) { + XYZ temp; + temp.x = stringtod(line[2]); + temp.y = stringtod(line[3]); + temp.z = stringtod(line[4]); + sys.volume.axis[box].Set(0, temp); + sys.volume.readCellBasis[box][0] = true; + sys.volume.hasVolume = sys.volume.ReadCellBasis(); + } } else { std::cout << "Error: This simulation requires only " << BOX_TOTAL << " sets of Cell Basis Vector!" << std::endl; @@ -542,13 +544,15 @@ void ConfigSetup::Init(const char *fileName) } else if(line[0] == "CellBasisVector2") { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { - XYZ temp; - sys.volume.boxCoordRead++; - sys.volume.hasVolume = (sys.volume.boxCoordRead == 3 * BOX_TOTAL); - temp.x = stringtod(line[2]); - temp.y = stringtod(line[3]); - temp.z = stringtod(line[4]); - sys.volume.axis[box].Set(1, temp); + if(!sys.volume.readCellBasis[box][1]) { + XYZ temp; + temp.x = stringtod(line[2]); + temp.y = stringtod(line[3]); + temp.z = stringtod(line[4]); + sys.volume.axis[box].Set(1, temp); + sys.volume.readCellBasis[box][1] = true; + sys.volume.hasVolume = sys.volume.ReadCellBasis(); + } } else { std::cout << "Error: This simulation requires only " << BOX_TOTAL << " sets of Cell Basis Vector!" << std::endl; @@ -557,13 +561,15 @@ void ConfigSetup::Init(const char *fileName) } else if(line[0] == "CellBasisVector3") { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { - XYZ temp; - sys.volume.boxCoordRead++; - sys.volume.hasVolume = (sys.volume.boxCoordRead == 3 * BOX_TOTAL); - temp.x = stringtod(line[2]); - temp.y = stringtod(line[3]); - temp.z = stringtod(line[4]); - sys.volume.axis[box].Set(2, temp); + if(!sys.volume.readCellBasis[box][2]) { + XYZ temp; + temp.x = stringtod(line[2]); + temp.y = stringtod(line[3]); + temp.z = stringtod(line[4]); + sys.volume.axis[box].Set(2, temp); + sys.volume.readCellBasis[box][2] = true; + sys.volume.hasVolume = sys.volume.ReadCellBasis(); + } } else { std::cout << "Error: This simulation requires only " << BOX_TOTAL << " sets of Cell Basis Vector!" << std::endl; @@ -1051,7 +1057,15 @@ void ConfigSetup::verifyInputs(void) } if(!sys.volume.hasVolume && !in.restart.enable) { std::cout << "Error: This simulation requires to define " << 3 * BOX_TOTAL<< - " Cell Basis vectors!" << std::endl; + " Cell Basis vectors!" << std::endl; + for(uint b = 0; b < BOX_TOTAL; b++){ + for(uint i = 0; i < 3; i++) { + if(!sys.volume.readCellBasis[b][i]) { + std::cout << "Error: CellBasisVector" << i+1 << " for Box " << b << + " is missing!" << std::endl; + } + } + } exit(EXIT_FAILURE); } if(sys.ff.VDW_KIND == sys.ff.VDW_SWITCH_KIND && sys.ff.rswitch == DBL_MAX) { diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index f810a16cb..d4d7d2ea4 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -180,15 +180,25 @@ struct ElectroStatic { struct Volume { bool hasVolume, cstArea, cstVolBox0; - uint boxCoordRead; + bool readCellBasis[BOX_TOTAL][3]; XYZArray axis[BOX_TOTAL]; - Volume(void) : hasVolume(false), cstArea(false), cstVolBox0(false), - boxCoordRead(0) + Volume(void) : hasVolume(false), cstArea(false), cstVolBox0(false) { for(uint b = 0; b < BOX_TOTAL; ++b) { axis[b] = XYZArray(3); + std::fill_n(readCellBasis[b], 3, false); } } + + bool ReadCellBasis() const { + for(uint b = 0; b < BOX_TOTAL; ++b) { + for(uint i = 0; i < 3; i++) { + if(!readCellBasis[b][i]) + return false; + } + } + return true; + } }; //If particle number varies (e.g. GCMC, GEMC) load in parameters for From e1d814e8821b2596401b19de6681c6701eb76af2 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 23 Jul 2018 17:53:14 -0400 Subject: [PATCH 076/199] Resize the acceptance kind for crankshaft class --- src/CrankShaft.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index cf5e91907..40ff54ef2 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -19,7 +19,13 @@ class CrankShaft : public MoveBase CrankShaft(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) {} + MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); From 7c008bf63848e8a57241d9d3ca08f91319120cba Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 24 Jul 2018 15:22:42 -0400 Subject: [PATCH 077/199] Print Simulation ends time as day : hr : min --- src/Clock.h | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Clock.h b/src/Clock.h index 3ae42e483..eb5f23eba 100644 --- a/src/Clock.h +++ b/src/Clock.h @@ -31,10 +31,11 @@ struct Clock { lastTime = strt; lastStep = totSt - 1; } - void CheckTime(const uint step); + void CheckTime(const ulong step); void SetStart(); void SetStop(); double GetTimDiff(); + void CompletionTime(uint &day, uint &hr, uint &min); private: @@ -48,23 +49,26 @@ struct Clock { ulong stepsPerOut, prevStep, lastStep; }; -inline void Clock::CheckTime(const uint step) +inline void Clock::CheckTime(const ulong step) { - uint stepDelta = step - prevStep; + ulong stepDelta = step - prevStep; + double speed = 0.0; if (stepDelta == stepsPerOut && step != lastStep) { #if defined(__linux__) || defined(__APPLE__) gettimeofday(&tv, &tz); double currTime = (double)tv.tv_sec + (double)tv.tv_usec / 1000000; - std::cout << "Steps/sec. : " - << stepDelta / (currTime - lastTime) << std::endl; + speed = stepDelta / (currTime - lastTime); #elif (_WIN32) || (__CYGWIN__) clock_t currTime = clock(); - std::cout << "Steps/sec. : " - << stepDelta / (((double)currTime - lastTime) / CLOCKS_PER_SEC) - << std::endl; + speed = stepDelta / (((double)currTime - lastTime) / CLOCKS_PER_SEC); #endif + uint day, hr, min; prevStep = step; lastTime = currTime; + CompletionTime(day, hr, min); + printf("Steps/sec: %7.3f, Simulation ends in: %3d d: %3d h: %3d m \n", + speed, day, hr, min); + } else if (step == lastStep) { #if defined(__linux__) || defined(__APPLE__) gettimeofday(&tv, &tz); @@ -110,4 +114,21 @@ inline double Clock::GetTimDiff() #endif } +inline void Clock::CompletionTime(uint &day, uint &hr, uint &min) +{ + double speed = 0.0; +#if defined(__linux__) || defined(__APPLE__) + speed = (double)(prevStep) / (lastTime - strt); +#elif (_WIN32) || (__CYGWIN__) + speed = (double)(prevStep) / ((double)(lastTime - strt) / CLOCKS_PER_SEC); +#endif + ulong rem = lastStep - prevStep; + ulong sec = rem / speed; + day = sec / 86400; + sec = sec % 86400; + hr = sec / 3600; + sec = sec % 3600; + min = ceil(sec / 60.0); +} + #endif /*CLOCK_H*/ From dc865177afbb33ad0ea51b2aaa689fe5a6fdda19 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 24 Jul 2018 15:58:50 -0400 Subject: [PATCH 078/199] include header file to use printf in clock.h class --- src/Clock.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Clock.h b/src/Clock.h index eb5f23eba..9498de392 100644 --- a/src/Clock.h +++ b/src/Clock.h @@ -11,6 +11,7 @@ along with this program, also can be found at . #include #include "BasicTypes.h" //uint, ulong #include //for cout +#include #if defined(__linux__) || defined(__APPLE__) #include //for timing #elif (_WIN32) || (__CYGWIN__) @@ -66,7 +67,7 @@ inline void Clock::CheckTime(const ulong step) prevStep = step; lastTime = currTime; CompletionTime(day, hr, min); - printf("Steps/sec: %7.3f, Simulation ends in: %3d d: %3d h: %3d m \n", + printf("Steps/sec: %7.3f, Simulation ends in: %3d d: %3d h: %3d m \n\n", speed, day, hr, min); } else if (step == lastStep) { From 1f26742c44a7198fb2df972a25ec131116538259 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 25 Jul 2018 13:35:38 -0400 Subject: [PATCH 079/199] This branch is made to implement cutoff for real part of electrostatic. In this commit FFParticle class is cleaned up. Each Energy type owns its variable. --- src/FFParticle.cpp | 244 ++++++++---------------------------------- src/FFParticle.h | 37 +++---- src/FFShift.h | 50 +++++++++ src/FFSwitch.h | 31 ++++++ src/FFSwitchMartini.h | 101 +++++++++++++++++ 5 files changed, 242 insertions(+), 221 deletions(-) diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 19fad8a43..7909519b1 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -12,21 +12,16 @@ along with this program, also can be found at . #endif FFParticle::FFParticle() : mass(NULL), nameFirst(NULL), nameSec(NULL), - n(NULL), n_1_4(NULL), sigmaSq(NULL), - sigmaSq_1_4(NULL), epsilon_cn(NULL), epsilon(NULL), - epsilon_1_4(NULL), epsilon_cn_1_4(NULL), epsilon_cn_6(NULL), - epsilon_cn_6_1_4(NULL), nOver6(NULL), - nOver6_1_4(NULL), enCorrection(NULL), - virCorrection(NULL), shiftConst(NULL), - shiftConst_1_4(NULL), An(NULL), - Bn(NULL), Cn(NULL), An_1_4(NULL), Bn_1_4(NULL), - Cn_1_4(NULL), sig6(NULL), sign(NULL), + n(NULL), n_1_4(NULL), sigmaSq(NULL), sigmaSq_1_4(NULL), epsilon_cn(NULL), + epsilon(NULL), epsilon_1_4(NULL), epsilon_cn_1_4(NULL), epsilon_cn_6(NULL), + epsilon_cn_6_1_4(NULL), nOver6(NULL), nOver6_1_4(NULL), enCorrection(NULL), + virCorrection(NULL) #ifdef GOMC_CUDA - varCUDA(NULL), -#endif - sig6_1_4(NULL), sign_1_4(NULL), rCut(0), rCutSq(0), - rOnSq(0), rOn(0), A6(0), B6(0), C6(0), factor1(0), - factor2(0) {} + , varCUDA(NULL) +#endif + { + rCut = rCutSq = 0.0; + } FFParticle::~FFParticle(void) { @@ -40,7 +35,8 @@ FFParticle::~FFParticle(void) delete[] epsilon_cn; delete[] epsilon_cn_6; delete[] nOver6; - // parameter for 1-4 interaction, same one will be used for 1-3 interaction + // parameter for 1-4 interaction, + // same one will be used for 1-3 interaction delete[] sigmaSq_1_4; delete[] n_1_4; delete[] epsilon_1_4; @@ -51,19 +47,6 @@ FFParticle::~FFParticle(void) delete[] enCorrection; delete[] virCorrection; - delete[] shiftConst; - delete[] An; - delete[] Bn; - delete[] Cn; - delete[] sig6; - delete[] sign; - // parameter for 1-4 interaction, same one will be used for 1-3 interaction - delete[] shiftConst_1_4; - delete[] An_1_4; - delete[] Bn_1_4; - delete[] Cn_1_4; - delete[] sig6_1_4; - delete[] sign_1_4; #ifdef GOMC_CUDA DestroyCUDAVars(varCUDA); delete varCUDA; @@ -114,11 +97,6 @@ void FFParticle::Init(ff_setup::Particle const& mie, enCorrection = new double [size]; virCorrection = new double [size]; - if(vdwKind == sys.ff.VDW_SHIFT_KIND) { - shiftConst = new double [size]; - shiftConst_1_4 = new double [size]; - } - rCut = sys.ff.cutoff; rCutSq = rCut * rCut; rCutLow = sys.ff.cutoffLow; @@ -126,47 +104,10 @@ void FFParticle::Init(ff_setup::Particle const& mie, scaling_14 = sys.elect.oneFourScale; ewald = sys.elect.ewald; alpha = sys.elect.alpha; - diElectric_1 = 1.0 / sys.elect.dielectric; - - if(vdwKind == sys.ff.VDW_SWITCH_KIND && isMartini) { - An = new double [size]; - Bn = new double [size]; - Cn = new double [size]; - An_1_4 = new double [size]; - Bn_1_4 = new double [size]; - Cn_1_4 = new double [size]; - sign = new double [size]; - sig6 = new double [size]; - sign_1_4 = new double [size]; - sig6_1_4 = new double [size]; - - rOn = sys.ff.rswitch; - //in Martini, Coulomb switching distance is zero - rOnCoul = 0.0; - rOnSq = rOn * rOn; - // LJ constants - A6 = 6.0 * ((6.0 + 1) * rOn - (6.0 + 4) * rCut) / (pow(rCut, 6.0 + 2) * - pow(rCut - rOn, 2)); - B6 = -6.0 * ((6.0 + 1) * rOn - (6.0 + 3) * rCut) / (pow(rCut, 6.0 + 2) * - pow(rCut - rOn, 3)); - C6 = 1.0 / pow(rCut, 6.0) - A6 / 3.0 * pow(rCut - rOn, 3) - B6 / 4.0 * - pow(rCut - rOn, 4); - // Coulomb constants - A1 = 1.0 * ((1.0 + 1) * rOnCoul - (1.0 + 4) * rCut) / (pow(rCut, 1.0 + 2) * - pow(rCut - rOnCoul, 2)); - B1 = -1.0 * ((1.0 + 1) * rOnCoul - (1.0 + 3) * rCut) / (pow(rCut, 1.0 + 2) * - pow(rCut - rOnCoul, 3)); - C1 = 1.0 / pow(rCut, 1.0) - A1 / 3.0 * pow(rCut - rOnCoul, 3) - B1 / 4.0 * - pow(rCut - rOnCoul, 4); - } else if(vdwKind == sys.ff.VDW_SWITCH_KIND && !isMartini) { - rOn = sys.ff.rswitch; - rOnSq = rOn * rOn; - - factor1 = rCutSq - 3 * rOnSq; - factor2 = pow((rCutSq - rOnSq), -3); - } + //Combining VDW parameter Blend(mie, rCut); + //Adjusting VDW parameter using NBFIX AdjNBfix(mie, nbfix, rCut); #ifdef GOMC_CUDA @@ -180,93 +121,11 @@ double FFParticle::EnergyLRC(const uint kind1, const uint kind2) const return enCorrection[FlatIndex(kind1, kind2)]; } - double FFParticle::VirialLRC(const uint kind1, const uint kind2) const { return virCorrection[FlatIndex(kind1, kind2)]; } -void FFParticle::AdjNBfix(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, const double rCut) -{ - uint size = num::Sq(count); - for(uint i = 0; i < nbfix.epsilon.size(); i++) { - for(uint j = 0; j < size; j++) { - if(nbfix.getname(i) == nameFirst[j] || nbfix.getname(i) == nameSec[j]) { - n[j] = nbfix.n[i]; - n_1_4[j] = nbfix.n_1_4[i]; - double rRat = nbfix.sigma[i] / rCut, tc = 1.0; - //calculating sig^2 and tc*sig^3 - num::Cb(sigmaSq[j], tc, nbfix.sigma[i]); - sigmaSq_1_4[j] = nbfix.sigma_1_4[i] * nbfix.sigma_1_4[i]; - tc *= 0.5 * 4.0 * M_PI; - double cn = n[j] / (n[j] - 6) * pow(n[j] / 6, (6 / (n[j] - 6))); - double cn_1_4 = n_1_4[j] / (n_1_4[j] - 6) * - pow(n_1_4[j] / 6, (6 / (n_1_4[j] - 6))); - epsilon[j] = nbfix.epsilon[i]; - epsilon_cn[j] = cn * nbfix.epsilon[i]; - epsilon_1_4[j] = nbfix.epsilon_1_4[i]; - epsilon_cn_1_4[j] = cn_1_4 * nbfix.epsilon_1_4[i]; - epsilon_cn_6[j] = epsilon_cn[j] * 6; - epsilon_cn_6_1_4[j] = epsilon_cn_1_4[j] * 6; - nOver6[j] = n[j] / 6; - nOver6_1_4[j] = n_1_4[j] / 6; - enCorrection[j] = tc / (n[j] - 3) * epsilon_cn[j] * - ( pow(rRat, n[j] - 3) - - (double)(n[j] - 3.0) / 3.0 * pow(rRat, 3) ); - virCorrection[j] = tc / (n[j] - 3) * epsilon_cn_6[j] * - ( (double)(n[j]) / 6.0 * pow(rRat, n[j] - 3) - - (double)(n[j] - 3.0) / 3.0 * pow(rRat, 3) ); - - - if(vdwKind == num::VDW_SHIFT_KIND) { - double rRat2 = sigmaSq[j] / rCutSq; - double rRat4 = rRat2 * rRat2; - double attract = rRat4 * rRat2; - //for 1-4 interaction - double rRat2_1_4 = sigmaSq_1_4[j] / rCutSq; - double rRat4_1_4 = rRat2_1_4 * rRat2_1_4; - double attract_1_4 = rRat4_1_4 * rRat2_1_4; -#ifdef MIE_INT_ONLY - double repulse = num::POW(rRat2, rRat4, attract, n[j]); - double repulse_1_4 = - num::POW(rRat2_1_4, rRat4_1_4, attract_1_4, n_1_4[j]); -#else - double repulse = pow(sqrt(rRat2), n[j]); - double repulse_1_4 = pow(sqrt(rRat2_1_4), n_1_4[j]); -#endif - shiftConst[j] = epsilon_cn[j] * (repulse - attract); - shiftConst_1_4[j] = epsilon_cn_1_4[j] * - (repulse_1_4 - attract_1_4); - } - - if(vdwKind == num::VDW_SWITCH_KIND && isMartini) { - double pn = n[j]; - An[j] = pn * ((pn + 1) * rOn - (pn + 4) * rCut) / (pow(rCut, pn + 2) * - pow(rCut - rOn, 2)); - Bn[j] = -pn * ((pn + 1) * rOn - (pn + 3) * rCut) / (pow(rCut, pn + 2) * - pow(rCut - rOn, 3)); - Cn[j] = 1.0 / pow(rCut, pn) - An[j] / 3.0 * pow(rCut - rOn, 3) - - Bn[j] / 4.0 * pow(rCut - rOn, 4); - sig6[j] = pow(nbfix.sigma[i], 6); - sign[j] = pow(nbfix.sigma[i], pn); - - // for 1-4 interaction - double pn_1_4 = n_1_4[j]; - An_1_4[j] = pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 4) * rCut) / - (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 2)); - Bn_1_4[j] = -pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 3) * rCut) / - (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 3)); - Cn_1_4[j] = 1.0 / pow(rCut, pn_1_4) - An_1_4[j] / 3.0 * - pow(rCut - rOn, 3) - Bn_1_4[j] / 4.0 * pow(rCut - rOn, 4); - sig6_1_4[j] = pow(nbfix.sigma_1_4[i], 6); - sign_1_4[j] = pow(nbfix.sigma_1_4[i], pn_1_4); - } - } - } - } -} - void FFParticle::Blend(ff_setup::Particle const& mie, const double rCut) { for(uint i = 0; i < count; ++i) { @@ -315,50 +174,41 @@ void FFParticle::Blend(ff_setup::Particle const& mie, const double rCut) virCorrection[idx] = tc / (n[idx] - 3) * epsilon_cn_6[idx] * ( (double)(n[idx]) / 6.0 * pow(rRat, n[idx] - 3) - (double)(n[idx] - 3.0) / 3.0 * pow(rRat, 3) ); + } + } +} - if(vdwKind == num::VDW_SHIFT_KIND) { - double rRat2 = sigmaSq[idx] / rCutSq; - double rRat4 = rRat2 * rRat2; - double attract = rRat4 * rRat2; - //for 1-4 interaction - double rRat2_1_4 = sigmaSq_1_4[idx] / rCutSq; - double rRat4_1_4 = rRat2_1_4 * rRat2_1_4; - double attract_1_4 = rRat4_1_4 * rRat2_1_4; - -#ifdef MIE_INT_ONLY - double repulse = num::POW(rRat2, rRat4, attract, n[idx]); - double repulse_1_4 = - num::POW(rRat2_1_4, rRat4_1_4, attract_1_4, n_1_4[idx]); -#else - double repulse = pow(sqrt(rRat2), n[idx]); - double repulse_1_4 = pow(sqrt(rRat2_1_4), n_1_4[idx]); -#endif - shiftConst[idx] = epsilon_cn[idx] * (repulse - attract); - shiftConst_1_4[idx] = epsilon_cn_1_4[idx] * - (repulse_1_4 - attract_1_4); - } - - if(vdwKind == num::VDW_SWITCH_KIND && isMartini) { - double pn = n[idx]; - An[idx] = pn * ((pn + 1) * rOn - (pn + 4) * rCut) / (pow(rCut, pn + 2) * - pow(rCut - rOn, 2)); - Bn[idx] = -pn * ((pn + 1) * rOn - (pn + 3) * rCut) / (pow(rCut, pn + 2) * - pow(rCut - rOn, 3)); - Cn[idx] = 1.0 / pow(rCut, pn) - An[idx] / 3.0 * pow(rCut - rOn, 3) - - Bn[idx] / 4.0 * pow(rCut - rOn, 4); - sig6[idx] = pow(sigma, 6); - sign[idx] = pow(sigma, pn); - - // for 1-4 interaction - double pn_1_4 = n_1_4[idx]; - An_1_4[idx] = pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 4) * rCut) / - (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 2)); - Bn_1_4[idx] = -pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 3) * rCut) / - (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 3)); - Cn_1_4[idx] = 1.0 / pow(rCut, pn_1_4) - An_1_4[idx] / 3.0 * - pow(rCut - rOn, 3) - Bn_1_4[idx] / 4.0 * pow(rCut - rOn, 4); - sig6_1_4[idx] = pow(sigma_1_4, 6); - sign_1_4[idx] = pow(sigma_1_4, pn_1_4); +void FFParticle::AdjNBfix(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, const double rCut) +{ + uint size = num::Sq(count); + for(uint i = 0; i < nbfix.epsilon.size(); i++) { + for(uint j = 0; j < size; j++) { + if(nbfix.getname(i) == nameFirst[j] || nbfix.getname(i) == nameSec[j]) { + n[j] = nbfix.n[i]; + n_1_4[j] = nbfix.n_1_4[i]; + double rRat = nbfix.sigma[i] / rCut, tc = 1.0; + //calculating sig^2 and tc*sig^3 + num::Cb(sigmaSq[j], tc, nbfix.sigma[i]); + sigmaSq_1_4[j] = nbfix.sigma_1_4[i] * nbfix.sigma_1_4[i]; + tc *= 0.5 * 4.0 * M_PI; + double cn = n[j] / (n[j] - 6) * pow(n[j] / 6, (6 / (n[j] - 6))); + double cn_1_4 = n_1_4[j] / (n_1_4[j] - 6) * + pow(n_1_4[j] / 6, (6 / (n_1_4[j] - 6))); + epsilon[j] = nbfix.epsilon[i]; + epsilon_cn[j] = cn * nbfix.epsilon[i]; + epsilon_1_4[j] = nbfix.epsilon_1_4[i]; + epsilon_cn_1_4[j] = cn_1_4 * nbfix.epsilon_1_4[i]; + epsilon_cn_6[j] = epsilon_cn[j] * 6; + epsilon_cn_6_1_4[j] = epsilon_cn_1_4[j] * 6; + nOver6[j] = n[j] / 6; + nOver6_1_4[j] = n_1_4[j] / 6; + enCorrection[j] = tc / (n[j] - 3) * epsilon_cn[j] * + ( pow(rRat, n[j] - 3) - + (double)(n[j] - 3.0) / 3.0 * pow(rRat, 3) ); + virCorrection[j] = tc / (n[j] - 3) * epsilon_cn_6[j] * + ( (double)(n[j]) / 6.0 * pow(rRat, n[j] - 3) - + (double)(n[j] - 3.0) / 3.0 * pow(rRat, 3) ); } } } diff --git a/src/FFParticle.h b/src/FFParticle.h index 87f9f42d0..288e97fcd 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -52,11 +52,11 @@ struct FFParticle { FFParticle(); ~FFParticle(void); - double GetMass(const uint kind) const - { - return mass[kind]; - } - + virtual void Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind); + double GetEpsilon(const uint i, const uint j) const; double GetEpsilon_1_4(const uint i, const uint j) const; double GetSigma(const uint i, const uint j) const; @@ -82,19 +82,13 @@ struct FFParticle { const double qi_qj_Fact, const bool NB) const; - void Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind); //!Returns Energy long-range correction term for a kind pair virtual double EnergyLRC(const uint kind1, const uint kind2) const; //!Returns Energy long-range correction term for a kind pair virtual double VirialLRC(const uint kind1, const uint kind2) const; - uint NumKinds() const - { - return count; - } + uint NumKinds() const { return count; } + double GetMass(const uint kind) const { return mass[kind]; } #ifdef GOMC_CUDA VariablesCUDA *getCUDAVars() @@ -104,16 +98,14 @@ struct FFParticle { #endif protected: - - uint FlatIndex(const uint i, const uint j) const - { - return i + j * count; - } + //Find the index of the pair kind + uint FlatIndex(const uint i, const uint j) const { return i + j * count; } + //Combining sigma, epsilon, and n value for different kind void Blend(ff_setup::Particle const& mie, const double rCut); + //Use NBFIX to adjust sigma, epsilon, and n value for different kind void AdjNBfix(ff_setup::Particle const& mie, ff_setup::NBfix const& nbfix, const double rCut); - //vars for lj particles. double* mass; std::string *nameFirst; std::string *nameSec; @@ -127,11 +119,8 @@ struct FFParticle { //For LJ eps_cn(en) --> 4eps, eps_cn_6 --> 24eps, eps_cn_n --> 48eps double * sigmaSq, * epsilon, * epsilon_1_4, * epsilon_cn, * epsilon_cn_6, * nOver6, * sigmaSq_1_4, * epsilon_cn_1_4, * epsilon_cn_6_1_4, * nOver6_1_4, - * enCorrection, * virCorrection, *shiftConst, *An, *Bn, *Cn, *sig6, - *sign, *shiftConst_1_4, *An_1_4, *Bn_1_4, *Cn_1_4, *sig6_1_4, *sign_1_4; - - double rCut, rCutSq, rOn, rOnSq, rOnCoul, A1, B1, C1, A6, B6, C6, - factor1, factor2, scaling_14, alpha, diElectric_1; + * enCorrection, * virCorrection; + double rCut, rCutSq, scaling_14, alpha; double rCutLow, rCutLowSq; uint count, vdwKind; diff --git a/src/FFShift.h b/src/FFShift.h index 8b5e50b4c..0bdcd0612 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -30,6 +30,18 @@ along with this program, also can be found at . struct FF_SHIFT : public FFParticle { public: + FF_SHIFT() : FFParticle(), shiftConst(NULL), shiftConst_1_4(NULL) {} + ~FF_SHIFT() + { + FFParticle::~FFParticle(); + delete[] shiftConst; + delete[] shiftConst_1_4; + } + + virtual void Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind); virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; @@ -59,8 +71,46 @@ struct FF_SHIFT : public FFParticle { { return 0.0; } + + protected: + + double *shiftConst, *shiftConst_1_4; + }; +inline void FF_SHIFT::Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind) +{ + //Initializ sigma and epsilon + FFParticle::Init(mie, nbfix, sys, ffKind); + uint size = num::Sq(count); + //allocate memory + shiftConst = new double [size]; + shiftConst_1_4 = new double [size]; + //calculate shift constant + for(uint i = 0; i < count; ++i) { + for(uint j = 0; j < count; ++j) { + uint idx = FlatIndex(i, j); + double rRat2 = sigmaSq[idx] / rCutSq; + double rRat4 = rRat2 * rRat2; + double attract = rRat4 * rRat2; + //for 1-4 interaction + double rRat2_1_4 = sigmaSq_1_4[idx] / rCutSq; + double rRat4_1_4 = rRat2_1_4 * rRat2_1_4; + double attract_1_4 = rRat4_1_4 * rRat2_1_4; + double repulse = pow(sqrt(rRat2), n[idx]); + double repulse_1_4 = pow(sqrt(rRat2_1_4), n_1_4[idx]); + + shiftConst[idx] = epsilon_cn[idx] * (repulse - attract); + shiftConst_1_4[idx] = epsilon_cn_1_4[idx] * + (repulse_1_4 - attract_1_4); + + } + } +} + inline void FF_SHIFT::CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const diff --git a/src/FFSwitch.h b/src/FFSwitch.h index 31f220993..9fb841407 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -40,6 +40,20 @@ along with this program, also can be found at . struct FF_SWITCH : public FFParticle { public: + FF_SWITCH() : FFParticle() + { + rOnSq = rOn = factor1 = factor2 = 0.0; + } + ~FF_SWITCH() + { + FFParticle::~FFParticle(); + } + + virtual void Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind); + virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, @@ -69,8 +83,25 @@ struct FF_SWITCH : public FFParticle { return 0.0; } + protected: + + double rOn, rOnSq, factor1, factor2; + }; +inline void FF_SWITCH::Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind) +{ + //Initializ sigma and epsilon + FFParticle::Init(mie, nbfix, sys, ffKind); + rOn = sys.ff.rswitch; + rOnSq = rOn * rOn; + //calculate switch constant + factor1 = rCutSq - 3 * rOnSq; + factor2 = pow((rCutSq - rOnSq), -3); +} inline void FF_SWITCH::CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index 2f1e9cf96..995382694 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -48,6 +48,32 @@ along with this program, also can be found at . struct FF_SWITCH_MARTINI : public FFParticle { public: + FF_SWITCH_MARTINI() : FFParticle(), An(NULL),Bn(NULL), Cn(NULL), + An_1_4(NULL), Bn_1_4(NULL), Cn_1_4(NULL), sig6(NULL), sign(NULL), + sig6_1_4(NULL), sign_1_4(NULL) + { + A1= B1 = C1 = A6 = B6 = C6 = 0.0; + } + ~FF_SWITCH_MARTINI() + { + FFParticle::~FFParticle(); + delete[] An; + delete[] Bn; + delete[] Cn; + delete[] An_1_4; + delete[] Bn_1_4; + delete[] Cn_1_4; + delete[] sig6; + delete[] sign; + delete[] sig6_1_4; + delete[] sign_1_4; + } + + virtual void Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind); + virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, @@ -78,8 +104,83 @@ struct FF_SWITCH_MARTINI : public FFParticle { return 0.0; } + protected: + + double *An, *Bn, *Cn, *An_1_4, *Bn_1_4, *Cn_1_4; + double *sig6, *sig6_1_4, *sign, *sign_1_4; + + double diElectric_1, rOn, rOnSq, rOnCoul, A1, B1, C1, A6, B6, C6; + }; +inline void FF_SWITCH_MARTINI::Init(ff_setup::Particle const& mie, + ff_setup::NBfix const& nbfix, + config_setup::SystemVals const& sys, + config_setup::FFKind const& ffKind) +{ + //Initializ sigma and epsilon + FFParticle::Init(mie, nbfix, sys, ffKind); + uint size = num::Sq(count); + //allocate memory + An = new double [size]; + Bn = new double [size]; + Cn = new double [size]; + sign = new double [size]; + sig6 = new double [size]; + An_1_4 = new double [size]; + Bn_1_4 = new double [size]; + Cn_1_4 = new double [size]; + sign_1_4 = new double [size]; + sig6_1_4 = new double [size]; + //Set martini constant + diElectric_1 = 1.0 / sys.elect.dielectric; + rOn = sys.ff.rswitch; + rOnSq = rOn * rOn; + //in Martini, Coulomb switching distance is zero + rOnCoul = 0.0; + // Set LJ constants + A6 = 6.0 * ((6.0 + 1) * rOn - (6.0 + 4) * rCut) / (pow(rCut, 6.0 + 2) * + pow(rCut - rOn, 2)); + B6 = -6.0 * ((6.0 + 1) * rOn - (6.0 + 3) * rCut) / (pow(rCut, 6.0 + 2) * + pow(rCut - rOn, 3)); + C6 = 1.0 / pow(rCut, 6.0) - A6 / 3.0 * pow(rCut - rOn, 3) - B6 / 4.0 * + pow(rCut - rOn, 4); + // Set Coulomb constants + A1 = 1.0 * ((1.0 + 1) * rOnCoul - (1.0 + 4) * rCut) / (pow(rCut, 1.0 + 2) * + pow(rCut - rOnCoul, 2)); + B1 = -1.0 * ((1.0 + 1) * rOnCoul - (1.0 + 3) * rCut) / (pow(rCut, 1.0 + 2) * + pow(rCut - rOnCoul, 3)); + C1 = 1.0 / pow(rCut, 1.0) - A1 / 3.0 * pow(rCut - rOnCoul, 3) - B1 / 4.0 * + pow(rCut - rOnCoul, 4); + + for(uint i = 0; i < count; ++i) { + for(uint j = 0; j < count; ++j) { + uint idx = FlatIndex(i, j); + double pn = n[idx]; + An[idx] = pn * ((pn + 1) * rOn - (pn + 4) * rCut) / (pow(rCut, pn + 2) * + pow(rCut - rOn, 2)); + Bn[idx] = -pn * ((pn + 1) * rOn - (pn + 3) * rCut) / (pow(rCut, pn + 2) * + pow(rCut - rOn, 3)); + Cn[idx] = 1.0 / pow(rCut, pn) - An[idx] / 3.0 * pow(rCut - rOn, 3) - + Bn[idx] / 4.0 * pow(rCut - rOn, 4); + double sigma = sqrt(sigmaSq[idx]); + sig6[idx] = pow(sigma, 6); + sign[idx] = pow(sigma, pn); + + // for 1-4 interaction + double pn_1_4 = n_1_4[idx]; + An_1_4[idx] = pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 4) * rCut) / + (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 2)); + Bn_1_4[idx] = -pn_1_4 * ((pn_1_4 + 1) * rOn - (pn_1_4 + 3) * rCut) / + (pow(rCut, pn_1_4 + 2) * pow(rCut - rOn, 3)); + Cn_1_4[idx] = 1.0 / pow(rCut, pn_1_4) - An_1_4[idx] / 3.0 * + pow(rCut - rOn, 3) - Bn_1_4[idx] / 4.0 * pow(rCut - rOn, 4); + double sigma_1_4 = sqrt(sigmaSq_1_4[idx]); + sig6_1_4[idx] = pow(sigma_1_4, 6); + sign_1_4[idx] = pow(sigma_1_4, pn_1_4); + } + } +} inline void FF_SWITCH_MARTINI::CalcAdd_1_4(double& en, const double distSq, const uint kind1, From aa1828991dacc9fe4263d38c11e077076136ef92 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 25 Jul 2018 15:42:15 -0400 Subject: [PATCH 080/199] Seperating Displacement, Rotation, and VolumeTransfer to individual header file --- CMake/FileLists.cmake | 3 + src/MoveBase.h | 495 +----------------------------------------- src/Rotation.h | 115 ++++++++++ src/System.cpp | 3 + src/Translate.h | 122 +++++++++++ src/VolumeTransfer.h | 291 +++++++++++++++++++++++++ 6 files changed, 536 insertions(+), 493 deletions(-) create mode 100644 src/Rotation.h create mode 100644 src/Translate.h create mode 100644 src/VolumeTransfer.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index d6b3483bc..4f975bfcd 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -116,6 +116,7 @@ set(headers src/PSFOutput.h src/Reader.h src/Regrowth.h + src/Rotation.h src/SeedReader.h src/Setup.h src/SimEventFrequency.h @@ -124,6 +125,8 @@ set(headers src/SubdividedArray.h src/System.h src/TransformMatrix.h + src/Translate.h + src/VolumeTransfer.h src/Writer.h src/XYZArray.h src/cbmc/DCComponent.h diff --git a/src/MoveBase.h b/src/MoveBase.h index 08dd9e0bf..7f0a5c008 100644 --- a/src/MoveBase.h +++ b/src/MoveBase.h @@ -25,12 +25,6 @@ along with this program, also can be found at . #include "NoEwald.h" #include "MolPick.h" #include "Forcefield.h" -#ifdef _OPENMP -#include -#endif -#ifdef GOMC_CUDA -#include "ConstantDefinitionsCUDAKernel.cuh" -#endif class MoveBase { @@ -121,9 +115,8 @@ class MolTransformBase XYZArray newMolPos; }; -inline uint MolTransformBase::GetBoxAndMol -(PRNG & prng, Molecules const& molRef, - const double subDraw, const double movPerc) +inline uint MolTransformBase::GetBoxAndMol(PRNG & prng, Molecules const& molRef, + const double subDraw, const double movPerc) { #if ENSEMBLE == GCMC b = mv::BOX0; @@ -150,488 +143,4 @@ inline void MolTransformBase::ReplaceWith(MolTransformBase const& other) newMolPos = other.newMolPos; } -class Rotate; - -class Translate : public MoveBase, public MolTransformBase -{ -public: - - Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } - - virtual uint Prep(const double subDraw, const double movPerc); - uint ReplaceRot(Rotate const& other); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint rejectState, const uint step); - virtual void PrintAcceptKind(); -private: - Intermolecular inter_LJ, inter_Real, recip; - XYZ newCOM; -}; - -void Translate::PrintAcceptKind() { - for(uint k = 0; k < molRef.GetKindsCount(); k++) { - printf("%-30s %-5s ", "% Accepted Displacement ", molRef.kinds[k].name.c_str()); - for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); - else - printf("%10.5f ", 0.0); - } - std::cout << std::endl; - } -} - -inline uint Translate::Prep(const double subDraw, const double movPerc) -{ - return GetBoxAndMol(prng, molRef, subDraw, movPerc); -} - -inline uint Translate::Transform() -{ - subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); - coordCurrRef.TranslateRand(newMolPos, newCOM, pStart, pLen, - m, b, moveSetRef.Scale(subPick)); - return mv::fail_state::NO_FAIL; -} - -inline void Translate::CalcEn() -{ - cellList.RemoveMol(m, b, coordCurrRef); - molRemoved = true; - - //calculate LJ interaction and real term of electrostatic interaction - calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); - //calculate reciprocate term of electrostatic interaction - recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); - -} - -inline void Translate::Accept(const uint rejectState, const uint step) -{ - bool res = false; - if (rejectState == mv::fail_state::NO_FAIL) { - double pr = prng(); - res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + - recip.energy)); - } - bool result = (rejectState == mv::fail_state::NO_FAIL) && res; - - if (result) { - //Set new energy. - // setting energy and virial of LJ interaction - sysPotRef.boxEnergy[b].inter += inter_LJ.energy; - // setting energy and virial of coulomb interaction - sysPotRef.boxEnergy[b].real += inter_Real.energy; - // setting energy and virial of recip term - sysPotRef.boxEnergy[b].recip += recip.energy;; - - //Copy coords - newMolPos.CopyRange(coordCurrRef, 0, pStart, pLen); - comCurrRef.Set(m, newCOM); - calcEwald->UpdateRecip(b); - - sysPotRef.Total(); - } - - if(molRemoved) { - // It means that Recip energy is calculated and move not accepted - if(!result) { - calcEwald->RestoreMol(m); - } - cellList.AddMol(m, b, coordCurrRef); - molRemoved = false; - } - - subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, mk, b); -} - -class Rotate : public MoveBase, public MolTransformBase -{ -public: - Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } - - virtual uint Prep(const double subDraw, const double movPerc); - virtual uint Transform(); - virtual void CalcEn(); - virtual void Accept(const uint earlyReject, const uint step); - virtual void PrintAcceptKind(); -private: - Intermolecular inter_LJ, inter_Real, recip; -}; - -void Rotate::PrintAcceptKind() { - for(uint k = 0; k < molRef.GetKindsCount(); k++) { - printf("%-30s %-5s ", "% Accepted Rotation ", molRef.kinds[k].name.c_str()); - for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); - else - printf("%10.5f ", 0.0); - } - std::cout << std::endl; - } -} - -inline uint Rotate::Prep(const double subDraw, const double movPerc) -{ - uint state = GetBoxAndMol(prng, molRef, subDraw, movPerc); - if (state == mv::fail_state::NO_FAIL && molRef.NumAtoms(mk) <= 1) - state = mv::fail_state::ROTATE_ON_SINGLE_ATOM; - return state; -} - -inline uint Translate::ReplaceRot(Rotate const& other) -{ - ReplaceWith(other); - return mv::fail_state::NO_FAIL; -} - -inline uint Rotate::Transform() -{ - subPick = mv::GetMoveSubIndex(mv::ROTATE, b); - coordCurrRef.RotateRand(newMolPos, pStart, pLen, m, b, - moveSetRef.Scale(subPick)); - return mv::fail_state::NO_FAIL; -} - -inline void Rotate::CalcEn() -{ - cellList.RemoveMol(m, b, coordCurrRef); - molRemoved = true; - - //calculate LJ interaction and real term of electrostatic interaction - calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); - //calculate reciprocate term of electrostatic interaction - recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); -} - -inline void Rotate::Accept(const uint rejectState, const uint step) -{ - bool res = false; - - if (rejectState == mv::fail_state::NO_FAIL) { - double pr = prng(); - res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + - recip.energy)); - } - bool result = (rejectState == mv::fail_state::NO_FAIL) && res; - - if (result) { - //Set new energy. - // setting energy and virial of LJ interaction - sysPotRef.boxEnergy[b].inter += inter_LJ.energy; - // setting energy and virial of coulomb interaction - sysPotRef.boxEnergy[b].real += inter_Real.energy; - // setting energy and virial of recip term - sysPotRef.boxEnergy[b].recip += recip.energy; - - //Copy coords - newMolPos.CopyRange(coordCurrRef, 0, pStart, pLen); - calcEwald->UpdateRecip(b); - - sysPotRef.Total(); - } - - if(molRemoved) { - // It means that Recip energy is calculated and move not accepted - if(!result) { - calcEwald->RestoreMol(m); - } - - cellList.AddMol(m, b, coordCurrRef); - molRemoved = false; - } - - subPick = mv::GetMoveSubIndex(mv::ROTATE, b); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, mk, b); -} - -#if ENSEMBLE == GEMC || ENSEMBLE == NPT - -class VolumeTransfer : public MoveBase -{ -public: - VolumeTransfer(System &sys, StaticVals const& statV); - - virtual uint Prep(const double subDraw, const double movPerc); - virtual void CalcEn(); - virtual uint Transform(); - double GetCoeff() const; - virtual void Accept(const uint rejectState, const uint step); - virtual void PrintAcceptKind(); -private: - //Note: This is only used for GEMC-NPT - uint bPick[BOX_TOTAL], subPick, subPickT[BOX_TOTAL]; - SystemPotential sysPotNew; - const Forcefield& forcefield; - BoxDimensions newDim; - BoxDimensionsNonOrth newDimNonOrth; - Coordinates newMolsPos; - COM newCOMs; - MoleculeLookup & molLookRef; - const uint GEMC_KIND; - const double PRESSURE; - bool regrewGrid, isOrth; -}; - -inline VolumeTransfer::VolumeTransfer(System &sys, StaticVals const& statV) : - MoveBase(sys, statV), molLookRef(sys.molLookupRef), - newMolsPos(boxDimRef, newCOMs, sys.molLookupRef, - sys.prng, statV.mol), forcefield(statV.forcefield), - newDim(), newDimNonOrth(), - newCOMs(sys.boxDimRef, newMolsPos, sys.molLookupRef, - statV.mol), GEMC_KIND(statV.kindOfGEMC), - PRESSURE(statV.pressure), regrewGrid(false) -{ - newMolsPos.Init(sys.coordinates.Count()); - newCOMs.Init(statV.mol.count); - isOrth = statV.isOrthogonal; -} - -void VolumeTransfer::PrintAcceptKind() { - printf("%-37s", "% Accepted Volume-Transfer "); - for(uint b = 0; b < BOX_TOTAL; b++) { - uint index = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); - printf("%10.5f ", 100.0 * moveSetRef.GetAccept(index)); - } - std::cout << std::endl; -} - -inline uint VolumeTransfer::Prep(const double subDraw, const double movPerc) -{ - uint state = mv::fail_state::NO_FAIL; - if (GEMC_KIND == mv::GEMC_NVT) { - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER); - for (uint b = 0; b < BOX_TOTAL; b++) { - bPick[b] = b; - } - } - if (GEMC_KIND == mv::GEMC_NPT) { -#if ENSEMBLE == NPT - prng.PickBox(bPick[0], subDraw, movPerc); -#else - prng.PickBoxPair(bPick[0], bPick[1], subDraw, movPerc); -#endif - for (uint b = 0; b < BOX_TOTAL; b++) { - subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); - } - } - - if(isOrth) - newDim = boxDimRef; - else - newDimNonOrth = *((BoxDimensionsNonOrth*)(&boxDimRef)); - - coordCurrRef.CopyRange(newMolsPos, 0, 0, coordCurrRef.Count()); - comCurrRef.CopyRange(newCOMs, 0, 0, comCurrRef.Count()); - return state; -} - -inline uint VolumeTransfer::Transform() -{ - uint state = mv::fail_state::NO_FAIL; - //Reinit, if necessary. - if (GEMC_KIND == mv::GEMC_NVT) { - double max = moveSetRef.Scale(subPick); - if(isOrth) - coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, newDim, - comCurrRef, max); - else - coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, - newDimNonOrth, comCurrRef, max); - } else { - XYZ scale[BOX_TOTAL]; - for (uint b = 0; b < BOX_TOTAL; b++) { - if (state == mv::fail_state::NO_FAIL) { - if ((bPick[b] == 0) && fixBox0) - continue; - - double max = moveSetRef.Scale(subPickT[bPick[b]]); - double delta = prng.Sym(max); - if(isOrth) - state = boxDimRef.ShiftVolume(newDim, scale[bPick[b]], - bPick[b], delta); - else - state = boxDimRef.ShiftVolume(newDimNonOrth, scale[bPick[b]], - bPick[b], delta); - } - } - - if (state == mv::fail_state::NO_FAIL) { - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - if(isOrth) - coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, - newDim, bPick[b], scale[bPick[b]]); - else - coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, - newDimNonOrth, bPick[b], scale[bPick[b]]); - } - } - } - return state; -} - -inline void VolumeTransfer::CalcEn() -{ - if(isOrth) - cellList.GridAll(newDim, newMolsPos, molLookRef); - else - cellList.GridAll(newDimNonOrth, newMolsPos, molLookRef); - - regrewGrid = true; - - //back up cached fourier term - calcEwald->exgMolCache(); - sysPotNew = sysPotRef; - for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { - if ((bPick[b] == 0) && fixBox0) - continue; - - //calculate new K vectors - if(isOrth) - calcEwald->RecipInit(bPick[b], newDim); - else - calcEwald->RecipInit(bPick[b], newDimNonOrth); - //setup reciprocate terms - calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); - //calculate LJ interaction and real term of electrostatic interaction - if(isOrth) - sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, newDim, - bPick[b]); - else - sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, - newDimNonOrth, bPick[b]); - //calculate reciprocate term of electrostatic interaction - sysPotNew.boxEnergy[bPick[b]].recip = calcEwald->BoxReciprocal(bPick[b]); - } - sysPotNew.Total(); -} - - - -inline double VolumeTransfer::GetCoeff() const -{ - ////Log-volume style shift -- is turned off, at present. - // - //return pow(newDim.volume[b_i]/boxDimRef.volume[b_i], - // (double)molLookRef.NumInBox(b_i)+1) * - // pow(newDim.volume[b_ii]/boxDimRef.volume[b_ii], - // (double)molLookRef.NumInBox(b_ii)+1); - double coeff = 1.0; - if (GEMC_KIND == mv::GEMC_NVT) { - for (uint b = 0; b < BOX_TOTAL; ++b) { - if(isOrth) - coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)); - else - coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)); - } - } else { - for (uint b = 0; b < BOX_TOTAL; ++b) { - if ((bPick[b] == 0) && fixBox0) - continue; - - if(isOrth) - coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)) * - exp(-BETA * PRESSURE * (newDim.volume[b] - boxDimRef.volume[b])); - else - coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)) * - exp(-BETA * PRESSURE * (newDimNonOrth.volume[b] - boxDimRef.volume[b])); - } - - } - return coeff; -} - -inline void VolumeTransfer::Accept(const uint rejectState, const uint step) -{ - double volTransCoeff = GetCoeff(); - double uBoltz = exp(-BETA * (sysPotNew.Total() - sysPotRef.Total())); - double accept = volTransCoeff * uBoltz; - bool result = (rejectState == mv::fail_state::NO_FAIL) && prng() < accept; - if (result) { - //Set new energy. - sysPotRef = sysPotNew; - //Swap... next time we'll use the current members. - //NOTE: - //This will be less efficient for NPT, but necessary evil. - swap(coordCurrRef, newMolsPos); - swap(comCurrRef, newCOMs); - if(isOrth) - boxDimRef = newDim; - else - *((BoxDimensionsNonOrth*)(&boxDimRef)) = newDimNonOrth; - - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - calcEwald->UpdateRecip(b); - calcEwald->UpdateRecipVec(b); - } - } else if (rejectState == mv::fail_state::NO_FAIL && regrewGrid) { - cellList.GridAll(boxDimRef, coordCurrRef, molLookRef); - regrewGrid = false; - calcEwald->exgMolCache(); -#ifdef GOMC_CUDA - //update unitcell to the original in GPU - for (uint box = 0; box < BOX_TOTAL; box++) { - - UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), box, - boxDimRef.cellBasis[box].x, - boxDimRef.cellBasis[box].y, - boxDimRef.cellBasis[box].z); - if(!isOrth) { - BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(&boxDimRef)); - UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), box, - newAxes.cellBasis_Inv[box].x, - newAxes.cellBasis_Inv[box].y, - newAxes.cellBasis_Inv[box].z); - } - } -#endif - } - - if (GEMC_KIND == mv::GEMC_NVT) { - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 0); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 1); - moveSetRef.Update(result, subPick, step); - } - if (GEMC_KIND == mv::GEMC_NPT) { - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); - moveSetRef.Update(result, subPickT[bPick[b]], step); - } - } - -} - -#endif - #endif /*TRANSFORMABLE_BASE_H*/ diff --git a/src/Rotation.h b/src/Rotation.h new file mode 100644 index 000000000..9ad2dc426 --- /dev/null +++ b/src/Rotation.h @@ -0,0 +1,115 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef ROTATION_H +#define ROTATION_H + +#include "MoveBase.h" + + +class Rotate : public MoveBase, public MolTransformBase +{ +public: + Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint earlyReject, const uint step); + virtual void PrintAcceptKind(); +private: + Intermolecular inter_LJ, inter_Real, recip; +}; + +void Rotate::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Rotation ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint Rotate::Prep(const double subDraw, const double movPerc) +{ + uint state = GetBoxAndMol(prng, molRef, subDraw, movPerc); + if (state == mv::fail_state::NO_FAIL && molRef.NumAtoms(mk) <= 1) + state = mv::fail_state::ROTATE_ON_SINGLE_ATOM; + return state; +} + +inline uint Rotate::Transform() +{ + subPick = mv::GetMoveSubIndex(mv::ROTATE, b); + coordCurrRef.RotateRand(newMolPos, pStart, pLen, m, b, + moveSetRef.Scale(subPick)); + return mv::fail_state::NO_FAIL; +} + +inline void Rotate::CalcEn() +{ + cellList.RemoveMol(m, b, coordCurrRef); + molRemoved = true; + + //calculate LJ interaction and real term of electrostatic interaction + calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); + //calculate reciprocate term of electrostatic interaction + recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); +} + +inline void Rotate::Accept(const uint rejectState, const uint step) +{ + bool res = false; + + if (rejectState == mv::fail_state::NO_FAIL) { + double pr = prng(); + res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + + recip.energy)); + } + bool result = (rejectState == mv::fail_state::NO_FAIL) && res; + + if (result) { + //Set new energy. + // setting energy and virial of LJ interaction + sysPotRef.boxEnergy[b].inter += inter_LJ.energy; + // setting energy and virial of coulomb interaction + sysPotRef.boxEnergy[b].real += inter_Real.energy; + // setting energy and virial of recip term + sysPotRef.boxEnergy[b].recip += recip.energy; + + //Copy coords + newMolPos.CopyRange(coordCurrRef, 0, pStart, pLen); + calcEwald->UpdateRecip(b); + + sysPotRef.Total(); + } + + if(molRemoved) { + // It means that Recip energy is calculated and move not accepted + if(!result) { + calcEwald->RestoreMol(m); + } + + cellList.AddMol(m, b, coordCurrRef); + molRemoved = false; + } + + subPick = mv::GetMoveSubIndex(mv::ROTATE, b); + moveSetRef.Update(result, subPick, step); + AcceptKind(result, mk, b); +} + +#endif /*ROTATION_H*/ diff --git a/src/System.cpp b/src/System.cpp index 0d9250c6b..ad228092b 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -18,6 +18,9 @@ along with this program, also can be found at . #include "Molecules.h" //For indexing molecules. #include "MoveConst.h" //For array of move objects. #include "MoveBase.h" //For move bases.... +#include "Rotation.h" +#include "Translate.h" +#include "VolumeTransfer.h" #include "MoleculeTransfer.h" #include "IntraSwap.h" #include "Regrowth.h" diff --git a/src/Translate.h b/src/Translate.h new file mode 100644 index 000000000..bbee0bb8c --- /dev/null +++ b/src/Translate.h @@ -0,0 +1,122 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef TRANSLATE_H +#define TRANSLATE_H + +#include "MoveBase.h" +#include "Rotation.h" + +class Rotate; + +class Translate : public MoveBase, public MolTransformBase +{ +public: + + Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) + { + for(uint b = 0; b < BOX_TOTAL; b++) { + trial[b].resize(molRef.GetKindsCount(), 0); + accepted[b].resize(molRef.GetKindsCount(), 0); + } + } + + virtual uint Prep(const double subDraw, const double movPerc); + uint ReplaceRot(Rotate const& other); + virtual uint Transform(); + virtual void CalcEn(); + virtual void Accept(const uint rejectState, const uint step); + virtual void PrintAcceptKind(); +private: + Intermolecular inter_LJ, inter_Real, recip; + XYZ newCOM; +}; + +void Translate::PrintAcceptKind() { + for(uint k = 0; k < molRef.GetKindsCount(); k++) { + printf("%-30s %-5s ", "% Accepted Displacement ", molRef.kinds[k].name.c_str()); + for(uint b = 0; b < BOX_TOTAL; b++) { + if(trial[b][k] > 0) + printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + else + printf("%10.5f ", 0.0); + } + std::cout << std::endl; + } +} + +inline uint Translate::ReplaceRot(Rotate const& other) +{ + ReplaceWith(other); + return mv::fail_state::NO_FAIL; +} + +inline uint Translate::Prep(const double subDraw, const double movPerc) +{ + return GetBoxAndMol(prng, molRef, subDraw, movPerc); +} + +inline uint Translate::Transform() +{ + subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); + coordCurrRef.TranslateRand(newMolPos, newCOM, pStart, pLen, + m, b, moveSetRef.Scale(subPick)); + return mv::fail_state::NO_FAIL; +} + +inline void Translate::CalcEn() +{ + cellList.RemoveMol(m, b, coordCurrRef); + molRemoved = true; + + //calculate LJ interaction and real term of electrostatic interaction + calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); + //calculate reciprocate term of electrostatic interaction + recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); +} + +inline void Translate::Accept(const uint rejectState, const uint step) +{ + bool res = false; + if (rejectState == mv::fail_state::NO_FAIL) { + double pr = prng(); + res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + + recip.energy)); + } + bool result = (rejectState == mv::fail_state::NO_FAIL) && res; + + if (result) { + //Set new energy. + // setting energy and virial of LJ interaction + sysPotRef.boxEnergy[b].inter += inter_LJ.energy; + // setting energy and virial of coulomb interaction + sysPotRef.boxEnergy[b].real += inter_Real.energy; + // setting energy and virial of recip term + sysPotRef.boxEnergy[b].recip += recip.energy;; + + //Copy coords + newMolPos.CopyRange(coordCurrRef, 0, pStart, pLen); + comCurrRef.Set(m, newCOM); + calcEwald->UpdateRecip(b); + + sysPotRef.Total(); + } + + if(molRemoved) { + // It means that Recip energy is calculated and move not accepted + if(!result) { + calcEwald->RestoreMol(m); + } + cellList.AddMol(m, b, coordCurrRef); + molRemoved = false; + } + + subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); + moveSetRef.Update(result, subPick, step); + AcceptKind(result, mk, b); +} + +#endif /*TRANSLATE_H*/ diff --git a/src/VolumeTransfer.h b/src/VolumeTransfer.h new file mode 100644 index 000000000..d717878d6 --- /dev/null +++ b/src/VolumeTransfer.h @@ -0,0 +1,291 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef VOLUMETRANSFER_H +#define VOLUMETRANSFER_H + +#include "MoveBase.h" //For uint. + +#ifdef _OPENMP +#include +#endif +#ifdef GOMC_CUDA +#include "ConstantDefinitionsCUDAKernel.cuh" +#endif + +#if ENSEMBLE == GEMC || ENSEMBLE == NPT + +class VolumeTransfer : public MoveBase +{ +public: + VolumeTransfer(System &sys, StaticVals const& statV); + + virtual uint Prep(const double subDraw, const double movPerc); + virtual void CalcEn(); + virtual uint Transform(); + double GetCoeff() const; + virtual void Accept(const uint rejectState, const uint step); + virtual void PrintAcceptKind(); +private: + //Note: This is only used for GEMC-NPT + uint bPick[BOX_TOTAL], subPick, subPickT[BOX_TOTAL]; + SystemPotential sysPotNew; + const Forcefield& forcefield; + BoxDimensions newDim; + BoxDimensionsNonOrth newDimNonOrth; + Coordinates newMolsPos; + COM newCOMs; + MoleculeLookup & molLookRef; + const uint GEMC_KIND; + const double PRESSURE; + bool regrewGrid, isOrth; +}; + +inline VolumeTransfer::VolumeTransfer(System &sys, StaticVals const& statV) : + MoveBase(sys, statV), molLookRef(sys.molLookupRef), + newMolsPos(boxDimRef, newCOMs, sys.molLookupRef, + sys.prng, statV.mol), forcefield(statV.forcefield), + newDim(), newDimNonOrth(), + newCOMs(sys.boxDimRef, newMolsPos, sys.molLookupRef, + statV.mol), GEMC_KIND(statV.kindOfGEMC), + PRESSURE(statV.pressure), regrewGrid(false) +{ + newMolsPos.Init(sys.coordinates.Count()); + newCOMs.Init(statV.mol.count); + isOrth = statV.isOrthogonal; +} + +void VolumeTransfer::PrintAcceptKind() { + printf("%-37s", "% Accepted Volume-Transfer "); + for(uint b = 0; b < BOX_TOTAL; b++) { + uint index = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); + printf("%10.5f ", 100.0 * moveSetRef.GetAccept(index)); + } + std::cout << std::endl; +} + +inline uint VolumeTransfer::Prep(const double subDraw, const double movPerc) +{ + uint state = mv::fail_state::NO_FAIL; + if (GEMC_KIND == mv::GEMC_NVT) { + subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER); + for (uint b = 0; b < BOX_TOTAL; b++) { + bPick[b] = b; + } + } + if (GEMC_KIND == mv::GEMC_NPT) { +#if ENSEMBLE == NPT + prng.PickBox(bPick[0], subDraw, movPerc); +#else + prng.PickBoxPair(bPick[0], bPick[1], subDraw, movPerc); +#endif + for (uint b = 0; b < BOX_TOTAL; b++) { + subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); + } + } + + if(isOrth) + newDim = boxDimRef; + else + newDimNonOrth = *((BoxDimensionsNonOrth*)(&boxDimRef)); + + coordCurrRef.CopyRange(newMolsPos, 0, 0, coordCurrRef.Count()); + comCurrRef.CopyRange(newCOMs, 0, 0, comCurrRef.Count()); + return state; +} + +inline uint VolumeTransfer::Transform() +{ + uint state = mv::fail_state::NO_FAIL; + //Reinit, if necessary. + if (GEMC_KIND == mv::GEMC_NVT) { + double max = moveSetRef.Scale(subPick); + if(isOrth) + coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, newDim, + comCurrRef, max); + else + coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, + newDimNonOrth, comCurrRef, max); + } else { + XYZ scale[BOX_TOTAL]; + for (uint b = 0; b < BOX_TOTAL; b++) { + if (state == mv::fail_state::NO_FAIL) { + if ((bPick[b] == 0) && fixBox0) + continue; + + double max = moveSetRef.Scale(subPickT[bPick[b]]); + double delta = prng.Sym(max); + if(isOrth) + state = boxDimRef.ShiftVolume(newDim, scale[bPick[b]], + bPick[b], delta); + else + state = boxDimRef.ShiftVolume(newDimNonOrth, scale[bPick[b]], + bPick[b], delta); + } + } + + if (state == mv::fail_state::NO_FAIL) { + for (uint b = 0; b < BOX_TOTAL; b++) { + if ((bPick[b] == 0) && fixBox0) + continue; + + if(isOrth) + coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, + newDim, bPick[b], scale[bPick[b]]); + else + coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, + newDimNonOrth, bPick[b], scale[bPick[b]]); + } + } + } + return state; +} + +inline void VolumeTransfer::CalcEn() +{ + if(isOrth) + cellList.GridAll(newDim, newMolsPos, molLookRef); + else + cellList.GridAll(newDimNonOrth, newMolsPos, molLookRef); + + regrewGrid = true; + + //back up cached fourier term + calcEwald->exgMolCache(); + sysPotNew = sysPotRef; + for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { + if ((bPick[b] == 0) && fixBox0) + continue; + + //calculate new K vectors + if(isOrth) + calcEwald->RecipInit(bPick[b], newDim); + else + calcEwald->RecipInit(bPick[b], newDimNonOrth); + //setup reciprocate terms + calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); + //calculate LJ interaction and real term of electrostatic interaction + if(isOrth) + sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, newDim, + bPick[b]); + else + sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, + newDimNonOrth, bPick[b]); + //calculate reciprocate term of electrostatic interaction + sysPotNew.boxEnergy[bPick[b]].recip = calcEwald->BoxReciprocal(bPick[b]); + } + sysPotNew.Total(); +} + + + +inline double VolumeTransfer::GetCoeff() const +{ + ////Log-volume style shift -- is turned off, at present. + // + //return pow(newDim.volume[b_i]/boxDimRef.volume[b_i], + // (double)molLookRef.NumInBox(b_i)+1) * + // pow(newDim.volume[b_ii]/boxDimRef.volume[b_ii], + // (double)molLookRef.NumInBox(b_ii)+1); + double coeff = 1.0; + if (GEMC_KIND == mv::GEMC_NVT) { + for (uint b = 0; b < BOX_TOTAL; ++b) { + if(isOrth) + coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], + (double)molLookRef.NumInBox(b)); + else + coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], + (double)molLookRef.NumInBox(b)); + } + } else { + for (uint b = 0; b < BOX_TOTAL; ++b) { + if ((bPick[b] == 0) && fixBox0) + continue; + + if(isOrth) + coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], + (double)molLookRef.NumInBox(b)) * + exp(-BETA * PRESSURE * (newDim.volume[b] - boxDimRef.volume[b])); + else + coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], + (double)molLookRef.NumInBox(b)) * + exp(-BETA * PRESSURE * (newDimNonOrth.volume[b] - boxDimRef.volume[b])); + } + + } + return coeff; +} + +inline void VolumeTransfer::Accept(const uint rejectState, const uint step) +{ + double volTransCoeff = GetCoeff(); + double uBoltz = exp(-BETA * (sysPotNew.Total() - sysPotRef.Total())); + double accept = volTransCoeff * uBoltz; + bool result = (rejectState == mv::fail_state::NO_FAIL) && prng() < accept; + if (result) { + //Set new energy. + sysPotRef = sysPotNew; + //Swap... next time we'll use the current members. + //NOTE: + //This will be less efficient for NPT, but necessary evil. + swap(coordCurrRef, newMolsPos); + swap(comCurrRef, newCOMs); + if(isOrth) + boxDimRef = newDim; + else + *((BoxDimensionsNonOrth*)(&boxDimRef)) = newDimNonOrth; + + for (uint b = 0; b < BOX_TOTAL; b++) { + if ((bPick[b] == 0) && fixBox0) + continue; + + calcEwald->UpdateRecip(b); + calcEwald->UpdateRecipVec(b); + } + } else if (rejectState == mv::fail_state::NO_FAIL && regrewGrid) { + cellList.GridAll(boxDimRef, coordCurrRef, molLookRef); + regrewGrid = false; + calcEwald->exgMolCache(); +#ifdef GOMC_CUDA + //update unitcell to the original in GPU + for (uint box = 0; box < BOX_TOTAL; box++) { + + UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), box, + boxDimRef.cellBasis[box].x, + boxDimRef.cellBasis[box].y, + boxDimRef.cellBasis[box].z); + if(!isOrth) { + BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(&boxDimRef)); + UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), box, + newAxes.cellBasis_Inv[box].x, + newAxes.cellBasis_Inv[box].y, + newAxes.cellBasis_Inv[box].z); + } + } +#endif + } + + if (GEMC_KIND == mv::GEMC_NVT) { + subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 0); + moveSetRef.Update(result, subPick, step); + subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 1); + moveSetRef.Update(result, subPick, step); + } + if (GEMC_KIND == mv::GEMC_NPT) { + for (uint b = 0; b < BOX_TOTAL; b++) { + if ((bPick[b] == 0) && fixBox0) + continue; + + subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); + moveSetRef.Update(result, subPickT[bPick[b]], step); + } + } + +} + +#endif + +#endif /*VOLUMETRANSFER_H*/ From fba61256d8476dd49ed895bf9f8a6ed11c9c484e Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 25 Jul 2018 16:05:15 -0400 Subject: [PATCH 081/199] Fixing destructor call in FFParticle, Shift, Switch, and SwitchMartini --- src/FFParticle.h | 2 +- src/FFShift.h | 3 +-- src/FFSwitch.h | 4 ---- src/FFSwitchMartini.h | 23 +++++++++++------------ 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/FFParticle.h b/src/FFParticle.h index 288e97fcd..d6a49d249 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -50,7 +50,7 @@ struct FFParticle { public: FFParticle(); - ~FFParticle(void); + virtual ~FFParticle(void); virtual void Init(ff_setup::Particle const& mie, ff_setup::NBfix const& nbfix, diff --git a/src/FFShift.h b/src/FFShift.h index 0bdcd0612..f61d33a35 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -31,9 +31,8 @@ along with this program, also can be found at . struct FF_SHIFT : public FFParticle { public: FF_SHIFT() : FFParticle(), shiftConst(NULL), shiftConst_1_4(NULL) {} - ~FF_SHIFT() + virtual ~FF_SHIFT() { - FFParticle::~FFParticle(); delete[] shiftConst; delete[] shiftConst_1_4; } diff --git a/src/FFSwitch.h b/src/FFSwitch.h index 9fb841407..253998a93 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -44,10 +44,6 @@ struct FF_SWITCH : public FFParticle { { rOnSq = rOn = factor1 = factor2 = 0.0; } - ~FF_SWITCH() - { - FFParticle::~FFParticle(); - } virtual void Init(ff_setup::Particle const& mie, ff_setup::NBfix const& nbfix, diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index 995382694..e8e9fb753 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -54,19 +54,18 @@ struct FF_SWITCH_MARTINI : public FFParticle { { A1= B1 = C1 = A6 = B6 = C6 = 0.0; } - ~FF_SWITCH_MARTINI() + virtual ~FF_SWITCH_MARTINI() { - FFParticle::~FFParticle(); - delete[] An; - delete[] Bn; - delete[] Cn; - delete[] An_1_4; - delete[] Bn_1_4; - delete[] Cn_1_4; - delete[] sig6; - delete[] sign; - delete[] sig6_1_4; - delete[] sign_1_4; + delete[] An; + delete[] Bn; + delete[] Cn; + delete[] An_1_4; + delete[] Bn_1_4; + delete[] Cn_1_4; + delete[] sig6; + delete[] sign; + delete[] sig6_1_4; + delete[] sign_1_4; } virtual void Init(ff_setup::Particle const& mie, From 9f3abda772c806bd7f4206e4a41752e08050fad2 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 25 Jul 2018 16:11:11 -0400 Subject: [PATCH 082/199] Fix passing parameter for GPU in FFParticle.cpp --- src/FFParticle.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 7909519b1..3874c6079 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -111,6 +111,8 @@ void FFParticle::Init(ff_setup::Particle const& mie, AdjNBfix(mie, nbfix, rCut); #ifdef GOMC_CUDA + double diElectric_1 = 1.0 / sys.elect.dielectric; + double rOn = sys.ff.rswitch; InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, vdwKind, isMartini, count, rCut, rCutLow, rOn, alpha, ewald, diElectric_1); #endif From 5e0b0cbbdb6b85deaae754011f8b59fa4e431042 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 25 Jul 2018 18:12:18 -0400 Subject: [PATCH 083/199] Clean up forcefield class. Read all the forcefield info from one class rather than from input file. --- src/BoxDimensions.cpp | 5 ++--- src/BoxDimensions.h | 2 +- src/BoxDimensionsNonOrth.cpp | 5 ++--- src/BoxDimensionsNonOrth.h | 2 +- src/ConfigSetup.cpp | 4 ---- src/ConfigSetup.h | 5 +---- src/FFParticle.cpp | 26 ++++++++++++-------------- src/FFParticle.h | 11 +++++++---- src/FFShift.h | 13 +++++-------- src/FFSwitch.h | 15 +++++---------- src/FFSwitchMartini.h | 16 ++++++---------- src/Forcefield.cpp | 29 +++++++++++++++++------------ src/Forcefield.h | 21 +++++++++------------ src/StaticVals.cpp | 2 +- src/System.cpp | 4 +--- 15 files changed, 70 insertions(+), 90 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index 083cbe980..20906a5a9 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -13,11 +13,10 @@ using namespace geom; void BoxDimensions::Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, - double rc, double rcSq) + pdb_setup::Cryst1 const& cryst, double rc) { rCut = rc; - rCutSq = rcSq; + rCutSq = rc * rc; minVol = 8.0 * rCutSq * rCut + 0.001; for (uint b = 0; b < BOX_TOTAL; b++) { if(restart.enable && cryst.hasVolume) { diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index 5ffe2ec53..f25e6ee39 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -38,7 +38,7 @@ class BoxDimensions virtual void Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc, double rcSq); + pdb_setup::Cryst1 const& cryst, double rc); XYZ GetAxis(const uint b) const { diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index 2e8dfeff9..49e42c1eb 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -13,11 +13,10 @@ using namespace geom; void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, - double rc, double rcSq) + pdb_setup::Cryst1 const& cryst, double rc) { rCut = rc; - rCutSq = rcSq; + rCutSq = rc * rc; minVol = 8.0 * rCutSq * rCut + 0.001; for (uint b = 0; b < BOX_TOTAL; b++) { if(restart.enable && cryst.hasVolume) { diff --git a/src/BoxDimensionsNonOrth.h b/src/BoxDimensionsNonOrth.h index 121f6db9f..2c289eb80 100644 --- a/src/BoxDimensionsNonOrth.h +++ b/src/BoxDimensionsNonOrth.h @@ -35,7 +35,7 @@ class BoxDimensionsNonOrth : public BoxDimensions virtual void Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc, double rcSq); + pdb_setup::Cryst1 const& cryst, double rc); virtual void SetVolume(const uint b, const double vol); diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 9d4b4318f..2ff0ed1fd 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -382,10 +382,6 @@ void ConfigSetup::Init(const char *fileName) sys.elect.readElect = true; } else if(line[0] == "Tolerance") { sys.elect.tolerance = stringtod(line[1]); - sys.elect.alpha = sqrt(-1 * log(sys.elect.tolerance)) / - sys.ff.cutoff; - sys.elect.recip_rcut = 2 * (-log(sys.elect.tolerance)) / - sys.ff.cutoff; printf("%-40s %-1.3E \n", "Info: Ewald Summation Tolerance", sys.elect.tolerance); } else if(line[0] == "CachedFourier") { diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index d4d7d2ea4..d7f21b427 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -115,7 +115,6 @@ struct Exclude { struct PotentialConfig { uint kind; double cutoff; - double oneFourScale; uint VDW_KIND; }; struct VDWPot : public PotentialConfig { @@ -129,7 +128,7 @@ struct VDWSwitch : public PotentialConfig { //Items that effect the system interactions and/or identity, e.g. Temp. struct FFValues { uint VDW_KIND; - double cutoff, cutoffLow, rswitch, oneFourScale; + double cutoff, cutoffLow, rswitch; bool doTailCorr, vdwGeometricSigma; std::string kind; @@ -171,9 +170,7 @@ struct ElectroStatic { bool enable; bool ewald; bool cache; - double alpha; double tolerance; - double recip_rcut; double oneFourScale; double dielectric; }; diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 3874c6079..8e69f40b5 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -11,7 +11,7 @@ along with this program, also can be found at . #include "ConstantDefinitionsCUDAKernel.cuh" #endif -FFParticle::FFParticle() : mass(NULL), nameFirst(NULL), nameSec(NULL), +FFParticle::FFParticle(Forcefield &ff) : forcefield(ff), mass(NULL), nameFirst(NULL), nameSec(NULL), n(NULL), n_1_4(NULL), sigmaSq(NULL), sigmaSq_1_4(NULL), epsilon_cn(NULL), epsilon(NULL), epsilon_1_4(NULL), epsilon_cn_1_4(NULL), epsilon_cn_6(NULL), epsilon_cn_6_1_4(NULL), nOver6(NULL), nOver6_1_4(NULL), enCorrection(NULL), @@ -54,9 +54,7 @@ FFParticle::~FFParticle(void) } void FFParticle::Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind) + ff_setup::NBfix const& nbfix) { #ifdef GOMC_CUDA // Variables for GPU stored in here @@ -65,14 +63,14 @@ void FFParticle::Init(ff_setup::Particle const& mie, count = mie.epsilon.size(); //Get # particles read //Size LJ particle kind arrays mass = new double [count]; - vdwKind = sys.ff.VDW_KIND; - vdwGeometricSigma = sys.ff.vdwGeometricSigma; + vdwKind = forcefield.vdwKind; + vdwGeometricSigma = forcefield.vdwGeometricSigma; //Size LJ-LJ pair arrays uint size = num::Sq(count); nameFirst = new std::string [size]; nameSec = new std::string [size]; - isMartini = ffKind.isMARTINI; + isMartini = forcefield.isMartini; #ifdef MIE_INT_ONLY @@ -97,13 +95,13 @@ void FFParticle::Init(ff_setup::Particle const& mie, enCorrection = new double [size]; virCorrection = new double [size]; - rCut = sys.ff.cutoff; + rCut = forcefield.rCut; rCutSq = rCut * rCut; - rCutLow = sys.ff.cutoffLow; + rCutLow = forcefield.rCutLow; rCutLowSq = rCutLow * rCutLow; - scaling_14 = sys.elect.oneFourScale; - ewald = sys.elect.ewald; - alpha = sys.elect.alpha; + scaling_14 = forcefield.scl_14; + ewald = forcefield.ewald; + alpha = forcefield.alpha; //Combining VDW parameter Blend(mie, rCut); @@ -111,8 +109,8 @@ void FFParticle::Init(ff_setup::Particle const& mie, AdjNBfix(mie, nbfix, rCut); #ifdef GOMC_CUDA - double diElectric_1 = 1.0 / sys.elect.dielectric; - double rOn = sys.ff.rswitch; + double diElectric_1 = 1.0 / forcefield.dielectric; + double rOn = forcefield.rswitch; InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, vdwKind, isMartini, count, rCut, rCutLow, rOn, alpha, ewald, diElectric_1); #endif diff --git a/src/FFParticle.h b/src/FFParticle.h index d6a49d249..79792e38b 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -9,6 +9,7 @@ along with this program, also can be found at . #include "EnsemblePreprocessor.h" //For "MIE_INT_ONLY" preprocessor. #include "FFConst.h" //constants related to particles. +#include "Forcefield.h" #include "BasicTypes.h" //for uint #include "NumLib.h" //For Cb, Sq #include "Setup.h" @@ -46,16 +47,16 @@ struct FFValues; struct FFKind; } +class Forcefield; + struct FFParticle { public: - FFParticle(); + FFParticle(Forcefield &ff); virtual ~FFParticle(void); virtual void Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind); + ff_setup::NBfix const& nbfix); double GetEpsilon(const uint i, const uint j) const; double GetEpsilon_1_4(const uint i, const uint j) const; @@ -105,6 +106,8 @@ struct FFParticle { //Use NBFIX to adjust sigma, epsilon, and n value for different kind void AdjNBfix(ff_setup::Particle const& mie, ff_setup::NBfix const& nbfix, const double rCut); + //To access rcut and other forcefield data + const Forcefield& forcefield; double* mass; std::string *nameFirst; diff --git a/src/FFShift.h b/src/FFShift.h index f61d33a35..cbd88ea3f 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -28,9 +28,10 @@ along with this program, also can be found at . // Eelect = qi * qj * (1/r - 1/rcut) // Welect = qi * qj * 1/rij^3 + struct FF_SHIFT : public FFParticle { public: - FF_SHIFT() : FFParticle(), shiftConst(NULL), shiftConst_1_4(NULL) {} + FF_SHIFT(Forcefield &ff) : FFParticle(ff), shiftConst(NULL), shiftConst_1_4(NULL) {} virtual ~FF_SHIFT() { delete[] shiftConst; @@ -38,9 +39,7 @@ struct FF_SHIFT : public FFParticle { } virtual void Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind); + ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; @@ -78,12 +77,10 @@ struct FF_SHIFT : public FFParticle { }; inline void FF_SHIFT::Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind) + ff_setup::NBfix const& nbfix) { //Initializ sigma and epsilon - FFParticle::Init(mie, nbfix, sys, ffKind); + FFParticle::Init(mie, nbfix); uint size = num::Sq(count); //allocate memory shiftConst = new double [size]; diff --git a/src/FFSwitch.h b/src/FFSwitch.h index 253998a93..7412e4239 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -36,19 +36,16 @@ along with this program, also can be found at . // Welect = -1 * qi * qj * (dSwitchVal/rij^2 - (rij^2/rcut^2 - 1.0)^2/(rij^3)) // dSwitchVa = 2.0 * (rij^2/rcut^2 - 1.0) * 2.0 * rij/rcut^2 - struct FF_SWITCH : public FFParticle { public: - FF_SWITCH() : FFParticle() + FF_SWITCH(Forcefield &ff) : FFParticle(ff) { rOnSq = rOn = factor1 = factor2 = 0.0; } virtual void Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind); + ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; @@ -86,13 +83,11 @@ struct FF_SWITCH : public FFParticle { }; inline void FF_SWITCH::Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind) + ff_setup::NBfix const& nbfix) { //Initializ sigma and epsilon - FFParticle::Init(mie, nbfix, sys, ffKind); - rOn = sys.ff.rswitch; + FFParticle::Init(mie, nbfix); + rOn = forcefield.rswitch; rOnSq = rOn * rOn; //calculate switch constant factor1 = rCutSq - 3 * rOnSq; diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index e8e9fb753..ad52dcf98 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -48,7 +48,7 @@ along with this program, also can be found at . struct FF_SWITCH_MARTINI : public FFParticle { public: - FF_SWITCH_MARTINI() : FFParticle(), An(NULL),Bn(NULL), Cn(NULL), + FF_SWITCH_MARTINI(Forcefield &ff) : FFParticle(ff), An(NULL),Bn(NULL), Cn(NULL), An_1_4(NULL), Bn_1_4(NULL), Cn_1_4(NULL), sig6(NULL), sign(NULL), sig6_1_4(NULL), sign_1_4(NULL) { @@ -69,9 +69,7 @@ struct FF_SWITCH_MARTINI : public FFParticle { } virtual void Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind); + ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, const uint kind1, const uint kind2) const; @@ -113,12 +111,10 @@ struct FF_SWITCH_MARTINI : public FFParticle { }; inline void FF_SWITCH_MARTINI::Init(ff_setup::Particle const& mie, - ff_setup::NBfix const& nbfix, - config_setup::SystemVals const& sys, - config_setup::FFKind const& ffKind) + ff_setup::NBfix const& nbfix) { //Initializ sigma and epsilon - FFParticle::Init(mie, nbfix, sys, ffKind); + FFParticle::Init(mie, nbfix); uint size = num::Sq(count); //allocate memory An = new double [size]; @@ -132,8 +128,8 @@ inline void FF_SWITCH_MARTINI::Init(ff_setup::Particle const& mie, sign_1_4 = new double [size]; sig6_1_4 = new double [size]; //Set martini constant - diElectric_1 = 1.0 / sys.elect.dielectric; - rOn = sys.ff.rswitch; + diElectric_1 = 1.0 / forcefield.dielectric; + rOn = forcefield.rswitch; rOnSq = rOn * rOn; //in Martini, Coulomb switching distance is zero rOnCoul = 0.0; diff --git a/src/Forcefield.cpp b/src/Forcefield.cpp index ecf46b3bd..0dbd5ec72 100644 --- a/src/Forcefield.cpp +++ b/src/Forcefield.cpp @@ -7,13 +7,14 @@ along with this program, also can be found at . #include "Forcefield.h" //Header spec. //Setup partner classes #include "Setup.h" +#include "FFShift.h" +#include "FFSwitch.h" +#include "FFSwitchMartini.h" #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES #endif #include -const double BOLTZMANN = 0.0019872041; - Forcefield::Forcefield() { particles = NULL; @@ -35,8 +36,7 @@ Forcefield::~Forcefield() void Forcefield::Init(const Setup& set) { InitBasicVals(set.config.sys, set.config.in.ffKind); - particles->Init(set.ff.mie, set.ff.nbfix, set.config.sys, - set.config.in.ffKind); + particles->Init(set.ff.mie, set.ff.nbfix); bonds.Init(set.ff.bond); angles->Init(set.ff.angle); dihedrals.Init(set.ff.dih); @@ -49,8 +49,7 @@ void Forcefield::InitBasicVals(config_setup::SystemVals const& val, T_in_K = val.T.inKelvin; rCut = val.ff.cutoff; rCutSq = rCut * rCut; - rCutOver2 = rCut / 2.0; - scl_14 = val.ff.oneFourScale; + scl_14 = val.elect.oneFourScale; beta = 1 / T_in_K; vdwKind = val.ff.VDW_KIND; @@ -58,20 +57,26 @@ void Forcefield::InitBasicVals(config_setup::SystemVals const& val, electrostatic = val.elect.enable; ewald = val.elect.ewald; - alpha = val.elect.alpha; - recip_rcut = val.elect.recip_rcut; + alpha = sqrt(-1 * log(val.elect.tolerance)) / rCut; + recip_rcut = 2 * (-log(val.elect.tolerance)) /rCut; + rswitch = val.ff.rswitch; + dielectric = val.elect.dielectric; + + vdwGeometricSigma = val.ff.vdwGeometricSigma; + isMartini = ffKind.isMARTINI; + #if ENSEMBLE == GCMC isFugacity = val.chemPot.isFugacity; #endif if(vdwKind == val.ff.VDW_STD_KIND) - particles = new FFParticle(); + particles = new FFParticle(*this); else if(vdwKind == val.ff.VDW_SHIFT_KIND) - particles = new FF_SHIFT(); + particles = new FF_SHIFT(*this); else if (vdwKind == val.ff.VDW_SWITCH_KIND && ffKind.isMARTINI) - particles = new FF_SWITCH_MARTINI(); + particles = new FF_SWITCH_MARTINI(*this); else - particles = new FF_SWITCH(); + particles = new FF_SWITCH(*this); if(ffKind.isMARTINI) angles = new FFAngleMartini(); diff --git a/src/Forcefield.h b/src/Forcefield.h index ac8527b2b..02efd9fd2 100644 --- a/src/Forcefield.h +++ b/src/Forcefield.h @@ -9,9 +9,6 @@ along with this program, also can be found at . //Member classes #include "FFParticle.h" -#include "FFShift.h" -#include "FFSwitch.h" -#include "FFSwitchMartini.h" #include "FFBonds.h" #include "FFAngles.h" #include "FFDihedrals.h" @@ -27,6 +24,7 @@ struct SystemVals; class FFSetup; class Setup; class FFPrintout; +class FFParticle; class Forcefield { @@ -46,20 +44,19 @@ class Forcefield FFDihedrals dihedrals; //!Init(set.config.in.restart, set.config.sys.volume, - set.pdb.cryst, forcefield.rCut, forcefield.rCutSq); + set.pdb.cryst, forcefield.rCut); #endif #ifndef VARIABLE_PARTICLE_NUMBER molLookup.Init(mol, set.pdb.atoms); diff --git a/src/System.cpp b/src/System.cpp index ad228092b..db072ff5b 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -6,7 +6,6 @@ along with this program, also can be found at . ********************************************************************************/ #include "EnsemblePreprocessor.h" #include "System.h" - #include "CalculateEnergy.h" #include "EwaldCached.h" #include "Ewald.h" @@ -82,8 +81,7 @@ void System::Init(Setup const& set) #ifdef VARIABLE_VOLUME boxDimensions->Init(set.config.in.restart, set.config.sys.volume, set.pdb.cryst, - statV.forcefield.rCut, - statV.forcefield.rCutSq); + statV.forcefield.rCut); #endif #ifdef VARIABLE_PARTICLE_NUMBER molLookup.Init(statV.mol, set.pdb.atoms); From b5ed1b4139fa971ffa910b5245560b3c3e9185af Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 26 Jul 2018 10:36:53 -0400 Subject: [PATCH 084/199] Continue cleaning FFParticle.h --- src/FFParticle.cpp | 1 - src/FFParticle.h | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 8e69f40b5..4708b1147 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -5,7 +5,6 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "FFParticle.h" -#include "ConfigSetup.h" #include "NumLib.h" //For Sq, Cb, and MeanA/G functions. #ifdef GOMC_CUDA #include "ConstantDefinitionsCUDAKernel.cuh" diff --git a/src/FFParticle.h b/src/FFParticle.h index 79792e38b..95b0a5539 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -40,12 +40,6 @@ namespace ff_setup class Particle; class NBfix; } -namespace config_setup -{ -struct SystemVals; -struct FFValues; -struct FFKind; -} class Forcefield; From e7159b3441d03674d4ca744c506c3c352677a23d Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 26 Jul 2018 16:40:04 -0400 Subject: [PATCH 085/199] Reading cutoff value from user. Setup cellist based on max VDWrcut and coulombrcut. Updating enery routin classes. --- src/BoxDimensions.cpp | 46 +++++------ src/BoxDimensions.h | 22 +++--- src/BoxDimensionsNonOrth.cpp | 23 +++--- src/BoxDimensionsNonOrth.h | 3 +- src/CBMC.h | 1 + src/CalculateEnergy.cpp | 33 ++++---- src/CalculateEnergy.h | 3 +- src/CellList.cpp | 7 +- src/CellList.h | 7 +- src/ConfigSetup.cpp | 24 ++++++ src/ConfigSetup.h | 6 ++ src/Ewald.cpp | 62 ++++++--------- src/Ewald.h | 6 +- src/EwaldCached.cpp | 35 +-------- src/EwaldCached.h | 51 ------------ src/FFAngles.h | 5 -- src/FFParticle.cpp | 148 +++++++++++++++++++++++++++++------ src/FFParticle.h | 135 ++------------------------------ src/FFShift.h | 48 ++++++------ src/FFSwitch.h | 63 +++++++-------- src/FFSwitchMartini.h | 41 +++++----- src/Forcefield.cpp | 16 +++- src/Forcefield.h | 44 ++++++----- src/MoveSettings.cpp | 2 +- src/NoEwald.cpp | 34 +------- src/NoEwald.h | 29 ------- src/PRNG.h | 2 +- src/StaticVals.cpp | 2 +- src/System.cpp | 3 +- 29 files changed, 383 insertions(+), 518 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index 20906a5a9..fbc16a9b8 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -5,7 +5,6 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "BoxDimensions.h" -#include "BoxDimensionsNonOrth.h" #include "GeomLib.h" #include "MoveConst.h" //For cutoff-related fail condition @@ -13,12 +12,13 @@ using namespace geom; void BoxDimensions::Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc) + pdb_setup::Cryst1 const& cryst, + Forcefield const &ff) { - rCut = rc; - rCutSq = rc * rc; - minVol = 8.0 * rCutSq * rCut + 0.001; for (uint b = 0; b < BOX_TOTAL; b++) { + rCut[b] = std::max(ff.rCut, ff.rCutCoulomb[b]); + rCutSq[b] = rCut[b] * rCut[b]; + minVol[b] = 8.0 * rCutSq[b] * rCut[b] + 0.001; if(restart.enable && cryst.hasVolume) { axis = cryst.axis; double alpha = cos(cryst.cellAngle[b][0] * M_PI / 180.0); @@ -66,7 +66,7 @@ void BoxDimensions::Init(config_setup::RestartSettings const& restart, axis.Set(b, cellBasis[b].Length(0), cellBasis[b].Length(1), cellBasis[b].Length(2)); - if(axis.Get(b).Min() < 2.0 * rCut) { + if(axis.Get(b).Min() < 2.0 * rCut[b]) { printf("Error: Cutoff value is large than half of minimum BOX%d length!\n", b); exit(EXIT_FAILURE); } @@ -101,17 +101,17 @@ void BoxDimensions::Init(config_setup::RestartSettings const& restart, constArea = confVolume.cstArea; } -uint BoxDimensions::ShiftVolume -(BoxDimensions & newDim, XYZ & scale, const uint b, const double delta) const +uint BoxDimensions::ShiftVolume(BoxDimensions & newDim, XYZ & scale, + const uint b, const double delta) const { uint rejectState = mv::fail_state::NO_FAIL; double newVolume = volume[b] + delta; newDim.SetVolume(b, newVolume); - //If move would shrink any box axis to be less than 2 * rcut, then + //If move would shrink any box axis to be less than 2 * rCut[b], then //automatically reject to prevent errors. - if ((newDim.halfAx.x[b] < rCut || newDim.halfAx.y[b] < rCut || - newDim.halfAx.z[b] < rCut || newVolume < minVol)) { + if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || + newDim.halfAx.z[b] < rCut[b] || newVolume < minVol[b])) { std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" << std::endl; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; @@ -122,8 +122,8 @@ uint BoxDimensions::ShiftVolume return rejectState; } -uint BoxDimensions::ExchangeVolume -(BoxDimensions & newDim, XYZ * scale, const double transfer) const +uint BoxDimensions::ExchangeVolume(BoxDimensions & newDim, XYZ * scale, + const double transfer) const { uint state = mv::fail_state::NO_FAIL; double vTot = GetTotVolume(); @@ -135,8 +135,8 @@ uint BoxDimensions::ExchangeVolume //automatically reject to prevent errors. for (uint b = 0; b < BOX_TOTAL; b++) { scale[b] = newDim.axis.Get(b) / axis.Get(b); - if ((newDim.halfAx.x[b] < rCut || newDim.halfAx.y[b] < rCut || - newDim.halfAx.z[b] < rCut || newDim.volume[b] < minVol)) { + if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || + newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" << std::endl; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; @@ -154,14 +154,14 @@ BoxDimensions::BoxDimensions(BoxDimensions const& other) : other.cellBasis[b].CopyRange(cellBasis[b], 0, 0, 3); volume[b] = other.volume[b]; volInv[b] = other.volInv[b]; + rCut[b] = other.rCut[b]; + rCutSq[b] = other.rCutSq[b]; cubic[b] = other.cubic[b]; orthogonal[b] = other.orthogonal[b]; for(uint i = 0; i < 3; i++) { cosAngle[b][i] = other.cosAngle[b][i]; } } - rCut = other.rCut; - rCutSq = other.rCutSq; constArea = other.constArea; } @@ -171,6 +171,8 @@ BoxDimensions& BoxDimensions::operator=(BoxDimensions const& other) other.cellBasis[b].CopyRange(cellBasis[b], 0, 0, 3); volume[b] = other.volume[b]; volInv[b] = other.volInv[b]; + rCut[b] = other.rCut[b]; + rCutSq[b] = other.rCutSq[b]; cubic[b] = other.cubic[b]; orthogonal[b] = other.orthogonal[b]; for(uint i = 0; i < 3; i++) { @@ -179,8 +181,6 @@ BoxDimensions& BoxDimensions::operator=(BoxDimensions const& other) } other.axis.CopyRange(axis, 0, 0, BOX_TOTAL); other.halfAx.CopyRange(halfAx, 0, 0, BOX_TOTAL); - rCut = other.rCut; - rCutSq = other.rCutSq; constArea = other.constArea; return *this; } @@ -195,13 +195,13 @@ double BoxDimensions::GetTotVolume() const double BoxDimensions::MinVolume() const { - double minVol = volume[mv::BOX0]; + double minV = volume[mv::BOX0]; for(uint b = 1; b < BOX_TOTAL; b++) { - if(volume[b] < minVol) { - minVol = volume[b]; + if(volume[b] < minV) { + minV = volume[b]; } } - return minVol; + return minV; } void BoxDimensions::SetVolume(const uint b, const double vol) diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index f25e6ee39..4cc00ddfb 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -12,6 +12,7 @@ along with this program, also can be found at . #include "PDBSetup.h" //Primary source of volume. #include "ConfigSetup.h" //Other potential source of volume (new sys only) #include "XYZArray.h" //For axes +#include "Forcefield.h" #include "GeomLib.h" #include #include @@ -21,7 +22,6 @@ along with this program, also can be found at . //Use shortcuts when calculating Rcut //#define RCUT_SHORTCUT - class BoxDimensions { public: @@ -38,7 +38,8 @@ class BoxDimensions virtual void Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc); + pdb_setup::Cryst1 const& cryst, + Forcefield const &ff); XYZ GetAxis(const uint b) const { @@ -108,11 +109,12 @@ class BoxDimensions bool InRcut(double & distSq, XYZArray const& arr1, const uint i, XYZArray const& arr2, const uint j, const uint b) const; - +/* bool InRcut(double distSq) const { return (distSq < rCutSq); } + */ //Dist squared , two different coordinate arrays void GetDistSq(double & distSq, XYZArray const& arr1, @@ -141,9 +143,9 @@ class BoxDimensions double volInv[BOX_TOTAL]; //inverse volume of each box in (a^-3) double cosAngle[BOX_TOTAL][3]; //alpha, beta, gamma for each box - double rCut; - double rCutSq; - double minVol; + double rCut[BOX_TOTAL]; + double rCutSq[BOX_TOTAL]; + double minVol[BOX_TOTAL]; bool cubic[BOX_TOTAL], orthogonal[BOX_TOTAL], constArea; @@ -214,7 +216,7 @@ inline bool BoxDimensions::InRcut(double & distSq, XYZ & dist, { dist = MinImage(arr.Difference(i, j), b); distSq = dist.x * dist.x + dist.y * dist.y + dist.z * dist.z; - return (rCutSq > distSq); + return (rCutSq[b] > distSq); } @@ -225,7 +227,7 @@ inline bool BoxDimensions::InRcut(double & distSq, XYZ & dist, { dist = MinImage(arr1.Difference(i, arr2, j), b); distSq = dist.x * dist.x + dist.y * dist.y + dist.z * dist.z; - return (rCutSq > distSq); + return (rCutSq[b] > distSq); } inline bool BoxDimensions::InRcut(double & distSq, XYZArray const& arr, @@ -234,7 +236,7 @@ inline bool BoxDimensions::InRcut(double & distSq, XYZArray const& arr, { XYZ dist = MinImage(arr.Difference(i, j), b); distSq = dist.x * dist.x + dist.y * dist.y + dist.z * dist.z; - return (rCutSq > distSq); + return (rCutSq[b] > distSq); } @@ -244,7 +246,7 @@ inline bool BoxDimensions::InRcut(double & distSq, XYZArray const& arr1, { XYZ dist = MinImage(arr1.Difference(i, arr2, j), b); distSq = dist.x * dist.x + dist.y * dist.y + dist.z * dist.z; - return (rCutSq > distSq); + return (rCutSq[b] > distSq); } diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index 49e42c1eb..c95731f3e 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -13,12 +13,13 @@ using namespace geom; void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc) + pdb_setup::Cryst1 const& cryst, + Forcefield const &ff) { - rCut = rc; - rCutSq = rc * rc; - minVol = 8.0 * rCutSq * rCut + 0.001; for (uint b = 0; b < BOX_TOTAL; b++) { + rCut[b] = std::max(ff.rCut, ff.rCutCoulomb[b]); + rCutSq[b] = rCut[b] * rCut[b]; + minVol[b] = 8.0 * rCutSq[b] * rCut[b] + 0.001; if(restart.enable && cryst.hasVolume) { axis = cryst.axis; double alpha = cos(cryst.cellAngle[b][0] * M_PI / 180.0); @@ -93,7 +94,7 @@ void BoxDimensionsNonOrth::Init(config_setup::RestartSettings const& restart, //axis.Set(b, unslant.x, unslant.y, unslant.z); axis.Set(b, cellLength[b]); - if(axis.Get(b).Min() < 2.0 * rCut) { + if(axis.Get(b).Min() < 2.0 * rCut[b]) { printf("Error: Cutoff value is large than half of minimum BOX%d length!\n", b); exit(EXIT_FAILURE); } @@ -133,6 +134,8 @@ BoxDimensionsNonOrth& BoxDimensionsNonOrth::operator=(BoxDimensionsNonOrth const other.cellBasis_Inv[b].CopyRange(cellBasis_Inv[b], 0, 0, 3); volume[b] = other.volume[b]; volInv[b] = other.volInv[b]; + rCut[b] = other.rCut[b]; + rCutSq[b] = other.rCutSq[b]; cubic[b] = other.cubic[b]; orthogonal[b] = other.orthogonal[b]; for(uint i = 0; i < 3; i++) { @@ -142,8 +145,6 @@ BoxDimensionsNonOrth& BoxDimensionsNonOrth::operator=(BoxDimensionsNonOrth const other.axis.CopyRange(axis, 0, 0, BOX_TOTAL); other.halfAx.CopyRange(halfAx, 0, 0, BOX_TOTAL); other.cellLength.CopyRange(cellLength, 0, 0, BOX_TOTAL); - rCut = other.rCut; - rCutSq = other.rCutSq; constArea = other.constArea; return *this; } @@ -160,8 +161,8 @@ uint BoxDimensionsNonOrth::ShiftVolume(BoxDimensionsNonOrth & newDim, //If move would shrink any box axis to be less than 2 * rcut, then //automatically reject to prevent errors. - if ((newDim.halfAx.x[b] < rCut || newDim.halfAx.y[b] < rCut || - newDim.halfAx.z[b] < rCut || newVolume < minVol)) { + if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || + newDim.halfAx.z[b] < rCut[b] || newVolume < minVol[b])) { std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" << std::endl; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; @@ -187,8 +188,8 @@ uint BoxDimensionsNonOrth::ExchangeVolume(BoxDimensionsNonOrth & newDim, //automatically reject to prevent errors. for (uint b = 0; b < BOX_TOTAL; b++) { scale[b] = newDim.axis.Get(b) / axis.Get(b); - if ((newDim.halfAx.x[b] < rCut || newDim.halfAx.y[b] < rCut || - newDim.halfAx.z[b] < rCut || newDim.volume[b] < minVol)) { + if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || + newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" << std::endl; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; diff --git a/src/BoxDimensionsNonOrth.h b/src/BoxDimensionsNonOrth.h index 2c289eb80..9a7edc961 100644 --- a/src/BoxDimensionsNonOrth.h +++ b/src/BoxDimensionsNonOrth.h @@ -35,7 +35,8 @@ class BoxDimensionsNonOrth : public BoxDimensions virtual void Init(config_setup::RestartSettings const& restart, config_setup::Volume const& confVolume, - pdb_setup::Cryst1 const& cryst, double rc); + pdb_setup::Cryst1 const& cryst, + Forcefield const &ff); virtual void SetVolume(const uint b, const double vol); diff --git a/src/CBMC.h b/src/CBMC.h index 7ad5f70c5..13562483c 100644 --- a/src/CBMC.h +++ b/src/CBMC.h @@ -14,6 +14,7 @@ along with this program, also can be found at . */ #include "BasicTypes.h" +#include "Forcefield.h" struct MolPick; class Forcefield; diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 51741fb57..5b082c416 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -62,8 +62,6 @@ void CalculateEnergy::Init(System & sys) uint maxAtomInMol = 0; calcEwald = sys.GetEwald(); electrostatic = forcefield.electrostatic; - ewald = forcefield.ewald; - rCut = forcefield.rCut; for(uint m = 0; m < mols.count; ++m) { const MoleculeKind& molKind = mols.GetKind(m); if(molKind.NumAtoms() > maxAtomInMol) @@ -225,11 +223,11 @@ SystemPotential CalculateEnergy::BoxInter(SystemPotential potential, qi_qj_fact = particleCharge[pair1[i]] * particleCharge[pair2[i]] * num::qqFact; - tempREn += forcefield.particles->CalcCoulomb(distSq, qi_qj_fact); + tempREn += forcefield.particles->CalcCoulomb(distSq, qi_qj_fact, box); } tempLJEn += forcefield.particles->CalcEn(distSq, particleKind[pair1[i]], - particleKind[pair2[i]]); + particleKind[pair2[i]], box); } } #endif @@ -332,7 +330,7 @@ Virial CalculateEnergy::ForceCalc(const uint box) if (electrostatic) { qi_qj = particleCharge[pair1[i]] * particleCharge[pair2[i]]; - pRF = forcefield.particles->CalcCoulombVir(distSq, qi_qj); + pRF = forcefield.particles->CalcCoulombVir(distSq, qi_qj, box); //calculate the top diagonal of pressure tensor rT11 += pRF * (virC.x * comC.x); //rT12 += pRF * (0.5 * (virC.x * comC.y + virC.y * comC.x)); @@ -345,7 +343,7 @@ Virial CalculateEnergy::ForceCalc(const uint box) } pVF = forcefield.particles->CalcVir(distSq, particleKind[pair1[i]], - particleKind[pair2[i]]); + particleKind[pair2[i]], box); //calculate the top diagonal of pressure tensor vT11 += pVF * (virC.x * comC.x); //vT12 += pVF * (0.5 * (virC.x * comC.y + virC.y * comC.x)); @@ -446,12 +444,11 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, qi_qj_fact = particleCharge[atom] * particleCharge[nIndex[i]] * num::qqFact; - tempREn -= forcefield.particles->CalcCoulomb(distSq, qi_qj_fact); + tempREn -= forcefield.particles->CalcCoulomb(distSq, qi_qj_fact, box); } - tempLJEn -= forcefield.particles->CalcEn(distSq, - particleKind[atom], - particleKind[nIndex[i]]); + tempLJEn -= forcefield.particles->CalcEn(distSq, particleKind[atom], + particleKind[nIndex[i]], box); } } @@ -476,12 +473,12 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, particleCharge[nIndex[i]] * num::qqFact; tempREn += forcefield.particles->CalcCoulombEn(distSq, - qi_qj_fact); + qi_qj_fact, box); } tempLJEn += forcefield.particles->CalcEn(distSq, particleKind[atom], - particleKind[nIndex[i]]); + particleKind[nIndex[i]], box); } } } @@ -516,7 +513,7 @@ void CalculateEnergy::ParticleNonbonded(double* inter, *partner, box)) { inter[t] += forcefield.particles->CalcEn(distSq, kind.AtomKind(partIndex), - kind.AtomKind(*partner)); + kind.AtomKind(*partner), box); if (electrostatic) { double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; @@ -564,10 +561,10 @@ void CalculateEnergy::ParticleInter(double* en, double *real, if(currentAxes.InRcut(distSq, trialPos, t, currentCoords, nIndex[i], box)) { tempLJ += forcefield.particles->CalcEn(distSq, kindI, - particleKind[nIndex[i]]); + particleKind[nIndex[i]], box); if(electrostatic) { qi_qj_Fact = particleCharge[nIndex[i]] * kindICharge * num::qqFact; - tempReal += forcefield.particles->CalcCoulombEn(distSq, qi_qj_Fact); + tempReal += forcefield.particles->CalcCoulombEn(distSq, qi_qj_Fact, box); } } } @@ -740,7 +737,7 @@ void CalculateEnergy::MolNonbond(double & energy, energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind (molKind.nonBonded.part1[i]), molKind.AtomKind - (molKind.nonBonded.part2[i])); + (molKind.nonBonded.part2[i]), box); if (electrostatic) { qi_qj_Fact = num::qqFact * molKind.AtomCharge(molKind.nonBonded.part1[i]) * @@ -773,7 +770,7 @@ void CalculateEnergy::MolNonbond(double & energy, XYZArray const& pos, energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind (molKind.nonBonded.part1[i]), molKind.AtomKind - (molKind.nonBonded.part2[i])); + (molKind.nonBonded.part2[i]), box); if (electrostatic) { qi_qj_Fact = num::qqFact * molKind.AtomCharge(molKind.nonBonded.part1[i]) * @@ -1045,7 +1042,7 @@ bool CalculateEnergy::FindMolInCavity(std::vector< std::vector > &mol, mol.resize(molLookup.GetNumKind()); double maxLength = cavDim.Max(); - if(maxLength <= rCut) + if(maxLength <= currentAxes.rCut[box]) { CellList::Neighbors n = cellList.EnumerateLocal(center, box); while (!n.Done()) { diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index f38ed7057..be38bc36b 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -247,8 +247,7 @@ class CalculateEnergy const BoxDimensions& currentAxes; const COM& currentCOM; const Ewald *calcEwald; - bool electrostatic, ewald; - double rCut; + bool electrostatic; std::vector particleKind; std::vector particleMol; diff --git a/src/CellList.cpp b/src/CellList.cpp index 4bf6fd8da..5153aca7c 100644 --- a/src/CellList.cpp +++ b/src/CellList.cpp @@ -20,6 +20,7 @@ CellList::CellList(const Molecules& mols, BoxDimensions& dims) isBuilt = false; for(uint b = 0; b < BOX_TOTAL; b++) { edgeCells[b][0] = edgeCells[b][1] = edgeCells[b][2] = 0; + cutoff[b] = dims.rCut[b]; } } @@ -95,17 +96,17 @@ void CellList::ResizeGrid(const BoxDimensions& dims) bool rebuild = false; int* eCells = edgeCells[b]; int oldCells = eCells[0]; - eCells[0] = std::max((int)floor(sides.x / cutoff), 3); + eCells[0] = std::max((int)floor(sides.x / cutoff[b]), 3); cellSize[b].x = sides.x / eCells[0]; rebuild |= (!isBuilt || (oldCells != eCells[0])); oldCells = eCells[1]; - eCells[1] = std::max((int)floor(sides.y / cutoff), 3); + eCells[1] = std::max((int)floor(sides.y / cutoff[b]), 3); cellSize[b].y = sides.y / eCells[1]; rebuild |= (!isBuilt || (oldCells != eCells[1])); oldCells = eCells[2]; - eCells[2] = std::max((int)floor(sides.z / cutoff), 3); + eCells[2] = std::max((int)floor(sides.z / cutoff[b]), 3); cellSize[b].z = sides.z / eCells[2]; rebuild |= (!isBuilt || (oldCells != eCells[2])); diff --git a/src/CellList.h b/src/CellList.h index f8094be86..5be3fd58f 100644 --- a/src/CellList.h +++ b/src/CellList.h @@ -24,11 +24,6 @@ class CellList public: explicit CellList(const Molecules& mols, BoxDimensions& dims); - void SetCutoff(double cut) - { - cutoff = cut; - } - void RemoveMol(const int molIndex, const int box, const XYZArray& pos); void AddMol(const int molIndex, const int box, const XYZArray& pos); void GridAll(BoxDimensions& dims, const XYZArray& pos, const MoleculeLookup& lookup); @@ -72,7 +67,7 @@ class CellList int edgeCells[BOX_TOTAL][3]; const Molecules* mols; BoxDimensions *dimensions; - double cutoff; + double cutoff[BOX_TOTAL]; bool isBuilt; }; diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 2ff0ed1fd..f94a4de83 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -384,6 +384,19 @@ void ConfigSetup::Init(const char *fileName) sys.elect.tolerance = stringtod(line[1]); printf("%-40s %-1.3E \n", "Info: Ewald Summation Tolerance", sys.elect.tolerance); + } else if(line[0] == "RcutCoulomb") { + if(line.size() == 3) { + uint b = stringtoi(line[1]); + if(b < BOX_TOTAL) { + sys.elect.cutoffCoulomb[b] = stringtod(line[2]); + sys.elect.cutoffCoulombRead[b] = true; + printf("%s %-d: %-28s %4.4f A\n", "Info: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); + } else { + std::cout << "Error: This simulation requires only " << BOX_TOTAL << + " sets of Coulomb Cutoff!" << std::endl; + exit(EXIT_FAILURE); + } + } } else if(line[0] == "CachedFourier") { sys.elect.cache = checkBool(line[1]); sys.elect.readCache = true; @@ -821,6 +834,7 @@ void ConfigSetup::fillDefaults(void) if (sys.elect.ewald == true && sys.elect.readCache == false) { sys.elect.cache = true; + sys.elect.readCache = true; printf("%-40s %-s \n", "Default: Cache Ewald Fourier", "Active"); } @@ -829,6 +843,16 @@ void ConfigSetup::fillDefaults(void) printf("%-40s %-4.4f \n", "Default: Dielectric", sys.elect.dielectric); } + if(sys.elect.enable) { + for(uint b = 0; b < BOX_TOTAL; b++) { + if(!sys.elect.cutoffCoulombRead[b]) { + sys.elect.cutoffCoulomb[b] = sys.ff.cutoff; + sys.elect.cutoffCoulombRead[b] = true; + printf("%s %-d: %-25s %4.4f A\n", "Default: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); + } + } + } + if(sys.ff.cutoffLow == DBL_MAX) { sys.ff.cutoffLow = 0.00; printf("%-40s %-4.4f \n", "Default: Short Range Cutoff", sys.ff.cutoffLow); diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index d7f21b427..2342e2daf 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -170,9 +170,15 @@ struct ElectroStatic { bool enable; bool ewald; bool cache; + bool cutoffCoulombRead[BOX_TOTAL]; double tolerance; double oneFourScale; double dielectric; + double cutoffCoulomb[BOX_TOTAL]; + ElectroStatic(void) + { + std::fill_n(cutoffCoulombRead, BOX_TOTAL, false); + } }; struct Volume { diff --git a/src/Ewald.cpp b/src/Ewald.cpp index 599fa3948..f2c65d94b 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -5,7 +5,6 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "Ewald.h" -#include "EwaldCached.h" #include "CalculateEnergy.h" #include "EnergyTypes.h" //Energy structs #include "EnsemblePreprocessor.h" //Flags @@ -13,7 +12,6 @@ along with this program, also can be found at . #include "System.h" //For init #include "StaticVals.h" //For init #include "Forcefield.h" // -#include "MoleculeLookup.h" #include "MoleculeKind.h" #include "Coordinates.h" #include "BoxDimensions.h" @@ -38,7 +36,7 @@ along with this program, also can be found at . using namespace geom; Ewald::Ewald(StaticVals & stat, System & sys) : - forcefield(stat.forcefield), mols(stat.mol), currentCoords(sys.coordinates), + ff(stat.forcefield), mols(stat.mol), currentCoords(sys.coordinates), currentCOM(sys.com), sysPotRef(sys.potential), #ifdef VARIABLE_PARTICLE_NUMBER molLookup(sys.molLookup), @@ -51,17 +49,12 @@ Ewald::Ewald(StaticVals & stat, System & sys) : currentAxes(*stat.GetBoxDim()) #endif { - ewald = false; - electrostatic = false; imageLarge = 0; - alpha = 0.0; - recip_rcut = 0.0; - recip_rcut_Sq = 0.0; } Ewald::~Ewald() { - if(ewald) { + if(ff.ewald) { #ifdef GOMC_CUDA DestroyEwaldCUDAVars(forcefield.particles->getCUDAVars()); #endif @@ -117,11 +110,6 @@ void Ewald::Init() } } - electrostatic = forcefield.electrostatic; - ewald = forcefield.ewald; - alpha = forcefield.alpha; - recip_rcut = forcefield.recip_rcut; - recip_rcut_Sq = recip_rcut * recip_rcut; AllocMem(); //initialize K vectors and reciprocate terms UpdateVectorsAndRecipTerms(); @@ -569,15 +557,15 @@ void Ewald::RecipInitOrth(uint box, BoxDimensions const& boxAxes) uint counter = 0; int x, y, z, nkx_max, nky_max, nky_min, nkz_max, nkz_min; double ksqr, kX, kY, kZ; - double alpsqr4 = 1.0 / (4.0 * alpha * alpha); + double alpsqr4 = 1.0 / (4.0 * ff.alphaSq[box]); XYZ constValue = boxAxes.axis.Get(box); constValue.Inverse(); constValue *= 2 * M_PI; double vol = boxAxes.volume[box] / (4 * M_PI); - nkx_max = int(recip_rcut * boxAxes.axis.Get(box).x / (2 * M_PI)) + 1; - nky_max = int(recip_rcut * boxAxes.axis.Get(box).y / (2 * M_PI)) + 1; - nkz_max = int(recip_rcut * boxAxes.axis.Get(box).z / (2 * M_PI)) + 1; + nkx_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).x / (2 * M_PI)) + 1; + nky_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).y / (2 * M_PI)) + 1; + nkz_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).z / (2 * M_PI)) + 1; kmax[box] = std::max(std::max(nkx_max, nky_max), std::max(nky_max, nkz_max)); for(x = 0; x <= nkx_max; x++) { @@ -598,7 +586,7 @@ void Ewald::RecipInitOrth(uint box, BoxDimensions const& boxAxes) kZ = constValue.z * z; ksqr = kX * kX + kY * kY + kZ * kZ; - if(ksqr < recip_rcut_Sq) { + if(ksqr < ff.recip_rcut_Sq[box]) { kx[box][counter] = kX; ky[box][counter] = kY; kz[box][counter] = kZ; @@ -625,7 +613,7 @@ void Ewald::RecipInitNonOrth(uint box, BoxDimensions const& boxAxes) uint counter = 0; int x, y, z, nkx_max, nky_max, nky_min, nkz_max, nkz_min; double ksqr, kX, kY, kZ; - double alpsqr4 = 1.0 / (4.0 * alpha * alpha); + double alpsqr4 = 1.0 / (4.0 * ff.alphaSq[box]); XYZArray cellB(boxAxes.cellBasis[box]); cellB.Scale(0, boxAxes.axis.Get(box).x); cellB.Scale(1, boxAxes.axis.Get(box).y); @@ -635,9 +623,9 @@ void Ewald::RecipInitNonOrth(uint box, BoxDimensions const& boxAxes) cellB_Inv.ScaleRange(0, 3, (2 * M_PI) / det); double vol = boxAxes.volume[box] / (4 * M_PI); - nkx_max = int(recip_rcut * boxAxes.axis.Get(box).x / (2 * M_PI)) + 1; - nky_max = int(recip_rcut * boxAxes.axis.Get(box).y / (2 * M_PI)) + 1; - nkz_max = int(recip_rcut * boxAxes.axis.Get(box).z / (2 * M_PI)) + 1; + nkx_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).x / (2 * M_PI)) + 1; + nky_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).y / (2 * M_PI)) + 1; + nkz_max = int(ff.recip_rcut[box] * boxAxes.axis.Get(box).z / (2 * M_PI)) + 1; kmax[box] = std::max(std::max(nkx_max, nky_max), std::max(nky_max, nkz_max)); for (x = 0; x <= nkx_max; x++) { @@ -658,7 +646,7 @@ void Ewald::RecipInitNonOrth(uint box, BoxDimensions const& boxAxes) kZ = Dot(cellB_Inv.Get(2), XYZ(x, y, z)); ksqr = kX * kX + kY * kY + kZ * kZ; - if(ksqr < recip_rcut_Sq) { + if(ksqr < ff.recip_rcut_Sq[box]) { kx[box][counter] = kX; ky[box][counter] = kY; kz[box][counter] = kZ; @@ -703,9 +691,9 @@ void Ewald::RecipCountInit(uint box, BoxDimensions const& boxAxes) double det = cellB.AdjointMatrix(cellB_Inv); cellB_Inv.ScaleRange(0, 3, (2 * M_PI) / det); - nkx_max = int(recip_rcut * constValue.x / (2 * M_PI)) + 1; - nky_max = int(recip_rcut * constValue.y / (2 * M_PI)) + 1; - nkz_max = int(recip_rcut * constValue.z / (2 * M_PI)) + 1; + nkx_max = int(ff.recip_rcut[box] * constValue.x / (2 * M_PI)) + 1; + nky_max = int(ff.recip_rcut[box] * constValue.y / (2 * M_PI)) + 1; + nkz_max = int(ff.recip_rcut[box] * constValue.z / (2 * M_PI)) + 1; for(x = 0; x <= nkx_max; x++) { if(x == 0.0) @@ -725,7 +713,7 @@ void Ewald::RecipCountInit(uint box, BoxDimensions const& boxAxes) kZ = Dot(cellB_Inv.Get(2), XYZ(x, y, z)); ksqr = kX * kX + kY * kY + kZ * kZ; - if(ksqr < recip_rcut_Sq) { + if(ksqr < ff.recip_rcut_Sq[box]) { counter++; } } @@ -778,7 +766,7 @@ double Ewald::MolCorrection(uint molIndex, uint box) const start + i, start + j, box); dist = sqrt(distSq); correction += (thisKind.AtomCharge(i) * thisKind.AtomCharge(j) * - erf(alpha * dist) / dist); + erf(ff.alpha[box] * dist) / dist); } } @@ -805,7 +793,7 @@ double Ewald::BoxSelf(BoxDimensions const& boxAxes, uint box) const self += (molSelfEnergy * molLookup.NumKindInBox(i, box)); } - self = -1.0 * self * alpha * num::qqFact / sqrt(M_PI); + self = -1.0 * self * ff.alpha[box] * num::qqFact / sqrt(M_PI); return self; } @@ -823,7 +811,7 @@ Virial Ewald::ForceReciprocal(Virial& virial, uint box) const double wT22 = 0.0, wT23 = 0.0, wT33 = 0.0; double recipIntra = 0.0; - double constVal = 1.0 / (4.0 * alpha * alpha); + double constVal = 1.0 / (4.0 * ff.alphaSq[box]); double factor, arg, charge; uint p, length, start, atom; int i; @@ -964,7 +952,8 @@ Virial Ewald::ForceReciprocal(Virial& virial, uint box) const //calculate correction term for linear molecule CBMC algorithm double Ewald::SwapCorrection(const cbmc::TrialMol& trialMol) const { - if (trialMol.GetBox() >= BOXES_WITH_U_NB) + uint box = trialMol.GetBox(); + if (box >= BOXES_WITH_U_NB) return 0.0; double dist, distSq; @@ -976,11 +965,11 @@ double Ewald::SwapCorrection(const cbmc::TrialMol& trialMol) const for (uint i = 0; i < atomSize; i++) { for (uint j = i + 1; j < atomSize; j++) { currentAxes.InRcut(distSq, virComponents, trialMol.GetCoords(), - i, j, trialMol.GetBox()); + i, j, box); dist = sqrt(distSq); correction -= (thisKind.AtomCharge(i) * thisKind.AtomCharge(j) * - erf(alpha * dist) / dist); + erf(ff.alpha[box] * dist) / dist); } } return num::qqFact * correction; @@ -988,7 +977,8 @@ double Ewald::SwapCorrection(const cbmc::TrialMol& trialMol) const double Ewald::SwapSelf(const cbmc::TrialMol& trialMol) const { - if (trialMol.GetBox() >= BOXES_WITH_U_NB) + uint box = trialMol.GetBox(); + if (box >= BOXES_WITH_U_NB) return 0.0; MoleculeKind const& thisKind = trialMol.GetKind(); @@ -998,7 +988,7 @@ double Ewald::SwapSelf(const cbmc::TrialMol& trialMol) const for (uint i = 0; i < atomSize; i++) { en_self -= (thisKind.AtomCharge(i) * thisKind.AtomCharge(i)); } - return (en_self * alpha * num::qqFact / sqrt(M_PI)); + return (en_self * ff.alpha[box] * num::qqFact / sqrt(M_PI)); } //update reciprocate values diff --git a/src/Ewald.h b/src/Ewald.h index a2a52df39..1243feccd 100644 --- a/src/Ewald.h +++ b/src/Ewald.h @@ -12,6 +12,7 @@ along with this program, also can be found at . #include "Molecules.h" #include "Forcefield.h" #include "TrialMol.h" +#include "MoleculeLookup.h" #include #include #include @@ -126,7 +127,7 @@ class Ewald double currentEnergyRecip[BOXES_WITH_U_NB]; protected: - const Forcefield& forcefield; + const Forcefield& ff; const Molecules& mols; const Coordinates& currentCoords; const MoleculeLookup& molLookup; @@ -134,9 +135,6 @@ class Ewald const COM& currentCOM; const SystemPotential &sysPotRef; - bool electrostatic, ewald; - double alpha; - double recip_rcut, recip_rcut_Sq; uint *imageSize; uint *imageSizeRef; //const uint imageTotal = GetImageSize(); diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index 13bc4968c..c8ae1341c 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -5,34 +5,6 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "EwaldCached.h" -#include "CalculateEnergy.h" -#include "EnergyTypes.h" //Energy structs -#include "EnsemblePreprocessor.h" //Flags -#include "BasicTypes.h" //uint -#include "System.h" //For init -#include "StaticVals.h" //For init -#include "Forcefield.h" // -#include "MoleculeLookup.h" -#include "MoleculeKind.h" -#include "Coordinates.h" -#include "BoxDimensions.h" -#include "TrialMol.h" -#include "GeomLib.h" -#include "NumLib.h" -#include -#ifdef GOMC_CUDA -#include "ConstantDefinitionsCUDAKernel.cuh" -#include "VariablesCUDA.cuh" -#endif - -// -// -// Energy Calculation functions for Ewald summation method -// Calculating self, correction and reciprocate part of ewald -// -// Developed by Y. Li and Mohammad S. Barhaghi -// -// using namespace geom; @@ -40,7 +12,7 @@ EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) { } EwaldCached::~EwaldCached() { - if(ewald) { + if(ff.ewald) { for(int i = 0; i < mols.count; i++) { //when cached option is choosen if (cosMolRef[i] != NULL) { @@ -79,11 +51,6 @@ void EwaldCached::Init() } } - electrostatic = forcefield.electrostatic; - ewald = forcefield.ewald; - alpha = forcefield.alpha; - recip_rcut = forcefield.recip_rcut; - recip_rcut_Sq = recip_rcut * recip_rcut; AllocMem(); //initialize K vectors and reciprocate terms UpdateVectorsAndRecipTerms(); diff --git a/src/EwaldCached.h b/src/EwaldCached.h index 7d5873570..e191d9e0b 100644 --- a/src/EwaldCached.h +++ b/src/EwaldCached.h @@ -7,58 +7,7 @@ along with this program, also can be found at . #ifndef EWALDCACHED_H #define EWALDCACHED_H -#include "BasicTypes.h" -#include "EnergyTypes.h" -#include -#include -#include -#include -#ifdef _OPENMP -#include -#endif - -#include "Molecules.h" -#include "Forcefield.h" #include "Ewald.h" -#include "Coordinates.h" -#include "BoxDimensions.h" -#include "BoxDimensionsNonOrth.h" -#include "MoleculeKind.h" -#include "TrialMol.h" -#ifdef GOMC_CUDA -#include "ConstantDefinitionsCUDAKernel.cuh" -#include "CalculateForceCUDAKernel.cuh" -#endif - -// -// Calculating Electrostatic calculation with caching Fourier terms. -// Energy Calculation functions for Ewald summation method -// Calculating self, correction and reciprocate part of ewald -// -// Developed by Y. Li and Mohammad S. Barhaghi -// -// - -class StaticVals; -class System; -class Forcefield; -class Molecules; -class MoleculeLookup; -class MoleculeKind; -class Coordinates; -class COM; -class XYZArray; -class BoxDimensions; -class CalculateEnergy; - -namespace cbmc -{ -class TrialMol; -} -namespace config_setup -{ -class SystemVals; -} class EwaldCached : public Ewald { diff --git a/src/FFAngles.h b/src/FFAngles.h index d4e14d3c7..a9f695f1e 100644 --- a/src/FFAngles.h +++ b/src/FFAngles.h @@ -7,7 +7,6 @@ along with this program, also can be found at . #ifndef FF_ANGLES_H #define FF_ANGLES_H -#include "PRNG.h" #include "FFSetup.h" //For initialization data #include "BasicTypes.h" //For "uint" #include "VectorLib.h" //For transfer vect --> array function @@ -25,10 +24,6 @@ class FFAngles delete[] fixed; } - void AngGen(double * ang, double * en, double & weightAng, - PRNG & prng, const uint angKind, const uint numTrials, - const uint numPicksPerTrial, const double beta) const; - double Angle(const uint kind) const { return theta0[kind]; diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 4708b1147..7b3fa21e2 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -18,9 +18,7 @@ FFParticle::FFParticle(Forcefield &ff) : forcefield(ff), mass(NULL), nameFirst(N #ifdef GOMC_CUDA , varCUDA(NULL) #endif - { - rCut = rCutSq = 0.0; - } + {} FFParticle::~FFParticle(void) { @@ -62,15 +60,10 @@ void FFParticle::Init(ff_setup::Particle const& mie, count = mie.epsilon.size(); //Get # particles read //Size LJ particle kind arrays mass = new double [count]; - vdwKind = forcefield.vdwKind; - vdwGeometricSigma = forcefield.vdwGeometricSigma; - //Size LJ-LJ pair arrays uint size = num::Sq(count); nameFirst = new std::string [size]; nameSec = new std::string [size]; - isMartini = forcefield.isMartini; - #ifdef MIE_INT_ONLY n = new uint [size]; @@ -94,24 +87,17 @@ void FFParticle::Init(ff_setup::Particle const& mie, enCorrection = new double [size]; virCorrection = new double [size]; - rCut = forcefield.rCut; - rCutSq = rCut * rCut; - rCutLow = forcefield.rCutLow; - rCutLowSq = rCutLow * rCutLow; - scaling_14 = forcefield.scl_14; - ewald = forcefield.ewald; - alpha = forcefield.alpha; - //Combining VDW parameter - Blend(mie, rCut); + Blend(mie, forcefield.rCut); //Adjusting VDW parameter using NBFIX - AdjNBfix(mie, nbfix, rCut); + AdjNBfix(mie, nbfix, forcefield.rCut); #ifdef GOMC_CUDA double diElectric_1 = 1.0 / forcefield.dielectric; - double rOn = forcefield.rswitch; - InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, vdwKind, isMartini, - count, rCut, rCutLow, rOn, alpha, ewald, diElectric_1); + InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, forcefield.vdwKind, + forcefield.isMartini, count, forcefield.rCut, + forcefield.rCutLow, forcefield.rswitch, forcefield.alpha, + forcefield.ewald, diElectric_1); #endif } @@ -145,7 +131,7 @@ void FFParticle::Blend(ff_setup::Particle const& mie, const double rCut) double sigma, sigma_1_4; sigma = sigma_1_4 = 0.0; - if(vdwGeometricSigma) { + if(forcefield.vdwGeometricSigma) { sigma = num::MeanG(mie.sigma, mie.sigma, i, j); sigma_1_4 = num::MeanG(mie.sigma_1_4, mie.sigma_1_4, i, j); } else { @@ -243,3 +229,121 @@ double FFParticle::GetN_1_4(const uint i, const uint j) const uint idx = FlatIndex(i, j); return n_1_4[idx]; } + +// Defining the functions + +inline void FFParticle::CalcAdd_1_4(double& en, const double distSq, + const uint kind1, const uint kind2) const +{ + uint index = FlatIndex(kind1, kind2); + double rRat2 = sigmaSq_1_4[index] / distSq; + double rRat4 = rRat2 * rRat2; + double attract = rRat4 * rRat2; +#ifdef MIE_INT_ONLY + uint n_ij = n_1_4[index]; + double repulse = num::POW(rRat2, rRat4, attract, n_ij); +#else + double n_ij = n_1_4[index]; + double repulse = pow(sqrt(rRat2), n_ij); +#endif + + en += epsilon_cn_1_4[index] * (repulse - attract); +} + +inline void FFParticle::CalcCoulombAdd_1_4(double& en, const double distSq, + const double qi_qj_Fact, + const bool NB) const +{ + double dist = sqrt(distSq); + if(NB) + en += qi_qj_Fact / dist; + else + en += qi_qj_Fact * forcefield.scaling_14 / dist; +} + + + +//mie potential +inline double FFParticle::CalcEn(const double distSq, + const uint kind1, const uint kind2, const uint b) const +{ + uint index = FlatIndex(kind1, kind2); + double rRat2 = sigmaSq[index] / distSq; + double rRat4 = rRat2 * rRat2; + double attract = rRat4 * rRat2; +#ifdef MIE_INT_ONLY + uint n_ij = n[index]; + double repulse = num::POW(rRat2, rRat4, attract, n_ij); +#else + double n_ij = n[index]; + double repulse = pow(sqrt(rRat2), n_ij); +#endif + + return epsilon_cn[index] * (repulse - attract); +} + +inline double FFParticle::CalcCoulomb(const double distSq, + const double qi_qj_Fact, const uint b) const +{ + if(forcefield.ewald) { + double dist = sqrt(distSq); + double val = forcefield.alpha[b] * dist; + return qi_qj_Fact * erfc(val) / dist; + } else { + double dist = sqrt(distSq); + return qi_qj_Fact / dist; + } +} + +//will be used in energy calculation after each move +inline double FFParticle::CalcCoulombEn(const double distSq, + const double qi_qj_Fact, const uint b) const +{ + if(distSq <= forcefield.rCutLowSq) + return num::BIGNUM; + + if(forcefield.ewald) { + double dist = sqrt(distSq); + double val = forcefield.alpha[b] * dist; + return qi_qj_Fact * erfc(val) / dist; + } else { + double dist = sqrt(distSq); + return qi_qj_Fact / dist; + } +} + + +inline double FFParticle::CalcVir(const double distSq, + const uint kind1, const uint kind2, const uint b) const +{ + uint index = FlatIndex(kind1, kind2); + double rNeg2 = 1.0 / distSq; + double rRat2 = rNeg2 * sigmaSq[index]; + double rRat4 = rRat2 * rRat2; + double attract = rRat4 * rRat2; +#ifdef MIE_INT_ONLY + uint n_ij = n[index]; + double repulse = num::POW(rRat2, rRat4, attract, n_ij); +#else + double n_ij = n[index]; + double repulse = pow(sqrt(rRat2), n_ij); +#endif + + //Virial is the derivative of the pressure... mu + return epsilon_cn_6[index] * (nOver6[index] * repulse - attract) * rNeg2; +} + +inline double FFParticle::CalcCoulombVir(const double distSq, + const double qi_qj, const uint b) const +{ + if(forcefield.ewald) { + double dist = sqrt(distSq); + double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); + double expConstValue = exp(-1.0 * forcefield.alphaSq[b] * distSq); + double temp = 1.0 - erf(forcefield.alpha[b] * dist); + return qi_qj * (temp / dist + constValue * expConstValue) / distSq; + } else { + double dist = sqrt(distSq); + return qi_qj / (distSq * dist); + } +} diff --git a/src/FFParticle.h b/src/FFParticle.h index 95b0a5539..1dfad2e02 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -60,22 +60,21 @@ struct FFParticle { double GetN_1_4(const uint i, const uint j) const; // LJ interaction functions virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; // coulomb interaction functions virtual double CalcCoulomb(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, - const double qi_qj) const; + const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, - const double qi_qj_Fact, - const bool NB) const; + const double qi_qj_Fact, const bool NB) const; //!Returns Energy long-range correction term for a kind pair virtual double EnergyLRC(const uint kind1, const uint kind2) const; @@ -117,132 +116,12 @@ struct FFParticle { double * sigmaSq, * epsilon, * epsilon_1_4, * epsilon_cn, * epsilon_cn_6, * nOver6, * sigmaSq_1_4, * epsilon_cn_1_4, * epsilon_cn_6_1_4, * nOver6_1_4, * enCorrection, * virCorrection; - double rCut, rCutSq, scaling_14, alpha; - double rCutLow, rCutLowSq; - uint count, vdwKind; - bool isMartini, ewald, vdwGeometricSigma; + uint count; #ifdef GOMC_CUDA VariablesCUDA *varCUDA; #endif }; - -inline void FFParticle::CalcAdd_1_4(double& en, const double distSq, - const uint kind1, const uint kind2) const -{ - uint index = FlatIndex(kind1, kind2); - double rRat2 = sigmaSq_1_4[index] / distSq; - double rRat4 = rRat2 * rRat2; - double attract = rRat4 * rRat2; -#ifdef MIE_INT_ONLY - uint n_ij = n_1_4[index]; - double repulse = num::POW(rRat2, rRat4, attract, n_ij); -#else - double n_ij = n_1_4[index]; - double repulse = pow(sqrt(rRat2), n_ij); -#endif - - en += epsilon_cn_1_4[index] * (repulse - attract); -} - -inline void FFParticle::CalcCoulombAdd_1_4(double& en, const double distSq, - const double qi_qj_Fact, - const bool NB) const -{ - double dist = sqrt(distSq); - if(NB) - en += qi_qj_Fact / dist; - else - en += qi_qj_Fact * scaling_14 / dist; -} - - - -//mie potential -inline double FFParticle::CalcEn(const double distSq, - const uint kind1, const uint kind2) const -{ - uint index = FlatIndex(kind1, kind2); - double rRat2 = sigmaSq[index] / distSq; - double rRat4 = rRat2 * rRat2; - double attract = rRat4 * rRat2; -#ifdef MIE_INT_ONLY - uint n_ij = n[index]; - double repulse = num::POW(rRat2, rRat4, attract, n_ij); -#else - double n_ij = n[index]; - double repulse = pow(sqrt(rRat2), n_ij); -#endif - - return epsilon_cn[index] * (repulse - attract); -} - -inline double FFParticle::CalcCoulomb(const double distSq, - const double qi_qj_Fact) const -{ - if(ewald) { - double dist = sqrt(distSq); - double val = alpha * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - double dist = sqrt(distSq); - return qi_qj_Fact / dist; - } -} - -//will be used in energy calculation after each move -inline double FFParticle::CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const -{ - if(distSq <= rCutLowSq) - return num::BIGNUM; - - if(ewald) { - double dist = sqrt(distSq); - double val = alpha * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - double dist = sqrt(distSq); - return qi_qj_Fact / dist; - } -} - - -inline double FFParticle::CalcVir(const double distSq, - const uint kind1, const uint kind2) const -{ - uint index = FlatIndex(kind1, kind2); - double rNeg2 = 1.0 / distSq; - double rRat2 = rNeg2 * sigmaSq[index]; - double rRat4 = rRat2 * rRat2; - double attract = rRat4 * rRat2; -#ifdef MIE_INT_ONLY - uint n_ij = n[index]; - double repulse = num::POW(rRat2, rRat4, attract, n_ij); -#else - double n_ij = n[index]; - double repulse = pow(sqrt(rRat2), n_ij); -#endif - - //Virial is the derivative of the pressure... mu - return epsilon_cn_6[index] * (nOver6[index] * repulse - attract) * rNeg2; -} - -inline double FFParticle::CalcCoulombVir(const double distSq, - const double qi_qj) const -{ - if(ewald) { - double dist = sqrt(distSq); - double constValue = 2.0 * alpha / sqrt(M_PI); - double expConstValue = exp(-1.0 * alpha * alpha * distSq); - double temp = 1.0 - erf(alpha * dist); - return qi_qj * (temp / dist + constValue * expConstValue) / distSq; - } else { - double dist = sqrt(distSq); - return qi_qj / (distSq * dist); - } -} - #endif /*FF_PARTICLE_H*/ diff --git a/src/FFShift.h b/src/FFShift.h index cbd88ea3f..ee350d91f 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -42,19 +42,19 @@ struct FF_SHIFT : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; // coulomb interaction functions virtual double CalcCoulomb(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, - const double qi_qj) const; + const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, const double qi_qj_Fact, const bool NB) const; @@ -89,11 +89,11 @@ inline void FF_SHIFT::Init(ff_setup::Particle const& mie, for(uint i = 0; i < count; ++i) { for(uint j = 0; j < count; ++j) { uint idx = FlatIndex(i, j); - double rRat2 = sigmaSq[idx] / rCutSq; + double rRat2 = sigmaSq[idx] / forcefield.rCutSq; double rRat4 = rRat2 * rRat2; double attract = rRat4 * rRat2; //for 1-4 interaction - double rRat2_1_4 = sigmaSq_1_4[idx] / rCutSq; + double rRat2_1_4 = sigmaSq_1_4[idx] / forcefield.rCutSq; double rRat4_1_4 = rRat2_1_4 * rRat2_1_4; double attract_1_4 = rRat4_1_4 * rRat2_1_4; double repulse = pow(sqrt(rRat2), n[idx]); @@ -134,13 +134,13 @@ inline void FF_SHIFT::CalcCoulombAdd_1_4(double& en, const double distSq, if(NB) en += qi_qj_Fact / dist; else - en += qi_qj_Fact * scaling_14 / dist; + en += qi_qj_Fact * forcefield.scaling_14 / dist; } //mie potential inline double FF_SHIFT::CalcEn(const double distSq, - const uint kind1, const uint kind2) const + const uint kind1, const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); double rRat2 = sigmaSq[index] / distSq; @@ -158,38 +158,38 @@ inline double FF_SHIFT::CalcEn(const double distSq, } inline double FF_SHIFT::CalcCoulomb(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { double dist = sqrt(distSq); - return qi_qj_Fact * (1.0 / dist - 1.0 / rCut); + return qi_qj_Fact * (1.0 / dist - 1.0 / forcefield.rCut); } } //will be used in energy calculation after each move inline double FF_SHIFT::CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(distSq <= rCutLowSq) + if(distSq <= forcefield.rCutLowSq) return num::BIGNUM; - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { double dist = sqrt(distSq); - return qi_qj_Fact * (1.0 / dist - 1.0 / rCut); + return qi_qj_Fact * (1.0 / dist - 1.0 / forcefield.rCut); } } //mie potential inline double FF_SHIFT::CalcVir(const double distSq, - const uint kind1, const uint kind2) const + const uint kind1, const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); double rNeg2 = 1.0 / distSq; @@ -209,13 +209,13 @@ inline double FF_SHIFT::CalcVir(const double distSq, } inline double FF_SHIFT::CalcCoulombVir(const double distSq, - const double qi_qj) const + const double qi_qj, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double constValue = 2.0 * alpha / sqrt(M_PI); - double expConstValue = exp(-1.0 * alpha * alpha * distSq); - double temp = erfc(alpha * dist); + double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); + double expConstValue = exp(-1.0 * forcefield.alphaSq[b] * distSq); + double temp = erfc(forcefield.alpha[b] * dist); return qi_qj * (temp / dist + constValue * expConstValue) / distSq; } else { double dist = sqrt(distSq); diff --git a/src/FFSwitch.h b/src/FFSwitch.h index 7412e4239..69e2215a7 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -48,19 +48,19 @@ struct FF_SWITCH : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; // coulomb interaction functions virtual double CalcCoulomb(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, - const double qi_qj) const; + const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, const double qi_qj_Fact, const bool NB) const; @@ -90,15 +90,15 @@ inline void FF_SWITCH::Init(ff_setup::Particle const& mie, rOn = forcefield.rswitch; rOnSq = rOn * rOn; //calculate switch constant - factor1 = rCutSq - 3 * rOnSq; - factor2 = pow((rCutSq - rOnSq), -3); + factor1 = forcefield.rCutSq - 3 * rOnSq; + factor2 = pow((forcefield.rCutSq - rOnSq), -3); } inline void FF_SWITCH::CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const { uint index = FlatIndex(kind1, kind2); - double rCutSq_rijSq = rCutSq - distSq; + double rCutSq_rijSq = forcefield.rCutSq - distSq; double rCutSq_rijSq_Sq = rCutSq_rijSq * rCutSq_rijSq; double rRat2 = sigmaSq_1_4[index] / distSq; @@ -120,24 +120,24 @@ inline void FF_SWITCH::CalcAdd_1_4(double& en, const double distSq, } inline void FF_SWITCH::CalcCoulombAdd_1_4(double& en, const double distSq, - const double qi_qj_Fact, - const bool NB) const + const double qi_qj_Fact, + const bool NB) const { double dist = sqrt(distSq); if(NB) en += qi_qj_Fact / dist; else - en += qi_qj_Fact * scaling_14 / dist; + en += qi_qj_Fact * forcefield.scaling_14 / dist; } //mie potential inline double FF_SWITCH::CalcEn(const double distSq, - const uint kind1, const uint kind2) const + const uint kind1, const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); - double rCutSq_rijSq = rCutSq - distSq; + double rCutSq_rijSq = forcefield.rCutSq - distSq; double rCutSq_rijSq_Sq = rCutSq_rijSq * rCutSq_rijSq; double rRat2 = sigmaSq[index] / distSq; @@ -159,15 +159,15 @@ inline double FF_SWITCH::CalcEn(const double distSq, } inline double FF_SWITCH::CalcCoulomb(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { double dist = sqrt(distSq); - double switchVal = distSq / rCutSq - 1.0; + double switchVal = distSq / forcefield.rCutSq - 1.0; switchVal *= switchVal; return qi_qj_Fact * switchVal / dist; } @@ -175,18 +175,18 @@ inline double FF_SWITCH::CalcCoulomb(const double distSq, //will be used in energy calculation after each move inline double FF_SWITCH::CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(distSq <= rCutLowSq) + if(distSq <= forcefield.rCutLowSq) return num::BIGNUM; - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { double dist = sqrt(distSq); - double switchVal = distSq / rCutSq - 1.0; + double switchVal = distSq / forcefield.rCutSq - 1.0; switchVal *= switchVal; return qi_qj_Fact * switchVal / dist; } @@ -194,11 +194,11 @@ inline double FF_SWITCH::CalcCoulombEn(const double distSq, //mie potential inline double FF_SWITCH::CalcVir(const double distSq, - const uint kind1, const uint kind2) const + const uint kind1, const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); - double rCutSq_rijSq = rCutSq - distSq; + double rCutSq_rijSq = forcefield.rCutSq - distSq; double rCutSq_rijSq_Sq = rCutSq_rijSq * rCutSq_rijSq; double rNeg2 = 1.0 / distSq; @@ -226,19 +226,20 @@ inline double FF_SWITCH::CalcVir(const double distSq, } inline double FF_SWITCH::CalcCoulombVir(const double distSq, - const double qi_qj) const + const double qi_qj, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double constValue = 2.0 * alpha / sqrt(M_PI); - double expConstValue = exp(-1.0 * alpha * alpha * distSq); - double temp = erfc(alpha * dist); + double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); + double expConstValue = exp(-1.0 * forcefield.alphaSq[b] * distSq); + double temp = erfc(forcefield.alpha[b] * dist); return qi_qj * (temp / dist + constValue * expConstValue) / distSq; } else { double dist = sqrt(distSq); - double switchVal = distSq / rCutSq - 1.0; + double switchVal = distSq / forcefield.rCutSq - 1.0; switchVal *= switchVal; - double dSwitchVal = 2.0 * (distSq / rCutSq - 1.0) * 2.0 * dist / rCutSq; + double dSwitchVal = 2.0 * (distSq / forcefield.rCutSq - 1.0) * 2.0 * + dist / forcefield.rCutSq; return -1.0 * qi_qj * (dSwitchVal / distSq - switchVal / (distSq * dist)); } } diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index ad52dcf98..5aa2d570a 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -72,19 +72,19 @@ struct FF_SWITCH_MARTINI : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2) const; + const uint kind1, const uint kind2, const uint b) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; // coulomb interaction functions virtual double CalcCoulomb(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const; + const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, - const double qi_qj) const; + const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, const double qi_qj_Fact, const bool NB) const; @@ -133,6 +133,7 @@ inline void FF_SWITCH_MARTINI::Init(ff_setup::Particle const& mie, rOnSq = rOn * rOn; //in Martini, Coulomb switching distance is zero rOnCoul = 0.0; + double rCut = forcefield.rCut; // Set LJ constants A6 = 6.0 * ((6.0 + 1) * rOn - (6.0 + 4) * rCut) / (pow(rCut, 6.0 + 2) * pow(rCut - rOn, 2)); @@ -218,14 +219,14 @@ inline void FF_SWITCH_MARTINI::CalcCoulombAdd_1_4(double& en, if(NB) en += qi_qj_Fact / dist; else - en += qi_qj_Fact * scaling_14 / dist; + en += qi_qj_Fact * forcefield.scaling_14 / dist; } //mie potential inline double FF_SWITCH_MARTINI::CalcEn(const double distSq, const uint kind1, - const uint kind2) const + const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); @@ -258,11 +259,11 @@ inline double FF_SWITCH_MARTINI::CalcEn(const double distSq, } inline double FF_SWITCH_MARTINI::CalcCoulomb(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { // in Martini, the Coulomb switching distance is zero, so we will have @@ -278,14 +279,14 @@ inline double FF_SWITCH_MARTINI::CalcCoulomb(const double distSq, //will be used in energy calculation after each move inline double FF_SWITCH_MARTINI::CalcCoulombEn(const double distSq, - const double qi_qj_Fact) const + const double qi_qj_Fact, const uint b) const { - if(distSq <= rCutLowSq) + if(distSq <= forcefield.rCutLowSq) return num::BIGNUM; - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double val = alpha * dist; + double val = forcefield.alpha[b] * dist; return qi_qj_Fact * erfc(val) / dist; } else { // in Martini, the Coulomb switching distance is zero, so we will have @@ -302,7 +303,7 @@ inline double FF_SWITCH_MARTINI::CalcCoulombEn(const double distSq, //mie potential inline double FF_SWITCH_MARTINI::CalcVir(const double distSq, const uint kind1, - const uint kind2) const + const uint kind2, const uint b) const { uint index = FlatIndex(kind1, kind2); double n_ij = n[index]; @@ -330,13 +331,13 @@ inline double FF_SWITCH_MARTINI::CalcVir(const double distSq, } inline double FF_SWITCH_MARTINI::CalcCoulombVir(const double distSq, - const double qi_qj) const + const double qi_qj, const uint b) const { - if(ewald) { + if(forcefield.ewald) { double dist = sqrt(distSq); - double constValue = 2.0 * alpha / sqrt(M_PI); - double expConstValue = exp(-1.0 * alpha * alpha * distSq); - double temp = erfc(alpha * dist); + double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); + double expConstValue = exp(-1.0 * forcefield.alphaSq[b] * distSq); + double temp = erfc(forcefield.alpha[b] * dist); return qi_qj * (temp / dist + constValue * expConstValue) / distSq; } else { // in Martini, the Coulomb switching distance is zero, so we will have diff --git a/src/Forcefield.cpp b/src/Forcefield.cpp index 0dbd5ec72..a2390333e 100644 --- a/src/Forcefield.cpp +++ b/src/Forcefield.cpp @@ -49,7 +49,9 @@ void Forcefield::InitBasicVals(config_setup::SystemVals const& val, T_in_K = val.T.inKelvin; rCut = val.ff.cutoff; rCutSq = rCut * rCut; - scl_14 = val.elect.oneFourScale; + rCutLow = val.ff.cutoffLow; + rCutLowSq = rCutLow * rCutLow; + scaling_14 = val.elect.oneFourScale; beta = 1 / T_in_K; vdwKind = val.ff.VDW_KIND; @@ -57,11 +59,19 @@ void Forcefield::InitBasicVals(config_setup::SystemVals const& val, electrostatic = val.elect.enable; ewald = val.elect.ewald; - alpha = sqrt(-1 * log(val.elect.tolerance)) / rCut; - recip_rcut = 2 * (-log(val.elect.tolerance)) /rCut; + tolerance = val.elect.tolerance; rswitch = val.ff.rswitch; dielectric = val.elect.dielectric; + for(uint b = 0 ; b < BOX_TOTAL; b++) { + rCutCoulomb[b] = val.elect.cutoffCoulomb[b]; + rCutCoulombSq[b] = rCutCoulomb[b] * rCutCoulomb[b]; + alpha[b] = sqrt(-log(tolerance)) / rCutCoulomb[b]; + alphaSq[b] = alpha[b] * alpha[b]; + recip_rcut[b] = -2.0 * log(tolerance) / rCutCoulomb[b]; + recip_rcut_Sq[b] = recip_rcut[b] * recip_rcut[b]; + } + vdwGeometricSigma = val.ff.vdwGeometricSigma; isMartini = ffKind.isMARTINI; diff --git a/src/Forcefield.h b/src/Forcefield.h index 02efd9fd2..be61c5f2c 100644 --- a/src/Forcefield.h +++ b/src/Forcefield.h @@ -12,7 +12,6 @@ along with this program, also can be found at . #include "FFBonds.h" #include "FFAngles.h" #include "FFDihedrals.h" -#include "PRNG.h" namespace config_setup { @@ -39,28 +38,33 @@ class Forcefield FFParticle * particles; //! %50 - double maxVolExchange = boxDimRef.MinVolume() - boxDimRef.minVol; + double maxVolExchange = boxDimRef.MinVolume() - boxDimRef.minVol[b]; num::Bound(scale[moveIndex], 0.001, maxVolExchange - 0.001); break; } diff --git a/src/NoEwald.cpp b/src/NoEwald.cpp index 2cb2e3e76..5a34139c9 100644 --- a/src/NoEwald.cpp +++ b/src/NoEwald.cpp @@ -5,42 +5,12 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "NoEwald.h" -#include "EwaldCached.h" -#include "CalculateEnergy.h" -#include "EnergyTypes.h" //Energy structs -#include "EnsemblePreprocessor.h" //Flags -#include "BasicTypes.h" //uint -#include "System.h" //For init -#include "StaticVals.h" //For init -#include "Forcefield.h" // -#include "MoleculeLookup.h" -#include "MoleculeKind.h" -#include "Coordinates.h" -#include "BoxDimensions.h" -#include "TrialMol.h" -#include "GeomLib.h" -#include "NumLib.h" -#include - -// -// -// Energy Calculation functions for Ewald summation method -// Calculating self, correction and reciprocate part of ewald -// -// Developed by Y. Li and Mohammad S. Barhaghi -// -// - -using namespace geom; + NoEwald::NoEwald(StaticVals & stat, System & sys) : Ewald(stat, sys) {} -void NoEwald::Init() -{ - electrostatic = forcefield.electrostatic; - ewald = forcefield.ewald; -} +void NoEwald::Init() {} void NoEwald::AllocMem() { diff --git a/src/NoEwald.h b/src/NoEwald.h index b9da0325f..b4c95c203 100644 --- a/src/NoEwald.h +++ b/src/NoEwald.h @@ -7,36 +7,7 @@ along with this program, also can be found at . #ifndef NOEWALD_H #define NOEWALD_H -#include "BasicTypes.h" -#include "EnergyTypes.h" #include "Ewald.h" -#include -#include -#include -#include -#ifdef _OPENMP -#include -#endif -// -// Called when Ewlad method was not used. -// Energy Calculation functions for Ewald summation method -// Calculating self, correction and reciprocate part of ewald -// -// Developed by Y. Li and Mohammad S. Barhaghi -// -// - -class StaticVals; -class System; -class Forcefield; -class Molecules; -class MoleculeLookup; -class MoleculeKind; -class Coordinates; -class COM; -class XYZArray; -class BoxDimensions; -class CalculateEnergy; class NoEwald : public Ewald diff --git a/src/PRNG.h b/src/PRNG.h index 90565a392..f5028960a 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -24,9 +24,9 @@ along with this program, also can be found at . #include #include #include - #include "BasicTypes.h" + //Wrapper class for our random numbers class PRNG { diff --git a/src/StaticVals.cpp b/src/StaticVals.cpp index 88d420c9b..196adece4 100644 --- a/src/StaticVals.cpp +++ b/src/StaticVals.cpp @@ -19,7 +19,7 @@ void StaticVals::Init(Setup & set, System& sys) mol.Init(set, forcefield, sys); #ifndef VARIABLE_VOLUME boxDimensions->Init(set.config.in.restart, set.config.sys.volume, - set.pdb.cryst, forcefield.rCut); + set.pdb.cryst, forcefield); #endif #ifndef VARIABLE_PARTICLE_NUMBER molLookup.Init(mol, set.pdb.atoms); diff --git a/src/System.cpp b/src/System.cpp index db072ff5b..9a37f7334 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -81,7 +81,7 @@ void System::Init(Setup const& set) #ifdef VARIABLE_VOLUME boxDimensions->Init(set.config.in.restart, set.config.sys.volume, set.pdb.cryst, - statV.forcefield.rCut); + statV.forcefield); #endif #ifdef VARIABLE_PARTICLE_NUMBER molLookup.Init(statV.mol, set.pdb.atoms); @@ -92,7 +92,6 @@ void System::Init(Setup const& set) //particle/molecule ensemble, e.g. NVT coordinates.InitFromPDB(set.pdb.atoms); com.CalcCOM(); - cellList.SetCutoff(statV.forcefield.rCut); cellList.GridAll(boxDimRef, coordinates, molLookupRef); //check if we have to use cached version of ewlad or not. From ad5d56e4ff0f35555085474504b3831cf1540c5c Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 26 Jul 2018 17:42:53 -0400 Subject: [PATCH 086/199] Check cutoff for coulomb and VDW in FFparticle, Shift, Switch, .. --- src/CalculateEnergy.cpp | 40 ++++++++++++++++++++++------------------ src/ConfigSetup.cpp | 4 ++-- src/FFParticle.cpp | 20 +++++++++++++++++--- src/FFParticle.h | 4 ++-- src/FFShift.h | 24 +++++++++++++++++++----- src/FFSwitch.h | 26 +++++++++++++++++++------- src/FFSwitchMartini.h | 26 +++++++++++++++++++------- 7 files changed, 100 insertions(+), 44 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 5b082c416..9599ff58c 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -227,7 +227,7 @@ SystemPotential CalculateEnergy::BoxInter(SystemPotential potential, } tempLJEn += forcefield.particles->CalcEn(distSq, particleKind[pair1[i]], - particleKind[pair2[i]], box); + particleKind[pair2[i]]); } } #endif @@ -343,7 +343,7 @@ Virial CalculateEnergy::ForceCalc(const uint box) } pVF = forcefield.particles->CalcVir(distSq, particleKind[pair1[i]], - particleKind[pair2[i]], box); + particleKind[pair2[i]]); //calculate the top diagonal of pressure tensor vT11 += pVF * (virC.x * comC.x); //vT12 += pVF * (0.5 * (virC.x * comC.y + virC.y * comC.x)); @@ -448,7 +448,7 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, } tempLJEn -= forcefield.particles->CalcEn(distSq, particleKind[atom], - particleKind[nIndex[i]], box); + particleKind[nIndex[i]]); } } @@ -478,7 +478,7 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, tempLJEn += forcefield.particles->CalcEn(distSq, particleKind[atom], - particleKind[nIndex[i]], box); + particleKind[nIndex[i]]); } } } @@ -513,7 +513,7 @@ void CalculateEnergy::ParticleNonbonded(double* inter, *partner, box)) { inter[t] += forcefield.particles->CalcEn(distSq, kind.AtomKind(partIndex), - kind.AtomKind(*partner), box); + kind.AtomKind(*partner)); if (electrostatic) { double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; @@ -561,7 +561,7 @@ void CalculateEnergy::ParticleInter(double* en, double *real, if(currentAxes.InRcut(distSq, trialPos, t, currentCoords, nIndex[i], box)) { tempLJ += forcefield.particles->CalcEn(distSq, kindI, - particleKind[nIndex[i]], box); + particleKind[nIndex[i]]); if(electrostatic) { qi_qj_Fact = particleCharge[nIndex[i]] * kindICharge * num::qqFact; tempReal += forcefield.particles->CalcCoulombEn(distSq, qi_qj_Fact, box); @@ -732,12 +732,12 @@ void CalculateEnergy::MolNonbond(double & energy, for (uint i = 0; i < molKind.nonBonded.count; ++i) { uint p1 = mols.start[molIndex] + molKind.nonBonded.part1[i]; uint p2 = mols.start[molIndex] + molKind.nonBonded.part2[i]; - - if (currentAxes.InRcut(distSq, currentCoords, p1, p2, box)) { + currentAxes.InRcut(distSq, currentCoords, p1, p2, box); + if (forcefield.rCutSq > distSq) { energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind (molKind.nonBonded.part1[i]), molKind.AtomKind - (molKind.nonBonded.part2[i]), box); + (molKind.nonBonded.part2[i])); if (electrostatic) { qi_qj_Fact = num::qqFact * molKind.AtomCharge(molKind.nonBonded.part1[i]) * @@ -765,12 +765,12 @@ void CalculateEnergy::MolNonbond(double & energy, XYZArray const& pos, for (uint i = 0; i < molKind.nonBonded.count; ++i) { uint p1 = molKind.nonBonded.part1[i]; uint p2 = molKind.nonBonded.part2[i]; - - if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + currentAxes.InRcut(distSq, pos, p1, p2, box); + if (forcefield.rCutSq > distSq) { energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind (molKind.nonBonded.part1[i]), molKind.AtomKind - (molKind.nonBonded.part2[i]), box); + (molKind.nonBonded.part2[i])); if (electrostatic) { qi_qj_Fact = num::qqFact * molKind.AtomCharge(molKind.nonBonded.part1[i]) * @@ -799,7 +799,8 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, for (uint i = 0; i < molKind.nonBonded_1_4.count; ++i) { uint p1 = mols.start[molIndex] + molKind.nonBonded_1_4.part1[i]; uint p2 = mols.start[molIndex] + molKind.nonBonded_1_4.part2[i]; - if (currentAxes.InRcut(distSq, currentCoords, p1, p2, box)) { + currentAxes.InRcut(distSq, currentCoords, p1, p2, box); + if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, molKind.AtomKind (molKind.nonBonded_1_4.part1[i]), @@ -831,7 +832,8 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, XYZArray const& pos, for (uint i = 0; i < molKind.nonBonded_1_4.count; ++i) { uint p1 = molKind.nonBonded_1_4.part1[i]; uint p2 = molKind.nonBonded_1_4.part2[i]; - if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + currentAxes.InRcut(distSq, pos, p1, p2, box); + if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, molKind.AtomKind (molKind.nonBonded_1_4.part1[i]), @@ -864,7 +866,8 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, for (uint i = 0; i < molKind.nonBonded_1_3.count; ++i) { uint p1 = mols.start[molIndex] + molKind.nonBonded_1_3.part1[i]; uint p2 = mols.start[molIndex] + molKind.nonBonded_1_3.part2[i]; - if (currentAxes.InRcut(distSq, currentCoords, p1, p2, box)) { + currentAxes.InRcut(distSq, currentCoords, p1, p2, box); + if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, molKind.AtomKind (molKind.nonBonded_1_3.part1[i]), @@ -896,7 +899,8 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, XYZArray const& pos, for (uint i = 0; i < molKind.nonBonded_1_3.count; ++i) { uint p1 = molKind.nonBonded_1_3.part1[i]; uint p2 = molKind.nonBonded_1_3.part2[i]; - if (currentAxes.InRcut(distSq, pos, p1, p2, box)) { + currentAxes.InRcut(distSq, pos, p1, p2, box); + if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, molKind.AtomKind (molKind.nonBonded_1_3.part1[i]), @@ -920,7 +924,7 @@ double CalculateEnergy::IntraEnergy_1_3(const double distSq, const uint atom1, { if(!forcefield.OneThree) return 0.0; - else if(forcefield.rCutSq <= distSq) + else if(forcefield.rCutSq < distSq) return 0.0; double eng = 0.0; @@ -950,7 +954,7 @@ double CalculateEnergy::IntraEnergy_1_4(const double distSq, const uint atom1, { if(!forcefield.OneFour) return 0.0; - else if(forcefield.rCutSq <= distSq) + else if(forcefield.rCutSq < distSq) return 0.0; double eng = 0.0; diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index f94a4de83..0b831dfbd 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -390,7 +390,7 @@ void ConfigSetup::Init(const char *fileName) if(b < BOX_TOTAL) { sys.elect.cutoffCoulomb[b] = stringtod(line[2]); sys.elect.cutoffCoulombRead[b] = true; - printf("%s %-d: %-28s %4.4f A\n", "Info: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); + printf("%s %-d %-27s %4.4f A\n", "Info: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); } else { std::cout << "Error: This simulation requires only " << BOX_TOTAL << " sets of Coulomb Cutoff!" << std::endl; @@ -848,7 +848,7 @@ void ConfigSetup::fillDefaults(void) if(!sys.elect.cutoffCoulombRead[b]) { sys.elect.cutoffCoulomb[b] = sys.ff.cutoff; sys.elect.cutoffCoulombRead[b] = true; - printf("%s %-d: %-25s %4.4f A\n", "Default: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); + printf("%s %-d %-24s %4.4f A\n", "Default: Box ", b, " CutoffCoulomb", sys.elect.cutoffCoulomb[b]); } } } diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 7b3fa21e2..bc6c57685 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -265,8 +265,11 @@ inline void FFParticle::CalcCoulombAdd_1_4(double& en, const double distSq, //mie potential inline double FFParticle::CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rRat2 = sigmaSq[index] / distSq; double rRat4 = rRat2 * rRat2; @@ -285,6 +288,9 @@ inline double FFParticle::CalcEn(const double distSq, inline double FFParticle::CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double val = forcefield.alpha[b] * dist; @@ -299,8 +305,10 @@ inline double FFParticle::CalcCoulomb(const double distSq, inline double FFParticle::CalcCoulombEn(const double distSq, const double qi_qj_Fact, const uint b) const { - if(distSq <= forcefield.rCutLowSq) + if(forcefield.rCutLowSq > distSq) return num::BIGNUM; + else if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; if(forcefield.ewald) { double dist = sqrt(distSq); @@ -314,8 +322,11 @@ inline double FFParticle::CalcCoulombEn(const double distSq, inline double FFParticle::CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rNeg2 = 1.0 / distSq; double rRat2 = rNeg2 * sigmaSq[index]; @@ -336,6 +347,9 @@ inline double FFParticle::CalcVir(const double distSq, inline double FFParticle::CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); diff --git a/src/FFParticle.h b/src/FFParticle.h index 1dfad2e02..69abefeb6 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -60,9 +60,9 @@ struct FFParticle { double GetN_1_4(const uint i, const uint j) const; // LJ interaction functions virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; diff --git a/src/FFShift.h b/src/FFShift.h index ee350d91f..660c4770b 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -42,9 +42,9 @@ struct FF_SHIFT : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; @@ -140,8 +140,11 @@ inline void FF_SHIFT::CalcCoulombAdd_1_4(double& en, const double distSq, //mie potential inline double FF_SHIFT::CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rRat2 = sigmaSq[index] / distSq; double rRat4 = rRat2 * rRat2; @@ -160,6 +163,9 @@ inline double FF_SHIFT::CalcEn(const double distSq, inline double FF_SHIFT::CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double val = forcefield.alpha[b] * dist; @@ -174,8 +180,10 @@ inline double FF_SHIFT::CalcCoulomb(const double distSq, inline double FF_SHIFT::CalcCoulombEn(const double distSq, const double qi_qj_Fact, const uint b) const { - if(distSq <= forcefield.rCutLowSq) + if(forcefield.rCutLowSq > distSq) return num::BIGNUM; + else if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; if(forcefield.ewald) { double dist = sqrt(distSq); @@ -189,8 +197,11 @@ inline double FF_SHIFT::CalcCoulombEn(const double distSq, //mie potential inline double FF_SHIFT::CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rNeg2 = 1.0 / distSq; double rRat2 = rNeg2 * sigmaSq[index]; @@ -211,6 +222,9 @@ inline double FF_SHIFT::CalcVir(const double distSq, inline double FF_SHIFT::CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); diff --git a/src/FFSwitch.h b/src/FFSwitch.h index 69e2215a7..bd4c527d6 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -48,9 +48,9 @@ struct FF_SWITCH : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; @@ -133,10 +133,12 @@ inline void FF_SWITCH::CalcCoulombAdd_1_4(double& en, const double distSq, //mie potential inline double FF_SWITCH::CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { - uint index = FlatIndex(kind1, kind2); + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rCutSq_rijSq = forcefield.rCutSq - distSq; double rCutSq_rijSq_Sq = rCutSq_rijSq * rCutSq_rijSq; @@ -161,6 +163,9 @@ inline double FF_SWITCH::CalcEn(const double distSq, inline double FF_SWITCH::CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double val = forcefield.alpha[b] * dist; @@ -177,8 +182,10 @@ inline double FF_SWITCH::CalcCoulomb(const double distSq, inline double FF_SWITCH::CalcCoulombEn(const double distSq, const double qi_qj_Fact, const uint b) const { - if(distSq <= forcefield.rCutLowSq) + if(forcefield.rCutLowSq > distSq) return num::BIGNUM; + else if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; if(forcefield.ewald) { double dist = sqrt(distSq); @@ -194,10 +201,12 @@ inline double FF_SWITCH::CalcCoulombEn(const double distSq, //mie potential inline double FF_SWITCH::CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const + const uint kind1, const uint kind2) const { - uint index = FlatIndex(kind1, kind2); + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double rCutSq_rijSq = forcefield.rCutSq - distSq; double rCutSq_rijSq_Sq = rCutSq_rijSq * rCutSq_rijSq; @@ -228,6 +237,9 @@ inline double FF_SWITCH::CalcVir(const double distSq, inline double FF_SWITCH::CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index 5aa2d570a..5c54fe7a4 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -72,9 +72,9 @@ struct FF_SWITCH_MARTINI : public FFParticle { ff_setup::NBfix const& nbfix); virtual double CalcEn(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual double CalcVir(const double distSq, - const uint kind1, const uint kind2, const uint b) const; + const uint kind1, const uint kind2) const; virtual void CalcAdd_1_4(double& en, const double distSq, const uint kind1, const uint kind2) const; @@ -226,10 +226,12 @@ inline void FF_SWITCH_MARTINI::CalcCoulombAdd_1_4(double& en, //mie potential inline double FF_SWITCH_MARTINI::CalcEn(const double distSq, const uint kind1, - const uint kind2, const uint b) const + const uint kind2) const { - uint index = FlatIndex(kind1, kind2); + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double r_2 = 1.0 / distSq; double r_4 = r_2 * r_2; double r_6 = r_4 * r_2; @@ -261,6 +263,9 @@ inline double FF_SWITCH_MARTINI::CalcEn(const double distSq, inline double FF_SWITCH_MARTINI::CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double val = forcefield.alpha[b] * dist; @@ -281,8 +286,10 @@ inline double FF_SWITCH_MARTINI::CalcCoulomb(const double distSq, inline double FF_SWITCH_MARTINI::CalcCoulombEn(const double distSq, const double qi_qj_Fact, const uint b) const { - if(distSq <= forcefield.rCutLowSq) + if(forcefield.rCutLowSq > distSq) return num::BIGNUM; + else if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; if(forcefield.ewald) { double dist = sqrt(distSq); @@ -303,11 +310,13 @@ inline double FF_SWITCH_MARTINI::CalcCoulombEn(const double distSq, //mie potential inline double FF_SWITCH_MARTINI::CalcVir(const double distSq, const uint kind1, - const uint kind2, const uint b) const + const uint kind2) const { + if(forcefield.rCutSq < distSq) + return 0.0; + uint index = FlatIndex(kind1, kind2); double n_ij = n[index]; - double r_1 = 1.0 / sqrt(distSq); double r_8 = pow(r_1, 8); double r_n2 = pow(r_1, n_ij + 2); @@ -333,6 +342,9 @@ inline double FF_SWITCH_MARTINI::CalcVir(const double distSq, inline double FF_SWITCH_MARTINI::CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const { + if(forcefield.rCutCoulombSq[b] < distSq) + return 0.0; + if(forcefield.ewald) { double dist = sqrt(distSq); double constValue = 2.0 * forcefield.alpha[b] / sqrt(M_PI); From 39fcd06e08f1c8aaccbfd035c958daa900283092 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 30 Jul 2018 14:40:55 -0400 Subject: [PATCH 087/199] Implement the GPU part for realcutoff --- src/FFParticle.cpp | 2 +- src/GPU/CalculateEnergyCUDAKernel.cu | 21 ++++++++++++++++----- src/GPU/CalculateEnergyCUDAKernel.cuh | 5 +++-- src/GPU/CalculateForceCUDAKernel.cu | 21 ++++++++++++++++----- src/GPU/CalculateForceCUDAKernel.cuh | 5 +++-- src/GPU/ConstantDefinitionsCUDAKernel.cu | 13 +++++++++---- src/GPU/ConstantDefinitionsCUDAKernel.cuh | 3 ++- src/GPU/VariablesCUDA.cuh | 2 ++ 8 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index bc6c57685..f8fc52866 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -95,7 +95,7 @@ void FFParticle::Init(ff_setup::Particle const& mie, #ifdef GOMC_CUDA double diElectric_1 = 1.0 / forcefield.dielectric; InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, forcefield.vdwKind, - forcefield.isMartini, count, forcefield.rCut, + forcefield.isMartini, count, forcefield.rCut, forcefield.rCutCoulomb, forcefield.rCutLow, forcefield.rswitch, forcefield.alpha, forcefield.ewald, diElectric_1); #endif diff --git a/src/GPU/CalculateEnergyCUDAKernel.cu b/src/GPU/CalculateEnergyCUDAKernel.cu index 24093b1b5..0fd2f0adb 100644 --- a/src/GPU/CalculateEnergyCUDAKernel.cu +++ b/src/GPU/CalculateEnergyCUDAKernel.cu @@ -87,9 +87,10 @@ void CallBoxInterGPU(VariablesCUDA *vars, vars->gpu_isMartini, vars->gpu_count, vars->gpu_rCut, + vars->gpu_rCutCoulomb[box], vars->gpu_rCutLow, vars->gpu_rOn, - vars->gpu_alpha, + vars->gpu_alpha[box], vars->gpu_ewald, vars->gpu_diElectric_1, vars->gpu_nonOrth, @@ -158,9 +159,10 @@ __global__ void BoxInterGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, + double gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double *gpu_alpha, + double gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, int *gpu_nonOrth, @@ -179,18 +181,19 @@ __global__ void BoxInterGPU(int *gpu_pair1, double qqFact = 167000.0; gpu_REn[threadID] = 0.0; gpu_LJEn[threadID] = 0.0; + double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb); if(InRcutGPU(distSq, gpu_x[gpu_pair1[threadID]], gpu_y[gpu_pair1[threadID]], gpu_z[gpu_pair1[threadID]], gpu_x[gpu_pair2[threadID]], gpu_y[gpu_pair2[threadID]], gpu_z[gpu_pair2[threadID]], xAxes, yAxes, zAxes, xAxes / 2.0, yAxes / 2.0, zAxes / 2.0, - gpu_rCut[0], gpu_nonOrth[0], gpu_cell_x, gpu_cell_y, + cutoff, gpu_nonOrth[0], gpu_cell_x, gpu_cell_y, gpu_cell_z, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z)) { if(electrostatic) { qi_qj_fact = gpu_particleCharge[gpu_pair1[threadID]] * gpu_particleCharge[gpu_pair2[threadID]] * qqFact; gpu_REn[threadID] = CalcCoulombGPU(distSq, qi_qj_fact, gpu_rCutLow[0], gpu_ewald[0], gpu_VDW_Kind[0], - gpu_alpha[0], gpu_rCut[0], + gpu_alpha, gpu_rCutCoulomb, gpu_isMartini[0], gpu_diElectric_1[0]); } @@ -206,9 +209,13 @@ __global__ void BoxInterGPU(int *gpu_pair1, __device__ double CalcCoulombGPU(double distSq, double qi_qj_fact, double gpu_rCutLow, int gpu_ewald, int gpu_VDW_Kind, double gpu_alpha, - double gpu_rCut, int gpu_isMartini, + double gpu_rCutCoulomb, int gpu_isMartini, double gpu_diElectric_1) { + if((gpu_rCutCoulomb * gpu_rCutCoulomb) < distSq) { + return 0.0; + } + if(gpu_VDW_Kind == GPU_VDW_STD_KIND) { return CalcCoulombParticleGPU(distSq, qi_qj_fact, gpu_alpha); } else if(gpu_VDW_Kind == GPU_VDW_SHIFT_KIND) { @@ -229,6 +236,10 @@ __device__ double CalcEnGPU(double distSq, int kind1, int kind2, int gpu_isMartini, double gpu_rCut, double gpu_rOn, int gpu_count) { + if((gpu_rCut * gpu_rCut) < distSq) { + return 0.0; + } + int index = FlatIndexGPU(kind1, kind2, gpu_count); if(gpu_VDW_Kind == GPU_VDW_STD_KIND) { return CalcEnParticleGPU(distSq, index, gpu_sigmaSq, gpu_n, gpu_epsilon_Cn); diff --git a/src/GPU/CalculateEnergyCUDAKernel.cuh b/src/GPU/CalculateEnergyCUDAKernel.cuh index 449c1d98d..4947607b7 100644 --- a/src/GPU/CalculateEnergyCUDAKernel.cuh +++ b/src/GPU/CalculateEnergyCUDAKernel.cuh @@ -48,9 +48,10 @@ __global__ void BoxInterGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, + double gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double *gpu_alpha, + double gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, int *gpu_nonOrth, @@ -65,7 +66,7 @@ __global__ void BoxInterGPU(int *gpu_pair1, __device__ double CalcCoulombGPU(double distSq, double qi_qj_fact, double gpu_rCutLow, int gpu_ewald, int gpu_VDW_Kind, double gpu_alpha, - double gpu_rCut, int gpu_isMartini, + double gpu_rCutCoulomb, int gpu_isMartini, double gpu_diElectric_1); __device__ double CalcEnGPU(double distSq, int kind1, int kind2, double *gpu_sigmaSq, double *gpu_n, diff --git a/src/GPU/CalculateForceCUDAKernel.cu b/src/GPU/CalculateForceCUDAKernel.cu index f919ff3ba..66e3f80c9 100644 --- a/src/GPU/CalculateForceCUDAKernel.cu +++ b/src/GPU/CalculateForceCUDAKernel.cu @@ -147,9 +147,10 @@ void CallBoxInterForceGPU(VariablesCUDA *vars, vars->gpu_isMartini, vars->gpu_count, vars->gpu_rCut, + vars->gpu_rCutCoulomb[box], vars->gpu_rCutLow, vars->gpu_rOn, - vars->gpu_alpha, + vars->gpu_alpha[box], vars->gpu_ewald, vars->gpu_diElectric_1, vars->gpu_cell_x[box], @@ -366,9 +367,10 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, + double gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double *gpu_alpha, + double gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, double *gpu_cell_x, @@ -393,12 +395,13 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, gpu_vT12[threadID] = 0.0, gpu_vT13[threadID] = 0.0, gpu_vT23[threadID] = 0.0; gpu_rT12[threadID] = 0.0, gpu_rT13[threadID] = 0.0, gpu_rT23[threadID] = 0.0; double diff_comx, diff_comy, diff_comz; + double cutoff = fmax(gpu_rCut, gpu_rCutCoulomb); if(InRcutGPU(distSq, virX, virY, virZ, gpu_x[gpu_pair1[threadID]], gpu_y[gpu_pair1[threadID]], gpu_z[gpu_pair1[threadID]], gpu_x[gpu_pair2[threadID]], gpu_y[gpu_pair2[threadID]], gpu_z[gpu_pair2[threadID]], xAxes, yAxes, zAxes, xAxes / 2.0, - yAxes / 2.0, zAxes / 2.0, gpu_rCut[0], gpu_nonOrth[0], + yAxes / 2.0, zAxes / 2.0, cutoff, gpu_nonOrth[0], gpu_cell_x, gpu_cell_y, gpu_cell_z, gpu_Invcell_x, gpu_Invcell_y, gpu_Invcell_z)) { diff_comx = gpu_comx[gpu_particleMol[gpu_pair1[threadID]]] - @@ -416,7 +419,7 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, qi_qj = gpu_particleCharge[gpu_pair1[threadID]] * gpu_particleCharge[gpu_pair2[threadID]]; pRF = CalcCoulombForceGPU(distSq, qi_qj, gpu_VDW_Kind[0], gpu_ewald[0], - gpu_isMartini[0], gpu_alpha[0], gpu_rCut[0], + gpu_isMartini[0], gpu_alpha, gpu_rCutCoulomb, gpu_diElectric_1[0]); gpu_rT11[threadID] = pRF * (virX * diff_comx); @@ -524,8 +527,12 @@ __global__ void ForceReciprocalGPU(double *gpu_x, __device__ double CalcCoulombForceGPU(double distSq, double qi_qj, int gpu_VDW_Kind, int gpu_ewald, int gpu_isMartini, double gpu_alpha, - double gpu_rCut, double gpu_diElectric_1) + double gpu_rCutCoulomb, double gpu_diElectric_1) { + if((gpu_rCutCoulomb * gpu_rCutCoulomb) < distSq) { + return 0.0; + } + if(gpu_VDW_Kind == GPU_VDW_STD_KIND) { return CalcCoulombVirParticleGPU(distSq, qi_qj, gpu_alpha); } else if(gpu_VDW_Kind == GPU_VDW_SHIFT_KIND) { @@ -544,6 +551,10 @@ __device__ double CalcEnForceGPU(double distSq, int kind1, int kind2, double gpu_rOn, int gpu_isMartini, int gpu_VDW_Kind, int gpu_count) { + if((gpu_rCut * gpu_rCut) < distSq) { + return 0.0; + } + int index = FlatIndexGPU(kind1, kind2, gpu_count); if(gpu_VDW_Kind == GPU_VDW_STD_KIND) { return CalcVirParticleGPU(distSq, index, gpu_sigmaSq, gpu_n, diff --git a/src/GPU/CalculateForceCUDAKernel.cuh b/src/GPU/CalculateForceCUDAKernel.cuh index fa233b9d1..4e0c31a49 100644 --- a/src/GPU/CalculateForceCUDAKernel.cuh +++ b/src/GPU/CalculateForceCUDAKernel.cuh @@ -88,9 +88,10 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, + double gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double *gpu_alpha, + double gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, double *gpu_cell_x, @@ -130,7 +131,7 @@ __device__ double CalcCoulombForceGPU(double distSq, double qi_qj, int gpu_ewald, int gpu_isMartini, double gpu_alpha, - double gpu_rCut, + double gpu_rCutCoulomb, double gpu_diElectric_1); __device__ double CalcEnForceGPU(double distSq, int kind1, int kind2, double *gpu_sigmaSq, diff --git a/src/GPU/ConstantDefinitionsCUDAKernel.cu b/src/GPU/ConstantDefinitionsCUDAKernel.cu index fb9115c11..d066553d6 100644 --- a/src/GPU/ConstantDefinitionsCUDAKernel.cu +++ b/src/GPU/ConstantDefinitionsCUDAKernel.cu @@ -15,8 +15,8 @@ along with this program, also can be found at . void InitGPUForceField(VariablesCUDA &vars, double const *sigmaSq, double const *epsilon_Cn, double const *n, int VDW_Kind, int isMartini, - int count, double Rcut, double RcutLow, - double Ron, double alpha, + int count, double Rcut, double const *rCutCoulomb, + double RcutLow, double Ron, double const *alpha, int ewald, double diElectric_1) { int countSq = count * count; @@ -27,9 +27,10 @@ void InitGPUForceField(VariablesCUDA &vars, double const *sigmaSq, cudaMalloc(&vars.gpu_isMartini, sizeof(int)); cudaMalloc(&vars.gpu_count, sizeof(int)); cudaMalloc(&vars.gpu_rCut, sizeof(double)); + cudaMalloc(&vars.gpu_rCutCoulomb, BOX_TOTAL * sizeof(double)); cudaMalloc(&vars.gpu_rCutLow, sizeof(double)); cudaMalloc(&vars.gpu_rOn, sizeof(double)); - cudaMalloc(&vars.gpu_alpha, sizeof(double)); + cudaMalloc(&vars.gpu_alpha, BOX_TOTAL * sizeof(double)); cudaMalloc(&vars.gpu_ewald, sizeof(int)); cudaMalloc(&vars.gpu_diElectric_1, sizeof(double)); @@ -44,10 +45,13 @@ void InitGPUForceField(VariablesCUDA &vars, double const *sigmaSq, cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_count, &count, sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_rCut, &Rcut, sizeof(double), cudaMemcpyHostToDevice); + cudaMemcpy(vars.gpu_rCutCoulomb, rCutCoulomb, BOX_TOTAL * sizeof(double), + cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_rCutLow, &RcutLow, sizeof(double), cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_rOn, &Ron, sizeof(double), cudaMemcpyHostToDevice); - cudaMemcpy(vars.gpu_alpha, &alpha, sizeof(double), cudaMemcpyHostToDevice); + cudaMemcpy(vars.gpu_alpha, alpha, BOX_TOTAL * sizeof(double), + cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_ewald, &ewald, sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(vars.gpu_diElectric_1, &diElectric_1, sizeof(double), cudaMemcpyHostToDevice); @@ -259,6 +263,7 @@ void DestroyCUDAVars(VariablesCUDA *vars) cudaFree(vars->gpu_isMartini); cudaFree(vars->gpu_count); cudaFree(vars->gpu_rCut); + cudaFree(vars->gpu_rCutCoulomb); cudaFree(vars->gpu_rCutLow); cudaFree(vars->gpu_rOn); cudaFree(vars->gpu_alpha); diff --git a/src/GPU/ConstantDefinitionsCUDAKernel.cuh b/src/GPU/ConstantDefinitionsCUDAKernel.cuh index a75526d52..9ba114387 100644 --- a/src/GPU/ConstantDefinitionsCUDAKernel.cuh +++ b/src/GPU/ConstantDefinitionsCUDAKernel.cuh @@ -22,7 +22,8 @@ along with this program, also can be found at . void InitGPUForceField(VariablesCUDA &vars, double const *sigmaSq, double const *epsilon_Cn, double const *n, int VDW_Kind, int isMartini, int count, - double Rcut, double RcutLow, double Ron, double alpha, + double Rcut, double const *rCutCoulomb, + double RcutLow, double Ron, double const *alpha, int ewald, double diElectric_1); void InitCoordinatesCUDA(VariablesCUDA *vars, uint atomNumber, uint maxAtomsInMol, uint maxMolNumber); diff --git a/src/GPU/VariablesCUDA.cuh b/src/GPU/VariablesCUDA.cuh index 4a208a975..1bcf7a626 100644 --- a/src/GPU/VariablesCUDA.cuh +++ b/src/GPU/VariablesCUDA.cuh @@ -23,6 +23,7 @@ public: gpu_rCutLow = NULL; gpu_rOn = NULL; gpu_alpha = NULL; + gpu_rCutCoulomb = NULL; gpu_ewald = NULL; gpu_diElectric_1 = NULL; } @@ -33,6 +34,7 @@ public: int *gpu_isMartini; int *gpu_count; double *gpu_rCut; + double *gpu_rCutCoulomb; double *gpu_rCutLow; double *gpu_rOn; double *gpu_alpha; From 196c8cb012f555702d48de0093797888ae6e16eb Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 30 Jul 2018 16:26:25 -0400 Subject: [PATCH 088/199] Fix the compiling error for GPU but still not functional --- src/Ewald.cpp | 21 +++++++++++---------- src/FFParticle.cpp | 7 ++++--- src/GPU/CalculateEnergyCUDAKernel.cu | 6 +++--- src/GPU/CalculateForceCUDAKernel.cu | 6 +++--- src/Main.cpp | 1 + 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/Ewald.cpp b/src/Ewald.cpp index f2c65d94b..8ef792b29 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -21,6 +21,7 @@ along with this program, also can be found at . #include #ifdef GOMC_CUDA #include "CalculateEwaldCUDAKernel.cuh" +#include "CalculateForceCUDAKernel.cuh" #include "ConstantDefinitionsCUDAKernel.cuh" #endif @@ -56,7 +57,7 @@ Ewald::~Ewald() { if(ff.ewald) { #ifdef GOMC_CUDA - DestroyEwaldCUDAVars(forcefield.particles->getCUDAVars()); + DestroyEwaldCUDAVars(ff.particles->getCUDAVars()); #endif for (uint b = 0; b < BOXES_WITH_U_NB; b++) { if (kx[b] != NULL) { @@ -173,7 +174,7 @@ void Ewald::AllocMem() } #ifdef GOMC_CUDA - InitEwaldVariablesCUDA(forcefield.particles->getCUDAVars(), imageTotal); + InitEwaldVariablesCUDA(ff.particles->getCUDAVars(), imageTotal); #endif } @@ -211,7 +212,7 @@ void Ewald::BoxReciprocalSetup(uint box, XYZArray const& molCoords) } thisMol++; } - CallBoxReciprocalSetupGPU(forcefield.particles->getCUDAVars(), + CallBoxReciprocalSetupGPU(ff.particles->getCUDAVars(), thisBoxCoords, kx[box], ky[box], kz[box], chargeBox, imageSize[box], sumRnew[box], sumInew[box], prefact[box], hsqr[box], @@ -300,7 +301,7 @@ double Ewald::MolReciprocal(XYZArray const& molCoords, cCoords.Set(p, currentCoords[startAtom + p]); MolCharge.push_back(thisKind.AtomCharge(p)); } - CallMolReciprocalGPU(forcefield.particles->getCUDAVars(), + CallMolReciprocalGPU(ff.particles->getCUDAVars(), cCoords, molCoords, MolCharge, imageSizeRef[box], sumRnew[box], sumInew[box], energyRecipNew, box); #else @@ -367,7 +368,7 @@ double Ewald::SwapDestRecip(const cbmc::TrialMol &newMol, for(p = 0; p < length; p++) { MolCharge.push_back(thisKind.AtomCharge(p)); } - CallSwapReciprocalGPU(forcefield.particles->getCUDAVars(), + CallSwapReciprocalGPU(ff.particles->getCUDAVars(), molCoords, MolCharge, imageSizeRef[box], sumRnew[box], sumInew[box], insert, energyRecipNew, box); @@ -433,7 +434,7 @@ double Ewald::SwapSourceRecip(const cbmc::TrialMol &oldMol, for(p = 0; p < length; p++) { MolCharge.push_back(thisKind.AtomCharge(p)); } - CallSwapReciprocalGPU(forcefield.particles->getCUDAVars(), + CallSwapReciprocalGPU(ff.particles->getCUDAVars(), molCoords, MolCharge, imageSizeRef[box], sumRnew[box], sumInew[box], insert, energyRecipNew, box); @@ -738,7 +739,7 @@ void Ewald::SetRecipRef(uint box) std::memcpy(prefactRef[box], prefact[box], sizeof(double) *imageSize[box]); } #ifdef GOMC_CUDA - CopyCurrentToRefCUDA(forcefield.particles->getCUDAVars(), + CopyCurrentToRefCUDA(ff.particles->getCUDAVars(), box, imageSize[box]); #endif for(uint b = 0; b < BOXES_WITH_U_NB; b++) { @@ -855,7 +856,7 @@ Virial Ewald::ForceReciprocal(Virial& virial, uint box) const thisMol++; } - CallForceReciprocalGPU(forcefield.particles->getCUDAVars(), thisBoxCoords, + CallForceReciprocalGPU(ff.particles->getCUDAVars(), thisBoxCoords, thisBoxCOMDiff, chargeBox, wT11, wT12, wT13, wT22, wT23, wT33, imageSizeRef[box], constVal, box); @@ -1002,7 +1003,7 @@ void Ewald::UpdateRecip(uint box) sumRnew[box] = tempR; sumInew[box] = tempI; #ifdef GOMC_CUDA - UpdateRecipCUDA(forcefield.particles->getCUDAVars(), box); + UpdateRecipCUDA(ff.particles->getCUDAVars(), box); #endif } @@ -1027,7 +1028,7 @@ void Ewald::UpdateRecipVec(uint box) hsqr[box] = tempHsqr; prefact[box] = tempPrefact; #ifdef GOMC_CUDA - UpdateRecipVecCUDA(forcefield.particles->getCUDAVars(), box); + UpdateRecipVecCUDA(ff.particles->getCUDAVars(), box); #endif for(uint b = 0; b < BOXES_WITH_U_NB; b++) { diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index f8fc52866..89b9a84fd 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -95,9 +95,10 @@ void FFParticle::Init(ff_setup::Particle const& mie, #ifdef GOMC_CUDA double diElectric_1 = 1.0 / forcefield.dielectric; InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, forcefield.vdwKind, - forcefield.isMartini, count, forcefield.rCut, forcefield.rCutCoulomb, - forcefield.rCutLow, forcefield.rswitch, forcefield.alpha, - forcefield.ewald, diElectric_1); + forcefield.isMartini, count, forcefield.rCut, + forcefield.rCutCoulomb,forcefield.rCutLow, + forcefield.rswitch, forcefield.alpha, forcefield.ewald, + diElectric_1); #endif } diff --git a/src/GPU/CalculateEnergyCUDAKernel.cu b/src/GPU/CalculateEnergyCUDAKernel.cu index 0fd2f0adb..4984237f2 100644 --- a/src/GPU/CalculateEnergyCUDAKernel.cu +++ b/src/GPU/CalculateEnergyCUDAKernel.cu @@ -220,14 +220,14 @@ __device__ double CalcCoulombGPU(double distSq, double qi_qj_fact, return CalcCoulombParticleGPU(distSq, qi_qj_fact, gpu_alpha); } else if(gpu_VDW_Kind == GPU_VDW_SHIFT_KIND) { return CalcCoulombShiftGPU(distSq, qi_qj_fact, gpu_ewald, gpu_alpha, - gpu_rCut); + gpu_rCutCoulomb); } else if(gpu_VDW_Kind == GPU_VDW_SWITCH_KIND && gpu_isMartini) { return CalcCoulombSwitchMartiniGPU(distSq, qi_qj_fact, gpu_ewald, - gpu_alpha, gpu_rCut, + gpu_alpha, gpu_rCutCoulomb, gpu_diElectric_1); } else return CalcCoulombSwitchGPU(distSq, qi_qj_fact, gpu_alpha, gpu_ewald, - gpu_rCut); + gpu_rCutCoulomb); } __device__ double CalcEnGPU(double distSq, int kind1, int kind2, diff --git a/src/GPU/CalculateForceCUDAKernel.cu b/src/GPU/CalculateForceCUDAKernel.cu index 66e3f80c9..94c012baf 100644 --- a/src/GPU/CalculateForceCUDAKernel.cu +++ b/src/GPU/CalculateForceCUDAKernel.cu @@ -395,7 +395,7 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, gpu_vT12[threadID] = 0.0, gpu_vT13[threadID] = 0.0, gpu_vT23[threadID] = 0.0; gpu_rT12[threadID] = 0.0, gpu_rT13[threadID] = 0.0, gpu_rT23[threadID] = 0.0; double diff_comx, diff_comy, diff_comz; - double cutoff = fmax(gpu_rCut, gpu_rCutCoulomb); + double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb); if(InRcutGPU(distSq, virX, virY, virZ, gpu_x[gpu_pair1[threadID]], gpu_y[gpu_pair1[threadID]], gpu_z[gpu_pair1[threadID]], @@ -539,10 +539,10 @@ __device__ double CalcCoulombForceGPU(double distSq, double qi_qj, return CalcCoulombVirShiftGPU(distSq, qi_qj, gpu_ewald, gpu_alpha); } else if(gpu_VDW_Kind == GPU_VDW_SWITCH_KIND && gpu_isMartini) { return CalcCoulombVirSwitchMartiniGPU(distSq, qi_qj, gpu_ewald, gpu_alpha, - gpu_rCut, gpu_diElectric_1); + gpu_rCutCoulomb, gpu_diElectric_1); } else return CalcCoulombVirSwitchGPU(distSq, qi_qj, gpu_ewald, gpu_alpha, - gpu_rCut); + gpu_rCutCoulomb); } __device__ double CalcEnForceGPU(double distSq, int kind1, int kind2, diff --git a/src/Main.cpp b/src/Main.cpp index 940a84aaa..fb14ca41e 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -8,6 +8,7 @@ along with this program, also can be found at . #include "GOMC_Config.h" //For version number #ifdef GOMC_CUDA #include "cuda.h" +#include #endif #include #include From 1bcb4dd6f99019156bc1809e87452f65e29ef171 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 30 Jul 2018 17:05:07 -0400 Subject: [PATCH 089/199] Fix to set the maximum volume when we have dual cutoff for real part --- src/BoxDimensions.cpp | 11 ----------- src/BoxDimensions.h | 3 --- src/MoveSettings.cpp | 2 +- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index fbc16a9b8..4c35bd10e 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -193,17 +193,6 @@ double BoxDimensions::GetTotVolume() const return sum; } -double BoxDimensions::MinVolume() const -{ - double minV = volume[mv::BOX0]; - for(uint b = 1; b < BOX_TOTAL; b++) { - if(volume[b] < minV) { - minV = volume[b]; - } - } - return minV; -} - void BoxDimensions::SetVolume(const uint b, const double vol) { if(constArea) { diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index 4cc00ddfb..36118bd3b 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -48,9 +48,6 @@ class BoxDimensions double GetTotVolume() const; - //Return minimum volume of simulation boxes. - double MinVolume() const; - virtual void SetVolume(const uint b, const double vol); virtual uint ShiftVolume(BoxDimensions & newDim, XYZ & scale, diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index 6761e9973..d145db4fd 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -131,7 +131,7 @@ void MoveSettings::Adjust(const uint majMoveKind, #if ENSEMBLE == NPT || ENSEMBLE == GEMC case mv::VOL_TRANSFER : { //Warning: This will lead to have acceptance > %50 - double maxVolExchange = boxDimRef.MinVolume() - boxDimRef.minVol[b]; + double maxVolExchange = boxDimRef.volume[b] - boxDimRef.minVol[b]; num::Bound(scale[moveIndex], 0.001, maxVolExchange - 0.001); break; } From f9655dbd60f35fa3768b909ef2cbb6e5b45a93fa Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 30 Jul 2018 17:28:48 -0400 Subject: [PATCH 090/199] Fix to the error in MEMC when one of the kind is fixed --- src/IntraMoleculeExchange1.h | 6 +++--- src/MoleculeExchange1.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 4ad62ae7e..0894f2790 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -118,11 +118,11 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { kindS = kindL = largeBB[0] = largeBB[1] = -1; - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { if(molRef.kinds[k].name == statV.intraMemcVal.largeKind[t]) { - kindL = molLookRef.GetCanSwapKind(k); + kindL = k; } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind[t]) { - kindS = molLookRef.GetCanSwapKind(k); + kindS = k; } } diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index f301941b5..d43573ce8 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -127,11 +127,11 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { kindS = kindL = largeBB[0] = largeBB[1] = -1; - for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + for(uint k = 0; k < molLookRef.GetNumKind(); k++) { if(molRef.kinds[k].name == statV.memcVal.largeKind[t]) { - kindL = molLookRef.GetCanSwapKind(k); + kindL = k; } else if(molRef.kinds[k].name == statV.memcVal.smallKind[t]) { - kindS = molLookRef.GetCanSwapKind(k); + kindS = k; } } From 4f367dbc06d432083772045c1afd76e63830e3d6 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 30 Jul 2018 19:13:40 -0400 Subject: [PATCH 091/199] Fix to the error checking in MEMC when one of the kind is fixed --- src/IntraMoleculeExchange1.h | 15 ++++++++------- src/MoleculeExchange1.h | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 0894f2790..e4525bae1 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -118,22 +118,23 @@ inline void IntraMoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { kindS = kindL = largeBB[0] = largeBB[1] = -1; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) { - if(molRef.kinds[k].name == statV.intraMemcVal.largeKind[t]) { - kindL = k; - } else if(molRef.kinds[k].name == statV.intraMemcVal.smallKind[t]) { - kindS = k; + for(uint k = 0; k < molLookRef.GetNumCanMoveKind(); k++) { + uint kind = molLookRef.GetCanMoveKind(k); + if(molRef.kinds[kind].name == statV.intraMemcVal.largeKind[t]) { + kindL = kind; + } else if(molRef.kinds[kind].name == statV.intraMemcVal.smallKind[t]) { + kindS = kind; } } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged or it is fixed in its position.\n", statV.intraMemcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged or it is fixed in its position.\n", statV.intraMemcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index d43573ce8..3d860317a 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -127,22 +127,23 @@ inline void MoleculeExchange1::SetMEMC(StaticVals const& statV) { for(uint t = 0; t < exchangeRatioVec.size(); t++) { kindS = kindL = largeBB[0] = largeBB[1] = -1; - for(uint k = 0; k < molLookRef.GetNumKind(); k++) { - if(molRef.kinds[k].name == statV.memcVal.largeKind[t]) { - kindL = k; - } else if(molRef.kinds[k].name == statV.memcVal.smallKind[t]) { - kindS = k; + for(uint k = 0; k < molLookRef.GetNumCanSwapKind(); k++) { + uint kind = molLookRef.GetCanSwapKind(k); + if(molRef.kinds[kind].name == statV.memcVal.largeKind[t]) { + kindL = kind; + } else if(molRef.kinds[kind].name == statV.memcVal.smallKind[t]) { + kindS = kind; } } if(kindS == -1) { - printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged.\n", + printf("Error: Residue name %s was not found in PDB file as small molecule kind to be exchanged or not allowed to be transferred.\n", statV.memcVal.smallKind[t].c_str()); exit(EXIT_FAILURE); } if(kindL == -1) { - printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged.\n", + printf("Error: Residue name %s was not found in PDB file as large molecule kind to be exchanged or not allowed to be transferred.\n", statV.memcVal.largeKind[t].c_str()); exit(EXIT_FAILURE); } From 872756da54358ef7994b545ff02fb8acc2bb8eca Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 31 Jul 2018 11:49:03 -0400 Subject: [PATCH 092/199] Fix to the bug when molecule is not found in the box and tried to perform the move. --- src/CrankShaft.h | 16 +++++++++------- src/IntraSwap.h | 12 +++++++----- src/MoleculeTransfer.h | 10 ++++++---- src/Regrowth.h | 10 ++++++---- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index 40ff54ef2..a7b0cf89f 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -74,7 +74,7 @@ inline uint CrankShaft::GetBoxAndMol(const double subDraw, const double movPerc) //molecule will be removed and insert in same box destBox = sourceBox; - if (state != mv::fail_state::NO_MOL_OF_KIND_IN_BOX) { + if (state == mv::fail_state::NO_FAIL) { pStart = pLen = 0; molRef.GetRangeStartLength(pStart, pLen, molIndex); } @@ -84,12 +84,14 @@ inline uint CrankShaft::GetBoxAndMol(const double subDraw, const double movPerc) inline uint CrankShaft::Prep(const double subDraw, const double movPerc) { uint state = GetBoxAndMol(subDraw, movPerc); - newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); - oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); - oldMol.SetCoords(coordCurrRef, pStart); - //Set the newMol coordinate same as oldMol. Later after Transform, coordinates - //will be updated. - newMol.SetCoords(coordCurrRef, pStart); + if (state == mv::fail_state::NO_FAIL) { + newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); + oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); + oldMol.SetCoords(coordCurrRef, pStart); + //Set the newMol coordinate same as oldMol. Later after Transform, coordinates + //will be updated. + newMol.SetCoords(coordCurrRef, pStart); + } return state; } diff --git a/src/IntraSwap.h b/src/IntraSwap.h index e9207e5d6..5dae57d18 100644 --- a/src/IntraSwap.h +++ b/src/IntraSwap.h @@ -74,7 +74,7 @@ inline uint IntraSwap::GetBoxAndMol(const double subDraw, const double movPerc) //molecule will be removed and insert in same box destBox = sourceBox; - if (state != mv::fail_state::NO_MOL_OF_KIND_IN_BOX) { + if (state == mv::fail_state::NO_FAIL) { pStart = pLen = 0; molRef.GetRangeStartLength(pStart, pLen, molIndex); } @@ -84,10 +84,12 @@ inline uint IntraSwap::GetBoxAndMol(const double subDraw, const double movPerc) inline uint IntraSwap::Prep(const double subDraw, const double movPerc) { uint state = GetBoxAndMol(subDraw, movPerc); - newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); - oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); - oldMol.SetCoords(coordCurrRef, pStart); - W_tc = 1.0; + if (state == mv::fail_state::NO_FAIL) { + newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); + oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); + oldMol.SetCoords(coordCurrRef, pStart); + W_tc = 1.0; + } return state; } diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index dc8cc1bd6..1643b639d 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -78,7 +78,7 @@ inline uint MoleculeTransfer::GetBoxPairAndMol(const double subDraw, const doubl } #endif - if (state != mv::fail_state::NO_MOL_OF_KIND_IN_BOX) { + if (state == mv::fail_state::NO_FAIL) { pStart = pLen = 0; molRef.GetRangeStartLength(pStart, pLen, molIndex); } @@ -88,9 +88,11 @@ inline uint MoleculeTransfer::GetBoxPairAndMol(const double subDraw, const doubl inline uint MoleculeTransfer::Prep(const double subDraw, const double movPerc) { uint state = GetBoxPairAndMol(subDraw, movPerc); - newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); - oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); - oldMol.SetCoords(coordCurrRef, pStart); + if (state == mv::fail_state::NO_FAIL) { + newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); + oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); + oldMol.SetCoords(coordCurrRef, pStart); + } return state; } diff --git a/src/Regrowth.h b/src/Regrowth.h index cd1bebbf9..80a5e94c3 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -74,7 +74,7 @@ inline uint Regrowth::GetBoxAndMol(const double subDraw, const double movPerc) //molecule will be removed and insert in same box destBox = sourceBox; - if (state != mv::fail_state::NO_MOL_OF_KIND_IN_BOX) { + if (state == mv::fail_state::NO_FAIL) { pStart = pLen = 0; molRef.GetRangeStartLength(pStart, pLen, molIndex); } @@ -84,9 +84,11 @@ inline uint Regrowth::GetBoxAndMol(const double subDraw, const double movPerc) inline uint Regrowth::Prep(const double subDraw, const double movPerc) { uint state = GetBoxAndMol(subDraw, movPerc); - newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); - oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); - oldMol.SetCoords(coordCurrRef, pStart); + if (state == mv::fail_state::NO_FAIL) { + newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); + oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); + oldMol.SetCoords(coordCurrRef, pStart); + } return state; } From c2018fc34e5dc3e3ebdfb36c410f3e44197a5413 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 4 Aug 2018 21:22:30 -0400 Subject: [PATCH 093/199] Change MoveSetting to keep trak of acceptance, max value of each kind. Change VolumeTransfer class to be compatible for multiboxes. In NPT_GEMC, change the volume of one box, rather than two box at the same time. --- src/BoxDimensions.cpp | 18 ++- src/BoxDimensions.h | 4 +- src/BoxDimensionsNonOrth.cpp | 12 +- src/BoxDimensionsNonOrth.h | 2 +- src/CellList.cpp | 50 ++++++- src/CellList.h | 4 + src/ConfigSetup.cpp | 8 +- src/ConsoleOutput.cpp | 96 +++++++------ src/Coordinates.cpp | 8 +- src/Coordinates.h | 2 +- src/CrankShaft.h | 16 +-- src/Ewald.cpp | 18 ++- src/Ewald.h | 5 +- src/EwaldCached.cpp | 45 ++++++- src/EwaldCached.h | 6 + src/IntraMoleculeExchange1.h | 22 ++- src/IntraMoleculeExchange2.h | 4 +- src/IntraMoleculeExchange3.h | 4 +- src/IntraSwap.h | 18 +-- src/MoleculeExchange1.h | 31 +++-- src/MoleculeExchange2.h | 4 +- src/MoleculeExchange3.h | 4 +- src/MoleculeTransfer.h | 17 +-- src/MoveBase.h | 16 --- src/MoveConst.h | 5 +- src/MoveSettings.cpp | 227 +++++++++++++++++++------------ src/MoveSettings.h | 55 +++++--- src/NoEwald.cpp | 6 + src/NoEwald.h | 3 + src/OutputVars.cpp | 22 ++- src/OutputVars.h | 8 +- src/PDBOutput.cpp | 6 +- src/Regrowth.h | 17 +-- src/Rotation.h | 19 +-- src/System.cpp | 2 +- src/Translate.h | 19 +-- src/VolumeTransfer.h | 253 +++++++++++++++++++---------------- 37 files changed, 616 insertions(+), 440 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index 4c35bd10e..fc9cc28ff 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -123,17 +123,18 @@ uint BoxDimensions::ShiftVolume(BoxDimensions & newDim, XYZ & scale, } uint BoxDimensions::ExchangeVolume(BoxDimensions & newDim, XYZ * scale, - const double transfer) const + const double transfer, const uint *box) const { uint state = mv::fail_state::NO_FAIL; - double vTot = GetTotVolume(); + double vTot = GetTotVolume(box[0], box[1]); - newDim.SetVolume(0, volume[0] + transfer); - newDim.SetVolume(1, vTot - newDim.volume[0]); + newDim.SetVolume(box[0], volume[box[0]] + transfer); + newDim.SetVolume(box[1], vTot - newDim.volume[box[0]]); //If move would shrink any box axis to be less than 2 * rcut, then //automatically reject to prevent errors. - for (uint b = 0; b < BOX_TOTAL; b++) { + for (uint i = 0; i < 2; i++) { + uint b = box[i]; scale[b] = newDim.axis.Get(b) / axis.Get(b); if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { @@ -185,12 +186,9 @@ BoxDimensions& BoxDimensions::operator=(BoxDimensions const& other) return *this; } -double BoxDimensions::GetTotVolume() const +double BoxDimensions::GetTotVolume(const uint b1, const uint b2) const { - double sum = 0.0; - for (uint b = 0; b < BOX_TOTAL; b++) - sum += volume[b]; - return sum; + return (volume[b1] + volume[b2]); } void BoxDimensions::SetVolume(const uint b, const double vol) diff --git a/src/BoxDimensions.h b/src/BoxDimensions.h index 36118bd3b..4b1fb2529 100644 --- a/src/BoxDimensions.h +++ b/src/BoxDimensions.h @@ -46,7 +46,7 @@ class BoxDimensions return axis.Get(b); } - double GetTotVolume() const; + double GetTotVolume(const uint b1, const uint b2) const; virtual void SetVolume(const uint b, const double vol); @@ -55,7 +55,7 @@ class BoxDimensions //!Calculate and execute volume exchange based on transfer virtual uint ExchangeVolume(BoxDimensions & newDim, XYZ * scale, - const double transfer) const; + const double transfer, const uint *box) const; //Vector btwn two points, accounting for PBC, on an individual axis virtual XYZ MinImage(XYZ rawVec, const uint b) const; diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index c95731f3e..004c2b53d 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -174,19 +174,19 @@ uint BoxDimensionsNonOrth::ShiftVolume(BoxDimensionsNonOrth & newDim, } uint BoxDimensionsNonOrth::ExchangeVolume(BoxDimensionsNonOrth & newDim, - XYZ * scale, - const double transfer) const + XYZ * scale, const double transfer, const uint *box) const { uint state = mv::fail_state::NO_FAIL; - double vTot = GetTotVolume(); + double vTot = GetTotVolume(box[0], box[1]); newDim = *this; - newDim.SetVolume(0, volume[0] + transfer); - newDim.SetVolume(1, vTot - newDim.volume[0]); + newDim.SetVolume(box[0], volume[box[0]] + transfer); + newDim.SetVolume(box[1], vTot - newDim.volume[box[0]]); //If move would shrink any box axis to be less than 2 * rcut, then //automatically reject to prevent errors. - for (uint b = 0; b < BOX_TOTAL; b++) { + for (uint i = 0; i < 2; i++) { + uint b = box[i]; scale[b] = newDim.axis.Get(b) / axis.Get(b); if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { diff --git a/src/BoxDimensionsNonOrth.h b/src/BoxDimensionsNonOrth.h index 9a7edc961..4b78a5e16 100644 --- a/src/BoxDimensionsNonOrth.h +++ b/src/BoxDimensionsNonOrth.h @@ -45,7 +45,7 @@ class BoxDimensionsNonOrth : public BoxDimensions //!Calculate and execute volume exchange based on transfer virtual uint ExchangeVolume(BoxDimensionsNonOrth & newDim, XYZ * scale, - const double transfer) const; + const double transfer, const uint *box) const; //Construct cell basis based on new axis dimension void CalcCellDimensions(const uint b); diff --git a/src/CellList.cpp b/src/CellList.cpp index 5153aca7c..fdcc85351 100644 --- a/src/CellList.cpp +++ b/src/CellList.cpp @@ -117,6 +117,33 @@ void CellList::ResizeGrid(const BoxDimensions& dims) isBuilt = true; } +// Resize one boxes to match current axes +void CellList::ResizeGridBox(const BoxDimensions& dims, const uint b) +{ + XYZ sides = dims.axis[b]; + bool rebuild = false; + int* eCells = edgeCells[b]; + int oldCells = eCells[0]; + eCells[0] = std::max((int)floor(sides.x / cutoff[b]), 3); + cellSize[b].x = sides.x / eCells[0]; + rebuild |= (!isBuilt || (oldCells != eCells[0])); + + oldCells = eCells[1]; + eCells[1] = std::max((int)floor(sides.y / cutoff[b]), 3); + cellSize[b].y = sides.y / eCells[1]; + rebuild |= (!isBuilt || (oldCells != eCells[1])); + + oldCells = eCells[2]; + eCells[2] = std::max((int)floor(sides.z / cutoff[b]), 3); + cellSize[b].z = sides.z / eCells[2]; + rebuild |= (!isBuilt || (oldCells != eCells[2])); + + if (rebuild) { + RebuildNeighbors(b); + } + isBuilt = true; +} + void CellList::RebuildNeighbors(int b) { int* eCells = edgeCells[b]; @@ -149,9 +176,8 @@ void CellList::RebuildNeighbors(int b) } } -void CellList::GridAll( BoxDimensions& dims, - const XYZArray& pos, - const MoleculeLookup& lookup) +void CellList::GridAll(BoxDimensions& dims, const XYZArray& pos, + const MoleculeLookup& lookup) { dimensions = &dims; list.resize(pos.Count()); @@ -171,6 +197,24 @@ void CellList::GridAll( BoxDimensions& dims, } } +void CellList::GridBox(BoxDimensions& dims, const XYZArray& pos, + const MoleculeLookup& lookup, const uint b) +{ + dimensions = &dims; + list.resize(pos.Count()); + ResizeGridBox(dims, b); + head[b].assign(edgeCells[b][0] * edgeCells[b][1] * + edgeCells[b][2], END_CELL); + MoleculeLookup::box_iterator it = lookup.BoxBegin(b), + end = lookup.BoxEnd(b); + + // For each molecule per box + while (it != end) { + AddMol(*it, b, pos); + ++it; + } +} + CellList::Pairs CellList::EnumeratePairs(int box) const { diff --git a/src/CellList.h b/src/CellList.h index 5be3fd58f..dbec6aa4e 100644 --- a/src/CellList.h +++ b/src/CellList.h @@ -27,6 +27,8 @@ class CellList void RemoveMol(const int molIndex, const int box, const XYZArray& pos); void AddMol(const int molIndex, const int box, const XYZArray& pos); void GridAll(BoxDimensions& dims, const XYZArray& pos, const MoleculeLookup& lookup); + void GridBox(BoxDimensions& dims, const XYZArray& pos, const MoleculeLookup& lookup, + const uint b); // Index of cell containing position int PositionToCell(const XYZ& posRef, int box) const; @@ -57,6 +59,8 @@ class CellList // Resize all boxes to match current axes void ResizeGrid(const BoxDimensions& dims); + // Resize one boxes to match current axes + void ResizeGridBox(const BoxDimensions& dims, const uint b); // Rebuild head/neighbor lists in box b to match current grid void RebuildNeighbors(int b); diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 0b831dfbd..7bbe82460 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -118,6 +118,7 @@ ConfigSetup::ConfigSetup(void) sys.cbmcTrials.nonbonded.nth = UINT_MAX; out.statistics.vars.molNum.block = false; out.statistics.vars.molNum.fluct = false; + sys.volume.cstVolBox0 = false; #endif #ifdef VARIABLE_VOLUME sys.moves.volume = DBL_MAX; @@ -912,6 +913,11 @@ void ConfigSetup::verifyInputs(void) std::cout << "Warning: Input pressure set, but will be ignored in NVT-GEMC" << std::endl; } + + if(sys.volume.cstVolBox0 && sys.gemc.kind == mv::GEMC_NVT) { + std::cout << "Error: Fix volume of box 0 cannot be applied to NVT-GEMC!\n"; + exit(EXIT_FAILURE); + } #endif #if ENSEMBLE == NPT if(sys.gemc.pressure == DBL_MAX) { @@ -919,7 +925,7 @@ void ConfigSetup::verifyInputs(void) exit(EXIT_FAILURE); } if(sys.volume.cstVolBox0) { - std::cout << "Warning: Fix volume of box 0 set, but will be ignored.\n"; + std::cout << "Error: Fix volume of box 0 cannot be applied fot NPT simulation!\n"; exit(EXIT_FAILURE); } #endif diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 91bec8ed6..772d5f014 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -93,47 +93,47 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const if(box == mv::BOX0) { #endif if(var->Perfromed(mv::DISPLACE)) { - sub = mv::GetMoveSubIndex(mv::DISPLACE, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + sub = mv::DISPLACE; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); + printElement(var->GetScale(box, sub), elementWidth); } if(var->Perfromed(mv::ROTATE)) { - sub = mv::GetMoveSubIndex(mv::ROTATE, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + sub = mv::ROTATE; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); + printElement(var->GetScale(box, sub), elementWidth); } if(var->Perfromed(mv::INTRA_SWAP)) { - sub = mv::GetMoveSubIndex(mv::INTRA_SWAP, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::INTRA_SWAP; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } if(var->Perfromed(mv::REGROWTH)) { - sub = mv::GetMoveSubIndex(mv::REGROWTH, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::REGROWTH; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } if(var->Perfromed(mv::INTRA_MEMC)) { - sub = mv::GetMoveSubIndex(mv::INTRA_MEMC, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::INTRA_MEMC; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } if(var->Perfromed(mv::CRANKSHAFT)) { - sub = mv::GetMoveSubIndex(mv::CRANKSHAFT, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::CRANKSHAFT; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } #if ENSEMBLE == GCMC @@ -142,27 +142,27 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const #if ENSEMBLE == GEMC || ENSEMBLE == GCMC if(var->Perfromed(mv::MOL_TRANSFER)) { - sub = mv::GetMoveSubIndex(mv::MOL_TRANSFER, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::MOL_TRANSFER; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } if(var->Perfromed(mv::MEMC)) { - sub = mv::GetMoveSubIndex(mv::MEMC, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); + sub = mv::MEMC; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); } #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT if(var->Perfromed(mv::VOL_TRANSFER)) { - sub = mv::GetMoveSubIndex(mv::VOL_TRANSFER, box); - printElement(var->GetTries(sub), elementWidth); - printElement(var->GetAccepted(sub), elementWidth); - printElement(var->GetAcceptPercent(sub), elementWidth); - printElement(var->GetScale(sub), elementWidth); + sub = mv::VOL_TRANSFER; + printElement(var->GetTries(box, sub), elementWidth); + printElement(var->GetAccepted(box, sub), elementWidth); + printElement(var->GetAcceptPercent(box, sub), elementWidth); + printElement(var->GetScale(box, sub), elementWidth); } #endif @@ -175,7 +175,11 @@ void ConsoleOutput::PrintStatistic(const uint box, const ulong step) const uint offset = box * var->numKinds; std::string title = "STAT_"; - title += (box ? "1:" : "0:"); + sstrm::Converter toStr; + std::string numStr = ""; + toStr << box; + toStr >> numStr; + title += numStr + ":"; printElementStep(title, step + 1, elementWidth); if(enableVolume) @@ -206,7 +210,11 @@ void ConsoleOutput::PrintStatistic(const uint box, const ulong step) const void ConsoleOutput::PrintPressureTensor(const uint box, const ulong step) const { std::string title = "PRES_"; - title += (box ? "1:" : "0:"); + sstrm::Converter toStr; + std::string numStr = ""; + toStr << box; + toStr >> numStr; + title += numStr + ":"; printElementStep(title, step + 1, elementWidth); for(uint i = 0; i < 3; i++) { @@ -228,7 +236,11 @@ void ConsoleOutput::PrintEnergy(const uint box, Energy const& en, Virial const& vir, const ulong step) const { std::string title = "ENER_"; - title += (box ? "1:" : "0:"); + sstrm::Converter toStr; + std::string numStr = ""; + toStr << box; + toStr >> numStr; + title += numStr + ":"; printElementStep(title, step + 1, elementWidth); printElement(en.total, elementWidth); diff --git a/src/Coordinates.cpp b/src/Coordinates.cpp index f6686e19d..2cd604dc7 100644 --- a/src/Coordinates.cpp +++ b/src/Coordinates.cpp @@ -135,16 +135,16 @@ void Coordinates::RotateRand //scale all in each mol newCOM[m]/oldCOM[m] void Coordinates::VolumeTransferTranslate (uint & state, Coordinates & dest, COM & newCOM, BoxDimensions & newDim, - COM const& oldCOM, const double max) const + COM const& oldCOM, const double max, const uint *box) const { - XYZ scale[BOX_TOTAL]; + XYZ scale[2]; double transfer = prngRef.Sym(max); //Scale cell - state = boxDimRef.ExchangeVolume(newDim, scale, transfer); + state = boxDimRef.ExchangeVolume(newDim, scale, transfer, box); //If scaling succeeded (if it wouldn't take the box to below 2*rcut, cont. if(state == mv::fail_state::NO_FAIL) { - for (uint b = 0; b < BOX_TOTAL; ++b) { + for (uint b = 0; b < 2; ++b) { TranslateOneBox(dest, newCOM, oldCOM, newDim, b, scale[b]); } } diff --git a/src/Coordinates.h b/src/Coordinates.h index 12aaf1b82..dedad40da 100644 --- a/src/Coordinates.h +++ b/src/Coordinates.h @@ -55,7 +55,7 @@ class Coordinates : public XYZArray //scale all in each mol newCOM[m]/oldCOM[m] void VolumeTransferTranslate (uint & state, Coordinates &dest, COM & newCOM, BoxDimensions & newDim, - COM const& oldCOM, const double max) const; + COM const& oldCOM, const double max, const uint *box) const; //Helper for TranslateAll void TranslateOneBox(Coordinates & dest, COM & newCOM, COM const& oldCOM, diff --git a/src/CrankShaft.h b/src/CrankShaft.h index a7b0cf89f..a514b9cf6 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -19,13 +19,7 @@ class CrankShaft : public MoveBase CrankShaft(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -51,8 +45,8 @@ void CrankShaft::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Crank-Shaft ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::CRANKSHAFT, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::CRANKSHAFT, k))); else printf("%10.5f ", 0.0); } @@ -179,9 +173,7 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) } else //else we didn't even try because we knew it would fail result = false; - subPick = mv::GetMoveSubIndex(mv::CRANKSHAFT, sourceBox); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, kindIndex, sourceBox); + moveSetRef.Update(mv::CRANKSHAFT, result, step, sourceBox, kindIndex); } #endif diff --git a/src/Ewald.cpp b/src/Ewald.cpp index 8ef792b29..5dd1bcc27 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -49,9 +49,7 @@ Ewald::Ewald(StaticVals & stat, System & sys) : #else currentAxes(*stat.GetBoxDim()) #endif -{ - imageLarge = 0; -} +{} Ewald::~Ewald() { @@ -545,12 +543,18 @@ void Ewald::exgMolCache() //compare number of images in different boxes and select the largest one uint Ewald::findLargeImage() { - imageLarge = 0; + uint maxImg = 0; for (int b = 0; b < BOXES_WITH_U_NB; b++) { - if (imageLarge < imageSize[b]) - imageLarge = imageSize[b]; + if (maxImg < imageSize[b]) + maxImg = imageSize[b]; } - return imageLarge; + return maxImg; +} + +//backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip +void Ewald::backupMolCache() +{ + return; } void Ewald::RecipInitOrth(uint box, BoxDimensions const& boxAxes) diff --git a/src/Ewald.h b/src/Ewald.h index 1243feccd..235cf68da 100644 --- a/src/Ewald.h +++ b/src/Ewald.h @@ -116,11 +116,15 @@ class Ewald //restore cosMol and sinMol virtual void RestoreMol(int molIndex); + //Find the largest kvector uint findLargeImage(); //update sinMol and cosMol virtual void exgMolCache(); + //backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip + virtual void backupMolCache(); + virtual void UpdateVectorsAndRecipTerms(); private: @@ -139,7 +143,6 @@ class Ewald uint *imageSizeRef; //const uint imageTotal = GetImageSize(); uint imageTotal; - uint imageLarge; uint *kmax; double **sumRnew; //cosine serries double **sumInew; //sine serries diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index c8ae1341c..af827d1fa 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -5,10 +5,15 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ #include "EwaldCached.h" +#include "StaticVals.h" using namespace geom; -EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) { } +EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) +#if ENSEMBLE == GEMC + , GEMC_KIND(stat.kindOfGEMC) +#endif + {} EwaldCached::~EwaldCached() { @@ -88,7 +93,7 @@ void EwaldCached::AllocMem() } //25% larger than original box size, reserved for image size change - imageTotal = findLargeImage(); + imageTotal = Ewald::findLargeImage(); cosMolRestore = new double[imageTotal]; sinMolRestore = new double[imageTotal]; @@ -254,8 +259,8 @@ double EwaldCached::SwapDestRecip(const cbmc::TrialMol &newMol, #pragma omp parallel default(shared) #endif { - std::memcpy(cosMolRestore, cosMolRef[molIndex], sizeof(double)*imageLarge); - std::memcpy(sinMolRestore, sinMolRef[molIndex], sizeof(double)*imageLarge); + std::memcpy(cosMolRestore, cosMolRef[molIndex], sizeof(double)*imageTotal); + std::memcpy(sinMolRestore, sinMolRef[molIndex], sizeof(double)*imageTotal); } if (box < BOXES_WITH_U_NB) { @@ -360,3 +365,35 @@ void EwaldCached::exgMolCache() cosMolBoxRecip = tempCos; sinMolBoxRecip = tempSin; } + +//backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip +void EwaldCached::backupMolCache() +{ + #if ENSEMBLE == NPT + exgMolCache(); + #elif ENSEMBLE == GEMC + if(GEMC_KIND == mv::GEMC_NVT) { + if(BOX_TOTAL == 2) { + exgMolCache(); + } else { + uint m; + #ifdef _OPENMP + #pragma omp parallel for private(m) + #endif + for(m = 0; m < mols.count; m++) { + std::memcpy(cosMolBoxRecip[m], cosMolRef[m], sizeof(double)*imageTotal); + std::memcpy(sinMolBoxRecip[m], sinMolRef[m], sizeof(double)*imageTotal); + } + } + } else { + uint m; + #ifdef _OPENMP + #pragma omp parallel for private(m) + #endif + for(m = 0; m < mols.count; m++) { + std::memcpy(cosMolBoxRecip[m], cosMolRef[m], sizeof(double)*imageTotal); + std::memcpy(sinMolBoxRecip[m], sinMolRef[m], sizeof(double)*imageTotal); + } + } + #endif +} \ No newline at end of file diff --git a/src/EwaldCached.h b/src/EwaldCached.h index e191d9e0b..5b531d826 100644 --- a/src/EwaldCached.h +++ b/src/EwaldCached.h @@ -49,6 +49,9 @@ class EwaldCached : public Ewald //update sinMol and cosMol virtual void exgMolCache(); + //backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip + virtual void backupMolCache(); + private: double *cosMolRestore; //cos()*charge @@ -57,6 +60,9 @@ class EwaldCached : public Ewald double **sinMolRef; double **cosMolBoxRecip; double **sinMolBoxRecip; + #if ENSEMBLE == GEMC + const uint GEMC_KIND; + #endif }; diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index e4525bae1..c11031585 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -26,6 +26,8 @@ class IntraMoleculeExchange1 : public MoveBase perAdjust(statV.GetPerAdjust()), cavB(3), invCavB(3) { enableID = statV.intraMemcVal.enable; + trial.resize(BOX_TOTAL); + accepted.resize(BOX_TOTAL); if(enableID) { if(molLookRef.GetNumCanSwapKind() < 2) { @@ -61,6 +63,9 @@ class IntraMoleculeExchange1 : public MoveBase virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); virtual void PrintAcceptKind(); + //This function carries out actions based on the internal acceptance state and + //molecule kind + void AcceptKind(const uint rejectState, const uint kind, const uint box); protected: @@ -85,6 +90,8 @@ class IntraMoleculeExchange1 : public MoveBase //To store total sets of exchange pairs vector exchangeRatioVec, kindSVec, kindLVec; vector< vector > largeBBVec; + //For move acceptance of each molecule kind + std::vector< std::vector > trial, accepted; int exDiff, exchangeRatio; double volCav, lastAccept; @@ -97,6 +104,14 @@ class IntraMoleculeExchange1 : public MoveBase Forcefield const& ffRef; }; +inline void IntraMoleculeExchange1::AcceptKind(const uint rejectState, const uint kind, + const uint box) +{ + trial[box][kind]++; + if(rejectState) + accepted[box][kind]++; +} + void IntraMoleculeExchange1::PrintAcceptKind() { for(uint k = 0; k < kindLVec.size(); k++) { uint ks = kindSVec[k]; @@ -181,8 +196,8 @@ inline void IntraMoleculeExchange1::AdjustExRatio() if(exMin == 0) exMin = 1; - subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept > lastAccept) { exchangeRatio += exDiff; @@ -560,8 +575,7 @@ inline void IntraMoleculeExchange1::Accept(const uint rejectState, result = false; } - subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); + moveSetRef.Update(mv::INTRA_MEMC, result, step, sourceBox); //If we consider total aceeptance of S->L and L->S AcceptKind(result, kindS * molRef.GetKindsCount() + kindL, sourceBox); AcceptKind(result, kindL * molRef.GetKindsCount() + kindS, sourceBox); diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 7fb16d1f9..1a548141a 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -86,8 +86,8 @@ inline void IntraMoleculeExchange2::AdjustExRatio() uint exMax = ceil((float)molInCavCount / (float)perAdjust); uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept > lastAccept) { exchangeRatio += exDiff; diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 7fb41228a..85902f9e0 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -63,8 +63,8 @@ inline void IntraMoleculeExchange3::AdjustExRatio() uint exMax = ceil((float)molInCavCount / (float)perAdjust); uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::INTRA_MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept > lastAccept) { exchangeRatio += exDiff; diff --git a/src/IntraSwap.h b/src/IntraSwap.h index 5dae57d18..5858bf936 100644 --- a/src/IntraSwap.h +++ b/src/IntraSwap.h @@ -19,13 +19,7 @@ class IntraSwap : public MoveBase IntraSwap(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -51,8 +45,8 @@ void IntraSwap::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Intra-Swap ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::INTRA_SWAP, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::INTRA_SWAP, k))); else printf("%10.5f ", 0.0); } @@ -97,7 +91,6 @@ inline uint IntraSwap::Prep(const double subDraw, const double movPerc) inline uint IntraSwap::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); - subPick = mv::GetMoveSubIndex(mv::INTRA_SWAP, sourceBox); molRef.kinds[kindIndex].Build(oldMol, newMol, molIndex); return mv::fail_state::NO_FAIL; } @@ -179,9 +172,8 @@ inline void IntraSwap::Accept(const uint rejectState, const uint step) } } else //else we didn't even try because we knew it would fail result = false; - subPick = mv::GetMoveSubIndex(mv::INTRA_SWAP, sourceBox); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, kindIndex, sourceBox); + + moveSetRef.Update(mv::INTRA_SWAP, result, step, sourceBox, kindIndex); } #endif diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 3d860317a..b20a1ecf1 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -29,6 +29,8 @@ class MoleculeExchange1 : public MoveBase perAdjust(statV.GetPerAdjust()) { enableID = statV.memcVal.enable; + trial.resize(BOX_TOTAL); + accepted.resize(BOX_TOTAL); if(enableID) { if(molLookRef.GetNumCanSwapKind() < 2) { @@ -64,6 +66,9 @@ class MoleculeExchange1 : public MoveBase virtual void CalcEn(); virtual void Accept(const uint earlyReject, const uint step); virtual void PrintAcceptKind(); + //This function carries out actions based on the internal acceptance state and + //molecule kind + void AcceptKind(const uint rejectState, const uint kind, const uint box); protected: @@ -91,6 +96,8 @@ class MoleculeExchange1 : public MoveBase //To store total sets of exchange pairs vector exchangeRatioVec, kindSVec, kindLVec; vector< vector > largeBBVec; + //For move acceptance of each molecule kind + std::vector< std::vector > trial, accepted; int exDiff, exchangeRatio; double volCav, lastAccept; @@ -106,6 +113,14 @@ class MoleculeExchange1 : public MoveBase Forcefield const& ffRef; }; +inline void MoleculeExchange1::AcceptKind(const uint rejectState, const uint kind, + const uint box) +{ + trial[box][kind]++; + if(rejectState) + accepted[box][kind]++; +} + void MoleculeExchange1::PrintAcceptKind() { for(uint k = 0; k < kindLVec.size(); k++) { uint ks = kindSVec[k]; @@ -190,8 +205,8 @@ inline void MoleculeExchange1::AdjustExRatio() if(exMin == 0) exMin = 1; - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept > lastAccept) { exchangeRatio += exDiff; @@ -752,15 +767,9 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) result = false; } -#if ENSEMBLE == GEMC - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::MEMC, destBox); - moveSetRef.Update(result, subPick, step); -#elif ENSEMBLE == GCMC - subPick = mv::GetMoveSubIndex(mv::MEMC); - moveSetRef.Update(result, subPick, step); -#endif + moveSetRef.Update(mv::MEMC, result, step, sourceBox); + moveSetRef.Update(mv::MEMC, result, step, destBox); + //If we consider total aceeptance of S->L and L->S AcceptKind(result, kindS + kindL * molRef.GetKindsCount(), sourceBox); AcceptKind(result, kindS + kindL * molRef.GetKindsCount(), destBox); diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index c35e9c3a7..c42ec1741 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -89,8 +89,8 @@ inline void MoleculeExchange2::AdjustExRatio() { uint exMax = ceil((float)molInCavCount / (float)perAdjust); uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept >= lastAccept) { exchangeRatio += exDiff; diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 32de04ecc..5645a1df0 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -66,8 +66,8 @@ inline void MoleculeExchange3::AdjustExRatio() { uint exMax = ceil((float)molInCavCount / (float)perAdjust); uint exMin = 1; - subPick = mv::GetMoveSubIndex(mv::MEMC, sourceBox); - double currAccept = moveSetRef.GetAccept(subPick); + uint index = kindS + kindL * molRef.GetKindsCount(); + double currAccept = (double)(accepted[sourceBox][index])/(double)(trial[sourceBox][index]); if(abs(currAccept - lastAccept) >= 0.05 * currAccept) { if(currAccept >= lastAccept) { exchangeRatio += exDiff; diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index 1643b639d..b9cde0f9d 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -20,13 +20,7 @@ class MoleculeTransfer : public MoveBase MoleculeTransfer(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -55,8 +49,8 @@ void MoleculeTransfer::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Mol-Transfer ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::MOL_TRANSFER, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::MOL_TRANSFER, k))); else printf("%10.5f ", 0.0); } @@ -100,7 +94,6 @@ inline uint MoleculeTransfer::Prep(const double subDraw, const double movPerc) inline uint MoleculeTransfer::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); - subPick = mv::GetMoveSubIndex(mv::MOL_TRANSFER, sourceBox); molRef.kinds[kindIndex].Build(oldMol, newMol, molIndex); return mv::fail_state::NO_FAIL; } @@ -241,9 +234,7 @@ inline void MoleculeTransfer::Accept(const uint rejectState, const uint step) } else //we didn't even try because we knew it would fail result = false; - subPick = mv::GetMoveSubIndex(mv::MOL_TRANSFER, sourceBox); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, kindIndex, destBox); + moveSetRef.Update(mv::MOL_TRANSFER, result, step, destBox, kindIndex); } #endif diff --git a/src/MoveBase.h b/src/MoveBase.h index 7f0a5c008..cb5ff65c9 100644 --- a/src/MoveBase.h +++ b/src/MoveBase.h @@ -39,11 +39,6 @@ class MoveBase cellList(sys.cellList), molRemoved(false) { calcEwald = sys.GetEwald(); -#if ENSEMBLE == GEMC || ENSEMBLE == NPT - fixBox0 = statV.fixVolBox0; -#endif - trial.resize(BOX_TOTAL); - accepted.resize(BOX_TOTAL); } //Based on the random draw, determine the move kind, box, and @@ -63,7 +58,6 @@ class MoveBase //This function carries out actions based on the internal acceptance state and //molecule kind - void AcceptKind(const uint rejectState, const uint kind, const uint box); //This function print the internal acceptance state for each molecule kind virtual void PrintAcceptKind() = 0; @@ -87,18 +81,8 @@ class MoveBase const bool ewald; CellList& cellList; bool molRemoved, fixBox0; - //For move acceptance of each molecule kind - std::vector< std::vector > trial, accepted; }; -inline void MoveBase::AcceptKind(const uint rejectState, const uint kind, - const uint box) -{ - trial[box][kind]++; - if(rejectState) - accepted[box][kind]++; -} - //Data needed for transforming a molecule's position via inter or intrabox //moves. class MolTransformBase diff --git a/src/MoveConst.h b/src/MoveConst.h index 3c97ec821..93bacd9cf 100644 --- a/src/MoveConst.h +++ b/src/MoveConst.h @@ -133,6 +133,7 @@ const uint IT_KINDS_TOTAL = 2; // 4. IntraSwap (box 0) 5. Regrowth (box 0) 6. IntraMEMC (box 0) // 7. CrankShaft (box 0) +/* #if ENSEMBLE == NVT const uint COUNT = 6; const uint SCALEABLE = 2; @@ -147,6 +148,7 @@ const uint COUNT = 7; const uint SCALEABLE = 3; #endif +*/ //AUTO REJECTION OR ACCEPTANCE FLAGS @@ -165,7 +167,7 @@ const uint INNER_CUTOFF_NEW_TRIAL_POS = 4; const uint VOL_TRANS_WOULD_SHRINK_BOX_BELOW_CUTOFF = 5; } - +/* inline uint GetMoveSubIndex(const uint maj, const uint b = 0) { #if ENSEMBLE == GCMC @@ -177,6 +179,7 @@ inline uint GetMoveSubIndex(const uint maj, const uint b = 0) return maj * BOX_TOTAL + b; #endif } +*/ } diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index d145db4fd..a79f2d224 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -16,127 +16,178 @@ const double MoveSettings::TARGET_ACCEPT_FRACT = 0.50; const double MoveSettings::TINY_AMOUNT = 0.0000001; void MoveSettings::Init(StaticVals const& statV, - pdb_setup::Remarks const& remarks) + pdb_setup::Remarks const& remarks, + const uint tkind) { + + totKind = tkind; perAdjust = statV.simEventFreq.perAdjust; - for (uint m = 0; m < mv::COUNT; m++) { - if (m < mv::SCALEABLE) { - tempTries[m] = 0; - tempAccepted[m] = 0; + for(uint b = 0; b < BOX_TOTAL; b++) { + for(uint m = 0; m < mv::MOVE_KINDS_TOTAL; m++) { + acceptPercent[b][m].resize(totKind, 0); + scale[b][m].resize(totKind, 0); + accepted[b][m].resize(totKind, 0); + tries[b][m].resize(totKind, 0); + tempAccepted[b][m].resize(totKind, 0); + tempTries[b][m].resize(totKind, 0); } - acceptPercent[m] = 0.0; - accepted[m] = tries[m] = 0; } - if(remarks.restart) { - for(uint b = 0; b < BOX_TOTAL; b++) { - uint disp = mv::GetMoveSubIndex(mv::DISPLACE, b); - scale[disp] = remarks.disp[b]; - uint rotate = mv::GetMoveSubIndex(mv::ROTATE, b); - scale[rotate] = remarks.rotate[b]; -#if ENSEMBLE == NPT || ENSEMBLE == GEMC - uint volume = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); - if (remarks.vol[b] > 0.1) { - scale[volume] = remarks.vol[b]; - } else { - scale[volume] = 500; - } -#endif - } - } else { - for(uint b = 0; b < BOX_TOTAL; b++) { - uint disp = mv::GetMoveSubIndex(mv::DISPLACE, b); - scale[disp] = boxDimRef.axis.Min(b) / 4;; - uint rotate = mv::GetMoveSubIndex(mv::ROTATE, b); - scale[rotate] = M_PI_4; + + for(uint b = 0; b < BOX_TOTAL; b++) { + for(uint m = 0; m < mv::MOVE_KINDS_TOTAL; m++) { + for(uint k = 0; k < totKind; k++){ + if(m == mv::DISPLACE) { + if(remarks.restart && remarks.disp[b] > 0.0) { + scale[b][m][k] = remarks.disp[b]; + } else { + scale[b][m][k] = boxDimRef.axis.Min(b) / 4; + } + } else if (m == mv::ROTATE) { + if(remarks.restart && remarks.rotate[b] > 0.0) { + scale[b][m][k] = remarks.rotate[b]; + } else { + scale[b][m][k] = M_PI_4; + } + } #if ENSEMBLE == NPT || ENSEMBLE == GEMC - uint volume = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); - scale[volume] = 500; + else if (m == mv::VOL_TRANSFER) { + if(remarks.restart && remarks.vol[b] > 0.0) { + scale[b][m][k] = remarks.vol[b]; + } else { + scale[b][m][k] = 500; + } + } #endif + } } } - } //Process results of move we just did in terms of acceptance counters -void MoveSettings::Update(const bool isAccepted, const uint moveIndex, - const uint step) +void MoveSettings::Update(const uint move, const bool isAccepted, + const uint step, const uint box, const uint kind) { - if (moveIndex < mv::SCALEABLE) { - tempTries[moveIndex]++; - } else { - tries[moveIndex]++; + tries[box][move][kind]++; + tempTries[box][move][kind]++; + if(isAccepted) { + tempAccepted[box][move][kind]++; + accepted[box][move][kind]++; } - //Store to appropriate acceptance counter, if accepted. - if (isAccepted && moveIndex < mv::SCALEABLE) { - tempAccepted[moveIndex]++; - } else if (isAccepted) { - accepted[moveIndex]++; + acceptPercent[box][move][kind] = (double)(accepted[box][move][kind]) / + (double)(tries[box][move][kind]); + + // for any move that we dont care about kind of molecule, it should be included + //in the if condition + if (move == mv::INTRA_MEMC + #if ENSEMBLE == GEMC || ENSEMBLE == GCMC + || move == mv::INTRA_MEMC + #endif + #if ENSEMBLE == NPT || ENSEMBLE == GEMC + || move == mv::VOL_TRANSFER + #endif + ) { + for (uint k = 1; k < totKind; k++) { + tries[box][move][kind]++; + tempTries[box][move][kind]++; + if(isAccepted) { + tempAccepted[box][move][kind]++; + accepted[box][move][kind]++; + } + acceptPercent[box][move][kind] = (double)(accepted[box][move][kind]) / + (double)(tries[box][move][kind]); + } } - - //Refresh acceptance percentage appropriately - if (moveIndex < mv::SCALEABLE) - acceptPercent[moveIndex] = - (double)(tempAccepted[moveIndex] + accepted[moveIndex]) / - (double)(tempTries[moveIndex] + tries[moveIndex]); - else - acceptPercent[moveIndex] = (double)(accepted[moveIndex]) / - (double)(tries[moveIndex]); - } void MoveSettings::AdjustMoves(const uint step) { //Check whether we need to adjust this move's scaling. if ((step + 1) % perAdjust == 0) { - for (uint m = 0; m < mv::SCALEABLE; ++m) { - uint majMoveKind = m / BOX_TOTAL; - - uint b = m - (majMoveKind * BOXES_WITH_U_NB); - Adjust(majMoveKind, m, b); + for(uint b = 0; b < BOX_TOTAL; b++) { + for (uint m = 0; m < mv::MOVE_KINDS_TOTAL; ++m) { + for(uint k = 0; k < totKind; k++) { + Adjust(b, m, k); + } + } } } } //Adjust responsibly -void MoveSettings::Adjust(const uint majMoveKind, - const uint moveIndex, const uint b) +void MoveSettings::Adjust(const uint box, const uint move, const uint kind) { - if (tempTries[moveIndex] > 0) { - double currentAccept = (double)(tempAccepted[moveIndex]) / - (double)(tempTries[moveIndex]); - - double fractOfTargetAccept = currentAccept / TARGET_ACCEPT_FRACT; - - - if (fractOfTargetAccept > 0.0) { - scale[moveIndex] *= fractOfTargetAccept; + if(move == mv::DISPLACE) { + if(tempTries[box][move][kind] > 0) { + double currentAccept = (double)(tempAccepted[box][move][kind]) / + (double)(tempTries[box][move][kind]); + double fractOfTargetAccept = currentAccept / TARGET_ACCEPT_FRACT; + if (fractOfTargetAccept > 0.0) { + scale[box][move][kind] *= fractOfTargetAccept; + } else { + scale[box][move][kind] *= 0.5; + } } - - accepted[moveIndex] += tempAccepted[moveIndex]; - tries[moveIndex] += tempTries[moveIndex]; - + num::Bound(scale[box][move][kind], 0.0000000001, + (boxDimRef.axis.Min(box) / 2) - TINY_AMOUNT); + } else if(move == mv::ROTATE) { + if(tempTries[box][move][kind] > 0) { + double currentAccept = (double)(tempAccepted[box][move][kind]) / + (double)(tempTries[box][move][kind]); + double fractOfTargetAccept = currentAccept / TARGET_ACCEPT_FRACT; + if (fractOfTargetAccept > 0.0) { + scale[box][move][kind] *= fractOfTargetAccept; + } else { + scale[box][move][kind] *= 0.5; + } + } + num::Bound(scale[box][move][kind], 0.000001, M_PI - TINY_AMOUNT); } - tempAccepted[moveIndex] = tempTries[moveIndex] = 0; - //Bound our values to prevent to big or too small a move. - switch (majMoveKind) { - case mv::DISPLACE : - num::Bound(scale[moveIndex], 0.0000000001, - (boxDimRef.axis.Min(b) / 2) - TINY_AMOUNT); - break; - case mv::ROTATE : - num::Bound(scale[moveIndex], 0.000001, M_PI - TINY_AMOUNT); - break; #if ENSEMBLE == NPT || ENSEMBLE == GEMC - case mv::VOL_TRANSFER : { + else if(move == mv::VOL_TRANSFER) { + if(tempTries[box][move][kind] > 0) { + double currentAccept = (double)(tempAccepted[box][move][kind]) / + (double)(tempTries[box][move][kind]); + double fractOfTargetAccept = currentAccept / TARGET_ACCEPT_FRACT; + if (fractOfTargetAccept > 0.0) { + scale[box][move][kind] *= fractOfTargetAccept; + } else { + scale[box][move][kind] *= 0.5; + } + } //Warning: This will lead to have acceptance > %50 - double maxVolExchange = boxDimRef.volume[b] - boxDimRef.minVol[b]; - num::Bound(scale[moveIndex], 0.001, maxVolExchange - 0.001); - break; + double maxVolExchange = boxDimRef.volume[box] - boxDimRef.minVol[box]; + num::Bound(scale[box][move][kind], 0.001, maxVolExchange - 0.001); } #endif - default: - break; + tempAccepted[box][move][kind] = 0; + tempTries[box][move][kind] = 0; +} + +uint MoveSettings::GetAcceptTot(const uint box, const uint move) const +{ + uint sum= 0; + for(uint k = 0; k < totKind; k++) { + sum += accepted[box][move][k]; + } + return sum; +} + +double MoveSettings::GetScaleTot(const uint box, const uint move) const +{ + double sum = 0.0; + for(uint k = 0; k < totKind; k++) { + sum += scale[box][move][k]; } + return sum / (double)(totKind); } + +uint MoveSettings::GetTrialTot(const uint box, const uint move) const +{ + uint sum = 0.0; + for(uint k = 0; k < totKind; k++) { + sum += tries[box][move][k]; + } + return sum; +} \ No newline at end of file diff --git a/src/MoveSettings.h b/src/MoveSettings.h index be6c489fc..07c635947 100644 --- a/src/MoveSettings.h +++ b/src/MoveSettings.h @@ -12,51 +12,76 @@ along with this program, also can be found at . #include "OutputVars.h" #include "PDBSetup.h" //Primary source of volume. #include "MoveConst.h" //For sizes of arrays. +#include class StaticVals; //For various initialization constants. class BoxDimensions; //For axis sizes +using namespace std; + class MoveSettings { public: friend class OutputVars; - MoveSettings(BoxDimensions & dim) : boxDimRef(dim) {} + MoveSettings(BoxDimensions & dim) : boxDimRef(dim) + { + acceptPercent.resize(BOX_TOTAL); + scale.resize(BOX_TOTAL); + accepted.resize(BOX_TOTAL); + tries.resize(BOX_TOTAL); + tempAccepted.resize(BOX_TOTAL); + tempTries.resize(BOX_TOTAL); + for(uint b = 0; b < BOX_TOTAL; b++) { + acceptPercent[b].resize(mv::MOVE_KINDS_TOTAL); + scale[b].resize(mv::MOVE_KINDS_TOTAL); + accepted[b].resize(mv::MOVE_KINDS_TOTAL); + tries[b].resize(mv::MOVE_KINDS_TOTAL); + tempAccepted[b].resize(mv::MOVE_KINDS_TOTAL); + tempTries[b].resize(mv::MOVE_KINDS_TOTAL); + } + } MoveSettings& operator=(MoveSettings const& rhs) { return *this; } - void Init(StaticVals const& statV, pdb_setup::Remarks const& remarks); + void Init(StaticVals const& statV, pdb_setup::Remarks const& remarks, + const uint tkind); - void Update(const bool isAccepted, const uint moveIndex, const uint step); + void Update(const uint move, const bool isAccepted, const uint step, + const uint box, const uint kind = 0); void AdjustMoves(const uint step); - void Adjust(const uint majMoveKind, const uint moveIndex, const uint b); + void Adjust(const uint box, const uint move, const uint kind); - double Scale(const uint move) const + double Scale(const uint box, const uint move, const uint kind = 0) const { - return scale[move]; + return scale[box][move][kind]; } - double GetAccept(const uint move) const + double GetAccept(const uint box, const uint move, const uint kind = 0) const { - return acceptPercent[move]; + return acceptPercent[box][move][kind]; } - double GetTrial(const uint move) const + double GetTrial(const uint box, const uint move, const uint kind = 0) const { - return tries[move]; + return tries[box][move][kind]; } + uint GetAcceptTot(const uint box, const uint move) const; + uint GetTrialTot(const uint box, const uint move) const; + double GetScaleTot(const uint box, const uint move) const; + private: - double scale[mv::SCALEABLE]; - double acceptPercent[mv::COUNT]; - uint accepted[mv::COUNT]; - uint tries[mv::COUNT]; + + vector< vector< vector > > scale, acceptPercent; + vector< vector< vector > > accepted, tries, tempAccepted, tempTries; + uint perAdjust; - uint tempAccepted[mv::SCALEABLE], tempTries[mv::SCALEABLE]; + uint totKind; #if ENSEMBLE == GEMC uint GEMC_KIND; diff --git a/src/NoEwald.cpp b/src/NoEwald.cpp index 5a34139c9..7ed670195 100644 --- a/src/NoEwald.cpp +++ b/src/NoEwald.cpp @@ -139,6 +139,12 @@ void NoEwald::exgMolCache() return; } +//backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip +void NoEwald::backupMolCache() +{ + return; +} + void NoEwald::UpdateVectorsAndRecipTerms() { return; diff --git a/src/NoEwald.h b/src/NoEwald.h index b4c95c203..687866a1c 100644 --- a/src/NoEwald.h +++ b/src/NoEwald.h @@ -80,6 +80,9 @@ class NoEwald : public Ewald //update sinMol and cosMol virtual void exgMolCache(); + //backup the whole cosMolRef & sinMolRef into cosMolBoxRecip & sinMolBoxRecip + virtual void backupMolCache(); + virtual void UpdateVectorsAndRecipTerms(); }; diff --git a/src/OutputVars.cpp b/src/OutputVars.cpp index acde5a9e9..e79d90528 100644 --- a/src/OutputVars.cpp +++ b/src/OutputVars.cpp @@ -45,30 +45,26 @@ bool OutputVars::Perfromed(uint moveKind) return (movePercRef[moveKind] > 0.0); } -uint OutputVars::GetTries(uint sub) +uint OutputVars::GetTries(uint box, uint sub) { - return (sub < mv::SCALEABLE ? - moveSetRef->tries[sub] + moveSetRef->tempTries[sub] : - moveSetRef->tries[sub]); + return moveSetRef->GetTrialTot(box, sub); } -uint OutputVars::GetAccepted(uint sub) +uint OutputVars::GetAccepted(uint box, uint sub) { - return (sub < mv::SCALEABLE ? - moveSetRef->accepted[sub] + moveSetRef->tempAccepted[sub] : - moveSetRef->accepted[sub]); + return moveSetRef->GetAcceptTot(box, sub); } -double OutputVars::GetScale(uint sub) +double OutputVars::GetScale(uint box, uint sub) { - return moveSetRef->scale[sub]; + return moveSetRef->GetScaleTot(box, sub); } -double OutputVars::GetAcceptPercent(uint sub) +double OutputVars::GetAcceptPercent(uint box, uint sub) { - if(GetTries(sub) == 0) + if(GetTries(box, sub) == 0) return 0.0; - return (double)(GetAccepted(sub)) / (double)(GetTries(sub)) * 100.0; + return (double)(GetAccepted(box, sub)) / (double)(GetTries(box, sub)) * 100.0; } void OutputVars::Init(pdb_setup::Atoms const& atoms) diff --git a/src/OutputVars.h b/src/OutputVars.h index 2026c1d80..94482b9b9 100644 --- a/src/OutputVars.h +++ b/src/OutputVars.h @@ -31,10 +31,10 @@ class OutputVars void CalcAndConvert(ulong step); bool Perfromed(uint moveKind); - uint GetTries(uint sub); - uint GetAccepted(uint sub); - double GetAcceptPercent(uint sub); - double GetScale(uint sub); + uint GetTries(uint box, uint sub); + uint GetAccepted(uint box, uint sub); + double GetAcceptPercent(uint box, uint sub); + double GetScale(uint box, uint sub); //private: //Intermediate vars. diff --git a/src/PDBOutput.cpp b/src/PDBOutput.cpp index 3b025c312..6c64bf95f 100644 --- a/src/PDBOutput.cpp +++ b/src/PDBOutput.cpp @@ -234,11 +234,11 @@ void PDBOutput::PrintCrystRest(const uint b, const uint step, Writer & out) using namespace pdb_entry::cryst1::field; using namespace pdb_entry; using namespace pdb_entry::remark::field; - double displace = moveSetRef.Scale(mv::GetMoveSubIndex(mv::DISPLACE, b)); - double rotate = moveSetRef.Scale(mv::GetMoveSubIndex(mv::ROTATE, b)); + double displace = moveSetRef.GetScaleTot(b, mv::DISPLACE); + double rotate = moveSetRef.GetScaleTot(b, mv::ROTATE); double volume = 0.0; #if ENSEMBLE == GEMC || ENSEMBLE == NPT - volume = moveSetRef.Scale(mv::GetMoveSubIndex(mv::VOL_TRANSFER, b)); + volume = moveSetRef.GetScaleTot(b, mv::VOL_TRANSFER); #endif sstrm::Converter toStr; std::string outStr(pdb_entry::LINE_WIDTH, ' '); diff --git a/src/Regrowth.h b/src/Regrowth.h index 80a5e94c3..fa58bf688 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -19,13 +19,7 @@ class Regrowth : public MoveBase Regrowth(System &sys, StaticVals const& statV) : ffRef(statV.forcefield), molLookRef(sys.molLookupRef), - MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -51,8 +45,8 @@ void Regrowth::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Regrowth ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::REGROWTH, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::REGROWTH, k))); else printf("%10.5f ", 0.0); } @@ -92,7 +86,6 @@ inline uint Regrowth::Prep(const double subDraw, const double movPerc) return state; } - inline uint Regrowth::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); @@ -176,9 +169,7 @@ inline void Regrowth::Accept(const uint rejectState, const uint step) } else //else we didn't even try because we knew it would fail result = false; - subPick = mv::GetMoveSubIndex(mv::REGROWTH, sourceBox); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, kindIndex, sourceBox); + moveSetRef.Update(mv::REGROWTH, result, step, sourceBox, kindIndex); } #endif diff --git a/src/Rotation.h b/src/Rotation.h index 9ad2dc426..e05475a57 100644 --- a/src/Rotation.h +++ b/src/Rotation.h @@ -13,13 +13,7 @@ along with this program, also can be found at . class Rotate : public MoveBase, public MolTransformBase { public: - Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + Rotate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); virtual uint Transform(); @@ -34,8 +28,8 @@ void Rotate::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Rotation ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::ROTATE, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::ROTATE, k))); else printf("%10.5f ", 0.0); } @@ -53,9 +47,8 @@ inline uint Rotate::Prep(const double subDraw, const double movPerc) inline uint Rotate::Transform() { - subPick = mv::GetMoveSubIndex(mv::ROTATE, b); coordCurrRef.RotateRand(newMolPos, pStart, pLen, m, b, - moveSetRef.Scale(subPick)); + moveSetRef.Scale(b, mv::ROTATE, mk)); return mv::fail_state::NO_FAIL; } @@ -107,9 +100,7 @@ inline void Rotate::Accept(const uint rejectState, const uint step) molRemoved = false; } - subPick = mv::GetMoveSubIndex(mv::ROTATE, b); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, mk, b); + moveSetRef.Update(mv::ROTATE, result, step, b, mk); } #endif /*ROTATION_H*/ diff --git a/src/System.cpp b/src/System.cpp index 9a37f7334..6b2c225e5 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -86,7 +86,7 @@ void System::Init(Setup const& set) #ifdef VARIABLE_PARTICLE_NUMBER molLookup.Init(statV.mol, set.pdb.atoms); #endif - moveSettings.Init(statV, set.pdb.remarks); + moveSettings.Init(statV, set.pdb.remarks, molLookupRef.GetNumKind()); //Note... the following calls use box iterators, so must come after //the molecule lookup initialization, in case we're in a constant //particle/molecule ensemble, e.g. NVT diff --git a/src/Translate.h b/src/Translate.h index bbee0bb8c..2cf2528ad 100644 --- a/src/Translate.h +++ b/src/Translate.h @@ -16,13 +16,7 @@ class Translate : public MoveBase, public MolTransformBase { public: - Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) - { - for(uint b = 0; b < BOX_TOTAL; b++) { - trial[b].resize(molRef.GetKindsCount(), 0); - accepted[b].resize(molRef.GetKindsCount(), 0); - } - } + Translate(System &sys, StaticVals const& statV) : MoveBase(sys, statV) {} virtual uint Prep(const double subDraw, const double movPerc); uint ReplaceRot(Rotate const& other); @@ -39,8 +33,8 @@ void Translate::PrintAcceptKind() { for(uint k = 0; k < molRef.GetKindsCount(); k++) { printf("%-30s %-5s ", "% Accepted Displacement ", molRef.kinds[k].name.c_str()); for(uint b = 0; b < BOX_TOTAL; b++) { - if(trial[b][k] > 0) - printf("%10.5f ", (double)(100.0 * accepted[b][k]/trial[b][k])); + if(moveSetRef.GetTrial(b, mv::DISPLACE, k) > 0) + printf("%10.5f ", (100.0 * moveSetRef.GetAccept(b, mv::DISPLACE, k))); else printf("%10.5f ", 0.0); } @@ -61,9 +55,8 @@ inline uint Translate::Prep(const double subDraw, const double movPerc) inline uint Translate::Transform() { - subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); coordCurrRef.TranslateRand(newMolPos, newCOM, pStart, pLen, - m, b, moveSetRef.Scale(subPick)); + m, b, moveSetRef.Scale(b, mv::DISPLACE, mk)); return mv::fail_state::NO_FAIL; } @@ -114,9 +107,7 @@ inline void Translate::Accept(const uint rejectState, const uint step) molRemoved = false; } - subPick = mv::GetMoveSubIndex(mv::DISPLACE, b); - moveSetRef.Update(result, subPick, step); - AcceptKind(result, mk, b); + moveSetRef.Update(mv::DISPLACE, result, step, b, mk); } #endif /*TRANSLATE_H*/ diff --git a/src/VolumeTransfer.h b/src/VolumeTransfer.h index d717878d6..7f3769466 100644 --- a/src/VolumeTransfer.h +++ b/src/VolumeTransfer.h @@ -23,15 +23,17 @@ class VolumeTransfer : public MoveBase public: VolumeTransfer(System &sys, StaticVals const& statV); - virtual uint Prep(const double subDraw, const double movPerc); + virtual uint Prep(const double subDraw, const double movePerc); virtual void CalcEn(); virtual uint Transform(); double GetCoeff() const; virtual void Accept(const uint rejectState, const uint step); virtual void PrintAcceptKind(); private: - //Note: This is only used for GEMC-NPT - uint bPick[BOX_TOTAL], subPick, subPickT[BOX_TOTAL]; + //Note: This is only used for GEMC-NVT + uint bPick[2]; + //Note: This is only used for GEMC-NPT and NPT + uint box; SystemPotential sysPotNew; const Forcefield& forcefield; BoxDimensions newDim; @@ -42,6 +44,7 @@ class VolumeTransfer : public MoveBase const uint GEMC_KIND; const double PRESSURE; bool regrewGrid, isOrth; + bool fixBox0; }; inline VolumeTransfer::VolumeTransfer(System &sys, StaticVals const& statV) : @@ -56,34 +59,30 @@ inline VolumeTransfer::VolumeTransfer(System &sys, StaticVals const& statV) : newMolsPos.Init(sys.coordinates.Count()); newCOMs.Init(statV.mol.count); isOrth = statV.isOrthogonal; + fixBox0 = statV.fixVolBox0; } void VolumeTransfer::PrintAcceptKind() { printf("%-37s", "% Accepted Volume-Transfer "); for(uint b = 0; b < BOX_TOTAL; b++) { - uint index = mv::GetMoveSubIndex(mv::VOL_TRANSFER, b); - printf("%10.5f ", 100.0 * moveSetRef.GetAccept(index)); + printf("%10.5f ", 100.0 * moveSetRef.GetAccept(b, mv::VOL_TRANSFER)); } std::cout << std::endl; } -inline uint VolumeTransfer::Prep(const double subDraw, const double movPerc) +inline uint VolumeTransfer::Prep(const double subDraw, const double movePerc) { uint state = mv::fail_state::NO_FAIL; + if (GEMC_KIND == mv::GEMC_NVT) { - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER); - for (uint b = 0; b < BOX_TOTAL; b++) { - bPick[b] = b; - } - } - if (GEMC_KIND == mv::GEMC_NPT) { -#if ENSEMBLE == NPT - prng.PickBox(bPick[0], subDraw, movPerc); -#else - prng.PickBoxPair(bPick[0], bPick[1], subDraw, movPerc); -#endif - for (uint b = 0; b < BOX_TOTAL; b++) { - subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); + prng.PickBoxPair(bPick[0], bPick[1], subDraw, movePerc); + } else { + prng.PickBox(box, subDraw, movePerc); + if(fixBox0) { + //For NPT-GEMC and when box0 is fixed, we cannot pick box 0 + while(box == 0) { + prng.PickBox(box, subDraw, movePerc); + } } } @@ -102,42 +101,33 @@ inline uint VolumeTransfer::Transform() uint state = mv::fail_state::NO_FAIL; //Reinit, if necessary. if (GEMC_KIND == mv::GEMC_NVT) { - double max = moveSetRef.Scale(subPick); - if(isOrth) + double max = std::min(moveSetRef.Scale(bPick[0], mv::VOL_TRANSFER), + moveSetRef.Scale(bPick[1], mv::VOL_TRANSFER)); + if(isOrth) { coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, newDim, - comCurrRef, max); - else + comCurrRef, max, bPick); + } else { coordCurrRef.VolumeTransferTranslate(state, newMolsPos, newCOMs, - newDimNonOrth, comCurrRef, max); + newDimNonOrth, comCurrRef, max, bPick); + } } else { - XYZ scale[BOX_TOTAL]; - for (uint b = 0; b < BOX_TOTAL; b++) { - if (state == mv::fail_state::NO_FAIL) { - if ((bPick[b] == 0) && fixBox0) - continue; - - double max = moveSetRef.Scale(subPickT[bPick[b]]); - double delta = prng.Sym(max); - if(isOrth) - state = boxDimRef.ShiftVolume(newDim, scale[bPick[b]], - bPick[b], delta); - else - state = boxDimRef.ShiftVolume(newDimNonOrth, scale[bPick[b]], - bPick[b], delta); - } + //NPT ot GEMC-NPT we change volume of one box + XYZ scale; + double max = moveSetRef.Scale(box, mv::VOL_TRANSFER); + double delta = prng.Sym(max); + if(isOrth) { + state = boxDimRef.ShiftVolume(newDim, scale, box, delta); + } else { + state = boxDimRef.ShiftVolume(newDimNonOrth, scale, box, delta); } - + if (state == mv::fail_state::NO_FAIL) { - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - if(isOrth) - coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, - newDim, bPick[b], scale[bPick[b]]); - else + if(isOrth) { coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, - newDimNonOrth, bPick[b], scale[bPick[b]]); + newDim, box, scale); + } else { + coordCurrRef.TranslateOneBox(newMolsPos, newCOMs, comCurrRef, + newDimNonOrth, box, scale); } } } @@ -146,37 +136,63 @@ inline uint VolumeTransfer::Transform() inline void VolumeTransfer::CalcEn() { - if(isOrth) - cellList.GridAll(newDim, newMolsPos, molLookRef); - else - cellList.GridAll(newDimNonOrth, newMolsPos, molLookRef); + if (GEMC_KIND == mv::GEMC_NVT) { + if(isOrth) { + cellList.GridAll(newDim, newMolsPos, molLookRef); + } else { + cellList.GridAll(newDimNonOrth, newMolsPos, molLookRef); + } + } else { + if(isOrth) { + cellList.GridBox(newDim, newMolsPos, molLookRef, box); + } else { + cellList.GridBox(newDimNonOrth, newMolsPos, molLookRef, box); + } + } regrewGrid = true; - //back up cached fourier term - calcEwald->exgMolCache(); + calcEwald->backupMolCache(); sysPotNew = sysPotRef; - for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { - if ((bPick[b] == 0) && fixBox0) - continue; + if (GEMC_KIND == mv::GEMC_NVT) { + for(uint b = 0; b < 2; b++) { + //calculate new K vectors + if(isOrth) { + calcEwald->RecipInit(bPick[b], newDim); + //setup reciprocate terms + calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); + sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, newDim, + bPick[b]); + } else { + calcEwald->RecipInit(bPick[b], newDimNonOrth); + //setup reciprocate terms + calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); + sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, + newDimNonOrth, bPick[b]); + } + //calculate reciprocate term of electrostatic interaction + sysPotNew.boxEnergy[bPick[b]].recip = calcEwald->BoxReciprocal(bPick[b]); + } + } else { //calculate new K vectors - if(isOrth) - calcEwald->RecipInit(bPick[b], newDim); - else - calcEwald->RecipInit(bPick[b], newDimNonOrth); - //setup reciprocate terms - calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); - //calculate LJ interaction and real term of electrostatic interaction - if(isOrth) + if(isOrth) { + calcEwald->RecipInit(box, newDim); + //setup reciprocate terms + calcEwald->BoxReciprocalSetup(box, newMolsPos); sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, newDim, - bPick[b]); - else + box); + } else { + calcEwald->RecipInit(box, newDimNonOrth); + //setup reciprocate terms + calcEwald->BoxReciprocalSetup(box, newMolsPos); sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, - newDimNonOrth, bPick[b]); + newDimNonOrth, box); + } //calculate reciprocate term of electrostatic interaction - sysPotNew.boxEnergy[bPick[b]].recip = calcEwald->BoxReciprocal(bPick[b]); + sysPotNew.boxEnergy[box].recip = calcEwald->BoxReciprocal(box); } + sysPotNew.Total(); } @@ -192,29 +208,24 @@ inline double VolumeTransfer::GetCoeff() const // (double)molLookRef.NumInBox(b_ii)+1); double coeff = 1.0; if (GEMC_KIND == mv::GEMC_NVT) { - for (uint b = 0; b < BOX_TOTAL; ++b) { + for (uint b = 0; b < 2; ++b) { if(isOrth) - coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)); + coeff *= pow(newDim.volume[bPick[b]] / boxDimRef.volume[bPick[b]], + (double)molLookRef.NumInBox(bPick[b])); else - coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)); + coeff *= pow(newDimNonOrth.volume[bPick[b]] / boxDimRef.volume[bPick[b]], + (double)molLookRef.NumInBox(bPick[b])); } } else { - for (uint b = 0; b < BOX_TOTAL; ++b) { - if ((bPick[b] == 0) && fixBox0) - continue; - - if(isOrth) - coeff *= pow(newDim.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)) * - exp(-BETA * PRESSURE * (newDim.volume[b] - boxDimRef.volume[b])); - else - coeff *= pow(newDimNonOrth.volume[b] / boxDimRef.volume[b], - (double)molLookRef.NumInBox(b)) * - exp(-BETA * PRESSURE * (newDimNonOrth.volume[b] - boxDimRef.volume[b])); + if(isOrth) { + coeff = pow(newDim.volume[box] / boxDimRef.volume[box], + (double)molLookRef.NumInBox(box)) * + exp(-BETA * PRESSURE * (newDim.volume[box] - boxDimRef.volume[box])); + } else { + coeff = pow(newDimNonOrth.volume[box] / boxDimRef.volume[box], + (double)molLookRef.NumInBox(box)) * + exp(-BETA * PRESSURE * (newDimNonOrth.volume[box] - boxDimRef.volume[box])); } - } return coeff; } @@ -238,50 +249,62 @@ inline void VolumeTransfer::Accept(const uint rejectState, const uint step) else *((BoxDimensionsNonOrth*)(&boxDimRef)) = newDimNonOrth; - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - calcEwald->UpdateRecip(b); - calcEwald->UpdateRecipVec(b); + if (GEMC_KIND == mv::GEMC_NVT) { + for (uint b = 0; b < 2; b++) { + calcEwald->UpdateRecip(bPick[b]); + calcEwald->UpdateRecipVec(bPick[b]); + } + } else { + calcEwald->UpdateRecip(box); + calcEwald->UpdateRecipVec(box); } + } else if (rejectState == mv::fail_state::NO_FAIL && regrewGrid) { - cellList.GridAll(boxDimRef, coordCurrRef, molLookRef); + if (GEMC_KIND == mv::GEMC_NVT) { + cellList.GridAll(boxDimRef, coordCurrRef, molLookRef); + } else { + cellList.GridBox(boxDimRef, coordCurrRef, molLookRef, box); + } + regrewGrid = false; calcEwald->exgMolCache(); #ifdef GOMC_CUDA - //update unitcell to the original in GPU - for (uint box = 0; box < BOX_TOTAL; box++) { - - UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), box, + if (GEMC_KIND == mv::GEMC_NVT) { + //update unitcell to the original in GPU + for (uint b = 0; b < 2; b++) { + UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), bPick[b], + boxDimRef.cellBasis[bPick[b]].x, + boxDimRef.cellBasis[bPick[b]].y, + boxDimRef.cellBasis[bPick[b]].z); + if(!isOrth) { + BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(&boxDimRef)); + UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), bPick[b], + newAxes.cellBasis_Inv[bPick[b]].x, + newAxes.cellBasis_Inv[bPick[b]].y, + newAxes.cellBasis_Inv[bPick[b]].z); + } + } + } else { + UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), bPick[b], boxDimRef.cellBasis[box].x, boxDimRef.cellBasis[box].y, boxDimRef.cellBasis[box].z); if(!isOrth) { BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(&boxDimRef)); UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), box, - newAxes.cellBasis_Inv[box].x, - newAxes.cellBasis_Inv[box].y, - newAxes.cellBasis_Inv[box].z); + newAxes.cellBasis_Inv[box].x, + newAxes.cellBasis_Inv[box].y, + newAxes.cellBasis_Inv[box].z); } } #endif } if (GEMC_KIND == mv::GEMC_NVT) { - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 0); - moveSetRef.Update(result, subPick, step); - subPick = mv::GetMoveSubIndex(mv::VOL_TRANSFER, 1); - moveSetRef.Update(result, subPick, step); - } - if (GEMC_KIND == mv::GEMC_NPT) { - for (uint b = 0; b < BOX_TOTAL; b++) { - if ((bPick[b] == 0) && fixBox0) - continue; - - subPickT[bPick[b]] = mv::GetMoveSubIndex(mv::VOL_TRANSFER, bPick[b]); - moveSetRef.Update(result, subPickT[bPick[b]], step); - } + moveSetRef.Update(mv::VOL_TRANSFER, result, step, bPick[0]); + moveSetRef.Update(mv::VOL_TRANSFER, result, step, bPick[1]); + } else { + moveSetRef.Update(mv::VOL_TRANSFER, result, step, box); } } From 75aef081c33f1b71a6ddac37030a3cb5a304127d Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 5 Aug 2018 11:39:46 -0400 Subject: [PATCH 094/199] Fix GPU compiling error --- src/VolumeTransfer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VolumeTransfer.h b/src/VolumeTransfer.h index 7f3769466..040dd7797 100644 --- a/src/VolumeTransfer.h +++ b/src/VolumeTransfer.h @@ -285,7 +285,7 @@ inline void VolumeTransfer::Accept(const uint rejectState, const uint step) } } } else { - UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), bPick[b], + UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), box, boxDimRef.cellBasis[box].x, boxDimRef.cellBasis[box].y, boxDimRef.cellBasis[box].z); From c4683b5f7d1208807e40e6ee0eea11d239b4f470 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 7 Aug 2018 15:03:55 -0400 Subject: [PATCH 095/199] Print atom and molecule infor in MEMC-3 if selected atom is not a node. --- src/cbmc/DCGraph.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index c096a79e0..9b699cd4b 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -486,9 +486,9 @@ void DCGraph::BuildGrowOld(TrialMol& oldMol, uint molIndex) } if(current == -1) { - std::cout << "In MEMC-3 move, atom index "<< oldMol.GetAtomBB(0)<< - " must be a node." - << "This atom must be bounded to two or more atoms! \n"; + std::cout << "Error: In MEMC-3 move, atom " << oldMol.GetKind().atomNames[oldMol.GetAtomBB(0)]<< + " in " << oldMol.GetKind().name << " must be a node.\n"; + std::cout << " This atom must be bounded to two or more atoms! \n"; exit(1); } @@ -546,9 +546,9 @@ void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) } if(current == -1) { - std::cout << "In MEMC-3 move, atom index "<< newMol.GetAtomBB(0)<< - " must be a node." - << "This atom must be bounded to two or more atoms! \n"; + std::cout << "Error: In MEMC-3 move, atom " << newMol.GetKind().atomNames[newMol.GetAtomBB(0)]<< + " in " << newMol.GetKind().name << " must be a node.\n"; + std::cout << " This atom must be bounded to two or more atoms! \n"; exit(1); } From 76d0c5b9b5ebd25cadda8f9f4fd96ec167262919 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 7 Aug 2018 15:25:16 -0400 Subject: [PATCH 096/199] Fix to the issue #99 --- src/MoleculeKind.cpp | 9 +++++++++ src/MoleculeKind.h | 3 +++ src/Molecules.cpp | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/MoleculeKind.cpp b/src/MoleculeKind.cpp index a6ae45db8..fdba77adb 100644 --- a/src/MoleculeKind.cpp +++ b/src/MoleculeKind.cpp @@ -151,3 +151,12 @@ double MoleculeKind::GetMoleculeCharge() return netCharge; } + +bool MoleculeKind::MoleculeHasCharge() +{ + for(uint i = 0; i < numAtoms; ++i) { + if(abs(atomCharge[i]) > 0.0) + return true; + } + return false; +} diff --git a/src/MoleculeKind.h b/src/MoleculeKind.h index a3cc95667..e215677c9 100644 --- a/src/MoleculeKind.h +++ b/src/MoleculeKind.h @@ -133,6 +133,9 @@ class MoleculeKind } double GetMoleculeCharge(); + + bool MoleculeHasCharge(); + SortedNonbond sortedNB, sortedNB_1_4, sortedNB_1_3, sortedEwaldNB; diff --git a/src/Molecules.cpp b/src/Molecules.cpp index 2d67fd2fb..2a9ff037b 100644 --- a/src/Molecules.cpp +++ b/src/Molecules.cpp @@ -80,8 +80,18 @@ void Molecules::Init(Setup & setup, Forcefield & forcefield, if(printFlag) { //calculating netcharge of all molecule kind double netCharge = 0.0; + bool hasCharge; for (uint mk = 0 ; mk < kindsCount; mk++) { netCharge += (countByKind[mk] * kinds[mk].GetMoleculeCharge()); + if(kinds[mk].MoleculeHasCharge()) { + if(!forcefield.ewald && !forcefield.isMartini) { + std::cout << "Warning: Charge detected in " << kinds[mk].name + << " but Ewald Summaion method is disabled.\n"; + } else if(!forcefield.electrostatic && forcefield.isMartini) { + std::cout << "Warning: Charge detected in " << kinds[mk].name + << " but Electrostatic energy calculation is disabled.\n"; + } + } } if(abs(netCharge) > 10E-7) { From cadab0acd5e94d7ca1edb461e9fbd2cb7e229ca6 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 8 Aug 2018 15:30:58 -0400 Subject: [PATCH 097/199] Fix to overlap issue during Displacement and Rotation move. Move will rejected if minDistance between two atoms get less than RcutLow. --- src/CalculateEnergy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 9599ff58c..d7b3ef5c2 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -444,7 +444,7 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, qi_qj_fact = particleCharge[atom] * particleCharge[nIndex[i]] * num::qqFact; - tempREn -= forcefield.particles->CalcCoulomb(distSq, qi_qj_fact, box); + tempREn -= forcefield.particles->CalcCoulombEn(distSq, qi_qj_fact, box); } tempLJEn -= forcefield.particles->CalcEn(distSq, particleKind[atom], From 49bbf15d0f12b0be3250bde2318f3d9c23deadb4 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 8 Aug 2018 15:50:19 -0400 Subject: [PATCH 098/199] Modify Error message for charge detection. --- src/Molecules.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Molecules.cpp b/src/Molecules.cpp index 2a9ff037b..1695a34a0 100644 --- a/src/Molecules.cpp +++ b/src/Molecules.cpp @@ -86,10 +86,10 @@ void Molecules::Init(Setup & setup, Forcefield & forcefield, if(kinds[mk].MoleculeHasCharge()) { if(!forcefield.ewald && !forcefield.isMartini) { std::cout << "Warning: Charge detected in " << kinds[mk].name - << " but Ewald Summaion method is disabled.\n"; + << " but Ewald Summaion method is disabled!\n\n"; } else if(!forcefield.electrostatic && forcefield.isMartini) { std::cout << "Warning: Charge detected in " << kinds[mk].name - << " but Electrostatic energy calculation is disabled.\n"; + << " but Electrostatic energy calculation is disabled!\n\n"; } } } From c628cf745fda43a5f326da7a6d8ea68322c2f206 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 9 Aug 2018 15:24:59 -0400 Subject: [PATCH 099/199] Start implementing crankshaft biased with dihedral --- src/CalculateEnergy.cpp | 241 ++++++++++++++++++++++------------- src/CalculateEnergy.h | 73 +++++------ src/IntraMoleculeExchange1.h | 8 +- src/IntraMoleculeExchange2.h | 8 +- src/IntraMoleculeExchange3.h | 4 +- src/MoleculeExchange1.h | 8 +- src/MoleculeExchange2.h | 10 +- src/MoleculeExchange3.h | 8 +- src/cbmc/DCCrankShaftAng.cpp | 4 +- src/cbmc/DCCrankShaftDih.cpp | 4 +- 10 files changed, 210 insertions(+), 158 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index d7b3ef5c2..0c6930ba5 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -620,23 +620,23 @@ void CalculateEnergy::MoleculeIntra(const uint molIndex, } //used in molecule exchange for calculating bonded and intraNonbonded energy -void CalculateEnergy::MoleculeIntra(cbmc::TrialMol &mol, - const uint molIndex) const +Energy CalculateEnergy::MoleculeIntra(cbmc::TrialMol const &mol, + const uint molIndex) const { - uint box = mol.GetBox(); double bondEn = 0.0, intraNonbondEn = 0.0; - MoleculeKind& molKind = mols.kinds[mols.kIndex[molIndex]]; // *2 because we'll be storing inverse bond vectors - XYZArray bondVec(molKind.bondList.count * 2); - - BondVectors(bondVec, mol.GetCoords(), molKind, box); - MolBond(bondEn, molKind, bondVec, box); - MolAngle(bondEn, molKind, bondVec, box); - MolDihedral(bondEn, molKind, bondVec, box); - MolNonbond(intraNonbondEn, mol.GetCoords(), molKind, box); - MolNonbond_1_4(intraNonbondEn, mol.GetCoords(), molKind, box); - MolNonbond_1_3(intraNonbondEn, mol.GetCoords(), molKind, box); - mol.AddEnergy(Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0)); + uint count = mol.GetKind().bondList.count; + XYZArray bondVec(count * 2); + std::vector bondExist(count * 2, false); + + BondVectors(bondVec, mol, bondExist); + MolBond(bondEn, mol, bondVec, bondExist); + MolAngle(bondEn, mol, bondVec, bondExist); + MolDihedral(bondEn, mol, bondVec, bondExist); + MolNonbond(intraNonbondEn, mol); + MolNonbond_1_4(intraNonbondEn, mol); + MolNonbond_1_3(intraNonbondEn, mol); + return Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0); } void CalculateEnergy::BondVectors(XYZArray & vecs, @@ -656,19 +656,24 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, } } -void CalculateEnergy::BondVectors(XYZArray & vecs, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const +void CalculateEnergy::BondVectors(XYZArray & vecs, + cbmc::TrialMol const &mol, + std::vector & bondExist) const { - for (uint i = 0; i < molKind.bondList.count; ++i) { - uint p1 = molKind.bondList.part1[i]; - uint p2 = molKind.bondList.part2[i]; - XYZ dist = pos.Difference(p2, p1); - dist = currentAxes.MinImage(dist, box); - - //store inverse vectors at i+count - vecs.Set(i, dist); - vecs.Set(i + molKind.bondList.count, -dist.x, -dist.y, -dist.z); + uint box = mol.GetBox(); + uint count = mol.GetKind().bondList.count; + for (uint i = 0; i < count; ++i) { + uint p1 = mol.GetKind().bondList.part1[i]; + uint p2 = mol.GetKind().bondList.part2[i]; + if(mol.AtomExists(p1) && mol.AtomExists(p2)) { + bondExist[i] = true; + bondExist[i + count] = true; + XYZ dist = mol.GetCoords().Difference(p2, p1); + dist = currentAxes.MinImage(dist, box); + //store inverse vectors at i+count + vecs.Set(i, dist); + vecs.Set(i + count, -dist.x, -dist.y, -dist.z); + } } } @@ -687,6 +692,23 @@ void CalculateEnergy::MolBond(double & energy, } } +void CalculateEnergy::MolBond(double & energy, + cbmc::TrialMol const &mol, + XYZArray const& vecs, + std::vector const & bondExist)const +{ + if (mol.GetBox() >= BOXES_WITH_U_B) + return; + + uint count = mol.GetKind().bondList.count; + for (uint b = 0; b < count; ++b) { + if(bondExist[b]) { + energy += forcefield.bonds.Calc(mol.GetKind().bondList.kinds[b], + vecs.Get(b).Length()); + } + } +} + void CalculateEnergy::MolAngle(double & energy, MoleculeKind const& molKind, XYZArray const& vecs, @@ -702,6 +724,26 @@ void CalculateEnergy::MolAngle(double & energy, } } +void CalculateEnergy::MolAngle(double & energy, + cbmc::TrialMol const &mol, + XYZArray const& vecs, + std::vector const & bondExist) const +{ + if (mol.GetBox() >= BOXES_WITH_U_B) + return; + + uint count = mol.GetKind().angles.Count(); + for (uint a = 0; a < count; ++a) { + if(bondExist[mol.GetKind().angles.GetBond(a, 0)] && + bondExist[mol.GetKind().angles.GetBond(a, 1)]) { + //Note: need to reverse the second bond to get angle properly. + double theta = Theta(vecs.Get(mol.GetKind().angles.GetBond(a, 0)), + -vecs.Get(mol.GetKind().angles.GetBond(a, 1))); + energy += forcefield.angles->Calc(mol.GetKind().angles.GetKind(a), theta); + } + } +} + void CalculateEnergy::MolDihedral(double & energy, MoleculeKind const& molKind, XYZArray const& vecs, @@ -717,6 +759,27 @@ void CalculateEnergy::MolDihedral(double & energy, } } +void CalculateEnergy::MolDihedral(double & energy, + cbmc::TrialMol const &mol, + XYZArray const& vecs, + std::vector const & bondExist) const +{ + if (mol.GetBox() >= BOXES_WITH_U_B) + return; + + uint count = mol.GetKind().dihedrals.Count(); + for (uint d = 0; d < count; ++d) { + if(bondExist[mol.GetKind().dihedrals.GetBond(d, 0)] && + bondExist[mol.GetKind().dihedrals.GetBond(d, 1)] && + bondExist[mol.GetKind().dihedrals.GetBond(d, 2)]) { + double phi = Phi(vecs.Get(mol.GetKind().dihedrals.GetBond(d, 0)), + vecs.Get(mol.GetKind().dihedrals.GetBond(d, 1)), + vecs.Get(mol.GetKind().dihedrals.GetBond(d, 2))); + energy += forcefield.dihedrals.Calc(mol.GetKind().dihedrals.GetKind(d), phi); + } + } +} + // Calculate 1-N nonbonded intra energy void CalculateEnergy::MolNonbond(double & energy, MoleculeKind const& molKind, @@ -752,32 +815,30 @@ void CalculateEnergy::MolNonbond(double & energy, } // Calculate 1-N nonbonded intra energy uisng pos -void CalculateEnergy::MolNonbond(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const +void CalculateEnergy::MolNonbond(double & energy, cbmc::TrialMol const &mol) const { - if (box >= BOXES_WITH_U_B) + if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - - for (uint i = 0; i < molKind.nonBonded.count; ++i) { - uint p1 = molKind.nonBonded.part1[i]; - uint p2 = molKind.nonBonded.part2[i]; - currentAxes.InRcut(distSq, pos, p1, p2, box); - if (forcefield.rCutSq > distSq) { - energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind - (molKind.nonBonded.part1[i]), - molKind.AtomKind - (molKind.nonBonded.part2[i])); - if (electrostatic) { - qi_qj_Fact = num::qqFact * - molKind.AtomCharge(molKind.nonBonded.part1[i]) * - molKind.AtomCharge(molKind.nonBonded.part2[i]); - - forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, - qi_qj_Fact, true); + uint count = mol.GetKind().nonBonded.count; + + for (uint i = 0; i < count; ++i) { + uint p1 = mol.GetKind().nonBonded.part1[i]; + uint p2 = mol.GetKind().nonBonded.part2[i]; + if(mol.AtomExists(p1) && mol.AtomExists(p2)) { + currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); + if (forcefield.rCutSq > distSq) { + energy += forcefield.particles->CalcEn(distSq, mol.GetKind().AtomKind(p1), + mol.GetKind().AtomKind(p2)); + if (electrostatic) { + qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(1) * + mol.GetKind().AtomCharge(p2); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, true); + } } } } @@ -819,33 +880,32 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, } // Calculate 1-4 nonbonded intra energy using pos -void CalculateEnergy::MolNonbond_1_4(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const +void CalculateEnergy::MolNonbond_1_4(double & energy, + cbmc::TrialMol const &mol) const { - if (box >= BOXES_WITH_U_B) + if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - - for (uint i = 0; i < molKind.nonBonded_1_4.count; ++i) { - uint p1 = molKind.nonBonded_1_4.part1[i]; - uint p2 = molKind.nonBonded_1_4.part2[i]; - currentAxes.InRcut(distSq, pos, p1, p2, box); - if (forcefield.rCutSq > distSq) { - forcefield.particles->CalcAdd_1_4(energy, distSq, - molKind.AtomKind - (molKind.nonBonded_1_4.part1[i]), - molKind.AtomKind - (molKind.nonBonded_1_4.part2[i])); - if (electrostatic) { - qi_qj_Fact = num::qqFact * - molKind.AtomCharge(molKind.nonBonded_1_4.part1[i]) * - molKind.AtomCharge(molKind.nonBonded_1_4.part2[i]); - - forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, - qi_qj_Fact, false); + uint count = mol.GetKind().nonBonded_1_4.count; + + for (uint i = 0; i < count; ++i) { + uint p1 = mol.GetKind().nonBonded_1_4.part1[i]; + uint p2 = mol.GetKind().nonBonded_1_4.part2[i]; + if(mol.AtomExists(p1) && mol.AtomExists(p2)) { + currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); + if (forcefield.rCutSq > distSq) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + mol.GetKind().AtomKind(p1), + mol.GetKind().AtomKind(p2)); + if (electrostatic) { + qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(p1) * + mol.GetKind().AtomCharge(p2); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } } } } @@ -886,33 +946,32 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, } // Calculate 1-3 nonbonded intra energy -void CalculateEnergy::MolNonbond_1_3(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const +void CalculateEnergy::MolNonbond_1_3(double & energy, + cbmc::TrialMol const &mol) const { - if (box >= BOXES_WITH_U_B) + if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - - for (uint i = 0; i < molKind.nonBonded_1_3.count; ++i) { - uint p1 = molKind.nonBonded_1_3.part1[i]; - uint p2 = molKind.nonBonded_1_3.part2[i]; - currentAxes.InRcut(distSq, pos, p1, p2, box); - if (forcefield.rCutSq > distSq) { - forcefield.particles->CalcAdd_1_4(energy, distSq, - molKind.AtomKind - (molKind.nonBonded_1_3.part1[i]), - molKind.AtomKind - (molKind.nonBonded_1_3.part2[i])); - if (electrostatic) { - qi_qj_Fact = num::qqFact * - molKind.AtomCharge(molKind.nonBonded_1_3.part1[i]) * - molKind.AtomCharge(molKind.nonBonded_1_3.part2[i]); - - forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, - qi_qj_Fact, false); + uint count = mol.GetKind().nonBonded_1_3.count; + + for (uint i = 0; i < count; ++i) { + uint p1 = mol.GetKind().nonBonded_1_3.part1[i]; + uint p2 = mol.GetKind().nonBonded_1_3.part2[i]; + if(mol.AtomExists(p1) && mol.AtomExists(p2)) { + currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); + if (forcefield.rCutSq > distSq) { + forcefield.particles->CalcAdd_1_4(energy, distSq, + mol.GetKind().AtomKind(p1), + mol.GetKind().AtomKind(p2)); + if (electrostatic) { + qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(p1) * + mol.GetKind().AtomCharge(p2); + + forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, + qi_qj_Fact, false); + } } } } diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index be38bc36b..7199bce00 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -133,7 +133,7 @@ class CalculateEnergy void MoleculeIntra(const uint molIndex, const uint box, double *bondEn) const; //used in molecule exchange for calculating bonded and intraNonbonded energy - void MoleculeIntra(cbmc::TrialMol &mol, const uint molIndex) const; + Energy MoleculeIntra(cbmc::TrialMol const &mol, const uint molIndex) const; //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule @@ -172,62 +172,55 @@ class CalculateEnergy const uint box) const; //! Calculates bond vectors using pos, stores them in vecs - void BondVectors(XYZArray & vecs, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const; + void BondVectors(XYZArray & vecs, cbmc::TrialMol const &mol, + std::vector & bondExist) const; //! Calculates bond stretch intramolecular energy of a full molecule - void MolBond(double & energy, - MoleculeKind const& molKind, - XYZArray const& vecs, - const uint box) const; + void MolBond(double & energy, MoleculeKind const& molKind, + XYZArray const& vecs, const uint box) const; + + //! Calculates bond stretch intramolecular energy of a non-complete molecule + void MolBond(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, + std::vector const & bondExist) const; //! Calculates angular bend intramolecular energy of a full molecule - void MolAngle(double & energy, - MoleculeKind const& molKind, - XYZArray const& vecs, - const uint box) const; + void MolAngle(double & energy, MoleculeKind const& molKind, + XYZArray const& vecs, const uint box) const; + + //! Calculates angular bend intramolecular energy of a non-complete molecule + void MolAngle(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, + std::vector const & bondExist) const; //! Calculates dihedral torsion intramolecular energy of a full molecule - void MolDihedral(double & energy, - MoleculeKind const& molKind, - XYZArray const& vecs, - const uint box) const; + void MolDihedral(double & energy, MoleculeKind const& molKind, + XYZArray const& vecs, const uint box) const; + + //! Calculates dihedral torsion intramolecular energy of a non-complete molecule + void MolDihedral(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, + std::vector const & bondExist) const; //! Calculates Nonbonded 1_N intramolecule energy of a full molecule - void MolNonbond(double & energy, - MoleculeKind const& molKind, - const uint molIndex, - const uint box) const; + void MolNonbond(double & energy, MoleculeKind const& molKind, + const uint molIndex, const uint box) const; - //! Calculates Nonbonded 1_N intramolecule energy of a full molecule using pos - void MolNonbond(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const; + //! Calculates Nonbonded 1_N intramolecule energy of a non-complete molecule + void MolNonbond(double & energy, cbmc::TrialMol const &mol) const; //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule - void MolNonbond_1_4(double & energy, - MoleculeKind const& molKind, - const uint molIndex, - const uint box) const; + void MolNonbond_1_4(double & energy, MoleculeKind const& molKind, + const uint molIndex, const uint box) const; - //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule using pos - void MolNonbond_1_4(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const; + //! Calculates Nonbonded 1_4 intramolecule energy of a non-complete molecule + void MolNonbond_1_4(double & energy, cbmc::TrialMol const &mol) const; //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule //for Martini forcefield - void MolNonbond_1_3(double & energy, - MoleculeKind const& molKind, - const uint molIndex, - const uint box) const; + void MolNonbond_1_3(double & energy, MoleculeKind const& molKind, + const uint molIndex, const uint box) const; - //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule using pos + //! Calculates Nonbonded 1_3 intramolecule energy of a non-complete molecule //for Martini forcefield - void MolNonbond_1_3(double & energy, XYZArray const& pos, - MoleculeKind const& molKind, - const uint box) const; + void MolNonbond_1_3(double & energy, cbmc::TrialMol const &mol) const; //! For particles in main coordinates array determines if they belong //! to same molecule, using internal arrays. diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index c11031585..2902f1f33 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -423,7 +423,7 @@ inline uint IntraMoleculeExchange1::Transform() cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + oldMolA[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n])); } //Calc old energy before deleting @@ -431,7 +431,7 @@ inline uint IntraMoleculeExchange1::Transform() cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + oldMolB[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n])); } //Insert kindL to cavity of center A @@ -440,7 +440,7 @@ inline uint IntraMoleculeExchange1::Transform() ShiftMol(n, false); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); } //Insert kindS to cavity of center B @@ -449,7 +449,7 @@ inline uint IntraMoleculeExchange1::Transform() ShiftMol(n, true); cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } return mv::fail_state::NO_FAIL; diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 1a548141a..6ae5d720c 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -299,7 +299,7 @@ inline uint IntraMoleculeExchange2::Transform() cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + oldMolA[n-1].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1])); } //Calc old energy before deleting @@ -307,7 +307,7 @@ inline uint IntraMoleculeExchange2::Transform() cellList.RemoveMol(molIndexB[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + oldMolB[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n])); } //Insert kindL to cavity of center A @@ -316,7 +316,7 @@ inline uint IntraMoleculeExchange2::Transform() ShiftMol(n, false); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); } //Insert kindS to cavity of center B @@ -325,7 +325,7 @@ inline uint IntraMoleculeExchange2::Transform() ShiftMol(n, true); cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } return mv::fail_state::NO_FAIL; diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 85902f9e0..4caf69728 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -254,7 +254,7 @@ inline uint IntraMoleculeExchange3::Transform() cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + oldMolA[n-1].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1])); } //Calc old energy before deleting @@ -276,7 +276,7 @@ inline uint IntraMoleculeExchange3::Transform() ShiftMol(n, true); cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } return mv::fail_state::NO_FAIL; diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index b20a1ecf1..a2942184c 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -495,7 +495,7 @@ inline uint MoleculeExchange1::Transform() cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + oldMolA[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n])); } //Calc old energy and delete B from destBox @@ -503,7 +503,7 @@ inline uint MoleculeExchange1::Transform() cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + oldMolB[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n])); } //Insert A to destBox @@ -512,7 +512,7 @@ inline uint MoleculeExchange1::Transform() ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } //Insert B in sourceBox @@ -521,7 +521,7 @@ inline uint MoleculeExchange1::Transform() ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); } return mv::fail_state::NO_FAIL; diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index c42ec1741..045e5895a 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -332,7 +332,7 @@ inline uint MoleculeExchange2::Transform() cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + oldMolA[n-1].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1])); } } else @@ -342,7 +342,7 @@ inline uint MoleculeExchange2::Transform() cellList.RemoveMol(molIndexA[n], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n]].BuildIDOld(oldMolA[n], molIndexA[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n]); + oldMolA[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n], molIndexA[n])); } } @@ -352,7 +352,7 @@ inline uint MoleculeExchange2::Transform() cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + oldMolB[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n])); } //Insert A to destBox @@ -362,7 +362,7 @@ inline uint MoleculeExchange2::Transform() ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } //Insert B in sourceBox @@ -372,7 +372,7 @@ inline uint MoleculeExchange2::Transform() ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); } return mv::fail_state::NO_FAIL; diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 5645a1df0..1aa06c916 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -284,7 +284,7 @@ inline uint MoleculeExchange3::Transform() cellList.RemoveMol(molIndexA[n-1], sourceBox, coordCurrRef); molRef.kinds[kindIndexA[n-1]].BuildIDOld(oldMolA[n-1], molIndexA[n-1]); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1]); + oldMolA[n-1].AddEnergy(calcEnRef.MoleculeIntra(oldMolA[n-1], molIndexA[n-1])); } //Calc old energy and delete Large kind from dest box for(uint n = 0; n < numInCavB; n++) { @@ -301,7 +301,7 @@ inline uint MoleculeExchange3::Transform() for(uint n = 0; n < numInCavB; n++) { cellList.RemoveMol(molIndexB[n], destBox, coordCurrRef); molRef.kinds[kindIndexB[n]].BuildIDOld(oldMolB[n], molIndexB[n]); - calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n]); + oldMolB[n].AddEnergy(calcEnRef.MoleculeIntra(oldMolB[n], molIndexB[n])); } } @@ -312,7 +312,7 @@ inline uint MoleculeExchange3::Transform() molRef.kinds[kindIndexA[n]].BuildIDNew(newMolA[n], molIndexA[n]); ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); - calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n]); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); } //Insert Large kind to sourceBox for(uint n = 0; n < numInCavB; n++) { @@ -333,7 +333,7 @@ inline uint MoleculeExchange3::Transform() ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n]); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); } } diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 7ac728014..d5fd32d2d 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -151,7 +151,7 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.ConfirmOldAtom(a); } //Calculate bonded energy and weight - data->calc.MoleculeIntra(oldMol, molIndex); + oldMol.AddEnergy(data->calc.MoleculeIntra(oldMol, molIndex)); double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + oldMol.GetEnergy().intraNonbond)); oldMol.MultWeight(W_bonded); @@ -216,7 +216,7 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) newMol.ConfirmOldAtom(a); } //Calculate bonded energy and weight - data->calc.MoleculeIntra(newMol, molIndex); + newMol.AddEnergy(data->calc.MoleculeIntra(newMol, molIndex)); double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + newMol.GetEnergy().intraNonbond)); newMol.MultWeight(W_bonded); diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index c4c21ffdd..b1964b699 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -149,7 +149,7 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.ConfirmOldAtom(a); } //Calculate bonded energy and weight - data->calc.MoleculeIntra(oldMol, molIndex); + oldMol.AddEnergy(data->calc.MoleculeIntra(oldMol, molIndex)); double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + oldMol.GetEnergy().intraNonbond)); oldMol.MultWeight(W_bonded); @@ -214,7 +214,7 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) newMol.ConfirmOldAtom(a); } //Calculate bonded energy and weight - data->calc.MoleculeIntra(newMol, molIndex); + newMol.AddEnergy(data->calc.MoleculeIntra(newMol, molIndex)); double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + newMol.GetEnergy().intraNonbond)); newMol.MultWeight(W_bonded); From d78218533a7a0bd00782cb79aa63f935d2af206b Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 9 Aug 2018 18:04:36 -0400 Subject: [PATCH 100/199] Finished implementation for DCCrankshaftAng class. --- src/cbmc/DCCrankShaftAng.cpp | 154 +++++++++++++++++++++++++++++------ src/cbmc/DCCrankShaftAng.h | 5 ++ src/cbmc/TrialMol.cpp | 5 ++ src/cbmc/TrialMol.h | 3 + 4 files changed, 142 insertions(+), 25 deletions(-) diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index d5fd32d2d..a4b78a6c1 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -69,12 +69,22 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; exit(EXIT_FAILURE); } + + if(data->nDihTrials < 1) { + std::cout << "Error: CBMC dihedral trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } } void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) { + for (uint a = 0; a < totAtoms; a++) { + oldMol.ConfirmOldAtom(a); + } + XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { + oldMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = oldMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); @@ -82,12 +92,19 @@ void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } + //Calculate ol bonded and intrabonded energy wihtout atoms + oldEnergy = data->calc.MoleculeIntra(oldMol, molIndex); } void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) { + for (uint a = 0; a < totAtoms; a++) { + newMol.ConfirmOldAtom(a); + } + XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { + newMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = newMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); @@ -95,6 +112,8 @@ void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } + //Calculate ol bonded and intrabonded energy wihtout atoms + oldEnergy = data->calc.MoleculeIntra(newMol, molIndex); } @@ -102,12 +121,21 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* intraNonbonded = data->nonbonded_1_4; double* inter = data->inter; double* real = data->real; + double* ljWeights = data->ljWeights; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -119,8 +147,17 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) //Spin all nLJTrial except the original coordinates for (uint lj = nLJTrials; lj-- > 1;) { - double theta = data->prng.rand(M_PI * 2.0); - RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + ChooseTorsion(oldMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + nonbonded[lj] = intraNonbonded[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); + //double theta = data->prng.rand(M_PI * 2.0); + //RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -129,6 +166,11 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) } } + ChooseTorsionOld(oldMol, molIndex, cross, tensor); + ljWeights[0] = std::accumulate(torWeights, torWeights + nDihTrials, 0.0); + bondedEn[0] = torEnergy[0]; + nonbonded[0] = intraNonbonded[0]; + for (uint a = 0; a < numAtom; a++) { //Shift original coordinate back. multiPosRotions[a].Add(0, center); @@ -140,27 +182,28 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) } for (uint trial = 0; trial < nLJTrials; ++trial) { - stepWeight += exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + ljWeights[trial] *= exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + stepWeight += ljWeights[trial]; } oldMol.MultWeight(stepWeight / nLJTrials); - oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], + oldMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[0], + oldEnergy.intraNonbond + nonbonded[0], + inter[0], real[0], 0.0, 0.0, 0.0)); - - for (uint a = 0; a < totAtoms; a++) { - oldMol.ConfirmOldAtom(a); - } - //Calculate bonded energy and weight - oldMol.AddEnergy(data->calc.MoleculeIntra(oldMol, molIndex)); - double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + - oldMol.GetEnergy().intraNonbond)); - oldMol.MultWeight(W_bonded); } void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* intraNonbonded = data->nonbonded_1_4; double* inter = data->inter; double* real = data->real; double* ljWeights = data->ljWeights; @@ -180,8 +223,17 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) //Go backward to to preserve prototype for (uint lj = nLJTrials; lj-- > 0;) { - double theta = data->prng.rand(M_PI * 2.0); - RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + ChooseTorsion(newMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + nonbonded[lj] = intraNonbonded[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); + //double theta = data->prng.rand(M_PI * 2.0); + //RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -199,26 +251,78 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) } for (uint trial = 0; trial < nLJTrials; trial++) { - ljWeights[trial] = exp(-1 * data->ff.beta * + ljWeights[trial] *= exp(-1 * data->ff.beta * (inter[trial] + real[trial])); stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); newMol.MultWeight(stepWeight / nLJTrials); - newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], + newMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[winner], + oldEnergy.intraNonbond + nonbonded[winner], + inter[winner], real[winner], 0.0, 0.0, 0.0)); for (uint a = 0; a < numAtom; a++) { newMol.AddAtom(atoms[a], multiPosRotions[a][winner]); } - for (uint a = 0; a < totAtoms; a++) { - newMol.ConfirmOldAtom(a); +} + +void DCCrankShaftAng::ChooseTorsion(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* intraNonbonded = data->nonbonded_1_4; + + XYZ center = mol.AtomPosition(a0); + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + Energy en = data->calc.MoleculeIntra(mol, molIndex); + en -= oldEnergy; + torEnergy[tor] = en.intraBond; + intraNonbonded[tor] = en.intraNonbond; + torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + } +} + +void DCCrankShaftAng::ChooseTorsionOld(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* intraNonbonded = data->nonbonded_1_4; + + XYZ center = mol.AtomPosition(a0); + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + Energy en = data->calc.MoleculeIntra(mol, molIndex); + en -= oldEnergy; + torEnergy[tor] = en.intraBond; + intraNonbonded[tor] = en.intraNonbond; + torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); } - //Calculate bonded energy and weight - newMol.AddEnergy(data->calc.MoleculeIntra(newMol, molIndex)); - double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + - newMol.GetEnergy().intraNonbond)); - newMol.MultWeight(W_bonded); } + + } diff --git a/src/cbmc/DCCrankShaftAng.h b/src/cbmc/DCCrankShaftAng.h index 159a8ce2f..9edca5215 100644 --- a/src/cbmc/DCCrankShaftAng.h +++ b/src/cbmc/DCCrankShaftAng.h @@ -38,10 +38,15 @@ class DCCrankShaftAng : public DCComponent } private: + void ChooseTorsion(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); + void ChooseTorsionOld(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); DCData* data; XYZArray *multiPosRotions; uint a0, a1, a2, numAtom, totAtoms; std::vector atoms; + Energy oldEnergy; }; } #endif diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 2a183a07d..2280abfff 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -117,6 +117,11 @@ void TrialMol::ConfirmOldAtom(uint i) atomBuilt[i] = true; } +void TrialMol::UnConfirmOldAtom(uint i) +{ + atomBuilt[i] = false; +} + //!Returns rectangular coordinates of an addition //!Determines coordinates with respect to current basis XYZ TrialMol::GetRectCoords(double bond, double theta, double phi) const diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index a1dfdf553..0a2b5714d 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -52,6 +52,9 @@ class TrialMol //!Confirms that atom at index i has been built (used for oldMols) void ConfirmOldAtom(uint i); + //!UnConfirms that atom at index i has been built (used for oldMols) + void UnConfirmOldAtom(uint i); + //!Sets an orthonormal basis for coordinate conversion. /*!\param p1 Index of particle new additions will be bonded to * \param p2 Index of particle that will be in angles with new additions From 2c11a14d52344666cea66142823a2df2fe58f6a1 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 10 Aug 2018 12:23:12 -0400 Subject: [PATCH 101/199] Implement Dihedral bias for DCCrankShaftDih class. --- src/cbmc/DCCrankShaftAng.cpp | 11 ++- src/cbmc/DCCrankShaftDih.cpp | 150 +++++++++++++++++++++++++++++------ src/cbmc/DCCrankShaftDih.h | 5 ++ 3 files changed, 134 insertions(+), 32 deletions(-) diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index a4b78a6c1..b2419a1bc 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -128,9 +128,9 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; double* intraNonbonded = data->nonbonded_1_4; + double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; - double* ljWeights = data->ljWeights; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); @@ -156,8 +156,6 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); - //double theta = data->prng.rand(M_PI * 2.0); - //RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -204,9 +202,9 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; double* intraNonbonded = data->nonbonded_1_4; + double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; - double* ljWeights = data->ljWeights; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); @@ -232,8 +230,6 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); - //double theta = data->prng.rand(M_PI * 2.0); - //RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -289,6 +285,7 @@ void DCCrankShaftAng::ChooseTorsion(TrialMol& mol, uint molIndex, mol.AddAtom(atoms[a], coord + center); } Energy en = data->calc.MoleculeIntra(mol, molIndex); + //Get bonded energy difference due to rotating of atoms en -= oldEnergy; torEnergy[tor] = en.intraBond; intraNonbonded[tor] = en.intraNonbond; @@ -308,6 +305,7 @@ void DCCrankShaftAng::ChooseTorsionOld(TrialMol& mol, uint molIndex, XYZ center = mol.AtomPosition(a0); for (uint tor = 0; tor < nDihTrials; ++tor) { + //Use actual coordinate fir first torsion trial torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], @@ -317,6 +315,7 @@ void DCCrankShaftAng::ChooseTorsionOld(TrialMol& mol, uint molIndex, mol.AddAtom(atoms[a], coord + center); } Energy en = data->calc.MoleculeIntra(mol, molIndex); + //Get bonded energy difference due to rotating of atoms en -= oldEnergy; torEnergy[tor] = en.intraBond; intraNonbonded[tor] = en.intraNonbond; diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index b1964b699..80d7dcb4c 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -71,8 +71,13 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) { + for (uint a = 0; a < totAtoms; a++) { + oldMol.ConfirmOldAtom(a); + } + XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { + oldMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = oldMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); @@ -80,12 +85,19 @@ void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } + //Calculate ol bonded and intrabonded energy wihtout atoms + oldEnergy = data->calc.MoleculeIntra(oldMol, molIndex); } void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) { + for (uint a = 0; a < totAtoms; a++) { + newMol.ConfirmOldAtom(a); + } + XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { + newMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = newMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); @@ -93,6 +105,8 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } + //Calculate ol bonded and intrabonded energy wihtout atoms + oldEnergy = data->calc.MoleculeIntra(newMol, molIndex); } @@ -100,12 +114,21 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* intraNonbonded = data->nonbonded_1_4; + double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -117,8 +140,15 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) //Spin all nLJTrial except the original coordinates for (uint lj = nLJTrials; lj-- > 1;) { - double theta = data->prng.rand(M_PI * 2.0); - RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + ChooseTorsion(oldMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + nonbonded[lj] = intraNonbonded[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -127,6 +157,11 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) } } + ChooseTorsionOld(oldMol, molIndex, cross, tensor); + ljWeights[0] = std::accumulate(torWeights, torWeights + nDihTrials, 0.0); + bondedEn[0] = torEnergy[0]; + nonbonded[0] = intraNonbonded[0]; + for (uint a = 0; a < numAtom; a++) { //Shift original coordinate back. multiPosRotions[a].Add(0, center); @@ -138,30 +173,31 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) } for (uint trial = 0; trial < nLJTrials; ++trial) { - stepWeight += exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + ljWeights[trial] *= exp(-1 * data->ff.beta * + (inter[trial] + real[trial])); + stepWeight += ljWeights[trial]; } oldMol.MultWeight(stepWeight / nLJTrials); - oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], + oldMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[0], + oldEnergy.intraNonbond + nonbonded[0], + inter[0], real[0], 0.0, 0.0, 0.0)); - - for (uint a = 0; a < totAtoms; a++) { - oldMol.ConfirmOldAtom(a); - } - //Calculate bonded energy and weight - oldMol.AddEnergy(data->calc.MoleculeIntra(oldMol, molIndex)); - double W_bonded = exp(-1.0 * data->ff.beta * (oldMol.GetEnergy().intraBond + - oldMol.GetEnergy().intraNonbond)); - oldMol.MultWeight(W_bonded); } void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) { PRNG& prng = data->prng; uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* intraNonbonded = data->nonbonded_1_4; + double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; - double* ljWeights = data->ljWeights; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); @@ -178,8 +214,15 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) //Go backward to to preserve prototype for (uint lj = nLJTrials; lj-- > 0;) { - double theta = data->prng.rand(M_PI * 2.0); - RotationMatrix spin = RotationMatrix::FromAxisAngle(theta, cross, tensor); + ChooseTorsion(newMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + nonbonded[lj] = intraNonbonded[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); for (uint a = 0; a < numAtom; a++) { //find positions @@ -197,26 +240,81 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) } for (uint trial = 0; trial < nLJTrials; trial++) { - ljWeights[trial] = exp(-1 * data->ff.beta * + ljWeights[trial] *= exp(-1 * data->ff.beta * (inter[trial] + real[trial])); stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); newMol.MultWeight(stepWeight / nLJTrials); - newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], + newMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[winner], + oldEnergy.intraNonbond + nonbonded[winner], + inter[winner], real[winner], 0.0, 0.0, 0.0)); for (uint a = 0; a < numAtom; a++) { newMol.AddAtom(atoms[a], multiPosRotions[a][winner]); } - for (uint a = 0; a < totAtoms; a++) { - newMol.ConfirmOldAtom(a); +} + +void DCCrankShaftDih::ChooseTorsion(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* intraNonbonded = data->nonbonded_1_4; + + XYZ center = mol.AtomPosition(a0); + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + Energy en = data->calc.MoleculeIntra(mol, molIndex); + //Get bonded energy difference due to rotating of atoms + en -= oldEnergy; + torEnergy[tor] = en.intraBond; + intraNonbonded[tor] = en.intraNonbond; + torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); } - //Calculate bonded energy and weight - newMol.AddEnergy(data->calc.MoleculeIntra(newMol, molIndex)); - double W_bonded = exp(-1.0 * data->ff.beta * (newMol.GetEnergy().intraBond + - newMol.GetEnergy().intraNonbond)); - newMol.MultWeight(W_bonded); } + +void DCCrankShaftDih::ChooseTorsionOld(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* intraNonbonded = data->nonbonded_1_4; + + XYZ center = mol.AtomPosition(a0); + for (uint tor = 0; tor < nDihTrials; ++tor) { + //Use actual coordinate fir first torsion trial + torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + Energy en = data->calc.MoleculeIntra(mol, molIndex); + //Get bonded energy difference due to rotating of atoms + en -= oldEnergy; + torEnergy[tor] = en.intraBond; + intraNonbonded[tor] = en.intraNonbond; + torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + } +} + + } diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index ab85260ed..21ba2e479 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -38,10 +38,15 @@ class DCCrankShaftDih : public DCComponent } private: + void ChooseTorsion(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); + void ChooseTorsionOld(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); DCData* data; XYZArray *multiPosRotions; uint a0, a1, a2, a3, numAtom, totAtoms; std::vector atoms; + Energy oldEnergy; }; } #endif From dba698a3de8cec30b7d713ede959e208ce5e4f67 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 13 Aug 2018 17:26:01 -0400 Subject: [PATCH 102/199] Use angle and dihedral energy for bias. Only calculate the energy of angle and dihedral which affected by rotation. Finished implementation for CrankShaftAng --- src/CalculateEnergy.cpp | 118 ++++++++++---------- src/CalculateEnergy.h | 21 ++-- src/cbmc/DCCrankShaftAng.cpp | 206 +++++++++++++++++++++++++++++------ src/cbmc/DCCrankShaftAng.h | 19 +++- 4 files changed, 265 insertions(+), 99 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 0c6930ba5..7d3acdb0d 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -625,17 +625,18 @@ Energy CalculateEnergy::MoleculeIntra(cbmc::TrialMol const &mol, { double bondEn = 0.0, intraNonbondEn = 0.0; // *2 because we'll be storing inverse bond vectors - uint count = mol.GetKind().bondList.count; + const MoleculeKind& molKind = mol.GetKind(); + uint count = molKind.bondList.count; XYZArray bondVec(count * 2); std::vector bondExist(count * 2, false); - BondVectors(bondVec, mol, bondExist); - MolBond(bondEn, mol, bondVec, bondExist); - MolAngle(bondEn, mol, bondVec, bondExist); - MolDihedral(bondEn, mol, bondVec, bondExist); - MolNonbond(intraNonbondEn, mol); - MolNonbond_1_4(intraNonbondEn, mol); - MolNonbond_1_3(intraNonbondEn, mol); + BondVectors(bondVec, mol, bondExist, molKind); + MolBond(bondEn, mol, bondVec, bondExist, molKind); + MolAngle(bondEn, mol, bondVec, bondExist, molKind); + MolDihedral(bondEn, mol, bondVec, bondExist, molKind); + MolNonbond(intraNonbondEn, mol, molKind); + MolNonbond_1_4(intraNonbondEn, mol, molKind); + MolNonbond_1_3(intraNonbondEn, mol, molKind); return Energy(bondEn, intraNonbondEn, 0.0, 0.0, 0.0, 0.0, 0.0); } @@ -658,13 +659,14 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, void CalculateEnergy::BondVectors(XYZArray & vecs, cbmc::TrialMol const &mol, - std::vector & bondExist) const + std::vector & bondExist, + MoleculeKind const& molKind) const { uint box = mol.GetBox(); - uint count = mol.GetKind().bondList.count; + uint count = molKind.bondList.count; for (uint i = 0; i < count; ++i) { - uint p1 = mol.GetKind().bondList.part1[i]; - uint p2 = mol.GetKind().bondList.part2[i]; + uint p1 = molKind.bondList.part1[i]; + uint p2 = molKind.bondList.part2[i]; if(mol.AtomExists(p1) && mol.AtomExists(p2)) { bondExist[i] = true; bondExist[i + count] = true; @@ -695,15 +697,16 @@ void CalculateEnergy::MolBond(double & energy, void CalculateEnergy::MolBond(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist)const + std::vector const & bondExist, + MoleculeKind const& molKind)const { if (mol.GetBox() >= BOXES_WITH_U_B) return; - uint count = mol.GetKind().bondList.count; + uint count = molKind.bondList.count; for (uint b = 0; b < count; ++b) { if(bondExist[b]) { - energy += forcefield.bonds.Calc(mol.GetKind().bondList.kinds[b], + energy += forcefield.bonds.Calc(molKind.bondList.kinds[b], vecs.Get(b).Length()); } } @@ -727,19 +730,20 @@ void CalculateEnergy::MolAngle(double & energy, void CalculateEnergy::MolAngle(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist) const + std::vector const & bondExist, + MoleculeKind const& molKind) const { if (mol.GetBox() >= BOXES_WITH_U_B) return; - uint count = mol.GetKind().angles.Count(); + uint count = molKind.angles.Count(); for (uint a = 0; a < count; ++a) { - if(bondExist[mol.GetKind().angles.GetBond(a, 0)] && - bondExist[mol.GetKind().angles.GetBond(a, 1)]) { + if(bondExist[molKind.angles.GetBond(a, 0)] && + bondExist[molKind.angles.GetBond(a, 1)]) { //Note: need to reverse the second bond to get angle properly. - double theta = Theta(vecs.Get(mol.GetKind().angles.GetBond(a, 0)), - -vecs.Get(mol.GetKind().angles.GetBond(a, 1))); - energy += forcefield.angles->Calc(mol.GetKind().angles.GetKind(a), theta); + double theta = Theta(vecs.Get(molKind.angles.GetBond(a, 0)), + -vecs.Get(molKind.angles.GetBond(a, 1))); + energy += forcefield.angles->Calc(molKind.angles.GetKind(a), theta); } } } @@ -762,20 +766,21 @@ void CalculateEnergy::MolDihedral(double & energy, void CalculateEnergy::MolDihedral(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist) const + std::vector const & bondExist, + MoleculeKind const& molKind) const { if (mol.GetBox() >= BOXES_WITH_U_B) return; - uint count = mol.GetKind().dihedrals.Count(); + uint count = molKind.dihedrals.Count(); for (uint d = 0; d < count; ++d) { - if(bondExist[mol.GetKind().dihedrals.GetBond(d, 0)] && - bondExist[mol.GetKind().dihedrals.GetBond(d, 1)] && - bondExist[mol.GetKind().dihedrals.GetBond(d, 2)]) { - double phi = Phi(vecs.Get(mol.GetKind().dihedrals.GetBond(d, 0)), - vecs.Get(mol.GetKind().dihedrals.GetBond(d, 1)), - vecs.Get(mol.GetKind().dihedrals.GetBond(d, 2))); - energy += forcefield.dihedrals.Calc(mol.GetKind().dihedrals.GetKind(d), phi); + if(bondExist[molKind.dihedrals.GetBond(d, 0)] && + bondExist[molKind.dihedrals.GetBond(d, 1)] && + bondExist[molKind.dihedrals.GetBond(d, 2)]) { + double phi = Phi(vecs.Get(molKind.dihedrals.GetBond(d, 0)), + vecs.Get(molKind.dihedrals.GetBond(d, 1)), + vecs.Get(molKind.dihedrals.GetBond(d, 2))); + energy += forcefield.dihedrals.Calc(molKind.dihedrals.GetKind(d), phi); } } } @@ -815,26 +820,27 @@ void CalculateEnergy::MolNonbond(double & energy, } // Calculate 1-N nonbonded intra energy uisng pos -void CalculateEnergy::MolNonbond(double & energy, cbmc::TrialMol const &mol) const +void CalculateEnergy::MolNonbond(double & energy, cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const { if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - uint count = mol.GetKind().nonBonded.count; + uint count = molKind.nonBonded.count; for (uint i = 0; i < count; ++i) { - uint p1 = mol.GetKind().nonBonded.part1[i]; - uint p2 = mol.GetKind().nonBonded.part2[i]; + uint p1 = molKind.nonBonded.part1[i]; + uint p2 = molKind.nonBonded.part2[i]; if(mol.AtomExists(p1) && mol.AtomExists(p2)) { currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); if (forcefield.rCutSq > distSq) { - energy += forcefield.particles->CalcEn(distSq, mol.GetKind().AtomKind(p1), - mol.GetKind().AtomKind(p2)); + energy += forcefield.particles->CalcEn(distSq, molKind.AtomKind(p1), + molKind.AtomKind(p2)); if (electrostatic) { - qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(1) * - mol.GetKind().AtomCharge(p2); + qi_qj_Fact = num::qqFact * molKind.AtomCharge(1) * + molKind.AtomCharge(p2); forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, qi_qj_Fact, true); @@ -881,27 +887,28 @@ void CalculateEnergy::MolNonbond_1_4(double & energy, // Calculate 1-4 nonbonded intra energy using pos void CalculateEnergy::MolNonbond_1_4(double & energy, - cbmc::TrialMol const &mol) const + cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const { if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - uint count = mol.GetKind().nonBonded_1_4.count; + uint count = molKind.nonBonded_1_4.count; for (uint i = 0; i < count; ++i) { - uint p1 = mol.GetKind().nonBonded_1_4.part1[i]; - uint p2 = mol.GetKind().nonBonded_1_4.part2[i]; + uint p1 = molKind.nonBonded_1_4.part1[i]; + uint p2 = molKind.nonBonded_1_4.part2[i]; if(mol.AtomExists(p1) && mol.AtomExists(p2)) { currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, - mol.GetKind().AtomKind(p1), - mol.GetKind().AtomKind(p2)); + molKind.AtomKind(p1), + molKind.AtomKind(p2)); if (electrostatic) { - qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(p1) * - mol.GetKind().AtomCharge(p2); + qi_qj_Fact = num::qqFact * molKind.AtomCharge(p1) * + molKind.AtomCharge(p2); forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, qi_qj_Fact, false); @@ -947,27 +954,28 @@ void CalculateEnergy::MolNonbond_1_3(double & energy, // Calculate 1-3 nonbonded intra energy void CalculateEnergy::MolNonbond_1_3(double & energy, - cbmc::TrialMol const &mol) const + cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const { if (mol.GetBox() >= BOXES_WITH_U_B) return; double distSq; double qi_qj_Fact; - uint count = mol.GetKind().nonBonded_1_3.count; + uint count = molKind.nonBonded_1_3.count; for (uint i = 0; i < count; ++i) { - uint p1 = mol.GetKind().nonBonded_1_3.part1[i]; - uint p2 = mol.GetKind().nonBonded_1_3.part2[i]; + uint p1 = molKind.nonBonded_1_3.part1[i]; + uint p2 = molKind.nonBonded_1_3.part2[i]; if(mol.AtomExists(p1) && mol.AtomExists(p2)) { currentAxes.InRcut(distSq, mol.GetCoords(), p1, p2, mol.GetBox()); if (forcefield.rCutSq > distSq) { forcefield.particles->CalcAdd_1_4(energy, distSq, - mol.GetKind().AtomKind(p1), - mol.GetKind().AtomKind(p2)); + molKind.AtomKind(p1), + molKind.AtomKind(p2)); if (electrostatic) { - qi_qj_Fact = num::qqFact * mol.GetKind().AtomCharge(p1) * - mol.GetKind().AtomCharge(p2); + qi_qj_Fact = num::qqFact * molKind.AtomCharge(p1) * + molKind.AtomCharge(p2); forcefield.particles->CalcCoulombAdd_1_4(energy, distSq, qi_qj_Fact, false); diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 7199bce00..4b6c913d9 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -173,7 +173,8 @@ class CalculateEnergy //! Calculates bond vectors using pos, stores them in vecs void BondVectors(XYZArray & vecs, cbmc::TrialMol const &mol, - std::vector & bondExist) const; + std::vector & bondExist, + MoleculeKind const& molKind) const; //! Calculates bond stretch intramolecular energy of a full molecule void MolBond(double & energy, MoleculeKind const& molKind, @@ -181,7 +182,8 @@ class CalculateEnergy //! Calculates bond stretch intramolecular energy of a non-complete molecule void MolBond(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist) const; + std::vector const & bondExist, + MoleculeKind const& molKind) const; //! Calculates angular bend intramolecular energy of a full molecule void MolAngle(double & energy, MoleculeKind const& molKind, @@ -189,7 +191,8 @@ class CalculateEnergy //! Calculates angular bend intramolecular energy of a non-complete molecule void MolAngle(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist) const; + std::vector const & bondExist, + MoleculeKind const& molKind) const; //! Calculates dihedral torsion intramolecular energy of a full molecule void MolDihedral(double & energy, MoleculeKind const& molKind, @@ -197,21 +200,24 @@ class CalculateEnergy //! Calculates dihedral torsion intramolecular energy of a non-complete molecule void MolDihedral(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, - std::vector const & bondExist) const; + std::vector const & bondExist, + MoleculeKind const& molKind) const; //! Calculates Nonbonded 1_N intramolecule energy of a full molecule void MolNonbond(double & energy, MoleculeKind const& molKind, const uint molIndex, const uint box) const; //! Calculates Nonbonded 1_N intramolecule energy of a non-complete molecule - void MolNonbond(double & energy, cbmc::TrialMol const &mol) const; + void MolNonbond(double & energy, cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const; //! Calculates Nonbonded 1_4 intramolecule energy of a full molecule void MolNonbond_1_4(double & energy, MoleculeKind const& molKind, const uint molIndex, const uint box) const; //! Calculates Nonbonded 1_4 intramolecule energy of a non-complete molecule - void MolNonbond_1_4(double & energy, cbmc::TrialMol const &mol) const; + void MolNonbond_1_4(double & energy, cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const; //! Calculates Nonbonded 1_3 intramolecule energy of a full molecule //for Martini forcefield @@ -220,7 +226,8 @@ class CalculateEnergy //! Calculates Nonbonded 1_3 intramolecule energy of a non-complete molecule //for Martini forcefield - void MolNonbond_1_3(double & energy, cbmc::TrialMol const &mol) const; + void MolNonbond_1_3(double & energy, cbmc::TrialMol const &mol, + MoleculeKind const& molKind) const; //! For particles in main coordinates array determines if they belong //! to same molecule, using internal arrays. diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index b2419a1bc..22bc4bc10 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -7,9 +7,9 @@ along with this program, also can be found at . #include "DCCrankShaftAng.h" #include "TrialMol.h" #include "PRNG.h" -#include "MolSetup.h" #include "Forcefield.h" #include "NumLib.h" +#include "Geometry.h" #include "CalculateEnergy.h" #include "XYZArray.h" #include @@ -74,6 +74,23 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, std::cout << "Error: CBMC dihedral trials must be greater than 0.\n"; exit(EXIT_FAILURE); } + + //Find the angles affected by rotation + //First find the angle x-a0-a1 + ang = AtomMidEndAngles(kind, a0, a1); + //Add angle with a1-a2-x + vector tempAng = AtomMidEndAngles(kind, a2, a1); + ang.insert(ang.end(), tempAng.begin(), tempAng.end()); + + //Find the dihedral affected by rotation + //First find the dihedral with x-a0-a1-x in the middle + dih = DihsOnBond(kind, a0, a1); + //Add dihedral with x-a1-a2-x + vector tempDih = DihsOnBond(kind, a1, a2); + dih.insert(dih.end(), tempDih.begin(), tempDih.end()); + //Add dihedral with atom a1 in one end: x-x-x-a1 + tempDih = AtomEndDihs(kind, a1); + dih.insert(dih.end(), tempDih.begin(), tempDih.end()); } void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) @@ -84,7 +101,6 @@ void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { - oldMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = oldMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); @@ -92,8 +108,6 @@ void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } - //Calculate ol bonded and intrabonded energy wihtout atoms - oldEnergy = data->calc.MoleculeIntra(oldMol, molIndex); } void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) @@ -104,7 +118,6 @@ void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { - newMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = newMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); @@ -112,8 +125,6 @@ void DCCrankShaftAng::PrepareNew(TrialMol& newMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } - //Calculate ol bonded and intrabonded energy wihtout atoms - oldEnergy = data->calc.MoleculeIntra(newMol, molIndex); } @@ -127,7 +138,6 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) double* torEnergy = data->angleEnergy; double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; - double* intraNonbonded = data->nonbonded_1_4; double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; @@ -136,6 +146,7 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -152,7 +163,6 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) torWeights + nDihTrials, 0.0); uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); bondedEn[lj] = torEnergy[winner]; - nonbonded[lj] = intraNonbonded[winner]; //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); @@ -167,7 +177,6 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) ChooseTorsionOld(oldMol, molIndex, cross, tensor); ljWeights[0] = std::accumulate(torWeights, torWeights + nDihTrials, 0.0); bondedEn[0] = torEnergy[0]; - nonbonded[0] = intraNonbonded[0]; for (uint a = 0; a < numAtom; a++) { //Shift original coordinate back. @@ -177,16 +186,16 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) //Calculate nonbonded energy data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, oldMol.GetBox(), nLJTrials); + ParticleNonbonded(oldMol, multiPosRotions[a], atoms[a], nLJTrials); } for (uint trial = 0; trial < nLJTrials; ++trial) { ljWeights[trial] *= exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } oldMol.MultWeight(stepWeight / nLJTrials); - oldMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[0], - oldEnergy.intraNonbond + nonbonded[0], + oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], 0.0, 0.0, 0.0)); } @@ -201,7 +210,6 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) double* torEnergy = data->angleEnergy; double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; - double* intraNonbonded = data->nonbonded_1_4; double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; @@ -210,6 +218,7 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = newMol.AtomPosition(a0); @@ -226,7 +235,6 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) torWeights + nDihTrials, 0.0); uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); bondedEn[lj] = torEnergy[winner]; - nonbonded[lj] = intraNonbonded[winner]; //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); @@ -244,17 +252,17 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) //Calculate nonbonded energy data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, newMol.GetBox(), nLJTrials); + ParticleNonbonded(newMol, multiPosRotions[a], atoms[a], nLJTrials); } for (uint trial = 0; trial < nLJTrials; trial++) { ljWeights[trial] *= exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); newMol.MultWeight(stepWeight / nLJTrials); - newMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[winner], - oldEnergy.intraNonbond + nonbonded[winner], + newMol.AddEnergy(Energy(bondedEn[winner], nonbonded[winner], inter[winner], real[winner], 0.0, 0.0, 0.0)); @@ -272,7 +280,6 @@ void DCCrankShaftAng::ChooseTorsion(TrialMol& mol, uint molIndex, double* torsion = data->angles; double* torWeights = data->angleWeights; double* torEnergy = data->angleEnergy; - double* intraNonbonded = data->nonbonded_1_4; XYZ center = mol.AtomPosition(a0); for (uint tor = 0; tor < nDihTrials; ++tor) { @@ -284,12 +291,9 @@ void DCCrankShaftAng::ChooseTorsion(TrialMol& mol, uint molIndex, XYZ coord = spin.Apply(multiPosRotions[a][0]); mol.AddAtom(atoms[a], coord + center); } - Energy en = data->calc.MoleculeIntra(mol, molIndex); - //Get bonded energy difference due to rotating of atoms - en -= oldEnergy; - torEnergy[tor] = en.intraBond; - intraNonbonded[tor] = en.intraNonbond; - torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); } } @@ -301,7 +305,6 @@ void DCCrankShaftAng::ChooseTorsionOld(TrialMol& mol, uint molIndex, double* torsion = data->angles; double* torWeights = data->angleWeights; double* torEnergy = data->angleEnergy; - double* intraNonbonded = data->nonbonded_1_4; XYZ center = mol.AtomPosition(a0); for (uint tor = 0; tor < nDihTrials; ++tor) { @@ -314,14 +317,153 @@ void DCCrankShaftAng::ChooseTorsionOld(TrialMol& mol, uint molIndex, XYZ coord = spin.Apply(multiPosRotions[a][0]); mol.AddAtom(atoms[a], coord + center); } - Energy en = data->calc.MoleculeIntra(mol, molIndex); - //Get bonded energy difference due to rotating of atoms - en -= oldEnergy; - torEnergy[tor] = en.intraBond; - intraNonbonded[tor] = en.intraNonbond; - torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); } } +double DCCrankShaftAng::CalcIntraBonded(TrialMol& mol, uint molIndex) +{ + + double bondedEn = 0.0; + uint box = mol.GetBox(); + const MoleculeKind& molKind = mol.GetKind(); + XYZ b1, b2, b3; + const XYZArray &coords = mol.GetCoords(); + for(uint i = 0; i < ang.size(); i++) { + b1 = data->axes.MinImage(coords.Difference(ang[i].a0, ang[i].a1), box); + b2 = data->axes.MinImage(coords.Difference(ang[i].a2, ang[i].a1), box); + bondedEn += data->ff.angles->Calc(ang[i].kind, geom::Theta(b1, b2)); + double theta = geom::Theta(b1, b2); + } + + for(uint i = 0; i < dih.size(); i++) { + //No need to calcminImage since we unwrap it + b1 = data->axes.MinImage(coords.Difference(dih[i].a1, dih[i].a0), box); + b2 = data->axes.MinImage(coords.Difference(dih[i].a2, dih[i].a1), box); + b3 = data->axes.MinImage(coords.Difference(dih[i].a3, dih[i].a2), box); + bondedEn += data->ff.dihedrals.Calc(dih[i].kind, geom::Phi(b1, b2, b3)); + } + return bondedEn; +} + +void DCCrankShaftAng::ParticleNonbonded(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + ParticleNonbonded1_N(mol, trialPos, partIndex, trials); + ParticleNonbonded1_4(mol, trialPos, partIndex, trials); + ParticleNonbonded1_3(mol, trialPos, partIndex, trials); +} + +void DCCrankShaftAng::ParticleNonbonded1_N(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB.Begin(partIndex); + const uint* end = kind.sortedNB.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + nonbonded[t] += data->ff.particles->CalcEn(distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +void DCCrankShaftAng::ParticleNonbonded1_4(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneFour) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_4.Begin(partIndex); + const uint* end = kind.sortedNB_1_4.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +void DCCrankShaftAng::ParticleNonbonded1_3(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneThree) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_3.Begin(partIndex); + const uint* end = kind.sortedNB_1_3.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} } diff --git a/src/cbmc/DCCrankShaftAng.h b/src/cbmc/DCCrankShaftAng.h index 9edca5215..6649b918c 100644 --- a/src/cbmc/DCCrankShaftAng.h +++ b/src/cbmc/DCCrankShaftAng.h @@ -11,12 +11,10 @@ along with this program, also can be found at . #include "DCData.h" #include "BasicTypes.h" #include "TransformMatrix.h" +#include "MolSetup.h" #include -namespace mol_setup -{ - class MolKind; -} +using namespace mol_setup; namespace cbmc { @@ -42,11 +40,22 @@ class DCCrankShaftAng : public DCComponent RotationMatrix& tensor); void ChooseTorsionOld(TrialMol& mol, uint molIndex, RotationMatrix& cross, RotationMatrix& tensor); + double CalcIntraBonded(TrialMol& mol, uint molIndex); + void ParticleNonbonded(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_N(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_4(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_3(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + DCData* data; XYZArray *multiPosRotions; uint a0, a1, a2, numAtom, totAtoms; std::vector atoms; - Energy oldEnergy; + std::vector ang; + std::vector dih; }; } #endif From 129c7140587a9c9b66eacaf801b12d6d8c663825 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 13 Aug 2018 20:20:36 -0400 Subject: [PATCH 103/199] Use angle and dihedral energy for bias. Only calculate the energy of angle and dihedral which affected by rotation. Finished implementation for CrankShaftDih --- src/MolSetup.cpp | 9 +- src/cbmc/DCCrankShaftAng.cpp | 4 + src/cbmc/DCCrankShaftDih.cpp | 234 ++++++++++++++++++++++++++++++----- src/cbmc/DCCrankShaftDih.h | 19 ++- 4 files changed, 229 insertions(+), 37 deletions(-) diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index f7d2ea66e..b39a6468a 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -27,7 +27,14 @@ using namespace mol_setup; bool Dihedral::operator == (const Dihedral& o) const { - return (a0 == o.a0 && a1 == o.a1 && a2 == o.a2 && a3 == o.a3); + bool same = false; + if(a0 == o.a0 && a1 == o.a1 && a2 == o.a2 && a3 == o.a3) + same = true; + + if(a0 == o.a3 && a1 == o.a2 && a2 == o.a1 && a3 == o.a0) + same = true; + + return same; } bool Dihedral::operator != (const Dihedral& other) const diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 22bc4bc10..e4b4fb98d 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -91,6 +91,10 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, //Add dihedral with atom a1 in one end: x-x-x-a1 tempDih = AtomEndDihs(kind, a1); dih.insert(dih.end(), tempDih.begin(), tempDih.end()); + /* + for(uint i = 0; i < dih.size(); i++) { + printf("Angle on %d-%d--%d: %d -> %d -> %d -> %d \n", a0, a1, a2, dih[i].a0, dih[i].a1, dih[i].a2, dih[i].a3); + } */ } void DCCrankShaftAng::PrepareOld(TrialMol& oldMol, uint molIndex) diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 80d7dcb4c..01160c365 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -7,9 +7,9 @@ along with this program, also can be found at . #include "DCCrankShaftDih.h" #include "TrialMol.h" #include "PRNG.h" -#include "MolSetup.h" #include "Forcefield.h" #include "NumLib.h" +#include "Geometry.h" #include "CalculateEnergy.h" #include "XYZArray.h" #include @@ -67,6 +67,52 @@ DCCrankShaftDih::DCCrankShaftDih(DCData* data, const mol_setup::MolKind& kind, std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; exit(EXIT_FAILURE); } + + //Find the angles affected by rotation + //First find the angle x-a0-a1 + ang = AtomMidEndAngles(kind, a0, a1); + //Add angle with a2-a3-x + vector tempAng = AtomMidEndAngles(kind, a3, a2); + ang.insert(ang.end(), tempAng.begin(), tempAng.end()); + + //Find the dihedral affected by rotation + //First find the dihedral with x-a0-a1-x in the middle + dih = DihsOnBond(kind, a0, a1); + //Add dihedral with x-a2-a3-x + vector tempDih = DihsOnBond(kind, a2, a3); + dih.insert(dih.end(), tempDih.begin(), tempDih.end()); + //Add dihedral with atom a1 in one end: x-x-x-a1 + tempDih = AtomEndDihs(kind, a1); + //Avoid double counting the dihedral + for(uint i = 0; i < tempDih.size(); i++){ + bool found = false; + for(uint j = 0; j < dih.size(); j++){ + if(tempDih[i] == dih[j]) { + found = true; + } + } + if(!found) { + dih.push_back(tempDih[i]); + } + } + //Add dihedral with atom a2 in one end: x-x-x-a2 + tempDih = AtomEndDihs(kind, a2); + //Avoid double counting the dihedral + for(uint i = 0; i < tempDih.size(); i++){ + bool found = false; + for(uint j = 0; j < dih.size(); j++){ + if(tempDih[i] == dih[j]) { + found = true; + } + } + if(!found) { + dih.push_back(tempDih[i]); + } + } + /* + for(uint i = 0; i < dih.size(); i++) { + printf("Dinhedral on %d-%d-%d-%d: %d -> %d -> %d -> %d \n", a0, a1, a2, a3, dih[i].a0, dih[i].a1, dih[i].a2, dih[i].a3); + } */ } void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) @@ -77,7 +123,6 @@ void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) XYZ center = oldMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { - oldMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = oldMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); @@ -85,8 +130,6 @@ void DCCrankShaftDih::PrepareOld(TrialMol& oldMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } - //Calculate ol bonded and intrabonded energy wihtout atoms - oldEnergy = data->calc.MoleculeIntra(oldMol, molIndex); } void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) @@ -97,7 +140,6 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) XYZ center = newMol.AtomPosition(a0); for(uint i = 0; i < numAtom; i++) { - newMol.UnConfirmOldAtom(atoms[i]); //Unwrap the coordinates with respect to a0. XYZ temp = newMol.AtomPosition(atoms[i]); XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); @@ -105,8 +147,6 @@ void DCCrankShaftDih::PrepareNew(TrialMol& newMol, uint molIndex) coord -= center; multiPosRotions[i].Set(0, coord); } - //Calculate ol bonded and intrabonded energy wihtout atoms - oldEnergy = data->calc.MoleculeIntra(newMol, molIndex); } @@ -120,7 +160,6 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) double* torEnergy = data->angleEnergy; double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; - double* intraNonbonded = data->nonbonded_1_4; double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; @@ -129,6 +168,7 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -145,7 +185,6 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) torWeights + nDihTrials, 0.0); uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); bondedEn[lj] = torEnergy[winner]; - nonbonded[lj] = intraNonbonded[winner]; //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); @@ -160,7 +199,6 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) ChooseTorsionOld(oldMol, molIndex, cross, tensor); ljWeights[0] = std::accumulate(torWeights, torWeights + nDihTrials, 0.0); bondedEn[0] = torEnergy[0]; - nonbonded[0] = intraNonbonded[0]; for (uint a = 0; a < numAtom; a++) { //Shift original coordinate back. @@ -170,16 +208,16 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) //Calculate nonbonded energy data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, oldMol.GetBox(), nLJTrials); + ParticleNonbonded(oldMol, multiPosRotions[a], atoms[a], nLJTrials); } for (uint trial = 0; trial < nLJTrials; ++trial) { ljWeights[trial] *= exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } oldMol.MultWeight(stepWeight / nLJTrials); - oldMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[0], - oldEnergy.intraNonbond + nonbonded[0], + oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], 0.0, 0.0, 0.0)); } @@ -194,7 +232,6 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) double* torEnergy = data->angleEnergy; double* bondedEn = data->bonded; double* nonbonded = data->nonbonded; - double* intraNonbonded = data->nonbonded_1_4; double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; @@ -203,6 +240,7 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); //Set up rotation matrix using a0-a3 axis. XYZ center = newMol.AtomPosition(a0); @@ -219,7 +257,6 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) torWeights + nDihTrials, 0.0); uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); bondedEn[lj] = torEnergy[winner]; - nonbonded[lj] = intraNonbonded[winner]; //convert chosen torsion to 3D positions RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], cross, tensor); @@ -237,17 +274,17 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) //Calculate nonbonded energy data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, newMol.GetBox(), nLJTrials); + ParticleNonbonded(newMol, multiPosRotions[a], atoms[a], nLJTrials); } for (uint trial = 0; trial < nLJTrials; trial++) { ljWeights[trial] *= exp(-1 * data->ff.beta * - (inter[trial] + real[trial])); + (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); newMol.MultWeight(stepWeight / nLJTrials); - newMol.AddEnergy(Energy(oldEnergy.intraBond + bondedEn[winner], - oldEnergy.intraNonbond + nonbonded[winner], + newMol.AddEnergy(Energy(bondedEn[winner], nonbonded[winner], inter[winner], real[winner], 0.0, 0.0, 0.0)); @@ -265,7 +302,6 @@ void DCCrankShaftDih::ChooseTorsion(TrialMol& mol, uint molIndex, double* torsion = data->angles; double* torWeights = data->angleWeights; double* torEnergy = data->angleEnergy; - double* intraNonbonded = data->nonbonded_1_4; XYZ center = mol.AtomPosition(a0); for (uint tor = 0; tor < nDihTrials; ++tor) { @@ -277,12 +313,9 @@ void DCCrankShaftDih::ChooseTorsion(TrialMol& mol, uint molIndex, XYZ coord = spin.Apply(multiPosRotions[a][0]); mol.AddAtom(atoms[a], coord + center); } - Energy en = data->calc.MoleculeIntra(mol, molIndex); - //Get bonded energy difference due to rotating of atoms - en -= oldEnergy; - torEnergy[tor] = en.intraBond; - intraNonbonded[tor] = en.intraNonbond; - torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); } } @@ -307,14 +340,153 @@ void DCCrankShaftDih::ChooseTorsionOld(TrialMol& mol, uint molIndex, XYZ coord = spin.Apply(multiPosRotions[a][0]); mol.AddAtom(atoms[a], coord + center); } - Energy en = data->calc.MoleculeIntra(mol, molIndex); - //Get bonded energy difference due to rotating of atoms - en -= oldEnergy; - torEnergy[tor] = en.intraBond; - intraNonbonded[tor] = en.intraNonbond; - torWeights[tor] = exp(-1 * data->ff.beta * (torEnergy[tor] + intraNonbonded[tor])); + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); + } +} + +double DCCrankShaftDih::CalcIntraBonded(TrialMol& mol, uint molIndex) +{ + + double bondedEn = 0.0; + uint box = mol.GetBox(); + const MoleculeKind& molKind = mol.GetKind(); + XYZ b1, b2, b3; + const XYZArray &coords = mol.GetCoords(); + for(uint i = 0; i < ang.size(); i++) { + b1 = data->axes.MinImage(coords.Difference(ang[i].a0, ang[i].a1), box); + b2 = data->axes.MinImage(coords.Difference(ang[i].a2, ang[i].a1), box); + bondedEn += data->ff.angles->Calc(ang[i].kind, geom::Theta(b1, b2)); + double theta = geom::Theta(b1, b2); + } + + for(uint i = 0; i < dih.size(); i++) { + //No need to calcminImage since we unwrap it + b1 = data->axes.MinImage(coords.Difference(dih[i].a1, dih[i].a0), box); + b2 = data->axes.MinImage(coords.Difference(dih[i].a2, dih[i].a1), box); + b3 = data->axes.MinImage(coords.Difference(dih[i].a3, dih[i].a2), box); + bondedEn += data->ff.dihedrals.Calc(dih[i].kind, geom::Phi(b1, b2, b3)); + } + return bondedEn; +} + +void DCCrankShaftDih::ParticleNonbonded(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + ParticleNonbonded1_N(mol, trialPos, partIndex, trials); + ParticleNonbonded1_4(mol, trialPos, partIndex, trials); + ParticleNonbonded1_3(mol, trialPos, partIndex, trials); +} + +void DCCrankShaftDih::ParticleNonbonded1_N(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB.Begin(partIndex); + const uint* end = kind.sortedNB.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + nonbonded[t] += data->ff.particles->CalcEn(distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +void DCCrankShaftDih::ParticleNonbonded1_4(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneFour) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_4.Begin(partIndex); + const uint* end = kind.sortedNB_1_4.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; } } +void DCCrankShaftDih::ParticleNonbonded1_3(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneThree) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_3.Begin(partIndex); + const uint* end = kind.sortedNB_1_3.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} } diff --git a/src/cbmc/DCCrankShaftDih.h b/src/cbmc/DCCrankShaftDih.h index 21ba2e479..388213aa8 100644 --- a/src/cbmc/DCCrankShaftDih.h +++ b/src/cbmc/DCCrankShaftDih.h @@ -11,12 +11,10 @@ along with this program, also can be found at . #include "DCData.h" #include "BasicTypes.h" #include "TransformMatrix.h" +#include "MolSetup.h" #include -namespace mol_setup -{ - class MolKind; -} +using namespace mol_setup; namespace cbmc { @@ -42,11 +40,22 @@ class DCCrankShaftDih : public DCComponent RotationMatrix& tensor); void ChooseTorsionOld(TrialMol& mol, uint molIndex, RotationMatrix& cross, RotationMatrix& tensor); + double CalcIntraBonded(TrialMol& mol, uint molIndex); + void ParticleNonbonded(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_N(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_4(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_3(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + DCData* data; XYZArray *multiPosRotions; uint a0, a1, a2, a3, numAtom, totAtoms; std::vector atoms; - Energy oldEnergy; + std::vector ang; + std::vector dih; }; } #endif From d088813b2708e52c8ba27135fadb95feef79914c Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 14 Aug 2018 13:56:52 -0400 Subject: [PATCH 104/199] Fix to the overlap detection. Error #86 --- src/CalculateEnergy.cpp | 22 ++-- src/CalculateEnergy.h | 3 +- src/CrankShaft.h | 7 +- src/FFParticle.cpp | 20 ---- src/FFParticle.h | 2 - src/FFShift.h | 21 ---- src/FFSwitch.h | 23 ---- src/FFSwitchMartini.h | 27 ----- src/IntraMoleculeExchange1.h | 30 ++++-- src/IntraMoleculeExchange2.h | 4 +- src/IntraMoleculeExchange3.h | 32 +++--- src/IntraSwap.h | 7 +- src/MoleculeExchange1.h | 72 +++++++------ src/MoleculeExchange2.h | 4 +- src/MoleculeExchange3.h | 6 +- src/MoleculeTransfer.h | 7 +- src/MoveBase.h | 6 +- src/Regrowth.h | 7 +- src/Rotation.h | 9 +- src/Translate.h | 5 +- src/cbmc/DCCrankShaftAng.cpp | 14 ++- src/cbmc/DCCrankShaftDih.cpp | 14 ++- src/cbmc/DCData.h | 6 ++ src/cbmc/DCFreeHedron.cpp | 14 ++- src/cbmc/DCFreeHedronSeed.cpp | 14 ++- src/cbmc/DCLinkedHedron.cpp | 9 +- src/cbmc/DCOnSphere.cpp | 10 +- src/cbmc/DCRotateCOM.cpp | 190 ++++++++++++++++++---------------- src/cbmc/DCSingle.cpp | 10 +- src/cbmc/TrialMol.cpp | 12 +-- src/cbmc/TrialMol.h | 14 ++- 31 files changed, 319 insertions(+), 302 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 7d3acdb0d..bc0704a11 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -404,13 +404,14 @@ Virial CalculateEnergy::ForceCalc(const uint box) -void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, +bool CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, Intermolecular &inter_coulomb, XYZArray const& molCoords, const uint molIndex, const uint box) const { double tempREn = 0.0, tempLJEn = 0.0; + bool overlap = false; if (box < BOXES_WITH_U_NB) { uint length = mols.GetKind(molIndex).NumAtoms(); uint start = mols.MolStart(molIndex); @@ -440,11 +441,12 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, //Subtract old energy if (currentAxes.InRcut(distSq, virComponents, currentCoords, atom, nIndex[i], box)) { + if (electrostatic) { qi_qj_fact = particleCharge[atom] * particleCharge[nIndex[i]] * num::qqFact; - tempREn -= forcefield.particles->CalcCoulombEn(distSq, qi_qj_fact, box); + tempREn -= forcefield.particles->CalcCoulomb(distSq, qi_qj_fact, box); } tempLJEn -= forcefield.particles->CalcEn(distSq, particleKind[atom], @@ -468,11 +470,15 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, distSq = 0.0; if (currentAxes.InRcut(distSq, virComponents, molCoords, p, currentCoords, nIndex[i], box)) { + if(distSq < forcefield.rCutLowSq) { + overlap |= true; + } + if (electrostatic) { qi_qj_fact = particleCharge[atom] * particleCharge[nIndex[i]] * num::qqFact; - tempREn += forcefield.particles->CalcCoulombEn(distSq, + tempREn += forcefield.particles->CalcCoulomb(distSq, qi_qj_fact, box); } @@ -486,6 +492,7 @@ void CalculateEnergy::MoleculeInter(Intermolecular &inter_LJ, inter_LJ.energy = tempLJEn; inter_coulomb.energy = tempREn; + return overlap; } // Calculate 1-N nonbonded intra energy @@ -505,12 +512,11 @@ void CalculateEnergy::ParticleNonbonded(double* inter, const uint* end = kind.sortedNB.End(partIndex); while (partner != end) { if (trialMol.AtomExists(*partner)) { - for (uint t = 0; t < trials; ++t) { double distSq; if (currentAxes.InRcut(distSq, trialPos, t, trialMol.GetCoords(), - *partner, box)) { + *partner, box)) { inter[t] += forcefield.particles->CalcEn(distSq, kind.AtomKind(partIndex), kind.AtomKind(*partner)); @@ -529,6 +535,7 @@ void CalculateEnergy::ParticleNonbonded(double* inter, void CalculateEnergy::ParticleInter(double* en, double *real, XYZArray const& trialPos, + bool* overlap, const uint partIndex, const uint molIndex, const uint box, @@ -560,11 +567,14 @@ void CalculateEnergy::ParticleInter(double* en, double *real, distSq = 0.0; if(currentAxes.InRcut(distSq, trialPos, t, currentCoords, nIndex[i], box)) { + if(distSq < forcefield.rCutLowSq) { + overlap[t] |= true; + } tempLJ += forcefield.particles->CalcEn(distSq, kindI, particleKind[nIndex[i]]); if(electrostatic) { qi_qj_Fact = particleCharge[nIndex[i]] * kindICharge * num::qqFact; - tempReal += forcefield.particles->CalcCoulombEn(distSq, qi_qj_Fact, box); + tempReal += forcefield.particles->CalcCoulomb(distSq, qi_qj_Fact, box); } } } diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 4b6c913d9..874d944dc 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -86,7 +86,7 @@ class CalculateEnergy //! @param box Index of box molecule is in. //! @param newCOM (optional) If COM has changed for new coordinate, //! allows for that to be considered. - void MoleculeInter(Intermolecular &inter_LJ, Intermolecular &inter_coulomb, + bool MoleculeInter(Intermolecular &inter_LJ, Intermolecular &inter_coulomb, XYZArray const& molCoords, const uint molIndex, const uint box) const; @@ -115,6 +115,7 @@ class CalculateEnergy //! @param trials Number of trials ot loop over in position array. (cbmc) void ParticleInter(double* en, double *real, XYZArray const& trialPos, + bool* overlap, const uint partIndex, const uint molIndex, const uint box, diff --git a/src/CrankShaft.h b/src/CrankShaft.h index a514b9cf6..dfd1438a0 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -77,6 +77,7 @@ inline uint CrankShaft::GetBoxAndMol(const double subDraw, const double movPerc) inline uint CrankShaft::Prep(const double subDraw, const double movPerc) { + overlap = false; uint state = GetBoxAndMol(subDraw, movPerc); if (state == mv::fail_state::NO_FAIL) { newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); @@ -94,6 +95,7 @@ inline uint CrankShaft::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); molRef.kinds[kindIndex].CrankShaft(oldMol, newMol, molIndex); + overlap = newMol.HasOverlap(); return mv::fail_state::NO_FAIL; } @@ -104,7 +106,7 @@ inline void CrankShaft::CalcEn() correct_old = 0.0; correct_new = 0.0; - if (newMol.GetWeight() != 0.0) { + if (newMol.GetWeight() != 0.0 && !overlap) { correct_new = calcEwald->SwapCorrection(newMol); correct_old = calcEwald->SwapCorrection(oldMol); recipDiff.energy = calcEwald->MolReciprocal(newMol.GetCoords(), molIndex, @@ -126,8 +128,7 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_recip; //safety to make sure move will be rejected in overlap case - if((newMol.GetEnergy().real < 1.0e15) && - (oldMol.GetEnergy().real < 1.0e15)) { + if(!overlap) { result = prng() < Wrat; } else result = false; diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index 89b9a84fd..d6817e107 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -302,26 +302,6 @@ inline double FFParticle::CalcCoulomb(const double distSq, } } -//will be used in energy calculation after each move -inline double FFParticle::CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const -{ - if(forcefield.rCutLowSq > distSq) - return num::BIGNUM; - else if(forcefield.rCutCoulombSq[b] < distSq) - return 0.0; - - if(forcefield.ewald) { - double dist = sqrt(distSq); - double val = forcefield.alpha[b] * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - double dist = sqrt(distSq); - return qi_qj_Fact / dist; - } -} - - inline double FFParticle::CalcVir(const double distSq, const uint kind1, const uint kind2) const { diff --git a/src/FFParticle.h b/src/FFParticle.h index 69abefeb6..87a3f7015 100644 --- a/src/FFParticle.h +++ b/src/FFParticle.h @@ -69,8 +69,6 @@ struct FFParticle { // coulomb interaction functions virtual double CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const; - virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, diff --git a/src/FFShift.h b/src/FFShift.h index 660c4770b..a84c75424 100644 --- a/src/FFShift.h +++ b/src/FFShift.h @@ -51,8 +51,6 @@ struct FF_SHIFT : public FFParticle { // coulomb interaction functions virtual double CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const; - virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, @@ -176,25 +174,6 @@ inline double FF_SHIFT::CalcCoulomb(const double distSq, } } -//will be used in energy calculation after each move -inline double FF_SHIFT::CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const -{ - if(forcefield.rCutLowSq > distSq) - return num::BIGNUM; - else if(forcefield.rCutCoulombSq[b] < distSq) - return 0.0; - - if(forcefield.ewald) { - double dist = sqrt(distSq); - double val = forcefield.alpha[b] * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - double dist = sqrt(distSq); - return qi_qj_Fact * (1.0 / dist - 1.0 / forcefield.rCut); - } -} - //mie potential inline double FF_SHIFT::CalcVir(const double distSq, const uint kind1, const uint kind2) const diff --git a/src/FFSwitch.h b/src/FFSwitch.h index bd4c527d6..610fa2392 100644 --- a/src/FFSwitch.h +++ b/src/FFSwitch.h @@ -57,8 +57,6 @@ struct FF_SWITCH : public FFParticle { // coulomb interaction functions virtual double CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const; - virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, @@ -178,27 +176,6 @@ inline double FF_SWITCH::CalcCoulomb(const double distSq, } } -//will be used in energy calculation after each move -inline double FF_SWITCH::CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const -{ - if(forcefield.rCutLowSq > distSq) - return num::BIGNUM; - else if(forcefield.rCutCoulombSq[b] < distSq) - return 0.0; - - if(forcefield.ewald) { - double dist = sqrt(distSq); - double val = forcefield.alpha[b] * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - double dist = sqrt(distSq); - double switchVal = distSq / forcefield.rCutSq - 1.0; - switchVal *= switchVal; - return qi_qj_Fact * switchVal / dist; - } -} - //mie potential inline double FF_SWITCH::CalcVir(const double distSq, const uint kind1, const uint kind2) const diff --git a/src/FFSwitchMartini.h b/src/FFSwitchMartini.h index 5c54fe7a4..c91d817cc 100644 --- a/src/FFSwitchMartini.h +++ b/src/FFSwitchMartini.h @@ -81,8 +81,6 @@ struct FF_SWITCH_MARTINI : public FFParticle { // coulomb interaction functions virtual double CalcCoulomb(const double distSq, const double qi_qj_Fact, const uint b) const; - virtual double CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const; virtual double CalcCoulombVir(const double distSq, const double qi_qj, const uint b) const; virtual void CalcCoulombAdd_1_4(double& en, const double distSq, @@ -282,31 +280,6 @@ inline double FF_SWITCH_MARTINI::CalcCoulomb(const double distSq, } } -//will be used in energy calculation after each move -inline double FF_SWITCH_MARTINI::CalcCoulombEn(const double distSq, - const double qi_qj_Fact, const uint b) const -{ - if(forcefield.rCutLowSq > distSq) - return num::BIGNUM; - else if(forcefield.rCutCoulombSq[b] < distSq) - return 0.0; - - if(forcefield.ewald) { - double dist = sqrt(distSq); - double val = forcefield.alpha[b] * dist; - return qi_qj_Fact * erfc(val) / dist; - } else { - // in Martini, the Coulomb switching distance is zero, so we will have - // sqrt(distSq) - rOnCoul = sqrt(distSq) - double dist = sqrt(distSq); - double rij_ronCoul_3 = dist * distSq; - double rij_ronCoul_4 = distSq * distSq; - - double coul = -(A1 / 3.0) * rij_ronCoul_3 - (B1 / 4.0) * rij_ronCoul_4 - C1; - return qi_qj_Fact * diElectric_1 * (1.0 / dist + coul); - } -} - //mie potential inline double FF_SWITCH_MARTINI::CalcVir(const double distSq, const uint kind1, diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 2902f1f33..4dc32f1b4 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -294,6 +294,7 @@ inline uint IntraMoleculeExchange1::GetBoxPairAndMol(const double subDraw, const double movPerc) { uint state = mv::fail_state::NO_FAIL; + overlap = false; #if ENSEMBLE == GCMC sourceBox = 0; @@ -440,7 +441,8 @@ inline uint IntraMoleculeExchange1::Transform() ShiftMol(n, false); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + overlap |= newMolB[n].HasOverlap(); } //Insert kindS to cavity of center B @@ -450,6 +452,7 @@ inline uint IntraMoleculeExchange1::Transform() cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } return mv::fail_state::NO_FAIL; @@ -458,17 +461,18 @@ inline uint IntraMoleculeExchange1::Transform() inline void IntraMoleculeExchange1::CalcEn() { - W_recip = 1.0; - recipDiffA = 0.0, recipDiffB = 0.0; - correctDiff = 0.0; + W_recip = 1.0; + recipDiffA = 0.0, recipDiffB = 0.0; + correctDiff = 0.0; - recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); - recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); + if(!overlap) { + recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); + recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); - //No need to contribute the self and correction energy since insertion - //and deletion are rigid body - W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB)); - + //No need to contribute the self and correction energy since insertion + //and deletion are rigid body + W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB)); + } } inline double IntraMoleculeExchange1::GetCoeff() const @@ -529,7 +533,11 @@ inline void IntraMoleculeExchange1::Accept(const uint rejectState, Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); } - result = prng() < molTransCoeff * Wrat; + if(!overlap) { + result = prng() < molTransCoeff * Wrat; + } else { + result = false; + } if(result) { //Add rest of energy. diff --git a/src/IntraMoleculeExchange2.h b/src/IntraMoleculeExchange2.h index 6ae5d720c..48b473f93 100644 --- a/src/IntraMoleculeExchange2.h +++ b/src/IntraMoleculeExchange2.h @@ -316,7 +316,8 @@ inline uint IntraMoleculeExchange2::Transform() ShiftMol(n, false); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + overlap |= newMolB[n].HasOverlap(); } //Insert kindS to cavity of center B @@ -326,6 +327,7 @@ inline uint IntraMoleculeExchange2::Transform() cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } return mv::fail_state::NO_FAIL; diff --git a/src/IntraMoleculeExchange3.h b/src/IntraMoleculeExchange3.h index 4caf69728..e0246a2ff 100644 --- a/src/IntraMoleculeExchange3.h +++ b/src/IntraMoleculeExchange3.h @@ -267,7 +267,8 @@ inline uint IntraMoleculeExchange3::Transform() for(uint n = 0; n < numInCavB; n++) { molRef.kinds[kindIndexB[n]].BuildGrowNew(newMolB[n], molIndexB[n]); ShiftMol(n, false); - cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + overlap |= newMolB[n].HasOverlap(); } //Insert kindS to cavity of center B @@ -277,6 +278,7 @@ inline uint IntraMoleculeExchange3::Transform() cellList.AddMol(molIndexA[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } return mv::fail_state::NO_FAIL; @@ -284,20 +286,22 @@ inline uint IntraMoleculeExchange3::Transform() inline void IntraMoleculeExchange3::CalcEn() { - W_recip = 1.0; - recipDiffA = 0.0, recipDiffB = 0.0; - correctDiff = 0.0; - //No need to calculate the correction term for kindS since it is - // inserted rigid body. We just need it for kindL - for(uint n = 0; n < numInCavB; n++) { - correctDiff += calcEwald->SwapCorrection(newMolB[n]); - correctDiff -= calcEwald->SwapCorrection(oldMolB[n]); - } - recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); - recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); + W_recip = 1.0; + recipDiffA = 0.0, recipDiffB = 0.0; + correctDiff = 0.0; + //No need to calculate the correction term for kindS since it is + // inserted rigid body. We just need it for kindL + if(!overlap) { + for(uint n = 0; n < numInCavB; n++) { + correctDiff += calcEwald->SwapCorrection(newMolB[n]); + correctDiff -= calcEwald->SwapCorrection(oldMolB[n]); + } + recipDiffA = calcEwald->SwapRecip(newMolA, oldMolA); + recipDiffB = calcEwald->SwapRecip(newMolB, oldMolB); - W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB + - correctDiff)); + W_recip = exp(-1.0 * ffRef.beta * (recipDiffA + recipDiffB + + correctDiff)); + } } inline double IntraMoleculeExchange3::GetCoeff() const diff --git a/src/IntraSwap.h b/src/IntraSwap.h index 5858bf936..f153f149d 100644 --- a/src/IntraSwap.h +++ b/src/IntraSwap.h @@ -77,6 +77,7 @@ inline uint IntraSwap::GetBoxAndMol(const double subDraw, const double movPerc) inline uint IntraSwap::Prep(const double subDraw, const double movPerc) { + overlap = false; uint state = GetBoxAndMol(subDraw, movPerc); if (state == mv::fail_state::NO_FAIL) { newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); @@ -92,6 +93,7 @@ inline uint IntraSwap::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); molRef.kinds[kindIndex].Build(oldMol, newMol, molIndex); + overlap = newMol.HasOverlap(); return mv::fail_state::NO_FAIL; } @@ -104,7 +106,7 @@ inline void IntraSwap::CalcEn() correct_old = 0.0; correct_new = 0.0; - if (newMol.GetWeight() != 0.0) { + if (newMol.GetWeight() != 0.0 && !overlap) { correct_new = calcEwald->SwapCorrection(newMol); correct_old = calcEwald->SwapCorrection(oldMol); recipDiff.energy = calcEwald->MolReciprocal(newMol.GetCoords(), molIndex, @@ -127,8 +129,7 @@ inline void IntraSwap::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_tc * W_recip; //safety to make sure move will be rejected in overlap case - if((newMol.GetEnergy().real < 1.0e15) && - (oldMol.GetEnergy().real < 1.0e15)) { + if(!overlap) { result = prng() < molTransCoeff * Wrat; } else result = false; diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index a2942184c..519f41491 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -347,7 +347,8 @@ inline uint MoleculeExchange1::ReplaceMolecule() inline uint MoleculeExchange1::GetBoxPairAndMol(const double subDraw, const double movPerc) { - uint state = mv::fail_state::NO_FAIL; + uint state = mv::fail_state::NO_FAIL; + overlap = false; //deside to insert or remove the big molecule prng.PickBool(insertL, subDraw, movPerc); //Set the source and dest Box. @@ -513,6 +514,7 @@ inline uint MoleculeExchange1::Transform() cellList.AddMol(molIndexA[n], destBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } //Insert B in sourceBox @@ -521,7 +523,8 @@ inline uint MoleculeExchange1::Transform() ShiftMol(false, n, destBox, sourceBox); cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + overlap |= newMolB[n].HasOverlap(); } return mv::fail_state::NO_FAIL; @@ -554,36 +557,37 @@ inline void MoleculeExchange1::CalcTc() inline void MoleculeExchange1::CalcEn() { - W_recip = 1.0; - correct_oldA = 0.0, correct_newA = 0.0; - self_oldA = 0.0, self_newA = 0.0; - correct_oldB = 0.0, correct_newB = 0.0; - self_oldB = 0.0, self_newB = 0.0; - recipDest = 0.0, recipSource = 0.0; - - for(uint n = 0; n < numInCavA; n++) { - correct_newA += calcEwald->SwapCorrection(newMolA[n]); - correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); - self_newA += calcEwald->SwapSelf(newMolA[n]); - self_oldA += calcEwald->SwapSelf(oldMolA[n]); - } - recipDest = calcEwald->SwapRecip(newMolA, oldMolB); + W_recip = 1.0; + correct_oldA = 0.0, correct_newA = 0.0; + self_oldA = 0.0, self_newA = 0.0; + correct_oldB = 0.0, correct_newB = 0.0; + self_oldB = 0.0, self_newB = 0.0; + recipDest = 0.0, recipSource = 0.0; + + if(!overlap) { + for(uint n = 0; n < numInCavA; n++) { + correct_newA += calcEwald->SwapCorrection(newMolA[n]); + correct_oldA += calcEwald->SwapCorrection(oldMolA[n]); + self_newA += calcEwald->SwapSelf(newMolA[n]); + self_oldA += calcEwald->SwapSelf(oldMolA[n]); + } + recipDest = calcEwald->SwapRecip(newMolA, oldMolB); - for(uint n = 0; n < numInCavB; n++) { - correct_newB += calcEwald->SwapCorrection(newMolB[n]); - correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); - self_newB += calcEwald->SwapSelf(newMolB[n]); - self_oldB += calcEwald->SwapSelf(oldMolB[n]); - } - recipSource = calcEwald->SwapRecip(newMolB, oldMolA); - - //need to contribute the self and correction energy - W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + - correct_newA - correct_oldA + - correct_newB - correct_oldB + - self_newA - self_oldA + - self_newB - self_oldB)); - + for(uint n = 0; n < numInCavB; n++) { + correct_newB += calcEwald->SwapCorrection(newMolB[n]); + correct_oldB += calcEwald->SwapCorrection(oldMolB[n]); + self_newB += calcEwald->SwapSelf(newMolB[n]); + self_oldB += calcEwald->SwapSelf(oldMolB[n]); + } + recipSource = calcEwald->SwapRecip(newMolB, oldMolA); + + //need to contribute the self and correction energy + W_recip = exp(-1.0 * ffRef.beta * (recipSource + recipDest + + correct_newA - correct_oldA + + correct_newB - correct_oldB + + self_newA - self_oldA + + self_newB - self_oldB)); + } } inline double MoleculeExchange1::GetCoeff() const @@ -707,7 +711,11 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) Wrat *= newMolB[n].GetWeight() / oldMolB[n].GetWeight(); } - result = prng() < molTransCoeff * Wrat; + if(!overlap) { + result = prng() < molTransCoeff * Wrat; + } else { + result = false; + } if(result) { //Add tail corrections diff --git a/src/MoleculeExchange2.h b/src/MoleculeExchange2.h index 045e5895a..63a9d3492 100644 --- a/src/MoleculeExchange2.h +++ b/src/MoleculeExchange2.h @@ -362,7 +362,8 @@ inline uint MoleculeExchange2::Transform() ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp - newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } //Insert B in sourceBox @@ -373,6 +374,7 @@ inline uint MoleculeExchange2::Transform() cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + overlap |= newMolB[n].HasOverlap(); } return mv::fail_state::NO_FAIL; diff --git a/src/MoleculeExchange3.h b/src/MoleculeExchange3.h index 1aa06c916..d1e51d6e7 100644 --- a/src/MoleculeExchange3.h +++ b/src/MoleculeExchange3.h @@ -313,12 +313,14 @@ inline uint MoleculeExchange3::Transform() ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); newMolA[n].AddEnergy(calcEnRef.MoleculeIntra(newMolA[n], molIndexA[n])); + overlap |= newMolA[n].HasOverlap(); } //Insert Large kind to sourceBox for(uint n = 0; n < numInCavB; n++) { molRef.kinds[kindIndexB[n]].BuildGrowNew(newMolB[n], molIndexB[n]); ShiftMol(false, n, destBox, sourceBox); - cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); + overlap |= newMolB[n].HasOverlap(); } } else { //Insert Large kind to destBox @@ -326,6 +328,7 @@ inline uint MoleculeExchange3::Transform() molRef.kinds[kindIndexA[n]].BuildNew(newMolA[n], molIndexA[n]); ShiftMol(true, n, sourceBox, destBox); cellList.AddMol(molIndexA[n], destBox, coordCurrRef); + overlap |= newMolA[n].HasOverlap(); } //Insert Small kind to sourceBox for(uint n = 0; n < numInCavB; n++) { @@ -334,6 +337,7 @@ inline uint MoleculeExchange3::Transform() cellList.AddMol(molIndexB[n], sourceBox, coordCurrRef); //Add bonded energy because we dont considered in DCRotate.cpp newMolB[n].AddEnergy(calcEnRef.MoleculeIntra(newMolB[n], molIndexB[n])); + overlap |= newMolB[n].HasOverlap(); } } diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index b9cde0f9d..e11ebe80a 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -81,6 +81,7 @@ inline uint MoleculeTransfer::GetBoxPairAndMol(const double subDraw, const doubl inline uint MoleculeTransfer::Prep(const double subDraw, const double movPerc) { + overlap = false; uint state = GetBoxPairAndMol(subDraw, movPerc); if (state == mv::fail_state::NO_FAIL) { newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); @@ -95,6 +96,7 @@ inline uint MoleculeTransfer::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); molRef.kinds[kindIndex].Build(oldMol, newMol, molIndex); + overlap = newMol.HasOverlap(); return mv::fail_state::NO_FAIL; } @@ -113,7 +115,7 @@ inline void MoleculeTransfer::CalcEn() W_tc = exp(-1.0 * ffRef.beta * (tcGain.energy + tcLose.energy)); } - if (newMol.GetWeight() != 0.0) { + if (newMol.GetWeight() != 0.0 && !overlap) { correct_new = calcEwald->SwapCorrection(newMol); correct_old = calcEwald->SwapCorrection(oldMol); self_new = calcEwald->SwapSelf(newMol); @@ -172,8 +174,7 @@ inline void MoleculeTransfer::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_tc * W_recip; //safety to make sure move will be rejected in overlap case - if((newMol.GetEnergy().real < 1.0e15) && - (oldMol.GetEnergy().real < 1.0e15)) { + if(!overlap) { result = prng() < molTransCoeff * Wrat; } else result = false; diff --git a/src/MoveBase.h b/src/MoveBase.h index cb5ff65c9..b856ddc5b 100644 --- a/src/MoveBase.h +++ b/src/MoveBase.h @@ -36,9 +36,11 @@ class MoveBase calcEnRef(sys.calcEnergy), comCurrRef(sys.com), coordCurrRef(sys.coordinates), prng(sys.prng), molRef(statV.mol), BETA(statV.forcefield.beta), ewald(statV.forcefield.ewald), - cellList(sys.cellList), molRemoved(false) + cellList(sys.cellList) { calcEwald = sys.GetEwald(); + molRemoved = false; + overlap = false; } //Based on the random draw, determine the move kind, box, and @@ -80,7 +82,7 @@ class MoveBase const double BETA; const bool ewald; CellList& cellList; - bool molRemoved, fixBox0; + bool molRemoved, fixBox0, overlap; }; //Data needed for transforming a molecule's position via inter or intrabox diff --git a/src/Regrowth.h b/src/Regrowth.h index fa58bf688..451223537 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -77,6 +77,7 @@ inline uint Regrowth::GetBoxAndMol(const double subDraw, const double movPerc) inline uint Regrowth::Prep(const double subDraw, const double movPerc) { + overlap = false; uint state = GetBoxAndMol(subDraw, movPerc); if (state == mv::fail_state::NO_FAIL) { newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); @@ -90,6 +91,7 @@ inline uint Regrowth::Transform() { cellList.RemoveMol(molIndex, sourceBox, coordCurrRef); molRef.kinds[kindIndex].Regrowth(oldMol, newMol, molIndex); + overlap = newMol.HasOverlap(); return mv::fail_state::NO_FAIL; } @@ -100,7 +102,7 @@ inline void Regrowth::CalcEn() correct_old = 0.0; correct_new = 0.0; - if (newMol.GetWeight() != 0.0) { + if (newMol.GetWeight() != 0.0 && !overlap) { correct_new = calcEwald->SwapCorrection(newMol); correct_old = calcEwald->SwapCorrection(oldMol); recipDiff.energy = calcEwald->MolReciprocal(newMol.GetCoords(), molIndex, @@ -122,8 +124,7 @@ inline void Regrowth::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_recip; //safety to make sure move will be rejected in overlap case - if((newMol.GetEnergy().real < 1.0e15) && - (oldMol.GetEnergy().real < 1.0e15)) { + if(!overlap) { result = prng() < Wrat; } else result = false; diff --git a/src/Rotation.h b/src/Rotation.h index e05475a57..95c523cc7 100644 --- a/src/Rotation.h +++ b/src/Rotation.h @@ -56,9 +56,10 @@ inline void Rotate::CalcEn() { cellList.RemoveMol(m, b, coordCurrRef); molRemoved = true; - + overlap = false; + //calculate LJ interaction and real term of electrostatic interaction - calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); + overlap = calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); //calculate reciprocate term of electrostatic interaction recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); } @@ -67,12 +68,12 @@ inline void Rotate::Accept(const uint rejectState, const uint step) { bool res = false; - if (rejectState == mv::fail_state::NO_FAIL) { + if(rejectState == mv::fail_state::NO_FAIL) { double pr = prng(); res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + recip.energy)); } - bool result = (rejectState == mv::fail_state::NO_FAIL) && res; + bool result = res && !overlap; if (result) { //Set new energy. diff --git a/src/Translate.h b/src/Translate.h index 2cf2528ad..abcba4b3e 100644 --- a/src/Translate.h +++ b/src/Translate.h @@ -64,9 +64,10 @@ inline void Translate::CalcEn() { cellList.RemoveMol(m, b, coordCurrRef); molRemoved = true; + overlap = false; //calculate LJ interaction and real term of electrostatic interaction - calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); + overlap = calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); //calculate reciprocate term of electrostatic interaction recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); } @@ -79,7 +80,7 @@ inline void Translate::Accept(const uint rejectState, const uint step) res = pr < exp(-BETA * (inter_LJ.energy + inter_Real.energy + recip.energy)); } - bool result = (rejectState == mv::fail_state::NO_FAIL) && res; + bool result = res && !overlap; if (result) { //Set new energy. diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index e4b4fb98d..70426cdf4 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -145,12 +145,14 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -188,8 +190,8 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) //Wrap the atom coordinates data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); //Calculate nonbonded energy - data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, - oldMol.GetBox(), nLJTrials); + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, oldMol.GetBox(), nLJTrials); ParticleNonbonded(oldMol, multiPosRotions[a], atoms[a], nLJTrials); } @@ -198,6 +200,7 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } + oldMol.UpdateOverlap(overlap[0]); oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], @@ -217,12 +220,14 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //Set up rotation matrix using a0-a3 axis. XYZ center = newMol.AtomPosition(a0); @@ -254,8 +259,8 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) //Wrap the atom coordinates data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); //Calculate nonbonded energy - data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, - newMol.GetBox(), nLJTrials); + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, newMol.GetBox(), nLJTrials); ParticleNonbonded(newMol, multiPosRotions[a], atoms[a], nLJTrials); } @@ -265,6 +270,7 @@ void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.UpdateOverlap(overlap[winner]); newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(bondedEn[winner], nonbonded[winner], inter[winner], real[winner], diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 01160c365..3b8fafdea 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -163,12 +163,14 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //Set up rotation matrix using a0-a3 axis. XYZ center = oldMol.AtomPosition(a0); @@ -206,8 +208,8 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) //Wrap the atom coordinates data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); //Calculate nonbonded energy - data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, - oldMol.GetBox(), nLJTrials); + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, oldMol.GetBox(), nLJTrials); ParticleNonbonded(oldMol, multiPosRotions[a], atoms[a], nLJTrials); } @@ -216,6 +218,7 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) (inter[trial] + real[trial] + nonbonded[trial])); stepWeight += ljWeights[trial]; } + oldMol.UpdateOverlap(overlap[0]); oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], @@ -235,12 +238,14 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //Set up rotation matrix using a0-a3 axis. XYZ center = newMol.AtomPosition(a0); @@ -272,8 +277,8 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) //Wrap the atom coordinates data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); //Calculate nonbonded energy - data->calc.ParticleInter(inter, real, multiPosRotions[a], atoms[a], molIndex, - newMol.GetBox(), nLJTrials); + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, newMol.GetBox(), nLJTrials); ParticleNonbonded(newMol, multiPosRotions[a], atoms[a], nLJTrials); } @@ -283,6 +288,7 @@ void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.UpdateOverlap(overlap[winner]); newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(bondedEn[winner], nonbonded[winner], inter[winner], real[winner], diff --git a/src/cbmc/DCData.h b/src/cbmc/DCData.h index 36a5b7c65..7254d9430 100644 --- a/src/cbmc/DCData.h +++ b/src/cbmc/DCData.h @@ -60,6 +60,8 @@ class DCData double* interT; //For DCRotateCOM, we have combined first and Nth trial double* realT; //For DCRotateCOM, we have combined first and Nth trial double* ljWeightsT; //For DCRotateCOM, we have combined first and Nth trial + bool* overlap; //For detecting overlap for each LJ trial + bool* overlapT; //For detecting overlap for each LJ trial. Used in DCRotateCOM XYZArray multiPositions[MAX_BONDS]; }; @@ -92,10 +94,12 @@ inline DCData::DCData(System& sys, const Forcefield& forcefield, const Setup& se oneFour = new double[maxLJTrials]; nonbonded = new double[maxLJTrials]; ljWeights = new double[maxLJTrials]; + overlap = new bool[maxLJTrials]; interT = new double[totalTrials]; realT = new double[totalTrials]; ljWeightsT = new double[totalTrials]; + overlapT = new bool[totalTrials]; uint trialMax = std::max(nAngleTrials, nDihTrials); angleEnergy = new double[trialMax]; @@ -121,6 +125,8 @@ inline DCData::~DCData() delete[] interT; delete[] realT; delete[] ljWeightsT; + delete[] overlap; + delete[] overlapT; } } diff --git a/src/cbmc/DCFreeHedron.cpp b/src/cbmc/DCFreeHedron.cpp index 775763c01..4aab2e8d5 100644 --- a/src/cbmc/DCFreeHedron.cpp +++ b/src/cbmc/DCFreeHedron.cpp @@ -107,10 +107,12 @@ void DCFreeHedron::BuildNew(TrialMol& newMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry newMol.ShiftBasis(hed.Focus()); @@ -141,10 +143,10 @@ void DCFreeHedron::BuildNew(TrialMol& newMol, uint molIndex) } for (uint b = 0; b < hed.NumBond(); ++b) { - calc.ParticleInter(inter, real, positions[b], hed.Bonded(b), + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, newMol.GetBox(), nLJTrials); } - calc.ParticleInter(inter, real, positions[hed.NumBond()], hed.Prev(), + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), molIndex, newMol.GetBox(), nLJTrials); double stepWeight = 0; @@ -159,6 +161,7 @@ void DCFreeHedron::BuildNew(TrialMol& newMol, uint molIndex) } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], 0.0, 0.0, 0.0)); @@ -177,10 +180,12 @@ void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry oldMol.SetBasis(hed.Focus(), hed.Prev()); @@ -220,11 +225,11 @@ void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) } for (uint b = 0; b < hed.NumBond(); ++b) { - calc.ParticleInter(inter, real, positions[b], hed.Bonded(b), + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, oldMol.GetBox(), nLJTrials); } double stepWeight = 0; - calc.ParticleInter(inter, real, positions[hed.NumBond()], hed.Prev(), + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), molIndex, oldMol.GetBox(), nLJTrials); for (uint lj = 0; lj < nLJTrials; ++lj) { @@ -236,6 +241,7 @@ void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(hed.GetWeight()); diff --git a/src/cbmc/DCFreeHedronSeed.cpp b/src/cbmc/DCFreeHedronSeed.cpp index 7c65278bc..b3aa66b76 100644 --- a/src/cbmc/DCFreeHedronSeed.cpp +++ b/src/cbmc/DCFreeHedronSeed.cpp @@ -101,10 +101,12 @@ void DCFreeHedronSeed::BuildNew(TrialMol& newMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry newMol.ShiftBasis(hed.Focus()); @@ -135,10 +137,10 @@ void DCFreeHedronSeed::BuildNew(TrialMol& newMol, uint molIndex) } for (uint b = 0; b < hed.NumBond(); ++b) { - calc.ParticleInter(inter, real, positions[b], hed.Bonded(b), + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, newMol.GetBox(), nLJTrials); } - calc.ParticleInter(inter, real, positions[hed.NumBond()], hed.Prev(), + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), molIndex, newMol.GetBox(), nLJTrials); double stepWeight = 0; @@ -153,6 +155,7 @@ void DCFreeHedronSeed::BuildNew(TrialMol& newMol, uint molIndex) } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], 0.0, 0.0, 0.0)); @@ -170,10 +173,12 @@ void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) double* ljWeights = data->ljWeights; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry oldMol.SetBasis(hed.Focus(), hed.Prev()); @@ -214,11 +219,11 @@ void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) } for (uint b = 0; b < hed.NumBond(); ++b) { - calc.ParticleInter(inter, real, positions[b], hed.Bonded(b), + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, oldMol.GetBox(), nLJTrials); } double stepWeight = 0; - calc.ParticleInter(inter, real, positions[hed.NumBond()], hed.Prev(), + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), molIndex, oldMol.GetBox(), nLJTrials); for (uint lj = 0; lj < nLJTrials; ++lj) { @@ -230,6 +235,7 @@ void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(hed.GetWeight()); diff --git a/src/cbmc/DCLinkedHedron.cpp b/src/cbmc/DCLinkedHedron.cpp index e3358daff..4eadd2873 100644 --- a/src/cbmc/DCLinkedHedron.cpp +++ b/src/cbmc/DCLinkedHedron.cpp @@ -144,10 +144,12 @@ void DCLinkedHedron::BuildNew(TrialMol& newMol, uint molIndex) double* nonbonded_1_4 = data->nonbonded_1_4; double* real = data->real; double* oneFour = data->oneFour; + bool* overlap = data->overlap; std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(bondedEn, nLJTrials, 0.0); std::fill_n(oneFour, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry newMol.SetBasis(hed.Focus(), hed.Prev()); @@ -198,6 +200,7 @@ void DCLinkedHedron::BuildNew(TrialMol& newMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); } + newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(bondedEn[winner] + hed.GetEnergy() + bondEnergy, nonbonded[winner] + hed.GetNonBondedEn() + oneFour[winner], inter[winner], real[winner], @@ -223,11 +226,13 @@ void DCLinkedHedron::BuildOld(TrialMol& oldMol, uint molIndex) double* nonbonded_1_4 = data->nonbonded_1_4; double* real = data->real; double* oneFour = data->oneFour; + bool* overlap = data->overlap; std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(bondedEn, nLJTrials, 0.0); std::fill_n(oneFour, nLJTrials, 0.0); std::fill_n(oneFour, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //get info about existing geometry oldMol.SetBasis(hed.Focus(), hed.Prev()); @@ -315,6 +320,7 @@ void DCLinkedHedron::BuildOld(TrialMol& oldMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); } + oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(bondedEn[0] + hed.GetEnergy() + bondEnergy, nonbonded[0] + hed.GetNonBondedEn() + oneFour[0], inter[0], real[0], 0.0, 0.0, 0.0)); @@ -329,6 +335,7 @@ double DCLinkedHedron::EvalLJ(TrialMol& mol, uint molIndex) double* inter = data->inter; double* nonbonded = data->nonbonded; double* real = data->real; + bool* overlap = data->overlap; XYZArray* positions = data->multiPositions; std::fill_n(data->inter, nLJTrials, 0.0); @@ -336,7 +343,7 @@ double DCLinkedHedron::EvalLJ(TrialMol& mol, uint molIndex) std::fill_n(real, nLJTrials, 0.0); for (uint b = 0; b < hed.NumBond(); ++b) { - data->calc.ParticleInter(inter, real, positions[b], hed.Bonded(b), + data->calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, mol.GetBox(), nLJTrials); data->calc.ParticleNonbonded(nonbonded, mol, positions[b], diff --git a/src/cbmc/DCOnSphere.cpp b/src/cbmc/DCOnSphere.cpp index c90364b00..3ce6dbe69 100644 --- a/src/cbmc/DCOnSphere.cpp +++ b/src/cbmc/DCOnSphere.cpp @@ -60,10 +60,12 @@ void DCOnSphere::BuildOld(TrialMol& oldMol, uint molIndex) uint nLJTrials = data->nLJTrialsNth; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //calculate bond energy for old molecule. SetBondLengthOld(oldMol); bondEnergy = BondEnergyOld(oldMol); @@ -73,7 +75,7 @@ void DCOnSphere::BuildOld(TrialMol& oldMol, uint molIndex) positions.Set(0, oldMol.AtomPosition(atom)); data->axes.WrapPBC(positions, oldMol.GetBox()); - data->calc.ParticleInter(inter, real, positions, atom, molIndex, + data->calc.ParticleInter(inter, real, positions, overlap, atom, molIndex, oldMol.GetBox(), nLJTrials); @@ -81,6 +83,7 @@ void DCOnSphere::BuildOld(TrialMol& oldMol, uint molIndex) stepWeight += exp(-1 * data->ff.beta * (inter[trial] + real[trial])); } + oldMol.UpdateOverlap(overlap[0]); oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(bondEnergy, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); @@ -94,11 +97,13 @@ void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) double* inter = data->inter; double* real = data->real; double* ljWeights = data->ljWeights; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); //calculate bond energy for old molecule. SetBondLengthNew(newMol); bondEnergy = BondEnergyNew(newMol); @@ -107,7 +112,7 @@ void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) newMol.AtomPosition(focus)); data->axes.WrapPBC(positions, newMol.GetBox()); - data->calc.ParticleInter(inter, real, positions, atom, molIndex, + data->calc.ParticleInter(inter, real, positions, overlap, atom, molIndex, newMol.GetBox(), nLJTrials); @@ -117,6 +122,7 @@ void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = data->prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.UpdateOverlap(overlap[winner]); newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(bondEnergy, 0, inter[winner], real[winner], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/DCRotateCOM.cpp b/src/cbmc/DCRotateCOM.cpp index 77fca1817..9751f2cb4 100644 --- a/src/cbmc/DCRotateCOM.cpp +++ b/src/cbmc/DCRotateCOM.cpp @@ -141,11 +141,13 @@ namespace cbmc double* ljWeights = data->ljWeightsT; double* inter = data->interT; double* real = data->realT; + bool* overlap = data->overlapT; RotationMatrix spin; std::fill_n(inter, totalTrials, 0.0); std::fill_n(real, totalTrials, 0.0); std::fill_n(ljWeights, totalTrials, 0.0); + std::fill_n(overlap, totalTrials, false); if(atomNumber == 1) { @@ -160,20 +162,20 @@ namespace cbmc //if we rotate around backbone we need to calc the rotation matrix if(newMol.RotateBB()) { - //find the inverse matrix of molecule that we insert - XYZ backBone; - if(atomNumber != 1) - { - backBone = newMol.GetCoords().Difference(newMol.GetAtomBB(0), - newMol.GetAtomBB(1)); - } - else - { - backBone = prng.RandomUnitVect(); - } - XYZArray T(3); - geom::SetBasis(T, backBone); - geom::TransposeMatrix(invMatrix, T); + //find the inverse matrix of molecule that we insert + XYZ backBone; + if(atomNumber != 1) + { + backBone = newMol.GetCoords().Difference(newMol.GetAtomBB(0), + newMol.GetAtomBB(1)); + } + else + { + backBone = prng.RandomUnitVect(); + } + XYZArray T(3); + geom::SetBasis(T, backBone); + geom::TransposeMatrix(invMatrix, T); } } @@ -189,53 +191,53 @@ namespace cbmc for (uint a = 0; a < atomNumber; ++a) { - multiPosRotions[a].Set(index, newMol.AtomPosition(a)); - multiPosRotions[a].Add(index, -center); + multiPosRotions[a].Set(index, newMol.AtomPosition(a)); + multiPosRotions[a].Add(index, -center); } //Rotational trial the molecule around COM for (uint r = nLJTrials; r-- > 0;) { - if(newMol.RotateBB()) - { - //we only perform rotation around z axis - RandRotateZ(); - } - else - { - //convert chosen torsion to 3D positions - spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); - } + if(newMol.RotateBB()) + { + //we only perform rotation around z axis + RandRotateZ(); + } + else + { + //convert chosen torsion to 3D positions + spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); + } - for (uint a = 0; a < atomNumber; ++a) - { - if(newMol.RotateBB()) - { - XYZ coord = multiPosRotions[a][index]; - //transform backbone to z axis - coord = geom::Transform(invMatrix, coord); - //rotate around z - coord = geom::Transform(rotateMatrix, coord); - //transfer backbone to cavity orientation - coord = newMol.Transform(coord); - multiPosRotions[a].Set(index + r, coord); - } - else - { - //find positions - multiPosRotions[a].Set(index + r, - spin.Apply(multiPosRotions[a][index])); - } - multiPosRotions[a].Add(index + r, center); - } + for (uint a = 0; a < atomNumber; ++a) + { + if(newMol.RotateBB()) + { + XYZ coord = multiPosRotions[a][index]; + //transform backbone to z axis + coord = geom::Transform(invMatrix, coord); + //rotate around z + coord = geom::Transform(rotateMatrix, coord); + //transfer backbone to cavity orientation + coord = newMol.Transform(coord); + multiPosRotions[a].Set(index + r, coord); + } + else + { + //find positions + multiPosRotions[a].Set(index + r, + spin.Apply(multiPosRotions[a][index])); + } + multiPosRotions[a].Add(index + r, center); + } } } for (uint a = 0; a < atomNumber; ++a) { data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); - calc.ParticleInter(inter, real, multiPosRotions[a], a, - molIndex, newMol.GetBox(), totalTrials); + calc.ParticleInter(inter, real, multiPosRotions[a], overlap, a, + molIndex, newMol.GetBox(), totalTrials); } double stepWeight = 0.0; @@ -250,7 +252,8 @@ namespace cbmc { newMol.AddAtom(a, multiPosRotions[a][winner]); } - + + newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.MultWeight(stepWeight / totalTrials); @@ -267,12 +270,14 @@ namespace cbmc uint totalTrials = data->totalTrials; double* ljWeights = data->ljWeightsT; double* inter = data->interT; - double* real = data->realT; + double* real = data->realT; + bool* overlap = data->overlapT; RotationMatrix spin; std::fill_n(inter, totalTrials, 0.0); std::fill_n(real, totalTrials, 0.0); std::fill_n(ljWeights, totalTrials, 0.0); + std::fill_n(overlap, totalTrials, false); if(atomNumber == 1) { @@ -287,8 +292,8 @@ namespace cbmc //if we rotate around backbone of the molecule if(oldMol.RotateBB()) { - //find the inverse matrix of cavity - oldMol.TransposeMatrix(invMatrix); + //find the inverse matrix of cavity + oldMol.TransposeMatrix(invMatrix); } } @@ -304,49 +309,49 @@ namespace cbmc for (uint a = 0; a < atomNumber; ++a) { - //get position and shift to origin - multiPosRotions[a].Set(index, oldMol.AtomPosition(a)); - multiPosRotions[a].Add(index, -center); + //get position and shift to origin + multiPosRotions[a].Set(index, oldMol.AtomPosition(a)); + multiPosRotions[a].Add(index, -center); } //Rotational trial the molecule around COM for (uint r = nLJTrials; r-- > 0;) { - if((index + r) == 0) - continue; + if((index + r) == 0) + continue; - if(oldMol.RotateBB()) - { - //we only perform rotation around z axis - RandRotateZ(); - } - else - { - //convert chosen torsion to 3D positions - spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); - } + if(oldMol.RotateBB()) + { + //we only perform rotation around z axis + RandRotateZ(); + } + else + { + //convert chosen torsion to 3D positions + spin = RotationMatrix::UniformRandom(prng(), prng(), prng()); + } - for (uint a = 0; a < atomNumber; ++a) - { - if(oldMol.RotateBB()) - { - XYZ coord = multiPosRotions[a][index]; - //transform backbone to z axis - coord = geom::Transform(invMatrix, coord); - //rotate around z - coord = geom::Transform(rotateMatrix, coord); - //transfer backbone to cavity orientation - coord = oldMol.Transform(coord); - multiPosRotions[a].Set(index + r, coord); - } - else - { - //find positions - multiPosRotions[a].Set(index + r, - spin.Apply(multiPosRotions[a][index])); - } - multiPosRotions[a].Add(index + r, center); - } + for (uint a = 0; a < atomNumber; ++a) + { + if(oldMol.RotateBB()) + { + XYZ coord = multiPosRotions[a][index]; + //transform backbone to z axis + coord = geom::Transform(invMatrix, coord); + //rotate around z + coord = geom::Transform(rotateMatrix, coord); + //transfer backbone to cavity orientation + coord = oldMol.Transform(coord); + multiPosRotions[a].Set(index + r, coord); + } + else + { + //find positions + multiPosRotions[a].Set(index + r, + spin.Apply(multiPosRotions[a][index])); + } + multiPosRotions[a].Add(index + r, center); + } } //Pick a new position for COM and transfer the molecule @@ -357,8 +362,8 @@ namespace cbmc { multiPosRotions[a].Add(0, orgCenter); data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); - calc.ParticleInter(inter, real, multiPosRotions[a], a, - molIndex, oldMol.GetBox(), totalTrials); + calc.ParticleInter(inter, real, multiPosRotions[a], overlap, a, + molIndex, oldMol.GetBox(), totalTrials); } double stepWeight = 0.0; @@ -371,7 +376,8 @@ namespace cbmc { oldMol.AddAtom(a, multiPosRotions[a][0]); } - + + oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.MultWeight(stepWeight / totalTrials); } diff --git a/src/cbmc/DCSingle.cpp b/src/cbmc/DCSingle.cpp index 992c67e6d..72359b728 100644 --- a/src/cbmc/DCSingle.cpp +++ b/src/cbmc/DCSingle.cpp @@ -29,10 +29,12 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) uint nLJTrials = data->nLJTrialsFirst; double* inter = data->inter; double* real = data->real; + bool* overlap = data->overlap; double stepWeight = 0; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); if(oldMol.COMFix()) { nLJTrials = 1; @@ -40,13 +42,14 @@ void DCSingle::BuildOld(TrialMol& oldMol, uint molIndex) prng.FillWithRandom(positions, nLJTrials, data->axes, oldMol.GetBox()); } positions.Set(0, data->axes.WrapPBC(oldMol.AtomPosition(atom), oldMol.GetBox())); - data->calc.ParticleInter(inter, real, positions, atom, molIndex, + data->calc.ParticleInter(inter, real, positions, overlap, atom, molIndex, oldMol.GetBox(), nLJTrials); for (uint trial = 0; trial < nLJTrials; ++trial) { stepWeight += exp(-1 * data->ff.beta * (inter[trial] + real[trial])); } + oldMol.UpdateOverlap(overlap[0]); oldMol.MultWeight(stepWeight / nLJTrials); oldMol.AddEnergy(Energy(0.0, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); @@ -61,10 +64,12 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) double* inter = data->inter; double* real = data->real; double* ljWeights = data->ljWeights; + bool* overlap = data->overlap; std::fill_n(inter, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); if(newMol.COMFix()) { nLJTrials = 1; @@ -72,7 +77,7 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) } else { prng.FillWithRandom(positions, nLJTrials, data->axes, newMol.GetBox()); } - data->calc.ParticleInter(inter, real, positions, atom, molIndex, + data->calc.ParticleInter(inter, real, positions, overlap, atom, molIndex, newMol.GetBox(), nLJTrials); double stepWeight = 0; @@ -82,6 +87,7 @@ void DCSingle::BuildNew(TrialMol& newMol, uint molIndex) stepWeight += ljWeights[trial]; } uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.UpdateOverlap(overlap[winner]); newMol.MultWeight(stepWeight / nLJTrials); newMol.AddEnergy(Energy(0.0, 0.0, inter[winner], real[winner], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 2280abfff..203cd5eaa 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -34,6 +34,7 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, comInCav = false; comFix = false; rotateBB = false; + overlap = false; cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); cavMatrix.Set(2, 0.0, 0.0, 1.0); @@ -41,7 +42,8 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, TrialMol::TrialMol() : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL), - comInCav(false), comFix(false), rotateBB(false), cavMatrix(3) + comInCav(false), comFix(false), rotateBB(false), overlap(false), + cavMatrix(3) { cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -59,6 +61,7 @@ TrialMol::TrialMol(const TrialMol& other) : comInCav = false; comFix = false; rotateBB = false; + overlap = false; cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); cavMatrix.Set(2, 0.0, 0.0, 1.0); @@ -88,6 +91,8 @@ void swap(TrialMol& a, TrialMol& b) b.comFix = false; a.rotateBB = false; b.rotateBB = false; + a.overlap = false; + b.overlap = false; a.cavMatrix.Set(0, 1.0, 0.0, 0.0); a.cavMatrix.Set(1, 0.0, 1.0, 0.0); a.cavMatrix.Set(2, 0.0, 0.0, 1.0); @@ -117,11 +122,6 @@ void TrialMol::ConfirmOldAtom(uint i) atomBuilt[i] = true; } -void TrialMol::UnConfirmOldAtom(uint i) -{ - atomBuilt[i] = false; -} - //!Returns rectangular coordinates of an addition //!Determines coordinates with respect to current basis XYZ TrialMol::GetRectCoords(double bond, double theta, double phi) const diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 0a2b5714d..8f8aafab9 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -52,9 +52,6 @@ class TrialMol //!Confirms that atom at index i has been built (used for oldMols) void ConfirmOldAtom(uint i); - //!UnConfirms that atom at index i has been built (used for oldMols) - void UnConfirmOldAtom(uint i); - //!Sets an orthonormal basis for coordinate conversion. /*!\param p1 Index of particle new additions will be bonded to * \param p2 Index of particle that will be in angles with new additions @@ -167,6 +164,16 @@ class TrialMol return atomBuilt[index]; } + void UpdateOverlap(const bool state) + { + overlap |= state; + } + + bool HasOverlap() const + { + return overlap; + } + //Used in MEMC move void SetSeed(const XYZ& coords, const XYZ& cav, const bool inCav, const bool fixCOM, const bool rotBB); @@ -202,6 +209,7 @@ class TrialMol XYZ cavityCenter, cavity; //The center and cavity dimensions uint backbone[2]; bool comInCav, comFix, rotateBB; + bool overlap; bool* atomBuilt; }; From 5bb955df1ef7b4bc7c88601e4d20df3c73367abd Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 14 Aug 2018 15:35:09 -0400 Subject: [PATCH 105/199] Fix the reciprocal energy when move was rejected due to overlap. Issue #86 --- src/CrankShaft.h | 3 ++- src/IntraSwap.h | 3 ++- src/MoleculeExchange1.h | 2 -- src/MoleculeTransfer.h | 4 ++-- src/Regrowth.h | 2 +- src/Rotation.h | 8 +++++--- src/Translate.h | 8 +++++--- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index dfd1438a0..6444d5da4 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -168,8 +168,9 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) //when weight is 0, MolDestSwap() will not be executed, thus cos/sin //molRef will not be changed. Also since no memcpy, doing restore //results in memory overwrite - if (newMol.GetWeight() != 0.0) + if (newMol.GetWeight() != 0.0 && !overlap) { calcEwald->RestoreMol(molIndex); + } } } else //else we didn't even try because we knew it would fail result = false; diff --git a/src/IntraSwap.h b/src/IntraSwap.h index f153f149d..5c67abcc8 100644 --- a/src/IntraSwap.h +++ b/src/IntraSwap.h @@ -168,8 +168,9 @@ inline void IntraSwap::Accept(const uint rejectState, const uint step) //when weight is 0, MolDestSwap() will not be executed, thus cos/sin //molRef will not be changed. Also since no memcpy, doing restore //results in memory overwrite - if (newMol.GetWeight() != 0.0) + if (newMol.GetWeight() != 0.0 && !overlap) { calcEwald->RestoreMol(molIndex); + } } } else //else we didn't even try because we knew it would fail result = false; diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 519f41491..6ef522e95 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -751,9 +751,7 @@ inline void MoleculeExchange1::Accept(const uint rejectState, const uint step) for (uint b = 0; b < BOX_TOTAL; b++) { calcEwald->UpdateRecip(b); } - //molA and molB already transfered to destBox and added to cellist - //Retotal sysPotRef.Total(); } else { diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index e11ebe80a..d37ff8137 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -227,9 +227,9 @@ inline void MoleculeTransfer::Accept(const uint rejectState, const uint step) //when weight is 0, MolDestSwap() will not be executed, thus cos/sin //molRef will not be changed. Also since no memcpy, doing restore //results in memory overwrite - if (newMol.GetWeight() != 0.0) + if (newMol.GetWeight() != 0.0 && !overlap) { calcEwald->RestoreMol(molIndex); - + } } } else //we didn't even try because we knew it would fail diff --git a/src/Regrowth.h b/src/Regrowth.h index 451223537..73f1931fe 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -164,7 +164,7 @@ inline void Regrowth::Accept(const uint rejectState, const uint step) //when weight is 0, MolDestSwap() will not be executed, thus cos/sin //molRef will not be changed. Also since no memcpy, doing restore //results in memory overwrite - if (newMol.GetWeight() != 0.0) + if(newMol.GetWeight() != 0.0 && !overlap) calcEwald->RestoreMol(molIndex); } } else //else we didn't even try because we knew it would fail diff --git a/src/Rotation.h b/src/Rotation.h index 95c523cc7..3412dcbd4 100644 --- a/src/Rotation.h +++ b/src/Rotation.h @@ -60,8 +60,10 @@ inline void Rotate::CalcEn() //calculate LJ interaction and real term of electrostatic interaction overlap = calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); - //calculate reciprocate term of electrostatic interaction - recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); + if(!overlap) { + //calculate reciprocate term of electrostatic interaction + recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); + } } inline void Rotate::Accept(const uint rejectState, const uint step) @@ -93,7 +95,7 @@ inline void Rotate::Accept(const uint rejectState, const uint step) if(molRemoved) { // It means that Recip energy is calculated and move not accepted - if(!result) { + if(!result && !overlap) { calcEwald->RestoreMol(m); } diff --git a/src/Translate.h b/src/Translate.h index abcba4b3e..2eb7dc759 100644 --- a/src/Translate.h +++ b/src/Translate.h @@ -68,8 +68,10 @@ inline void Translate::CalcEn() //calculate LJ interaction and real term of electrostatic interaction overlap = calcEnRef.MoleculeInter(inter_LJ, inter_Real, newMolPos, m, b); - //calculate reciprocate term of electrostatic interaction - recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); + if(!overlap) { + //calculate reciprocate term of electrostatic interaction + recip.energy = calcEwald->MolReciprocal(newMolPos, m, b); + } } inline void Translate::Accept(const uint rejectState, const uint step) @@ -101,7 +103,7 @@ inline void Translate::Accept(const uint rejectState, const uint step) if(molRemoved) { // It means that Recip energy is calculated and move not accepted - if(!result) { + if(!result && !overlap) { calcEwald->RestoreMol(m); } cellList.AddMol(m, b, coordCurrRef); From f7a4b3036a90634937eb27e80205edf22722ae09 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 21 Aug 2018 15:46:11 -0400 Subject: [PATCH 106/199] Add FloydWarshal to detect atoms in ring, Print error message if bonds in PDB files are different from Parameter file. --- CMake/FileLists.cmake | 6 +- CMake/GOMCCPUSetup.cmake | 8 +- CMake/GOMCCUDASetup.cmake | 8 +- lib/FloydWarshallCycle.cpp | 245 +++++++++++++++++++++++++++++++++++++ lib/FloydWarshallCycle.h | 74 +++++++++++ src/CalculateEnergy.cpp | 16 ++- src/CalculateEnergy.h | 2 +- 7 files changed, 346 insertions(+), 13 deletions(-) create mode 100644 lib/FloydWarshallCycle.cpp create mode 100644 lib/FloydWarshallCycle.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 4f975bfcd..d3142157e 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -151,7 +151,11 @@ set(libHeaders lib/NumLib.h lib/StrLib.h lib/StrStrmLib.h - lib/VectorLib.h) + lib/VectorLib.h + lib/FloydWarshallCycle.h) + +set(libSources + lib/FloydWarshallCycle.cpp) set(cudaHeaders src/GPU/ConstantDefinitionsCUDAKernel.cuh diff --git a/CMake/GOMCCPUSetup.cmake b/CMake/GOMCCPUSetup.cmake index 56a0fa03b..e96e5d38a 100644 --- a/CMake/GOMCCPUSetup.cmake +++ b/CMake/GOMCCPUSetup.cmake @@ -1,5 +1,5 @@ if(ENSEMBLE_NVT) - add_executable(NVT ${sources} ${headers} ${libHeaders}) + add_executable(NVT ${sources} ${headers} ${libHeaders} ${libSources}) set_target_properties(NVT PROPERTIES OUTPUT_NAME ${NVT_name} COMPILE_FLAGS "${NVT_flags}") @@ -10,7 +10,7 @@ if(ENSEMBLE_NVT) endif() if(ENSEMBLE_GEMC) - add_executable(GEMC ${sources} ${headers} ${libHeaders}) + add_executable(GEMC ${sources} ${headers} ${libHeaders} ${libSources}) set_target_properties(GEMC PROPERTIES OUTPUT_NAME ${GE_name} COMPILE_FLAGS "${GE_flags}") @@ -21,7 +21,7 @@ if(ENSEMBLE_GEMC) endif() if(ENSEMBLE_GCMC) - add_executable(GCMC ${sources} ${headers} ${libHeaders}) + add_executable(GCMC ${sources} ${headers} ${libHeaders} ${libSources}) set_target_properties(GCMC PROPERTIES OUTPUT_NAME ${GC_name} COMPILE_FLAGS "${GC_flags}") @@ -32,7 +32,7 @@ if(ENSEMBLE_GCMC) endif() if(ENSEMBLE_NPT) - add_executable(NPT ${sources} ${headers} ${libHeaders}) + add_executable(NPT ${sources} ${headers} ${libHeaders} ${libSources}) set_target_properties(NPT PROPERTIES OUTPUT_NAME ${NPT_name} COMPILE_FLAGS "${NPT_flags}") diff --git a/CMake/GOMCCUDASetup.cmake b/CMake/GOMCCUDASetup.cmake index 2ac9d3a4c..b07de57c9 100644 --- a/CMake/GOMCCUDASetup.cmake +++ b/CMake/GOMCCUDASetup.cmake @@ -21,7 +21,7 @@ set(GPU_NVT_name "GOMC_GPU_NVT") ##################################### if(ENSEMBLE_GPU_NVT) cuda_add_executable(GPU_NVT ${cudaSources} ${cudaHeaders} - ${sources} ${headers} ${libHeaders}) + ${sources} ${headers} ${libHeaders} ${libSources}) set_target_properties(GPU_NVT PROPERTIES OUTPUT_NAME ${GPU_NVT_name} COMPILE_FLAGS "${GPU_NVT_flags}") @@ -33,7 +33,7 @@ endif() if(ENSEMBLE_GPU_GEMC) cuda_add_executable(GPU_GEMC ${cudaSources} ${cudaHeaders} ${sources} - ${headers} ${libHeaders}) + ${headers} ${libHeaders} ${libSources}) set_target_properties(GPU_GEMC PROPERTIES OUTPUT_NAME ${GPU_GE_name} COMPILE_FLAGS "${GPU_GE_flags}") @@ -45,7 +45,7 @@ endif() if(ENSEMBLE_GPU_GCMC) cuda_add_executable(GPU_GCMC ${cudaSources} ${cudaHeaders} ${sources} - ${headers} ${libHeaders}) + ${headers} ${libHeaders} ${libSources}) set_target_properties(GPU_GCMC PROPERTIES OUTPUT_NAME ${GPU_GC_name} COMPILE_FLAGS "${GPU_GC_flags}") @@ -57,7 +57,7 @@ endif() if(ENSEMBLE_GPU_NPT) cuda_add_executable(GPU_NPT ${cudaSources} ${cudaHeaders} ${sources} - ${headers} ${libHeaders}) + ${headers} ${libHeaders} ${libSources}) set_target_properties(GPU_NPT PROPERTIES OUTPUT_NAME ${GPU_NPT_name} COMPILE_FLAGS "${GPU_NPT_flags}") diff --git a/lib/FloydWarshallCycle.cpp b/lib/FloydWarshallCycle.cpp new file mode 100644 index 000000000..df4c28dd8 --- /dev/null +++ b/lib/FloydWarshallCycle.cpp @@ -0,0 +1,245 @@ +#include "FloydWarshallCycle.h" + +FloydWarshallCycle::FloydWarshallCycle(int non) +{ + // let's check couple of things before we start + // number of nodes probably greater than zero + assert(non > 0); + + // Store the size of the graph in numberOfNodes + numberOfNodes = non; + + // Resize both graph and next vectors to the size of N*N + graph.resize(numberOfNodes); + for (int i = 0; i < numberOfNodes; i++) + graph[i].resize(numberOfNodes); + next.resize(numberOfNodes); + for (int i = 0; i < numberOfNodes; i++) + next[i].resize(numberOfNodes); + + // double check + assert(graph.size() == numberOfNodes); +} + + +FloydWarshallCycle::~FloydWarshallCycle() +{ +} + +void FloydWarshallCycle::AddEdge(int src, int dest) +{ + // make sure src and dest are not something crazy! + assert(src >= 0); + assert(dest >= 0); + + std::vector temp; + temp.push_back(src); + temp.push_back(dest); + connections.push_back(temp); +} + +std::vector FloydWarshallCycle::GetShortestCycle(int src) +{ + // check src value + assert(src >= 0); + + std::vector< std::vector > paths; + std::vector allEdgesIncludingSrc = getConnectionsFor(src); + for (int i = 0; i < allEdgesIncludingSrc.size(); i++) { + setDefaults(); + setValues(allEdgesIncludingSrc[i]); + floydWarshall(); + paths.push_back(getPath(allEdgesIncludingSrc[i])); + } + return findMinimumPath(paths); +} + +std::vector< std::vector > FloydWarshallCycle::GetAllUniqueCycles() +{ + // check number of nodes + assert(numberOfNodes >= 0); + + std::vector< std::vector > allCycles; + for (int i = 0; i < numberOfNodes; i++) { + allCycles.push_back(GetShortestCycle(i)); + } + return getUniqueVectors(allCycles); +} + +std::vector< std::vector > FloydWarshallCycle::GetAllUniqueCyclesAndCommonCycles() +{ + std::vector< std::vector > uniqueCycles = GetAllUniqueCycles(); + std::vector< std::vector > commons; + int len = uniqueCycles.size(); + bool *visited = new bool[len]; + for (int i = 0; i < len; i++) { + visited[i] = false; + } + for (int i = 0; i < len-1; i++) { + std::vector combined(uniqueCycles[i]); + bool didCombine = false; + if (!visited[i]) { + visited[i] = true; + for (int j = i; j < len; j++) { + if (haveCommonElements(combined, uniqueCycles[j])) { + combined = returnCombinedSet(combined, uniqueCycles[j]); + didCombine = true; + } + } + } + if (didCombine) + commons.push_back(combined); + } + + delete[] visited; + uniqueCycles.insert(uniqueCycles.end(), commons.begin(), commons.end()); + return uniqueCycles; +} + +void FloydWarshallCycle::floydWarshall() +{ + for (int k = 0; k < numberOfNodes; k++) { + for (int i = 0; i < numberOfNodes; i++) { + for (int j = 0; j < numberOfNodes; j++) { + if (graph[i][j]>graph[i][k] + graph[k][j]) { + graph[i][j] = graph[i][k] + graph[k][j]; + next[i][j] = next[i][k]; + } + } + } + } +} + +std::vector FloydWarshallCycle::getPath(int src, int dest) +{ + // check input + assert(src >= 0); + assert(dest >= 0); + + std::vector path; + if (next[src][dest] == -1) + return path; + path.push_back(src); + while (src != dest) { + src = next[src][dest]; + path.push_back(src); + } + return path; +} + +std::vector FloydWarshallCycle::getPath(int connectionIndex) +{ + int src = connections[connectionIndex][0]; + int dest = connections[connectionIndex][1]; + std::vector path; + if (next[src][dest] == -1) + return path; + path.push_back(src); + while (src != dest) { + src = next[src][dest]; + path.push_back(src); + } + return path; +} + +void FloydWarshallCycle::setDefaults() +{ + for (int i = 0; i < numberOfNodes; i++) + for (int j = 0; j < numberOfNodes; j++) { + graph[i][j] = 10000; + next[i][j] = -1; + } +} + +void FloydWarshallCycle::setValues(int exceptThisOne) +{ + for (int j = 0; j < connections.size(); j++) { + if (exceptThisOne != j) { + int zero = connections[j][0]; + int one = connections[j][1]; + graph[zero][one] = 1; + graph[one][zero] = 1; + next[zero][one] = one; + next[one][zero] = zero; + } + } +} + +std::vector FloydWarshallCycle::getConnectionsFor(int index) +{ + std::vector conn; + for (int i = 0; i < connections.size(); i++) { + if (connections[i][0] == index || connections[i][1] == index) + conn.push_back(i); + } + return conn; +} + +std::vector FloydWarshallCycle::findMinimumPath(std::vector< std::vector > paths) +{ + int min = 10000; + std::vector shortest; + for (int i = 0; i < paths.size(); i++) { + if (paths[i].size() != 0 && paths[i].size() < min) { + min = paths[i].size(); + shortest = paths[i]; + } + } + return shortest; +} + +std::vector< std::vector > FloydWarshallCycle::getUniqueVectors(std::vector< std::vector > allCycles) +{ + int j; + std::vector< std::vector > uniqueCycles; + for (int i = 0; i < allCycles.size(); i++) { + std::sort(allCycles[i].begin(), allCycles[i].end()); + } + for (int i = 0; i < allCycles.size(); i++) { + if (uniqueCycles.size() == 0) { + uniqueCycles.push_back(allCycles[i]); + } + else { + for (j = 0; j < uniqueCycles.size(); j++) + if (isVectorsEqual(uniqueCycles[j], allCycles[i])) + break; + if (j == uniqueCycles.size()) { + uniqueCycles.push_back(allCycles[i]); + } + } + } + return uniqueCycles; +} + +bool FloydWarshallCycle::isVectorsEqual(std::vector first, std::vector second) +{ + if (first.size() != second.size()) + return false; + for (int i = 0; i < first.size(); i++) { + if (first[i] != second[i]) { + return false; + } + } + return true; +} + +bool FloydWarshallCycle::haveCommonElements(std::vector first, std::vector second) +{ + for (int i = 0; i < first.size(); i++) { + if (std::find(second.begin(), second.end(), first[i]) != second.end()) { + return true; + } + } + return false; +} + +std::vector FloydWarshallCycle::returnCombinedSet(std::vector first, std::vector second) +{ + std::vector ret(first); + for (int i = 0; i < second.size(); i++) { + if (std::find(ret.begin(), ret.end(), second[i]) == ret.end()) { + ret.push_back(second[i]); + } + } + return ret; +} diff --git a/lib/FloydWarshallCycle.h b/lib/FloydWarshallCycle.h new file mode 100644 index 000000000..6e7a3bd65 --- /dev/null +++ b/lib/FloydWarshallCycle.h @@ -0,0 +1,74 @@ +#pragma once +#include +#include +#include + +class FloydWarshallCycle +{ +public: + // In constructor you have to mention the number of nodes + FloydWarshallCycle(int numberOfNodes); + ~FloydWarshallCycle(); + + // You can add more edges to the graph by calling this function + // src and dest doesn't matter and you can add the nodes by any order i.e. (i, j) == (j, i) + void AddEdge(int src, int dest); + + // Get the shortest path for specific node + std::vector GetShortestCycle(int src); + + std::vector< std::vector > GetAllUniqueCycles(); + + std::vector< std::vector > GetAllUniqueCyclesAndCommonCycles(); + +private: + // Number of nodes + int numberOfNodes; + + // This vector will hold the edges as a 2D array. Each edge will be a 2 element vector -> (src, dest) + std::vector< std::vector > connections; + + // This vector will hold the weights of the edges. + // We assume every connection has a weight of 1 + // So by running Floyd Warshall on this graph the shortest path + // will be equal to number of edges + std::vector< std::vector > graph; + + // This vector will hold the next jump for a shortest path + // This vector is required to get the full path + std::vector< std::vector > next; + + // Run the Floyd-Warshall algorithm + void floydWarshall(); + + // Get the full path after running Floyd-Warshall algorithm + // You need a source and destination + // Or simply by giving the connections index + std::vector getPath(int src, int dest); + std::vector getPath(int connectionIndex); + + // Set everything to default values + void setDefaults(); + + // Set the values for every edges except index + void setValues(int exceptThisOne); + + // Return all connections including an index + std::vector getConnectionsFor(int index); + + // Find the minimum of 2D array and return the shortest path + std::vector findMinimumPath(std::vector< std::vector > paths); + + // Find the unique cycles + std::vector< std::vector > getUniqueVectors(std::vector< std::vector > allCycles); + + // Compare two vectors + bool isVectorsEqual(std::vector first, std::vector second); + + // See if two vectors have common elements + bool haveCommonElements(std::vector first, std::vector second); + + // Return the combined set + std::vector returnCombinedSet(std::vector first, std::vector second); +}; + diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index bc0704a11..7b16a812b 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -621,7 +621,7 @@ void CalculateEnergy::MoleculeIntra(const uint molIndex, XYZArray bondVec(molKind.bondList.count * 2); BondVectors(bondVec, molKind, molIndex, box); - MolBond(bondEn[0], molKind, bondVec, box); + MolBond(bondEn[0], molKind, bondVec, molIndex, box); MolAngle(bondEn[0], molKind, bondVec, box); MolDihedral(bondEn[0], molKind, bondVec, box); MolNonbond(bondEn[1], molKind, molIndex, box); @@ -693,14 +693,24 @@ void CalculateEnergy::BondVectors(XYZArray & vecs, void CalculateEnergy::MolBond(double & energy, MoleculeKind const& molKind, XYZArray const& vecs, + const uint molIndex, const uint box) const { if (box >= BOXES_WITH_U_B) return; for (uint b = 0; b < molKind.bondList.count; ++b) { - energy += forcefield.bonds.Calc(molKind.bondList.kinds[b], - vecs.Get(b).Length()); + double molLength = vecs.Get(b).Length(); + double eqLength = forcefield.bonds.Length(molKind.bondList.kinds[b]); + energy += forcefield.bonds.Calc(molKind.bondList.kinds[b], molLength); + if(abs(molLength - eqLength) > 0.02) { + uint p1 = molKind.bondList.part1[b]; + uint p2 = molKind.bondList.part2[b]; + printf("Warning: Box %d, %d %s ,", box, molIndex, molKind.name.c_str()); + printf("Bond %s-%s: In Par. file ", molKind.atomNames[p1].c_str(), + molKind.atomNames[p2].c_str()); + printf("%2.3f A, in PDB file %2.3f A!\n", eqLength, molLength); + } } } diff --git a/src/CalculateEnergy.h b/src/CalculateEnergy.h index 874d944dc..ebc8ca127 100644 --- a/src/CalculateEnergy.h +++ b/src/CalculateEnergy.h @@ -179,7 +179,7 @@ class CalculateEnergy //! Calculates bond stretch intramolecular energy of a full molecule void MolBond(double & energy, MoleculeKind const& molKind, - XYZArray const& vecs, const uint box) const; + XYZArray const& vecs, const uint molIndex, const uint box) const; //! Calculates bond stretch intramolecular energy of a non-complete molecule void MolBond(double & energy, cbmc::TrialMol const &mol, XYZArray const& vecs, From 4226e008812f4d3a7f04310ae53575ce00d58e92 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 22 Aug 2018 13:08:03 -0400 Subject: [PATCH 107/199] Start developing the DCCyclic class. Not completed. --- src/CBMC.cpp | 18 ++++---- src/cbmc/DCCyclic.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++ src/cbmc/DCCyclic.h | 87 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 10 deletions(-) create mode 100644 src/cbmc/DCCyclic.cpp create mode 100644 src/cbmc/DCCyclic.h diff --git a/src/CBMC.cpp b/src/CBMC.cpp index fa82323d2..c332e3532 100644 --- a/src/CBMC.cpp +++ b/src/CBMC.cpp @@ -9,6 +9,7 @@ along with this program, also can be found at . #include "MolSetup.h" #include "DCLinear.h" #include "DCGraph.h" +#include "DCCyclic.h" #include @@ -18,22 +19,19 @@ namespace cbmc CBMC* MakeCBMC(System& sys, const Forcefield& ff, const MoleculeKind& kind, const Setup& set) { - /* + std::vector bondCount(kind.NumAtoms(), 0); for (uint i = 0; i < kind.bondList.count; ++i) { bondCount[kind.bondList.part1[i]]++; bondCount[kind.bondList.part2[i]]++; } - bool branched = false; - for (uint i = 0; i < kind.NumAtoms(); ++i) { - if (bondCount[i] > 2) - branched = true; - } - bool cyclic = (kind.NumBonds() > kind.NumAtoms() - 1) ? true : false; - */ -//Any molecule woth 3 atoms and more will be built in DCGraph - if (kind.NumAtoms() > 2) { + bool cyclic = (kind.NumBonds() > kind.NumAtoms() - 1) ? true : false; + + if(cyclic) { + return new DCCyclic(sys, ff, kind, set); + } else if (kind.NumAtoms() > 2) { + //Any molecule woth 3 atoms and more will be built in DCGraph return new DCGraph(sys, ff, kind, set); } else { return new DCLinear(sys, ff, kind, set); diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp new file mode 100644 index 000000000..30dd55f3f --- /dev/null +++ b/src/cbmc/DCCyclic.cpp @@ -0,0 +1,97 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include "DCCyclic.h" +#include "DCFreeHedron.h" +#include "DCLinkedHedron.h" +#include "DCFreeHedronSeed.h" +#include "DCFreeCycle.h" +#include "DCLinkedCycle.h" +#include "DCCloseCycle.h" +#include "DCFreeCycleSeed.h" +#include "DCRotateCOM.h" +#include "DCCrankShaftDih.h" +#include "DCCrankShaftAng.h" +#include "FloydWarshallCycle.h" +#include +#include + +namespace cbmc +{ +DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, + const MoleculeKind& kind, const Setup& set) + : data(sys, ff, set) +{ + using namespace mol_setup; + MolMap::const_iterator it = set.mol.kindMap.find(kind.name); + assert(it != set.mol.kindMap.end()); + const MolKind setupKind = it->second; + + idExchange = new DCRotateCOM(&data, setupKind); + + std::vector atomToNode(setupKind.atoms.size(), 0); + std::vector bondCount(setupKind.atoms.size(), 0); + FloydWarshallCycle fwc(setupKind.atoms.size()); + //Count the number of bonds for each atom + for (uint b = 0; b < setupKind.bonds.size(); ++b) { + const Bond& bond = setupKind.bonds[b]; + ++bondCount[bond.a0]; + ++bondCount[bond.a1]; + fwc.AddEdge(bond.a0, bond.a1); + } + cyclicAtom = fwc.GetAllUniqueCyclesAndCommonCycles(); + + //Find the node (number of bound > 1) + //Construct the starting node (DCFreeHedron or DCFreeCycle) + //Construct the Linking node (DCLinkHedron or DCLinkedCycle) + for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { + if (bondCount[atom] < 2) { + atomToNode[atom] = -1; + } else { + //Get the information of other Atoms that are bonded to the atom + std::vector bonds = AtomBonds(setupKind, atom); + atomToNode[atom] = nodes.size(); + //Add atom to the node list and initialize it with DCFreeHedron, atom and + // the first partner of the atom + nodes.push_back(Node()); + Node& node = nodes.back(); + //Atoms bonded to atom will be build from focus (atom) in random loc. + node.starting = new DCFreeHedron(&data, setupKind, atom, + bonds[0].a1); + //Atoms bonded to atom will be build from focus (atom) in specified loc. + node.restarting = new DCFreeHedronSeed(&data, setupKind, atom, + bonds[0].a1); + //set the atom index of the node + node.atomIndex = atom; + //Loop through all the bonds + for (uint i = 0; i < bonds.size(); ++i) { + uint partner = bonds[i].a1; + //Store partner index for each node + node.partnerIndex.push_back(partner); + if(bondCount[partner] == 1) { + continue; + } + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle + //Atoms will be build from prev(atom) to focus (partner) + Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner, + atom)); + node.edges.push_back(e); + } + } + } + + //reassign destination values from atom indices to node indices + for (uint i = 0; i < nodes.size(); ++i) { + for (uint j = 0; j < nodes[i].edges.size(); ++j) { + uint& dest = nodes[i].edges[j].destination; + dest = atomToNode[dest]; + assert(dest != -1); + } + } + + //InitCrankShaft(setupKind); +} \ No newline at end of file diff --git a/src/cbmc/DCCyclic.h b/src/cbmc/DCCyclic.h new file mode 100644 index 000000000..712f2387f --- /dev/null +++ b/src/cbmc/DCCyclic.h @@ -0,0 +1,87 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCCYCLIC_H +#define DCCYCLIC_H +#include "CBMC.h" +#include "DCComponent.h" +#include "DCData.h" +#include "MolSetup.h" +#include "Setup.h" +#include "MoleculeKind.h" +#include +#include + +/*CBMC forcyclic molecule +* The Decoupled/Coupled CBMC algorithm is represented by +* traversing a spanning tree of the graph. +* body of the ring is keep rigid during the move. +*/ + +namespace cbmc +{ + +class DCComponent; + +class DCCyclic : public CBMC +{ +public: + DCCyclic(System& sys, const Forcefield& ff, + const MoleculeKind& kind, const Setup& set); + + void Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex); + void BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, + const uint current); + void BuildIDNew(TrialMol& newMol, uint molIndex); + void BuildIDOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildGrowNew(TrialMol& newMol, uint molIndex); + void BuildGrowOld(TrialMol& oldMol, uint molIndex); + ~DCCyclic(); + +private: + //Find the two nodes that are forming dihedral or angle and initialize it. + void InitCrankShaft(const mol_setup::MolKind& kind); + //Store edge's atom that are connected to node and has more than 1 bond + //Each edge is a node as well + struct Edge { + uint destination; //destination is partner node index. + //When ring is not completed + DCComponent* connect; + //Acting on last two nodes of the ring to close the ring + DCComponent* closure; + Edge(uint d, DCComponent* c) : destination(d), connect(c), closure(c) {} + }; + + //Store the branching atom and all Atoms that are connected to this + //branching atom + struct Node { + uint atomIndex; + //starting will be initialized with DCFreeCycle or DCFreeHedron using random loc + DCComponent *starting; + //starting will be initialized with DCFreeCycleSeed or DCFreeHedronSeed, using specify seed + DCComponent *restarting; + //all the atom that are connected to this node and has more than 1 bond + //will be in edges and initialized with DCLinkedCycle or DCLinkedHedron + std::vector edges; + std::vector partnerIndex; + }; + + DCComponent *idExchange; + DCData data; + bool hasCrankShaft; + std::vector nodes; + std::vector fringe; + std::vector visited; + std::vector shaftNodesDih, shaftNodesAng; + std::vector< std::vector > cyclicAtom; +}; +} + +#endif \ No newline at end of file From 47793e2d719c3b72408eea5bfa4b6c4be4070ac8 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 23 Aug 2018 16:18:11 -0400 Subject: [PATCH 108/199] Continue adding functions to the DCCyclic class. Add DCFreeCycle.h and DCFreeCycle.cpp files. Not completed. --- CMake/FileLists.cmake | 2 + src/cbmc/DCCyclic.cpp | 241 ++++++++++++++++++++++++++++++++++--- src/cbmc/DCCyclic.h | 12 +- src/cbmc/DCFreeCycle.cpp | 252 +++++++++++++++++++++++++++++++++++++++ src/cbmc/DCFreeCycle.h | 60 ++++++++++ src/cbmc/DCGraph.cpp | 15 ++- 6 files changed, 556 insertions(+), 26 deletions(-) create mode 100644 src/cbmc/DCFreeCycle.cpp create mode 100644 src/cbmc/DCFreeCycle.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index d3142157e..2a076be79 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -40,6 +40,7 @@ set(sources src/cbmc/DCCrankShaftAng.cpp src/cbmc/DCCrankShaftDih.cpp src/cbmc/DCGraph.cpp + src/cbmc/DCFreeCycle.cpp src/cbmc/DCFreeHedron.cpp src/cbmc/DCFreeHedronSeed.cpp src/cbmc/DCLinkedHedron.cpp @@ -133,6 +134,7 @@ set(headers src/cbmc/DCCrankShaftAng.h src/cbmc/DCCrankShaftDih.h src/cbmc/DCData.h + src/cbmc/DCFreeCycle.h src/cbmc/DCFreeHedron.h src/cbmc/DCFreeHedronSeed.h src/cbmc/DCLinkedHedron.h diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 30dd55f3f..48ef93d25 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -21,8 +21,8 @@ along with this program, also can be found at . namespace cbmc { -DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, - const MoleculeKind& kind, const Setup& set) +DCCyclic::DCCyclic(System& sys, const Forcefield& ff, + const MoleculeKind& kind, const Setup& set) : data(sys, ff, set) { using namespace mol_setup; @@ -34,6 +34,8 @@ DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, std::vector atomToNode(setupKind.atoms.size(), 0); std::vector bondCount(setupKind.atoms.size(), 0); + isRing.resize(setupKind.atoms.size(), false); + ringIdx.resize(setupKind.atoms.size(), -1); FloydWarshallCycle fwc(setupKind.atoms.size()); //Count the number of bonds for each atom for (uint b = 0; b < setupKind.bonds.size(); ++b) { @@ -42,14 +44,16 @@ DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, ++bondCount[bond.a1]; fwc.AddEdge(bond.a0, bond.a1); } - cyclicAtom = fwc.GetAllUniqueCyclesAndCommonCycles(); + cyclicAtoms = fwc.GetAllUniqueCyclesAndCommonCycles(); //Find the node (number of bound > 1) //Construct the starting node (DCFreeHedron or DCFreeCycle) - //Construct the Linking node (DCLinkHedron or DCLinkedCycle) + //Construct the Linking node (DCLinkHedron or DCLinkedCycle or DCCloseCycle) for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { if (bondCount[atom] < 2) { atomToNode[atom] = -1; + isRing[atom] = false; + ringIdx[atom] = -1; } else { //Get the information of other Atoms that are bonded to the atom std::vector bonds = AtomBonds(setupKind, atom); @@ -58,12 +62,31 @@ DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, // the first partner of the atom nodes.push_back(Node()); Node& node = nodes.back(); - //Atoms bonded to atom will be build from focus (atom) in random loc. - node.starting = new DCFreeHedron(&data, setupKind, atom, - bonds[0].a1); - //Atoms bonded to atom will be build from focus (atom) in specified loc. - node.restarting = new DCFreeHedronSeed(&data, setupKind, atom, - bonds[0].a1); + for (uint i = 0; i < cyclicAtoms.size(); i++) { + if (std::find(cyclicAtoms[i].begin(), cyclicAtoms[i].end(), atom) + != cyclicAtoms[i].end()) { + isRing[atom] = true; + ringIdx[atom] = i; + break; + } + } + //Check if the node belong to a ring or not + if(isRing[atom]) { + //Atoms bonded to atom will be build from focus (atom) in random loc. + node.starting = new DCFreeCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], + atom, bonds[0].a1); + //Atoms bonded to atom will be build from focus (atom) in specified loc. + node.restarting = new DCFreeCycleSeed(&data, setupKind, cyclicAtoms[ringIdx[atom]], + atom, bonds[0].a1); + } else { + //Atoms bonded to atom will be build from focus (atom) in random loc. + node.starting = new DCFreeHedron(&data, setupKind, atom, + bonds[0].a1); + //Atoms bonded to atom will be build from focus (atom) in specified loc. + node.restarting = new DCFreeHedronSeed(&data, setupKind, atom, + bonds[0].a1); + } + //set the atom index of the node node.atomIndex = atom; //Loop through all the bonds @@ -74,11 +97,31 @@ DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, if(bondCount[partner] == 1) { continue; } - //Add partner to the edge list of node and initialize it with partner - //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle - //Atoms will be build from prev(atom) to focus (partner) - Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner, - atom)); + + //Check to see if the partner belongs to a ring or not + bool ring = false; + uint ringIndex = -1; + for (uint i = 0; i < cyclicAtoms.size(); i++) { + if (std::find(cyclicAtoms[i].begin(), cyclicAtoms[i].end(), partner) + != cyclicAtoms[i].end()) { + ring = true; + ringIndex = i; + break; + } + } + + if (ring) { + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle + //Atoms will be build from prev(atom) to focus(partner) + Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIndex], + partner,atom)); + } else { + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle + //Atoms will be build from prev(atom) to focus(partner) + Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner,atom)); + } node.edges.push_back(e); } } @@ -93,5 +136,171 @@ DCGraphDCCyclic::DCCyclic(System& sys, const Forcefield& ff, } } - //InitCrankShaft(setupKind); + InitCrankShaft(setupKind); +} + +void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) +{ + using namespace mol_setup; + using namespace std; + //Start with the atoms that form angles. + vector tempNodes = nodes; + vector visited(kind.atoms.size(), false); + + while(!tempNodes.empty()) { + //start from last node, find the atom index of the node + uint a0 = tempNodes.back().atomIndex; + //Find the angle that end with a0 + vector angles = AtomEndAngles(kind, a0); + while(!angles.empty()) { + //find the last atomindex in the angle + uint a1 = angles.back().a1; + uint a2 = angles.back().a2; + + if(!(visited[a0] && visited[a1] && visited[a2])) { + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a1-a2-x + vector tempAng = AtomMidEndAngles(kind, a2, a1); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint a = 0; a < angle.size(); a++) { + if(data.ff.angles->AngleFixed(angle[a].kind)) { + fixAngle = true; + } + } + //Check to see if atoms that are bonded to a1 belongs to same ring or not + bool sameRing = false; + if(isRing[a1]) { + //FInd the atoms that are bonded to a1 + vector bonds = AtomBonds(kind, a1); + for(uint b = 0; b < bonds.size(); b++) { + uint partner = bonds[b].a1; + if((partner == a0) || (partner == a2)) { + continue; + } + if(isRing[partner]) { + sameRing |= (ringIdx[a1] == ringIdx[partner]); + } + } + } + + //If there was no fix angles and atom a1 and any atom bonded to a1 are not + // in the same ring, we create DCCrankShaftAngle + if(!fixAngle && !sameRing) { + crankshaft.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + } + visited[a0] = true; + visited[a1] = true; + visited[a2] = true; + } + angles.pop_back(); + } + tempNodes.pop_back(); + } + + hasCrankShaft = (crankshaft.size() != 0); +} + +void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + if(!hasCrankShaft) { + //No crank shaft move means all angles are fixed. + //Instead we perform IntraSwap move + Build(oldMol, newMol, molIndex); + } else { + //Pick a random node pair + uint pick = data.prng.randIntExc(crankshaft.size()); + //Call DCCrankShaftAng and rotate a1 node around a0-a2 shaft + crankshaft[pick]->PrepareNew(newMol, molIndex); + crankshaft[pick]->BuildNew(newMol, molIndex); + crankshaft[pick]->PrepareOld(oldMol, molIndex); + crankshaft[pick]->BuildOld(oldMol, molIndex); + } +} + +void DCCyclic::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + BuildEdges(oldMol, newMol, molIndex, current); +} + +void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, + const uint cur) +{ + uint current = cur; + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while (!fringe.empty()) { + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } +} + +void DCCyclic::BuildIDNew(TrialMol& newMol, uint molIndex) +{ + idExchange->PrepareNew(newMol, molIndex); + idExchange->BuildNew(newMol, molIndex); +} + +void DCCyclic::BuildIDOld(TrialMol& oldMol, uint molIndex) +{ + idExchange->PrepareOld(oldMol, molIndex); + idExchange->BuildOld(oldMol, molIndex); +} + +DCCyclic::~DCCyclic() +{ + delete idExchange; + for(uint v = 0; v < nodes.size(); ++v) { + Node& node = nodes[v]; + delete node.starting; + delete node.restarting; + for(uint e = 0; e < node.edges.size(); ++ e) { + delete node.edges[e].connect; + } + } + + for(uint i = 0; i < crankshaft.size(); i++) { + delete crankshaft[i]; + } +} + + } \ No newline at end of file diff --git a/src/cbmc/DCCyclic.h b/src/cbmc/DCCyclic.h index 712f2387f..ba2506798 100644 --- a/src/cbmc/DCCyclic.h +++ b/src/cbmc/DCCyclic.h @@ -52,11 +52,9 @@ class DCCyclic : public CBMC //Each edge is a node as well struct Edge { uint destination; //destination is partner node index. - //When ring is not completed + //To build the next segment from prev-focus DCComponent* connect; - //Acting on last two nodes of the ring to close the ring - DCComponent* closure; - Edge(uint d, DCComponent* c) : destination(d), connect(c), closure(c) {} + Edge(uint d, DCComponent* c) : destination(d), connect(c) {} }; //Store the branching atom and all Atoms that are connected to this @@ -76,11 +74,13 @@ class DCCyclic : public CBMC DCComponent *idExchange; DCData data; bool hasCrankShaft; + std::vector isRing; //To check if atom is belong to a ring + std::vector ringIdx; //index to the row of cyclicAtoms std::vector nodes; std::vector fringe; std::vector visited; - std::vector shaftNodesDih, shaftNodesAng; - std::vector< std::vector > cyclicAtom; + std::vector crankshaft; + std::vector< std::vector > cyclicAtoms; }; } diff --git a/src/cbmc/DCFreeCycle.cpp b/src/cbmc/DCFreeCycle.cpp new file mode 100644 index 000000000..c36a77cde --- /dev/null +++ b/src/cbmc/DCFreeCycle.cpp @@ -0,0 +1,252 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#define _USE_MATH_DEFINES +#include +#include "DCFreeCycle.h" +#include "DCData.h" +#include "TrialMol.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "PRNG.h" +#include "NumLib.h" + +namespace cbmc +{ + +struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) + { + return (b.a1 == x); + } + uint x; +}; + +DCFreeCycle::DCFreeCycle(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev) + : data(data), seed(data, focus), hed(data, kind, focus, prev) +{ + cyclicAtoms = cycAtoms; + using namespace mol_setup; + using namespace std; + vector onFocus = AtomBonds(kind, hed.Focus()); + for(uint i = 0; i < onFocus.size(); ++i) { + if (onFocus[i].a1 == prev) { + anchorKind = onFocus[i].kind; + break; + } + } + + onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), + onFocus.end()); + //Find the atoms bonded to focus, except prev + for (uint i = 0; i < hed.NumBond(); ++i) { + bondKinds[i] = onFocus[i].kind; + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } +} + + +void DCFreeCycle::PrepareNew(TrialMol& newMol, uint molIndex) +{ + //Get new bond information + SetBondLengthNew(newMol); + hed.SetBondNew(bondLength, anchorBond); + hed.PrepareNew(newMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); + } + bondEnergy += data->ff.bonds.Calc(anchorKind, anchorBond); +} + +void DCFreeCycle::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + //Get old bond information + SetBondLengthOld(oldMol); + hed.SetBondOld(bondLengthOld, anchorBondOld); + hed.PrepareOld(oldMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); + } + bondEnergy += data->ff.bonds.Calc(anchorKind, anchorBondOld); +} + +void DCFreeCycle::SetBondLengthNew(TrialMol& newMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } + anchorBond = data->ff.bonds.Length(anchorKind); +} + +void DCFreeCycle::SetBondLengthOld(TrialMol& oldMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + bondLengthOld[i] = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Bonded(i))); + } + anchorBondOld = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Prev())); +} + +void DCFreeCycle::BuildNew(TrialMol& newMol, uint molIndex) +{ + seed.BuildNew(newMol, molIndex); + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Ewald *calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + newMol.ShiftBasis(hed.Focus()); + const XYZ center = newMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + + for (uint i = 0; i < hed.NumBond(); ++i) { + positions[i].Set(0, newMol.RawRectCoords(bondLength[i], hed.Theta(i), + hed.Phi(i))); + } + //add anchor atom + positions[hed.NumBond()].Set(0, newMol.RawRectCoords(anchorBond, 0, 0)); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + //convert chosen torsion to 3D positions + RotationMatrix spin = + RotationMatrix::UniformRandom(prng(), prng(), prng()); + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + data->axes.WrapPBC(positions[b], newMol.GetBox()); + } + + for (uint b = 0; b < hed.NumBond(); ++b) { + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), + molIndex, newMol.GetBox(), nLJTrials); + } + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), + molIndex, newMol.GetBox(), nLJTrials); + + double stepWeight = 0; + for (uint lj = 0; lj < nLJTrials; ++lj) { + ljWeights[lj] = exp(-ff.beta * (inter[lj] + real[lj])); + stepWeight += ljWeights[lj]; + } + + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + for(uint b = 0; b < hed.NumBond(); ++b) { + newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + } + + newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.UpdateOverlap(overlap[winner]); + newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), + inter[winner], real[winner], + 0.0, 0.0, 0.0)); + newMol.MultWeight(hed.GetWeight()); + newMol.MultWeight(stepWeight / nLJTrials); +} + +void DCFreeCycle::BuildOld(TrialMol& oldMol, uint molIndex) +{ + seed.BuildOld(oldMol, molIndex); + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Ewald * calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + oldMol.SetBasis(hed.Focus(), hed.Prev()); + //Calculate OldMol Bond Energy & + //Calculate phi weight for nTrials using actual theta of OldMol + hed.ConstrainedAnglesOld(data->nAngleTrials - 1, oldMol, molIndex); + const XYZ center = oldMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + double prevPhi[MAX_BONDS]; + for (uint i = 0; i < hed.NumBond(); ++i) { + //get position and shift to origin + positions[i].Set(0, oldMol.AtomPosition(hed.Bonded(i))); + data->axes.UnwrapPBC(positions[i], 0, 1, oldMol.GetBox(), center); + positions[i].Add(0, -center); + } + //add anchor atom + positions[hed.NumBond()].Set(0, oldMol.AtomPosition(hed.Prev())); + data->axes.UnwrapPBC(positions[hed.NumBond()], 0, 1, + oldMol.GetBox(), center); + positions[hed.NumBond()].Add(0, -center); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 1;) { + //convert chosen torsion to 3D positions + RotationMatrix spin = + RotationMatrix::UniformRandom(prng(), prng(), prng()); + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + positions[b].Add(0, center); + data->axes.WrapPBC(positions[b], oldMol.GetBox()); + } + + for (uint b = 0; b < hed.NumBond(); ++b) { + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), + molIndex, oldMol.GetBox(), nLJTrials); + } + double stepWeight = 0; + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), + molIndex, oldMol.GetBox(), nLJTrials); + + for (uint lj = 0; lj < nLJTrials; ++lj) { + stepWeight += exp(-ff.beta * (inter[lj] + real[lj])); + } + + for(uint b = 0; b < hed.NumBond(); ++b) { + oldMol.ConfirmOldAtom(hed.Bonded(b)); + } + + oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.UpdateOverlap(overlap[0]); + oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), + inter[0], real[0], 0.0, 0.0, 0.0)); + oldMol.MultWeight(hed.GetWeight()); + oldMol.MultWeight(stepWeight / nLJTrials); +} + +} diff --git a/src/cbmc/DCFreeCycle.h b/src/cbmc/DCFreeCycle.h new file mode 100644 index 000000000..fdeb7e7c9 --- /dev/null +++ b/src/cbmc/DCFreeCycle.h @@ -0,0 +1,60 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCFREECYCLE_H +#define DCFREECYCLE_H +#include "DCComponent.h" +#include "DCSingle.h" +#include "DCHedron.h" +#include "CBMC.h" + +namespace mol_setup +{ +class MolKind; +} + +namespace cbmc +{ +class DCData; + +class DCFreeCycle : public DCComponent +{ +public: + DCFreeCycle(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev); + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void SetBondLengthNew(TrialMol& newMol); + void SetBondLengthOld(TrialMol& oldMol); + + DCComponent* Clone() + { + return new DCFreeCycle(*this); + }; + +private: + DCData* data; + DCSingle seed; + DCHedron hed; + //bond length of prev bonded to focus + double anchorBond, anchorBondOld; + //bond energy of built branch + double bondEnergy; + uint anchorKind; + + //bond length of atom bonded to focus + double bondLength[MAX_BONDS]; + double bondLengthOld[MAX_BONDS]; + //bondKind between bonded[i] and focus + uint bondKinds[MAX_BONDS]; + //all atoms in the ring + std::vector cyclicAtoms; +}; +} + +#endif diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 9b699cd4b..08445870c 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -144,7 +144,7 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) //Find the angle that end with a0 vector angles = AtomEndAngles(kind, a0); while(!angles.empty()) { - //find the last atomindex in the dihedral + //find the last atomindex in the angle uint a1 = angles.back().a1; uint a2 = angles.back().a2; @@ -162,7 +162,7 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) fixAngle = true; } } - //If there was no fix angles, we create DCCrankShaftDih + //If there was no fix angles, we create DCCrankShaftAngle if(!fixAngle) { shaftNodesAng.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); } @@ -203,7 +203,6 @@ void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) shaftNodesDih : shaftNodesAng; //Pick a random node pair uint pick = data.prng.randIntExc(shaftNodes.size()); - //Call DCCrankShaftDih and rotate a1 and a2 nodes around a0-a3 shaft shaftNodes[pick]->PrepareNew(newMol, molIndex); shaftNodes[pick]->BuildNew(newMol, molIndex); shaftNodes[pick]->PrepareOld(oldMol, molIndex); @@ -595,6 +594,7 @@ void DCGraph::BuildGrowNew(TrialMol& newMol, uint molIndex) DCGraph::~DCGraph() { + delete idExchange; for(uint v = 0; v < nodes.size(); ++v) { Node& node = nodes[v]; delete node.starting; @@ -603,7 +603,14 @@ DCGraph::~DCGraph() delete node.edges[e].component; } } - delete idExchange; + + for(uint i = 0; i < shaftNodesDih.size(); i++) { + delete shaftNodesDih[i]; + } + + for(uint i = 0; i < shaftNodesAng.size(); i++) { + delete shaftNodesAng[i]; + } } From c569d86e953b3b2685571547a3a5512f726df2da Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 27 Aug 2018 14:26:33 -0400 Subject: [PATCH 109/199] Finished DCHedronCycle class. --- CMake/FileLists.cmake | 6 + src/cbmc/DCCrankShaftAng.cpp | 1 - src/cbmc/DCCrankShaftDih.cpp | 1 - src/cbmc/DCFreeCycle.cpp | 3 +- src/cbmc/DCFreeCycle.h | 6 +- src/cbmc/DCHedronCycle.cpp | 499 +++++++++++++++++++++++++++++++++++ src/cbmc/DCHedronCycle.h | 103 ++++++++ src/cbmc/DCLinkedCycle.cpp | 453 +++++++++++++++++++++++++++++++ src/cbmc/DCLinkedCycle.h | 68 +++++ src/cbmc/TrialMol.cpp | 7 +- src/cbmc/TrialMol.h | 7 + 11 files changed, 1143 insertions(+), 11 deletions(-) create mode 100644 src/cbmc/DCHedronCycle.cpp create mode 100644 src/cbmc/DCHedronCycle.h create mode 100644 src/cbmc/DCLinkedCycle.cpp create mode 100644 src/cbmc/DCLinkedCycle.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 2a076be79..9f5db8d40 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -43,8 +43,11 @@ set(sources src/cbmc/DCFreeCycle.cpp src/cbmc/DCFreeHedron.cpp src/cbmc/DCFreeHedronSeed.cpp + src/cbmc/DCFreeCycleSeed.cpp src/cbmc/DCLinkedHedron.cpp + src/cbmc/DCLinkedCycle.cpp src/cbmc/DCHedron.cpp + src/cbmc/DCHedronCycle.cpp src/cbmc/DCLinear.cpp src/cbmc/DCOnSphere.cpp src/cbmc/DCRotateCOM.cpp @@ -137,9 +140,12 @@ set(headers src/cbmc/DCFreeCycle.h src/cbmc/DCFreeHedron.h src/cbmc/DCFreeHedronSeed.h + src/cbmc/DCFreeCycleSeed.h src/cbmc/DCLinkedHedron.h + src/cbmc/DCLinkedCycle.h src/cbmc/DCGraph.h src/cbmc/DCHedron.h + src/cbmc/DCHedronCycle.h src/cbmc/DCLinear.h src/cbmc/DCOnSphere.h src/cbmc/DCRotateCOM.h diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 70426cdf4..db1bed1d4 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -345,7 +345,6 @@ double DCCrankShaftAng::CalcIntraBonded(TrialMol& mol, uint molIndex) b1 = data->axes.MinImage(coords.Difference(ang[i].a0, ang[i].a1), box); b2 = data->axes.MinImage(coords.Difference(ang[i].a2, ang[i].a1), box); bondedEn += data->ff.angles->Calc(ang[i].kind, geom::Theta(b1, b2)); - double theta = geom::Theta(b1, b2); } for(uint i = 0; i < dih.size(); i++) { diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 3b8fafdea..445d8e362 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -364,7 +364,6 @@ double DCCrankShaftDih::CalcIntraBonded(TrialMol& mol, uint molIndex) b1 = data->axes.MinImage(coords.Difference(ang[i].a0, ang[i].a1), box); b2 = data->axes.MinImage(coords.Difference(ang[i].a2, ang[i].a1), box); bondedEn += data->ff.angles->Calc(ang[i].kind, geom::Theta(b1, b2)); - double theta = geom::Theta(b1, b2); } for(uint i = 0; i < dih.size(); i++) { diff --git a/src/cbmc/DCFreeCycle.cpp b/src/cbmc/DCFreeCycle.cpp index c36a77cde..3e75ba41d 100644 --- a/src/cbmc/DCFreeCycle.cpp +++ b/src/cbmc/DCFreeCycle.cpp @@ -28,9 +28,8 @@ struct FindA1 { DCFreeCycle::DCFreeCycle(DCData* data, const mol_setup::MolKind& kind, std::vector cycAtoms, uint focus, uint prev) - : data(data), seed(data, focus), hed(data, kind, focus, prev) + : data(data), seed(data, focus), hed(data, kind, cycAtoms, focus, prev) { - cyclicAtoms = cycAtoms; using namespace mol_setup; using namespace std; vector onFocus = AtomBonds(kind, hed.Focus()); diff --git a/src/cbmc/DCFreeCycle.h b/src/cbmc/DCFreeCycle.h index fdeb7e7c9..cc167da33 100644 --- a/src/cbmc/DCFreeCycle.h +++ b/src/cbmc/DCFreeCycle.h @@ -8,7 +8,7 @@ along with this program, also can be found at . #define DCFREECYCLE_H #include "DCComponent.h" #include "DCSingle.h" -#include "DCHedron.h" +#include "DCHedronCyclic.h" #include "CBMC.h" namespace mol_setup @@ -40,7 +40,7 @@ class DCFreeCycle : public DCComponent private: DCData* data; DCSingle seed; - DCHedron hed; + DCHedronCyclic hed; //bond length of prev bonded to focus double anchorBond, anchorBondOld; //bond energy of built branch @@ -52,8 +52,6 @@ class DCFreeCycle : public DCComponent double bondLengthOld[MAX_BONDS]; //bondKind between bonded[i] and focus uint bondKinds[MAX_BONDS]; - //all atoms in the ring - std::vector cyclicAtoms; }; } diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp new file mode 100644 index 000000000..a0f995836 --- /dev/null +++ b/src/cbmc/DCHedronCycle.cpp @@ -0,0 +1,499 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#define _USE_MATH_DEFINES +#include +#include "DCHedronCycle.h" +#include "TrialMol.h" +#include "DCData.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "PRNG.h" +#include "NumLib.h" +#include "Geometry.h" +#include +#include + +namespace +{ +//Wish I could use lambdas.. +struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) + { + return (b.a1 == x); + } + uint x; +}; + +struct FindAngle { + FindAngle(uint x, uint y) : x(x), y(y) {} + uint y, x; + bool operator()(const mol_setup::Angle& a) + { + return (a.a0 == x && a.a2 == y) || (a.a0 == y && a.a2 == x); + } +}; + +//Check to see of angle a is in the ring or not +bool IsInRing(std::vector cycAtoms, const mol_setup::Angle& a) +{ + bool res = true; + if(std::find(cycAtoms.begin(), cycAtoms.end(), a.a0) == cycAtoms.end()) { + res = false; + } else if(std::find(cycAtoms.begin(), cycAtoms.end(), a.a1) == cycAtoms.end()) { + res = false; + } else if(std::find(cycAtoms.begin(), cycAtoms.end(), a.a2) == cycAtoms.end()) { + res = false; + } + return res; +} + +} + +namespace cbmc +{ + + +DCHedronCycle::DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev) + : data(data), focus(focus), prev(prev) +{ + using namespace mol_setup; + using namespace std; + vector onFocus = AtomBonds(kind, focus); + onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), + onFocus.end()); + nBonds = onFocus.size(); + + for (uint i = 0; i < nBonds; ++i) { + bonded[i] = onFocus[i].a1; + } + + vector angles = AtomMidAngles(kind, focus); + for (uint i = 0; i < nBonds; ++i) { + typedef vector::const_iterator Aiter; + Aiter free = find_if(angles.begin(), angles.end(), + FindAngle(prev, bonded[i])); + assert(free != angles.end()); + angleKinds[i][i] = free->kind; + angleInRing[i][i] = IsInRing(cycAtoms, *free); + + for (uint j = i + 1; j < nBonds; ++j) { + Aiter pair = find_if(angles.begin(), angles.end(), + FindAngle(bonded[i], bonded[j])); + angleKinds[i][j] = pair->kind; + angleKinds[j][i] = pair->kind; + angleInRing[i][j] = IsInRing(cycAtoms, *pair); + angleInRing[j][i] = angleInRing[i][j]; + } + } + + phi[0] = 0.0; + phiWeight[0] = 1.0; + + if(data->nAngleTrials < 1) { + std::cout << "Error: CBMC angle trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } +} + +void DCHedronCycle::SetBondNew(double const *bondLen, double const &anchBond) +{ + for(uint i = 0; i < nBonds; ++i) { + bondLength[i] = bondLen[i]; + } + anchorBond = anchBond; +} + +void DCHedronCycle::SetBondOld(double const *bondLen, double const &anchBond) +{ + for(uint i = 0; i < nBonds; ++i) { + bondLengthOld[i] = bondLen[i]; + } + anchorBondOld = anchBond; +} + +double DCHedronCycle::GetWeight() +{ + double result = 1; + for(uint i = 0; i < nBonds; ++i) { + result *= thetaWeight[i]; + result *= phiWeight[i]; + } + return result; +} + +double DCHedronCycle::CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2) +{ + XYZ b1, b2, b3; + const XYZArray &coords = mol.GetBCoords(); + //Since data in bCoords in unwrap, no need to calc minImage + b1 = coords.Difference(a0, a1); + b2 = coords.Difference(a2, a1); + double theta = geom::Theta(b1, b2); + return theta; +} + +//Randomly generate nTrials angles and save energy and weight +void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, + uint kind, uint nTrials, uint bType) +{ + double* nonbonded_1_3 = data->nonbonded_1_3; + int i; + double distSq, thetaFix; + bool angleFix = false; + std::fill_n(nonbonded_1_3, nTrials, 0.0); + //use backup coordinate to find theta and phi of the ring + if(angleInRing[bType][bType]) { + double th = CalcTheta(newMol, bonded[bType], focus, prev); + std::fill_n(data->angles, nTrials, th); + double en = data->ff.angles->Calc(kind, th); + std::fill_n(data->angleEnergy, nTrials, en); + double distSq = newMol.AngleDist(anchorBond, bondLength[bType], th); + double enNB = data->calc.IntraEnergy_1_3(distSq, prev, bonded[bType], molIndex); + std::fill_n(nonbonded_1_3, nTrials, enNB); + double w = exp((en + enNB) * -data->ff.beta); + std::fill_n(data->angleWeights, nTrials, w); + return; + } + + if(data->ff.angles->AngleFixed(kind)) { + angleFix = true; + thetaFix = data->ff.angles->Angle(kind); + } + + for (i = 0; i < nTrials; ++i) { + if(angleFix) + data->angles[i] = thetaFix; + else + data->angles[i] = data->prng.rand(M_PI); + } + +#ifdef _OPENMP + #pragma omp parallel for default(shared) private(i, distSq) +#endif + for (i = 0; i < nTrials; ++i) { + data->angleEnergy[i] = data->ff.angles->Calc(kind, data->angles[i]); + distSq = newMol.AngleDist(anchorBond, bondLength[bType], + data->angles[i]); + nonbonded_1_3[i] = + data->calc.IntraEnergy_1_3(distSq, prev, bonded[bType], molIndex); + data->angleWeights[i] = exp((data->angleEnergy[i] + nonbonded_1_3[i]) + * -data->ff.beta); + } +} + +void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, + uint kind, uint nTrials, uint bType) +{ + double* nonbonded_1_3 = data->nonbonded_1_3; + int i; + double distSq, thetaFix; + bool angleFix = false; + std::fill_n(nonbonded_1_3, nTrials, 0.0); + //use backup coordinate to find theta and phi of the ring + if(angleInRing[bType][bType]) { + double th = CalcTheta(oldMol, bonded[bType], focus, prev); + std::fill_n(data->angles, nTrials, th); + double en = data->ff.angles->Calc(kind, th); + std::fill_n(data->angleEnergy, nTrials, en); + double distSq = oldMol.AngleDist(anchorBondOld, bondLengthOld[bType], th); + double enNB = data->calc.IntraEnergy_1_3(distSq, prev, bonded[bType], molIndex); + std::fill_n(nonbonded_1_3, nTrials, enNB); + double w = exp((en + enNB) * -data->ff.beta); + std::fill_n(data->angleWeights, nTrials, w); + return; + } + + if(data->ff.angles->AngleFixed(kind)) { + angleFix = true; + thetaFix = data->ff.angles->Angle(kind); + } + + for (i = 0; i < nTrials; ++i) { + if(angleFix) + data->angles[i] = thetaFix; + else + data->angles[i] = data->prng.rand(M_PI); + } + +#ifdef _OPENMP + #pragma omp parallel for default(shared) private(i, distSq) +#endif + for (i = 0; i < nTrials; ++i) { + data->angleEnergy[i] = data->ff.angles->Calc(kind, data->angles[i]); + + distSq = oldMol.AngleDist(anchorBondOld, bondLengthOld[bType], + data->angles[i]); + nonbonded_1_3[i] = + data->calc.IntraEnergy_1_3(distSq, prev, bonded[bType], molIndex); + + data->angleWeights[i] = exp((data->angleEnergy[i] + nonbonded_1_3[i]) + * -data->ff.beta); + } +} + +void DCHedronCycle::FreeAnglesNew(TrialMol& newMol, uint molIndex, uint nTrials) +{ + for (uint i = 0; i < nBonds; ++i) { + GenerateAnglesNew(newMol, molIndex, angleKinds[i][i], nTrials, i); + double stepWeight = std::accumulate(data->angleWeights, + data->angleWeights + nTrials, + 0.0); + uint winner = data->prng.PickWeighted(data->angleWeights, + nTrials, stepWeight); + theta[i] = data->angles[winner]; + bendEnergy += data->angleEnergy[winner]; + oneThree += data->nonbonded_1_3[winner]; + thetaWeight[i] = stepWeight; + } +} + +void DCHedronCycle::FreeAnglesOld(TrialMol& oldMol, uint molIndex, uint nTrials) +{ + for (uint i = 0; i < nBonds; ++i) { + GenerateAnglesOld(oldMol, molIndex, angleKinds[i][i], nTrials, i); + double stepWeight = std::accumulate(data->angleWeights, + data->angleWeights + nTrials, + 0.0); + thetaWeight[i] = stepWeight; + } +} + +void DCHedronCycle::PrepareNew(TrialMol& newMol, uint molIndex) +{ + bendEnergy = 0.0; + oneThree = 0.0; + phi[0] = 0.0; + FreeAnglesNew(newMol, molIndex, data->nAngleTrials); + ConstrainedAngles(newMol, molIndex, data->nAngleTrials); +} + +void DCHedronCycle::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + oneThree = 0.0; + bendEnergy = 0.0; + FreeAnglesOld(oldMol, molIndex, data->nAngleTrials - 1); +} + + +void DCHedronCycle::IncorporateOld(TrialMol& oldMol, uint molIndex) +{ + bendEnergy = 0.0; + oneThree = 0.0; + const Forcefield& ff = data->ff; + for (uint b = 0; b < nBonds; ++b) { + + oldMol.OldThetaAndPhi(bonded[b], focus, theta[b], phi[b]); + double thetaEnergy = data->ff.angles->Calc(angleKinds[b][b], theta[b]); + double distSq = oldMol.OldDistSq(prev, bonded[b]); + double nonbondedEn = + data->calc.IntraEnergy_1_3(distSq, prev, bonded[b], molIndex); + + thetaWeight[b] += exp(-1 * data->ff.beta * (thetaEnergy + nonbondedEn)); + bendEnergy += thetaEnergy; + oneThree += nonbondedEn; + + if (b != 0) { + double phiEnergy = 0.0; + nonbondedEn = 0.0; + phiWeight[b] = 0.0; + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + double bfcTheta = acos(sinTerm * cos(phi[b] - phi[c]) + + cosTerm); + + double distSq = oldMol.OldDistSq(bonded[c], bonded[b]); + nonbondedEn += data->calc.IntraEnergy_1_3(distSq, bonded[c], + bonded[b], molIndex); + + phiEnergy += ff.angles->Calc(angleKinds[b][c], bfcTheta); + + } + phiWeight[b] = exp(-ff.beta * (phiEnergy + nonbondedEn)); + bendEnergy += phiEnergy; + oneThree += nonbondedEn; + } + } +} + + +void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials) +{ + double* angles = data->angles; + double* energies = data->angleEnergy; + double* weights = data->angleWeights; + double* nonbonded_1_3 = data->nonbonded_1_3; + std::fill_n(nonbonded_1_3, nTrials, 0.0); + phi[0] = 0.0; + + for (uint b = 1; b < nBonds; ++b) { + //pick "twist" angles + for (uint i = 0; i < nTrials; ++i) { + angles[i] = data->prng.rand(M_PI * 2); + energies[i] = 0.0; + nonbonded_1_3[i] = 0.0; + } + + //compare to angles determined in previous iterations + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + for (uint i = 0; i < nTrials; ++i) { + if(angleInRing[b][c]) { + double bfcTheta = CalcTheta(newMol, bonded[b], focus, bonded[c]); + angles[i] = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double distSq = newMol.AngleDist(bondLength[b], bondLength[c], + bfcTheta); + double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], + molIndex); + + nonbonded_1_3[i] += tempEn; + energies[i] += data->ff.angles->Calc(angleKinds[b][c], + bfcTheta); + + if(abs(angles[i]) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring with flexible angle for " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } else if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + + cosTerm); + double distSq = newMol.AngleDist(bondLength[b], bondLength[c], + bfcTheta); + double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], + molIndex); + + nonbonded_1_3[i] += tempEn; + energies[i] += data->ff.angles->Calc(angleKinds[b][c], + bfcTheta); + } else { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + angles[i] = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double distSq = newMol.AngleDist(bondLength[b], bondLength[c], + bfcTheta); + double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], + molIndex); + + nonbonded_1_3[i] += tempEn; + energies[i] += data->ff.angles->Calc(angleKinds[b][c], + bfcTheta); + + if(abs(angles[i]) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } + } + } + + //calculate weights from combined energy + double stepWeight = 0.0; + int i; +#ifdef _OPENMP + #pragma omp parallel for default(shared) private(i) reduction(+:stepWeight) +#endif + for (i = 0; i < nTrials; ++i) { + weights[i] = exp(-1 * data->ff.beta * (energies[i] + + nonbonded_1_3[i])); + stepWeight += weights[i]; + } + + uint winner = data->prng.PickWeighted(weights, nTrials, stepWeight); + phi[b] = angles[winner]; + bendEnergy += energies[winner]; + oneThree += nonbonded_1_3[winner]; + phiWeight[b] = stepWeight; + } +} + +//Calculate OldMol Bond Energy & +//Calculate phi weight for nTrials using actual theta of OldMol +void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, + uint molIndex) +{ + IncorporateOld(oldMol, molIndex); + + for (uint b = 1; b < nBonds; ++b) { + double stepWeight = 0.0; + //pick "twist" angles + for (uint i = 0; i < nTrials; ++i) { + double angles = data->prng.rand(M_PI * 2); + double energies = 0.0; + double nonbondedEng = 0.0; + //compare to angles determined in previous iterations + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + if(angleInRing[b][c]) { + double bfcTheta = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + angles = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double distSq = oldMol.AngleDist(bondLengthOld[b], + bondLengthOld[c], bfcTheta); + nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], molIndex); + + energies += data->ff.angles->Calc(angleKinds[b][c], + bfcTheta); + + if(abs(angles) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring with flexible angle for " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } else if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = acos(sinTerm * cos(angles - phi[c]) + + cosTerm); + double distSq = oldMol.AngleDist(bondLengthOld[b], + bondLengthOld[c], bfcTheta); + nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], molIndex); + + energies += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); + } else { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + angles = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double distSq = oldMol.AngleDist(bondLengthOld[b], + bondLengthOld[c], bfcTheta); + nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], + bonded[c], molIndex); + + energies += data->ff.angles->Calc(angleKinds[b][c], + bfcTheta); + + if(abs(angles) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } + } + + //calculate weights from combined energy + double weights = exp(-1 * data->ff.beta * (energies + nonbondedEng)); + stepWeight += weights; + } + phiWeight[b] += stepWeight; + } +} +} diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h new file mode 100644 index 000000000..d84441122 --- /dev/null +++ b/src/cbmc/DCHedronCycle.h @@ -0,0 +1,103 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCHEDRONCYCLE_H +#define DCHEDRONCYCLE_H +#include "DCComponent.h" +#include "CBMC.h" + +namespace mol_setup +{ +class MolKind; +} + +namespace cbmc +{ +class DCData; + +class DCHedronCycle +{ +public: + DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev); + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void IncorporateOld(TrialMol& oldMol, uint molIndex); + void ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, uint molIndex); + void SetBondNew(double const *bondLen, double const &anchBond); + void SetBondOld(double const *bondLen, double const &anchBond); + uint Bonded(uint i) const + { + return bonded[i]; + } + double Theta(uint i) const + { + return theta[i]; + } + double Phi(uint i) const + { + return phi[i]; + } + double GetWeight(); + double GetEnergy() + { + return bendEnergy; + } + double GetNonBondedEn() + { + return oneThree; + } + uint NumBond() + { + return nBonds; + } + uint Focus() + { + return focus; + } + uint Prev() + { + return prev; + } + + //need to go to private + uint bonded[MAX_BONDS]; + + +private: + void GenerateAnglesNew(TrialMol& newMol, uint molIndex, uint kind, + uint nTrials, uint bType); + void GenerateAnglesOld(TrialMol& oldMol, uint molIndex, uint kind, + uint nTrials, uint bType); + void FreeAnglesNew(TrialMol& newMol, uint molIndex, uint nTrials); + void FreeAnglesOld(TrialMol& oldMol, uint molIndex, uint nTrials); + void ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials); + //to calculate the angle in the ring from bCoords + double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2); + + DCData* data; + uint focus, prev; + uint nBonds; + //atoms bonded to focus, being build + + //bond length of atom bonded to focus + double bondLength[MAX_BONDS]; + double bondLengthOld[MAX_BONDS]; + + //angleKinds[i][j] = kind between bonded[i] and bonded[j] + //except angleKinds[i][i] = kind between bonded[i] and prev + uint angleKinds[MAX_BONDS][MAX_BONDS]; + bool angleInRing[MAX_BONDS][MAX_BONDS]; + double theta[MAX_BONDS]; + double thetaWeight[MAX_BONDS]; + double phi[MAX_BONDS]; + double phiWeight[MAX_BONDS]; + double bendEnergy, oneThree; + double anchorBond, anchorBondOld; +}; +} + +#endif diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp new file mode 100644 index 000000000..fcf01b2c1 --- /dev/null +++ b/src/cbmc/DCLinkedCycle.cpp @@ -0,0 +1,453 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#define _USE_MATH_DEFINES +#include +#include "DCLinkedCycle.h" +#include "DCData.h" +#include "TrialMol.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "PRNG.h" +#include "NumLib.h" +#include +#include + +namespace +{ +struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) + { + return (b.a1 == x); + } + uint x; +}; + +struct FindDih { + FindDih(uint x, uint y) : x(x), y(y) {} + uint x, y; + bool operator()(const mol_setup::Dihedral d) + { + return (d.a0 == x && d.a3 == y) || (d.a0 == y && d.a3 == x); + } +}; + +} + +namespace cbmc +{ +DCLinkedCycle::DCLinkedCycle +(DCData* data, const mol_setup::MolKind& kind, std::vector cycAtoms, + uint focus, uint prev) + : data(data), hed(data, kind, cycAtoms, focus, prev) +{ + using namespace mol_setup; + using namespace std; + vector onFocus = AtomBonds(kind, hed.Focus()); + onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), + onFocus.end()); + //Find the atoms bonded to focus, except prev + for (uint i = 0; i < hed.NumBond(); ++i) { + bondKinds[i] = onFocus[i].kind; + } + + vector onPrev = AtomBonds(kind, hed.Prev()); + onPrev.erase(remove_if(onPrev.begin(), onPrev.end(), FindA1(hed.Focus())), + onPrev.end()); + nPrevBonds = onPrev.size(); + + for(uint i = 0; i < nPrevBonds; ++i) { + prevBonded[i] = onPrev[i].a1; + } + + vector dihs = DihsOnBond(kind, hed.Focus(), hed.Prev()); + for(uint i = 0; i < hed.NumBond(); ++i) { + for(uint j = 0; j < nPrevBonds; ++j) { + vector::const_iterator match = + find_if(dihs.begin(), dihs.end(), FindDih(hed.Bonded(i), + prevBonded[j])); + assert(match != dihs.end()); + dihKinds[i][j] = match->kind; + } + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } + + if(data->nDihTrials < 1) { + std::cout << "Error: CBMC dihedral trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } + +} + + +void DCLinkedCycle::SetBasis(TrialMol& mol, uint p1, uint p2) +{ + using namespace geom; + //W is unit vec of p1->p2 + XYZ wVec = mol.GetBCoords().Difference(p2, p1); + wVec.Normalize(); + XYZ uVec; + //check to make sure our W isn't in line with the standard X Axis + if (abs(wVec.x) < 0.8) { + //V will be W x the standard X unit vec + uVec = XYZ(1.0, 0.0, 0.0); + } else { + //V will be W x the standard Y unit vec + uVec = XYZ(0.0, 1.0, 0.0); + } + XYZ vVec = Cross(wVec, uVec); + vVec.Normalize(); + //U is unit vec perpendicular to both V and W + uVec = Cross(vVec, wVec); + growthToWorld.BasisRotation(uVec, vVec, wVec); + worldToGrowth = growthToWorld.Inverse(); + basisPoint = mol.GetBCoords().Get(p1); +} + +void DCLinkedCycle::OldThetaAndPhi(TrialMol& mol, const uint atom, + const uint lastAtom, + double& theta, double& phi) const +{ + XYZ diff = mol.GetBCoords().Difference(atom, lastAtom); + XYZ growthCoords = worldToGrowth.Apply(diff); + theta = acos(growthCoords.z / growthCoords.Length()); + phi = atan2(growthCoords.y, growthCoords.x); + return; +} + + +void DCLinkedCycle::PrepareNew(TrialMol& newMol, uint molIndex) +{ + //Get new bond information + SetBondLengthNew(newMol); + hed.SetBondNew(bondLength, anchorBond); + hed.PrepareNew(newMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); + } +} + +void DCLinkedCycle::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + //Get old bond information + SetBondLengthOld(oldMol); + hed.SetBondOld(bondLengthOld, anchorBondOld); + hed.PrepareOld(oldMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); + } +} + +void DCLinkedCycle::SetBondLengthNew(TrialMol& newMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } + //anchorBond is built, we need the actual length + anchorBond = sqrt(newMol.OldDistSq(hed.Focus(), hed.Prev())); +} + +void DCLinkedCycle::SetBondLengthOld(TrialMol& oldMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + bondLengthOld[i] = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Bonded(i))); + } + anchorBondOld = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Prev())); +} + +void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) +{ + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* ljWeights = data->ljWeights; + double* bondedEn = data->bonded; + double* inter = data->inter; + double* nonbonded = data->nonbonded; + double* nonbonded_1_4 = data->nonbonded_1_4; + double* real = data->real; + double* oneFour = data->oneFour; + bool* overlap = data->overlap; + + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(bondedEn, nLJTrials, 0.0); + std::fill_n(oneFour, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + newMol.SetBasis(hed.Focus(), hed.Prev()); + const XYZ center = newMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + double prevPhi[MAX_BONDS]; + for (uint i = 0; i < hed.NumBond(); ++i) { + //get position and shift to origin + positions[i].Set(0, newMol.RawRectCoords(bondLength[i], + hed.Theta(i), hed.Phi(i))); + } + for (uint i = 0; i < nPrevBonds; ++i) { + double th; + //not using theta, so this is a wasted cos and sqrt + newMol.OldThetaAndPhi(prevBonded[i], hed.Prev(), th, prevPhi[i]); + } + XYZ rotationAxis = newMol.AtomPosition(hed.Focus()) - + newMol.AtomPosition(hed.Prev()); + rotationAxis = data->axes.MinImage(rotationAxis, newMol.GetBox()); + rotationAxis *= (1 / rotationAxis.Length()); + RotationMatrix cross = RotationMatrix::CrossProduct(rotationAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotationAxis); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + ChooseTorsion(newMol, molIndex, prevPhi, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + oneFour[lj] = nonbonded_1_4[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(-torsion[winner], + cross, tensor); + for (uint b = 0; b < hed.NumBond(); ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + + for (uint b = 0; b < hed.NumBond(); ++b) { + data->axes.WrapPBC(positions[b], newMol.GetBox()); + } + + double stepWeight = EvalLJ(newMol, molIndex); + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + for(uint b = 0; b < hed.NumBond(); ++b) { + newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + } + newMol.UpdateOverlap(overlap[winner]); + newMol.AddEnergy(Energy(bondedEn[winner] + hed.GetEnergy() + bondEnergy, + nonbonded[winner] + hed.GetNonBondedEn() + + oneFour[winner], inter[winner], real[winner], + 0.0, 0.0, 0.0)); + newMol.MultWeight(hed.GetWeight()); + newMol.MultWeight(stepWeight / nLJTrials); +} + +void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) +{ + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* ljWeights = data->ljWeights; + double* bondedEn = data->bonded; + double* inter = data->inter; + double* nonbonded = data->nonbonded; + double* nonbonded_1_4 = data->nonbonded_1_4; + double* real = data->real; + double* oneFour = data->oneFour; + bool* overlap = data->overlap; + + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(bondedEn, nLJTrials, 0.0); + std::fill_n(oneFour, nLJTrials, 0.0); + std::fill_n(oneFour, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + oldMol.SetBasis(hed.Focus(), hed.Prev()); + //Calculate OldMol Bond Energy & + //Calculate phi weight for nTrials using actual theta of OldMol + hed.ConstrainedAnglesOld(data->nAngleTrials - 1, oldMol, molIndex); + const XYZ center = oldMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + double prevPhi[MAX_BONDS]; + for (uint i = 0; i < hed.NumBond(); ++i) { + //get position and shift to origin + positions[i].Set(0, oldMol.AtomPosition(hed.Bonded(i))); + data->axes.UnwrapPBC(positions[i], 0, 1, oldMol.GetBox(), center); + positions[i].Add(0, -center); + } + for (uint i = 0; i < nPrevBonds; ++i) { + double t; + //not using theta, so this is a wasted cos and sqrt + oldMol.OldThetaAndPhi(prevBonded[i], hed.Prev(), t, prevPhi[i]); + } + XYZ rotationAxis = oldMol.AtomPosition(hed.Focus()) - + oldMol.AtomPosition(hed.Prev()); + rotationAxis = data->axes.MinImage(rotationAxis, oldMol.GetBox()); + rotationAxis *= (1 / rotationAxis.Length()); + RotationMatrix cross = RotationMatrix::CrossProduct(rotationAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotationAxis); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 1;) { + ChooseTorsion(oldMol, molIndex, prevPhi, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, torWeights + nDihTrials, + 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + oneFour[lj] = nonbonded_1_4[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = + RotationMatrix::FromAxisAngle(-torsion[winner], cross, tensor); + for (uint b = 0; b < hed.NumBond(); ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + ljWeights[0] = 0.0; + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + torEnergy[tor] = 0.0; + nonbonded_1_4[tor] = 0.0; + for (uint b = 0; b < hed.NumBond(); ++b) { + double theta1 = hed.Theta(b); + double trialPhi = hed.Phi(b) + torsion[tor]; + XYZ bondedC; + if(oldMol.OneFour()) { + //convert chosen torsion to 3D positions for bonded atoms to focus + RotationMatrix spin = RotationMatrix::FromAxisAngle(-torsion[tor], + cross, tensor); + bondedC = spin.Apply(positions[b][0]) + center; + } + + for (uint p = 0; p < nPrevBonds; ++p) { + if(oldMol.OneFour()) { + double distSq = oldMol.DistSq(bondedC, + oldMol.AtomPosition(prevBonded[p])); + nonbonded_1_4[tor] += + data->calc.IntraEnergy_1_4(distSq, prevBonded[p], + hed.Bonded(b), molIndex); + if(isnan(nonbonded_1_4[tor])) + nonbonded_1_4[tor] = num::BIGNUM; + } + torEnergy[tor] += ff.dihedrals.Calc(dihKinds[b][p], + trialPhi - prevPhi[p]); + } + } + ljWeights[0] += exp(-ff.beta * (torEnergy[tor] + nonbonded_1_4[tor])); + } + bondedEn[0] = torEnergy[0]; + oneFour[0] = nonbonded_1_4[0]; + + for (uint b = 0; b < hed.NumBond(); ++b) { + positions[b].Add(0, center); + data->axes.WrapPBC(positions[b], oldMol.GetBox()); + } + double stepWeight = EvalLJ(oldMol, molIndex); + for(uint b = 0; b < hed.NumBond(); ++b) { + oldMol.ConfirmOldAtom(hed.Bonded(b)); + } + oldMol.UpdateOverlap(overlap[0]); + oldMol.AddEnergy(Energy(bondedEn[0] + hed.GetEnergy() + bondEnergy, + nonbonded[0] + hed.GetNonBondedEn() + oneFour[0], + inter[0], real[0], 0.0, 0.0, 0.0)); + + oldMol.MultWeight(hed.GetWeight()); + oldMol.MultWeight(stepWeight / nLJTrials); +} + +double DCLinkedCycle::EvalLJ(TrialMol& mol, uint molIndex) +{ + uint nLJTrials = data->nLJTrialsNth; + double* inter = data->inter; + double* nonbonded = data->nonbonded; + double* real = data->real; + bool* overlap = data->overlap; + XYZArray* positions = data->multiPositions; + + std::fill_n(data->inter, nLJTrials, 0.0); + std::fill_n(data->nonbonded, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + + for (uint b = 0; b < hed.NumBond(); ++b) { + data->calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), + molIndex, mol.GetBox(), nLJTrials); + + data->calc.ParticleNonbonded(nonbonded, mol, positions[b], + hed.Bonded(b), mol.GetBox(), nLJTrials); + } + double stepWeight = 0; + for (uint lj = 0; lj < nLJTrials; ++lj) { + data->ljWeights[lj] *= exp(-data->ff.beta * + (inter[lj] + nonbonded[lj] + real[lj])); + stepWeight += data->ljWeights[lj]; + } + return stepWeight; +} + +void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, + double prevPhi[], RotationMatrix& cross, + RotationMatrix& tensor) +{ + double* torsion = data->angles; + double* torEnergy = data->angleEnergy; + double* torWeights = data->angleWeights; + double* nonbonded_1_4 = data->nonbonded_1_4; + uint nDihTrials = data->nDihTrials; + const Forcefield& ff = data->ff; + //To get the information if initial posotion before applying torsion + XYZArray* positions = data->multiPositions; + + std::fill_n(torsion, data->nDihTrials, 0.0); + std::fill_n(torWeights, data->nDihTrials, 0.0); + std::fill_n(torEnergy, data->nDihTrials, 0.0); + std::fill_n(nonbonded_1_4, data->nDihTrials, 0.0); + + const XYZ center = mol.AtomPosition(hed.Focus()); + //select torsion based on all dihedral angles + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = data->prng.rand(M_PI * 2); + torEnergy[tor] = 0.0; + nonbonded_1_4[tor] = 0.0; + for (uint b = 0; b < hed.NumBond(); ++b) { + double theta1 = hed.Theta(b); + double trialPhi = hed.Phi(b) + torsion[tor]; + XYZ bondedC; + if(mol.OneFour()) { + //convert chosen torsion to 3D positions for bonded atoms to focus + RotationMatrix spin = RotationMatrix::FromAxisAngle(-torsion[tor], + cross, tensor); + bondedC = spin.Apply(positions[b][0]) + center; + } + + for (uint p = 0; p < nPrevBonds; ++p) { + if(mol.OneFour()) { + double distSq = mol.DistSq(bondedC, mol.AtomPosition(prevBonded[p])); + nonbonded_1_4[tor] += + data->calc.IntraEnergy_1_4(distSq, prevBonded[p], + hed.Bonded(b), molIndex); + if(isnan(nonbonded_1_4[tor])) + nonbonded_1_4[tor] = num::BIGNUM; + } + + torEnergy[tor] += ff.dihedrals.Calc(dihKinds[b][p], + trialPhi - prevPhi[p]); + } + } + torWeights[tor] = exp(-ff.beta * (torEnergy[tor] + nonbonded_1_4[tor])); + } +} + + +} diff --git a/src/cbmc/DCLinkedCycle.h b/src/cbmc/DCLinkedCycle.h new file mode 100644 index 000000000..2cc2cc7b3 --- /dev/null +++ b/src/cbmc/DCLinkedCycle.h @@ -0,0 +1,68 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCLINKEDCYCLE_H +#define DCLINKEDCYCLE_H +#include "DCComponent.h" +#include "CBMC.h" +#include "DCHedronCycle.h" +#include "TransformMatrix.h" + +namespace mol_setup +{ +class MolKind; +} + +namespace cbmc +{ +class DCData; +class DCLinkedCycle : public DCComponent +{ +public: + DCLinkedCycle(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev); + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void SetBondLengthNew(TrialMol& newMol); + void SetBondLengthOld(TrialMol& oldMol); + + DCComponent* Clone() + { + return new DCLinkedCycle(*this); + }; + +private: + void ChooseTorsion(TrialMol& mol, uint molIndex, double prevPhi[], + RotationMatrix& cross, RotationMatrix& tensor); + double EvalLJ(TrialMol& mol, uint molIndex); + void SetBasis(TrialMol& mol, uint p1, uint p2); + void OldThetaAndPhi(TrialMol& mol, const uint atom, const uint lastAtom, + double& theta, double& phi) const; + DCData* data; + DCHedronCycle hed; + uint nPrevBonds; + uint prevBonded[MAX_BONDS]; + //kind[bonded][previous] + uint dihKinds[MAX_BONDS][MAX_BONDS]; + + //bond energy of built branch + double bondEnergy; + //bond length of prev bonded to focus + double anchorBond, anchorBondOld; + //bond length of atom bonded to focus + double bondLength[MAX_BONDS]; + double bondLengthOld[MAX_BONDS]; + //bondKind between bonded[i] and focus + uint bondKinds[MAX_BONDS]; + //To find the theta and phi in bCoords + RotationMatrix growthToWorld; + RotationMatrix worldToGrowth; + XYZ basisPoint; +}; +} +#endif diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 203cd5eaa..94c373c02 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -26,7 +26,7 @@ namespace cbmc TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, uint box) : kind(&k), axes(&ax), box(box), tCoords(k.NumAtoms()), cavMatrix(3), - totalWeight(1.0) + totalWeight(1.0), bCoords(k.NumAtoms()) { atomBuilt = new bool[k.NumAtoms()]; std::fill_n(atomBuilt, k.NumAtoms(), false); @@ -43,7 +43,7 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, TrialMol::TrialMol() : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL), comInCav(false), comFix(false), rotateBB(false), overlap(false), - cavMatrix(3) + cavMatrix(3), bCoords(0) { cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -53,7 +53,7 @@ TrialMol::TrialMol() TrialMol::TrialMol(const TrialMol& other) : kind(other.kind), axes(other.axes), box(other.box), tCoords(other.tCoords), cavMatrix(other.cavMatrix), en(other.en), - totalWeight(other.totalWeight), + bCoords(other.bCoords), totalWeight(other.totalWeight), basisPoint(other.basisPoint) { atomBuilt = new bool[kind->NumAtoms()]; @@ -80,6 +80,7 @@ void swap(TrialMol& a, TrialMol& b) swap(a.axes, b.axes); swap(a.box, b.box); swap(a.tCoords, b.tCoords); + swap(a.bCoords, b.bCoords); swap(a.en, b.en); swap(a.totalWeight, b.totalWeight); swap(a.atomBuilt, b.atomBuilt); diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 8f8aafab9..edbf55cd0 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -150,6 +150,12 @@ class TrialMol return tCoords; } + //!Returns reference to coordinates of the backup TrialMol. + const XYZArray& GetBCoords() const + { + return bCoords; + } + //!Returns position of atom i (undefined if it doesn't exist yet) XYZ AtomPosition(const uint atom) const { @@ -201,6 +207,7 @@ class TrialMol const BoxDimensions* axes; uint box; XYZArray tCoords, cavMatrix; + XYZArray bCoords; //used to find the angle and theta in rings molecule Energy en; double totalWeight; RotationMatrix growthToWorld; From fca2bebd24f71ca0f5cd8dba282874a415ebcba6 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 27 Aug 2018 15:33:05 -0400 Subject: [PATCH 110/199] Finish DCFreeCycle and DCFreeCycleSeed --- src/cbmc/DCFreeCycle.cpp | 1 + src/cbmc/DCFreeCycle.h | 4 +- src/cbmc/DCFreeCycleSeed.cpp | 251 ++++++++++++++++++++++++++++++++++ src/cbmc/DCFreeCycleSeed.h | 56 ++++++++ src/cbmc/DCFreeHedronSeed.cpp | 5 + 5 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 src/cbmc/DCFreeCycleSeed.cpp create mode 100644 src/cbmc/DCFreeCycleSeed.h diff --git a/src/cbmc/DCFreeCycle.cpp b/src/cbmc/DCFreeCycle.cpp index 3e75ba41d..60215b6fe 100644 --- a/src/cbmc/DCFreeCycle.cpp +++ b/src/cbmc/DCFreeCycle.cpp @@ -83,6 +83,7 @@ void DCFreeCycle::PrepareOld(TrialMol& oldMol, uint molIndex) void DCFreeCycle::SetBondLengthNew(TrialMol& newMol) { for(uint i = 0; i < hed.NumBond(); ++i) { + //We might need to use bondLength from bCoords bondLength[i] = data->ff.bonds.Length(bondKinds[i]); } anchorBond = data->ff.bonds.Length(anchorKind); diff --git a/src/cbmc/DCFreeCycle.h b/src/cbmc/DCFreeCycle.h index cc167da33..aac239c2c 100644 --- a/src/cbmc/DCFreeCycle.h +++ b/src/cbmc/DCFreeCycle.h @@ -8,7 +8,7 @@ along with this program, also can be found at . #define DCFREECYCLE_H #include "DCComponent.h" #include "DCSingle.h" -#include "DCHedronCyclic.h" +#include "DCHedronCycle.h" #include "CBMC.h" namespace mol_setup @@ -40,7 +40,7 @@ class DCFreeCycle : public DCComponent private: DCData* data; DCSingle seed; - DCHedronCyclic hed; + DCHedronCycle hed; //bond length of prev bonded to focus double anchorBond, anchorBondOld; //bond energy of built branch diff --git a/src/cbmc/DCFreeCycleSeed.cpp b/src/cbmc/DCFreeCycleSeed.cpp new file mode 100644 index 000000000..d34685845 --- /dev/null +++ b/src/cbmc/DCFreeCycleSeed.cpp @@ -0,0 +1,251 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#define _USE_MATH_DEFINES +#include +#include "DCFreeCycleSeed.h" +#include "DCData.h" +#include "TrialMol.h" +#include "MolSetup.h" +#include "Forcefield.h" +#include "PRNG.h" +#include "NumLib.h" + +namespace cbmc +{ + +struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) + { + return (b.a1 == x); + } + uint x; +}; + +DCFreeCycleSeed::DCFreeCycleSeed(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev) + : data(data), hed(data, kind, cycAtoms, focus, prev) +{ + using namespace mol_setup; + using namespace std; + vector onFocus = AtomBonds(kind, hed.Focus()); + for(uint i = 0; i < onFocus.size(); ++i) { + if (onFocus[i].a1 == prev) { + anchorKind = onFocus[i].kind; + break; + } + } + + onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), + onFocus.end()); + //Find the atoms bonded to focus, except prev + for (uint i = 0; i < hed.NumBond(); ++i) { + bondKinds[i] = onFocus[i].kind; + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } +} + + +void DCFreeCycleSeed::PrepareNew(TrialMol& newMol, uint molIndex) +{ + //Get new bond information + SetBondLengthNew(newMol); + hed.SetBondNew(bondLength, anchorBond); + hed.PrepareNew(newMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); + } + bondEnergy += data->ff.bonds.Calc(anchorKind, anchorBond); +} + +void DCFreeCycleSeed::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + //Get old bond information + SetBondLengthOld(oldMol); + hed.SetBondOld(bondLengthOld, anchorBondOld); + hed.PrepareOld(oldMol, molIndex); + bondEnergy = 0.0; + for(uint i = 0; i < hed.NumBond(); ++i) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); + } + bondEnergy += data->ff.bonds.Calc(anchorKind, anchorBondOld); +} + +void DCFreeCycleSeed::SetBondLengthNew(TrialMol& newMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + //We might need to use bondLength from bCoords + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } + anchorBond = data->ff.bonds.Length(anchorKind); +} + +void DCFreeCycleSeed::SetBondLengthOld(TrialMol& oldMol) +{ + for(uint i = 0; i < hed.NumBond(); ++i) { + bondLengthOld[i] = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Bonded(i))); + } + anchorBondOld = sqrt(oldMol.OldDistSq(hed.Focus(), hed.Prev())); +} + +void DCFreeCycleSeed::BuildNew(TrialMol& newMol, uint molIndex) +{ + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Ewald *calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + newMol.ShiftBasis(hed.Focus()); + const XYZ center = newMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + + for (uint i = 0; i < hed.NumBond(); ++i) { + positions[i].Set(0, newMol.RawRectCoords(bondLength[i], hed.Theta(i), + hed.Phi(i))); + } + //add anchor atom + positions[hed.NumBond()].Set(0, newMol.RawRectCoords(anchorBond, 0, 0)); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + //convert chosen torsion to 3D positions + RotationMatrix spin = + RotationMatrix::UniformRandom(prng(), prng(), prng()); + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + data->axes.WrapPBC(positions[b], newMol.GetBox()); + } + + for (uint b = 0; b < hed.NumBond(); ++b) { + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), + molIndex, newMol.GetBox(), nLJTrials); + } + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), + molIndex, newMol.GetBox(), nLJTrials); + + double stepWeight = 0; + for (uint lj = 0; lj < nLJTrials; ++lj) { + ljWeights[lj] = exp(-ff.beta * (inter[lj] + real[lj])); + stepWeight += ljWeights[lj]; + } + + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + for(uint b = 0; b < hed.NumBond(); ++b) { + newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + } + + newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.UpdateOverlap(overlap[winner]); + newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), + inter[winner], real[winner], + 0.0, 0.0, 0.0)); + newMol.MultWeight(hed.GetWeight()); + newMol.MultWeight(stepWeight / nLJTrials); +} + +void DCFreeCycleSeed::BuildOld(TrialMol& oldMol, uint molIndex) +{ + PRNG& prng = data->prng; + const CalculateEnergy& calc = data->calc; + const Ewald * calcEwald = data->calcEwald; + const Forcefield& ff = data->ff; + uint nLJTrials = data->nLJTrialsNth; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //get info about existing geometry + oldMol.SetBasis(hed.Focus(), hed.Prev()); + //Calculate OldMol Bond Energy & + //Calculate phi weight for nTrials using actual theta of OldMol + hed.ConstrainedAnglesOld(data->nAngleTrials - 1, oldMol, molIndex); + const XYZ center = oldMol.AtomPosition(hed.Focus()); + XYZArray* positions = data->multiPositions; + double prevPhi[MAX_BONDS]; + for (uint i = 0; i < hed.NumBond(); ++i) { + //get position and shift to origin + positions[i].Set(0, oldMol.AtomPosition(hed.Bonded(i))); + data->axes.UnwrapPBC(positions[i], 0, 1, oldMol.GetBox(), center); + positions[i].Add(0, -center); + } + + //add anchor atom + positions[hed.NumBond()].Set(0, oldMol.AtomPosition(hed.Prev())); + data->axes.UnwrapPBC(positions[hed.NumBond()], 0, 1, + oldMol.GetBox(), center); + positions[hed.NumBond()].Add(0, -center); + + //counting backward to preserve prototype + for (uint lj = nLJTrials; lj-- > 1;) { + //convert chosen torsion to 3D positions + RotationMatrix spin = + RotationMatrix::UniformRandom(prng(), prng(), prng()); + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + //find positions + positions[b].Set(lj, spin.Apply(positions[b][0])); + positions[b].Add(lj, center); + } + } + + for (uint b = 0; b < hed.NumBond() + 1; ++b) { + positions[b].Add(0, center); + data->axes.WrapPBC(positions[b], oldMol.GetBox()); + } + + for (uint b = 0; b < hed.NumBond(); ++b) { + calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), + molIndex, oldMol.GetBox(), nLJTrials); + } + double stepWeight = 0; + calc.ParticleInter(inter, real, positions[hed.NumBond()], overlap, hed.Prev(), + molIndex, oldMol.GetBox(), nLJTrials); + + for (uint lj = 0; lj < nLJTrials; ++lj) { + stepWeight += exp(-ff.beta * (inter[lj] + real[lj])); + } + + for(uint b = 0; b < hed.NumBond(); ++b) { + oldMol.ConfirmOldAtom(hed.Bonded(b)); + } + + oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.UpdateOverlap(overlap[0]); + oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), + inter[0], real[0], 0.0, 0.0, 0.0)); + oldMol.MultWeight(hed.GetWeight()); + oldMol.MultWeight(stepWeight / nLJTrials); +} + +} diff --git a/src/cbmc/DCFreeCycleSeed.h b/src/cbmc/DCFreeCycleSeed.h new file mode 100644 index 000000000..e61c0a704 --- /dev/null +++ b/src/cbmc/DCFreeCycleSeed.h @@ -0,0 +1,56 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCFREECYCLESEED_H +#define DCFREECYCLESEED_H +#include "DCComponent.h" +#include "DCHedronCycle.h" +#include "CBMC.h" + +namespace mol_setup +{ +class MolKind; +} + +namespace cbmc +{ +class DCData; + +class DCFreeCycleSeed : public DCComponent +{ +public: + DCFreeCycleSeed(DCData* data, const mol_setup::MolKind& kind, + std::vector cycAtoms, uint focus, uint prev); + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + void SetBondLengthNew(TrialMol& newMol); + void SetBondLengthOld(TrialMol& oldMol); + + DCComponent* Clone() + { + return new DCFreeCycleSeed(*this); + }; + +private: + DCData* data; + DCHedronCycle hed; + //bond length of prev bonded to focus + double anchorBond, anchorBondOld; + //bond energy of built branch + double bondEnergy; + uint anchorKind; + + //bond length of atom bonded to focus + double bondLength[MAX_BONDS]; + double bondLengthOld[MAX_BONDS]; + //bondKind between bonded[i] and focus + uint bondKinds[MAX_BONDS]; +}; +} + +#endif diff --git a/src/cbmc/DCFreeHedronSeed.cpp b/src/cbmc/DCFreeHedronSeed.cpp index b3aa66b76..d4c90bcc6 100644 --- a/src/cbmc/DCFreeHedronSeed.cpp +++ b/src/cbmc/DCFreeHedronSeed.cpp @@ -46,6 +46,11 @@ DCFreeHedronSeed::DCFreeHedronSeed(DCData* data, const mol_setup::MolKind& kind, for (uint i = 0; i < hed.NumBond(); ++i) { bondKinds[i] = onFocus[i].kind; } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } } From 7e1cf431a41e4e46a5d04fd47cbefa2ffd8f0fb0 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 27 Aug 2018 15:43:26 -0400 Subject: [PATCH 111/199] Add DCCyclic.h and DCCyclic.cpp file to cmake --- CMake/FileLists.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 9f5db8d40..cc6e5431d 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -39,6 +39,7 @@ set(sources src/System.cpp src/cbmc/DCCrankShaftAng.cpp src/cbmc/DCCrankShaftDih.cpp + src/cbmc/DCCyclic.cpp src/cbmc/DCGraph.cpp src/cbmc/DCFreeCycle.cpp src/cbmc/DCFreeHedron.cpp @@ -136,6 +137,7 @@ set(headers src/cbmc/DCComponent.h src/cbmc/DCCrankShaftAng.h src/cbmc/DCCrankShaftDih.h + src/cbmc/DCCyclic.h src/cbmc/DCData.h src/cbmc/DCFreeCycle.h src/cbmc/DCFreeHedron.h From 07149829ee14bf0c96935d7b0fc07822dfe27b2f Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 28 Aug 2018 11:05:42 -0400 Subject: [PATCH 112/199] Calculate the the angle using tCoords if atoms bonded to focuse already exist. --- src/cbmc/DCCyclic.cpp | 6 +++--- src/cbmc/DCHedronCycle.cpp | 19 ++++++++++++------- src/cbmc/DCHedronCycle.h | 2 +- src/cbmc/DCLinkedCycle.h | 2 ++ src/cbmc/TrialMol.cpp | 6 +++--- src/cbmc/TrialMol.h | 2 +- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 48ef93d25..531beb68c 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -10,7 +10,6 @@ along with this program, also can be found at . #include "DCFreeHedronSeed.h" #include "DCFreeCycle.h" #include "DCLinkedCycle.h" -#include "DCCloseCycle.h" #include "DCFreeCycleSeed.h" #include "DCRotateCOM.h" #include "DCCrankShaftDih.h" @@ -115,14 +114,15 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle //Atoms will be build from prev(atom) to focus(partner) Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIndex], - partner,atom)); + partner,atom)); + node.edges.push_back(e); } else { //Add partner to the edge list of node and initialize it with partner //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle //Atoms will be build from prev(atom) to focus(partner) Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner,atom)); + node.edges.push_back(e); } - node.edges.push_back(e); } } } diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index a0f995836..d230cb01e 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -127,14 +127,19 @@ double DCHedronCycle::GetWeight() return result; } -double DCHedronCycle::CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2) +double DCHedronCycle::CalcTheta(TrialMol& mol, const uint a0, const uint a1, + const uint a2) { - XYZ b1, b2, b3; - const XYZArray &coords = mol.GetBCoords(); - //Since data in bCoords in unwrap, no need to calc minImage - b1 = coords.Difference(a0, a1); - b2 = coords.Difference(a2, a1); - double theta = geom::Theta(b1, b2); + double theta = 0.0; + if(mol.AtomExists(a0) && mol.AtomExists(a2)) { + //Calculate theta using tCoords + theta = mol.GetTheta(a0, a1, a2); + } else { + //Calculate theta using bCoords + const XYZArray &coords = mol.GetBCoords(); + //Since data in bCoords in unwrap, no need to calc minImage + theta = geom::Theta(coords.Difference(a0, a1), coords.Difference(a2, a1)); + } return theta; } diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index d84441122..711ce21c1 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -75,7 +75,7 @@ class DCHedronCycle void FreeAnglesNew(TrialMol& newMol, uint molIndex, uint nTrials); void FreeAnglesOld(TrialMol& oldMol, uint molIndex, uint nTrials); void ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials); - //to calculate the angle in the ring from bCoords + //to calculate the angle in the ring from bCoords or tCoords a0-a1-a2 double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2); DCData* data; diff --git a/src/cbmc/DCLinkedCycle.h b/src/cbmc/DCLinkedCycle.h index 2cc2cc7b3..dcf401f15 100644 --- a/src/cbmc/DCLinkedCycle.h +++ b/src/cbmc/DCLinkedCycle.h @@ -49,6 +49,8 @@ class DCLinkedCycle : public DCComponent uint prevBonded[MAX_BONDS]; //kind[bonded][previous] uint dihKinds[MAX_BONDS][MAX_BONDS]; + //Used in finding the atom bonded to prev and focus and bith are in the ring + uint prevBondedRing, focBondedRing; //bond energy of built branch double bondEnergy; diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 94c373c02..3867b198d 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -169,12 +169,12 @@ double TrialMol::DistSq(const XYZ& a, const XYZ& b) return distSq; } -//!Return angle in radians between confirmed atoms a, b and c:w +//!Return angle in radians between confirmed atoms a-b-c double TrialMol::GetTheta(uint a, uint b, uint c) const { return geom::Theta( - axes->MinImage(tCoords.Difference(b, a), box), - axes->MinImage(tCoords.Difference(b, c), box)); + axes->MinImage(tCoords.Difference(a, b), box), + axes->MinImage(tCoords.Difference(c, b), box)); } void TrialMol::SetBasis(const uint p1, const uint p2, const uint p3) diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index edbf55cd0..197d64c56 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -87,7 +87,7 @@ class TrialMol static double PhiBetweenAngles(double theta1, double theta2, double interior); - //!Return angle in radians between confirmed atoms a, b and c + //!Return angle in radians between confirmed atoms a-b-c double GetTheta(uint a, uint b, uint c) const; //!Calculates theta and phi coords for atom in the current basis From 9e6907cd0996785d15841c6f7ce0a3aed8437a39 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 28 Aug 2018 16:54:19 -0400 Subject: [PATCH 113/199] Finished DCLinkedCycle class --- lib/FloydWarshallCycle.cpp | 22 ++--- lib/FloydWarshallCycle.h | 2 +- src/cbmc/DCCyclic.cpp | 2 +- src/cbmc/DCFreeCycle.cpp | 4 + src/cbmc/DCFreeCycleSeed.cpp | 4 + src/cbmc/DCFreeHedron.cpp | 4 + src/cbmc/DCFreeHedronSeed.cpp | 4 + src/cbmc/DCLinkedCycle.cpp | 165 +++++++++++++++++++++++++--------- src/cbmc/DCLinkedCycle.h | 12 ++- src/cbmc/DCLinkedHedron.cpp | 2 + src/cbmc/DCOnSphere.cpp | 2 + src/cbmc/TrialMol.cpp | 19 +++- src/cbmc/TrialMol.h | 74 ++++++++++++++- 13 files changed, 245 insertions(+), 71 deletions(-) diff --git a/lib/FloydWarshallCycle.cpp b/lib/FloydWarshallCycle.cpp index df4c28dd8..99f9fa455 100644 --- a/lib/FloydWarshallCycle.cpp +++ b/lib/FloydWarshallCycle.cpp @@ -66,34 +66,28 @@ std::vector< std::vector > FloydWarshallCycle::GetAllUniqueCycles() return getUniqueVectors(allCycles); } -std::vector< std::vector > FloydWarshallCycle::GetAllUniqueCyclesAndCommonCycles() +std::vector< std::vector > FloydWarshallCycle::GetAllCommonCycles() { std::vector< std::vector > uniqueCycles = GetAllUniqueCycles(); std::vector< std::vector > commons; int len = uniqueCycles.size(); - bool *visited = new bool[len]; + std::vector visited(len, false); + for (int i = 0; i < len; i++) { - visited[i] = false; - } - for (int i = 0; i < len-1; i++) { - std::vector combined(uniqueCycles[i]); - bool didCombine = false; if (!visited[i]) { + std::vector combined(uniqueCycles[i]); visited[i] = true; - for (int j = i; j < len; j++) { + for (int j = i+1; j < len; j++) { if (haveCommonElements(combined, uniqueCycles[j])) { combined = returnCombinedSet(combined, uniqueCycles[j]); - didCombine = true; + visited[j] = true; } } - } - if (didCombine) commons.push_back(combined); + } } - delete[] visited; - uniqueCycles.insert(uniqueCycles.end(), commons.begin(), commons.end()); - return uniqueCycles; + return commons; } void FloydWarshallCycle::floydWarshall() diff --git a/lib/FloydWarshallCycle.h b/lib/FloydWarshallCycle.h index 6e7a3bd65..336a5b533 100644 --- a/lib/FloydWarshallCycle.h +++ b/lib/FloydWarshallCycle.h @@ -19,7 +19,7 @@ class FloydWarshallCycle std::vector< std::vector > GetAllUniqueCycles(); - std::vector< std::vector > GetAllUniqueCyclesAndCommonCycles(); + std::vector< std::vector > GetAllCommonCycles(); private: // Number of nodes diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 531beb68c..a29f512ab 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -43,7 +43,7 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, ++bondCount[bond.a1]; fwc.AddEdge(bond.a0, bond.a1); } - cyclicAtoms = fwc.GetAllUniqueCyclesAndCommonCycles(); + cyclicAtoms = fwc.GetAllCommonCycles(); //Find the node (number of bound > 1) //Construct the starting node (DCFreeHedron or DCFreeCycle) diff --git a/src/cbmc/DCFreeCycle.cpp b/src/cbmc/DCFreeCycle.cpp index 60215b6fe..0b4a42bc2 100644 --- a/src/cbmc/DCFreeCycle.cpp +++ b/src/cbmc/DCFreeCycle.cpp @@ -159,9 +159,11 @@ void DCFreeCycle::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + newMol.AddBonds(hed.Bonded(b), hed.Focus()); } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.AddBonds(hed.Prev(), hed.Focus()); newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], @@ -239,9 +241,11 @@ void DCFreeCycle::BuildOld(TrialMol& oldMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.AddBonds(hed.Prev(), hed.Focus()); oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/DCFreeCycleSeed.cpp b/src/cbmc/DCFreeCycleSeed.cpp index d34685845..885319eb6 100644 --- a/src/cbmc/DCFreeCycleSeed.cpp +++ b/src/cbmc/DCFreeCycleSeed.cpp @@ -158,9 +158,11 @@ void DCFreeCycleSeed::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + newMol.AddBonds(hed.Bonded(b), hed.Focus()); } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.AddBonds(hed.Prev(), hed.Focus()); newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], @@ -238,9 +240,11 @@ void DCFreeCycleSeed::BuildOld(TrialMol& oldMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.AddBonds(hed.Prev(), hed.Focus()); oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/DCFreeHedron.cpp b/src/cbmc/DCFreeHedron.cpp index 4aab2e8d5..76f80e769 100644 --- a/src/cbmc/DCFreeHedron.cpp +++ b/src/cbmc/DCFreeHedron.cpp @@ -158,9 +158,11 @@ void DCFreeHedron::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + newMol.AddBonds(hed.Bonded(b), hed.Focus()); } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.AddBonds(hed.Prev(), hed.Focus()); newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], @@ -238,9 +240,11 @@ void DCFreeHedron::BuildOld(TrialMol& oldMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.AddBonds(hed.Prev(), hed.Focus()); oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/DCFreeHedronSeed.cpp b/src/cbmc/DCFreeHedronSeed.cpp index d4c90bcc6..5c073e6fe 100644 --- a/src/cbmc/DCFreeHedronSeed.cpp +++ b/src/cbmc/DCFreeHedronSeed.cpp @@ -157,9 +157,11 @@ void DCFreeHedronSeed::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + newMol.AddBonds(hed.Bonded(b), hed.Focus()); } newMol.AddAtom(hed.Prev(), positions[hed.NumBond()][winner]); + newMol.AddBonds(hed.Prev(), hed.Focus()); newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[winner], real[winner], @@ -237,9 +239,11 @@ void DCFreeHedronSeed::BuildOld(TrialMol& oldMol, uint molIndex) for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } oldMol.ConfirmOldAtom(hed.Prev()); + oldMol.AddBonds(hed.Prev(), hed.Focus()); oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(hed.GetEnergy() + bondEnergy, hed.GetNonBondedEn(), inter[0], real[0], 0.0, 0.0, 0.0)); diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index fcf01b2c1..e782e587b 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -51,17 +51,27 @@ DCLinkedCycle::DCLinkedCycle onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), onFocus.end()); //Find the atoms bonded to focus, except prev + focBondedRing = -1; for (uint i = 0; i < hed.NumBond(); ++i) { bondKinds[i] = onFocus[i].kind; + //store the dihedral that boded[i] and focus are in the middle + bondedFocusDih.push_back(DihsOnBond(kind, onFocus[i].a1, focus)); + if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { + focBondedRing = i; + } } + assert(focBondedRing != -1); vector onPrev = AtomBonds(kind, hed.Prev()); onPrev.erase(remove_if(onPrev.begin(), onPrev.end(), FindA1(hed.Focus())), onPrev.end()); nPrevBonds = onPrev.size(); - + prevBondedRing = -1; for(uint i = 0; i < nPrevBonds; ++i) { prevBonded[i] = onPrev[i].a1; + if(std::find(cycAtoms.begin(), cycAtoms.end(), onPrev[i].a1) != cycAtoms.end()) { + prevBondedRing = i; + } } vector dihs = DihsOnBond(kind, hed.Focus(), hed.Prev()); @@ -88,39 +98,13 @@ DCLinkedCycle::DCLinkedCycle } -void DCLinkedCycle::SetBasis(TrialMol& mol, uint p1, uint p2) +double DCLinkedCycle::CalcDih(TrialMol& mol, uint a0, uint a1, uint a2, uint a3) { - using namespace geom; - //W is unit vec of p1->p2 - XYZ wVec = mol.GetBCoords().Difference(p2, p1); - wVec.Normalize(); - XYZ uVec; - //check to make sure our W isn't in line with the standard X Axis - if (abs(wVec.x) < 0.8) { - //V will be W x the standard X unit vec - uVec = XYZ(1.0, 0.0, 0.0); - } else { - //V will be W x the standard Y unit vec - uVec = XYZ(0.0, 1.0, 0.0); - } - XYZ vVec = Cross(wVec, uVec); - vVec.Normalize(); - //U is unit vec perpendicular to both V and W - uVec = Cross(vVec, wVec); - growthToWorld.BasisRotation(uVec, vVec, wVec); - worldToGrowth = growthToWorld.Inverse(); - basisPoint = mol.GetBCoords().Get(p1); -} - -void DCLinkedCycle::OldThetaAndPhi(TrialMol& mol, const uint atom, - const uint lastAtom, - double& theta, double& phi) const -{ - XYZ diff = mol.GetBCoords().Difference(atom, lastAtom); - XYZ growthCoords = worldToGrowth.Apply(diff); - theta = acos(growthCoords.z / growthCoords.Length()); - phi = atan2(growthCoords.y, growthCoords.x); - return; + //Calculate the dihedral using bCoords + const XYZArray &coords = mol.GetBCoords(); + double phi = geom::Phi(coords.Difference(a1, a0), coords.Difference(a2, a1), + coords.Difference(a3, a2)); + return phi; } @@ -151,7 +135,12 @@ void DCLinkedCycle::PrepareOld(TrialMol& oldMol, uint molIndex) void DCLinkedCycle::SetBondLengthNew(TrialMol& newMol) { for(uint i = 0; i < hed.NumBond(); ++i) { - bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + if(newMol.AtomExists(hed.Bonded(i))) { + //if bonded[i] exist, we calculate the bond length + bondLength[i] = sqrt(newMol.OldDistSq(hed.Focus(), hed.Bonded(i))); + } else { + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } } //anchorBond is built, we need the actual length anchorBond = sqrt(newMol.OldDistSq(hed.Focus(), hed.Prev())); @@ -170,8 +159,6 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) PRNG& prng = data->prng; const CalculateEnergy& calc = data->calc; const Forcefield& ff = data->ff; - uint nLJTrials = data->nLJTrialsNth; - uint nDihTrials = data->nDihTrials; double* torsion = data->angles; double* torWeights = data->angleWeights; double* torEnergy = data->angleEnergy; @@ -183,6 +170,15 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) double* real = data->real; double* oneFour = data->oneFour; bool* overlap = data->overlap; + uint nDihTrials = data->nDihTrials; + uint nLJTrials; + if(prevBondedRing == -1) { + //we can perform trial + nLJTrials = data->nLJTrialsNth; + } else { + //it is in the body of ring, no trial + nLJTrials = 1; + } std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(bondedEn, nLJTrials, 0.0); @@ -235,9 +231,24 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) double stepWeight = EvalLJ(newMol, molIndex); uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + std::vector bExist(hed.NumBond(), false); + for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + if(newMol.BondsExist(hed.Bonded(b), hed.Focus())) { + bExist[b] = true; + } + newMol.AddBonds(hed.Bonded(b), hed.Focus()); + } + + //In ring, we will miss the dihedral for existed bonds + //Calculate the dihedral and 1-4 interaction for existed bonds + for(uint b = 0; b < hed.NumBond(); ++b) { + if(bExist[b]) { + CaclIntraEnergy(newMol, b, molIndex); + } } + newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(bondedEn[winner] + hed.GetEnergy() + bondEnergy, nonbonded[winner] + hed.GetNonBondedEn() + @@ -252,8 +263,6 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) PRNG& prng = data->prng; const CalculateEnergy& calc = data->calc; const Forcefield& ff = data->ff; - uint nLJTrials = data->nLJTrialsNth; - uint nDihTrials = data->nDihTrials; double* torsion = data->angles; double* torWeights = data->angleWeights; double* torEnergy = data->angleEnergy; @@ -265,6 +274,15 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) double* real = data->real; double* oneFour = data->oneFour; bool* overlap = data->overlap; + uint nDihTrials = data->nDihTrials; + uint nLJTrials; + if(prevBondedRing == -1) { + //we can perform trial + nLJTrials = data->nLJTrialsNth; + } else { + //it is in the body of ring, no trial + nLJTrials = 1; + } std::fill_n(ljWeights, nLJTrials, 0.0); std::fill_n(bondedEn, nLJTrials, 0.0); @@ -317,11 +335,16 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) } ljWeights[0] = 0.0; for (uint tor = 0; tor < nDihTrials; ++tor) { - torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + if(prevBondedRing == -1) { + torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + } else { + torsion[tor] = 0.0; + } torEnergy[tor] = 0.0; nonbonded_1_4[tor] = 0.0; for (uint b = 0; b < hed.NumBond(); ++b) { double theta1 = hed.Theta(b); + double trialPhi; double trialPhi = hed.Phi(b) + torsion[tor]; XYZ bondedC; if(oldMol.OneFour()) { @@ -355,9 +378,24 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) data->axes.WrapPBC(positions[b], oldMol.GetBox()); } double stepWeight = EvalLJ(oldMol, molIndex); + std::vector bExist(hed.NumBond(), false); + for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + if(oldMol.BondsExist(hed.Bonded(b), hed.Focus())) { + bExist[b] = true; + } + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } + + //In ring, we will miss the dihedral for existed bonds + //Calculate the dihedral and 1-4 interaction for existed bonds + for(uint b = 0; b < hed.NumBond(); ++b) { + if(bExist[b]) { + CaclIntraEnergy(oldMol, b, molIndex); + } + } + oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(bondedEn[0] + hed.GetEnergy() + bondEnergy, nonbonded[0] + hed.GetNonBondedEn() + oneFour[0], @@ -369,15 +407,22 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) double DCLinkedCycle::EvalLJ(TrialMol& mol, uint molIndex) { - uint nLJTrials = data->nLJTrialsNth; double* inter = data->inter; double* nonbonded = data->nonbonded; double* real = data->real; bool* overlap = data->overlap; XYZArray* positions = data->multiPositions; + uint nLJTrials; + if(prevBondedRing == -1) { + //we can perform trial + nLJTrials = data->nLJTrialsNth; + } else { + //it is in the body of ring, no trial + nLJTrials = 1; + } - std::fill_n(data->inter, nLJTrials, 0.0); - std::fill_n(data->nonbonded, nLJTrials, 0.0); + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); std::fill_n(real, nLJTrials, 0.0); for (uint b = 0; b < hed.NumBond(); ++b) { @@ -415,9 +460,21 @@ void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, std::fill_n(nonbonded_1_4, data->nDihTrials, 0.0); const XYZ center = mol.AtomPosition(hed.Focus()); + double torDiff = 0.0; + if(prevBondedRing != -1) { + //calculate dihedral in ring using bCoords + double phi = CalcDih(mol, hed.Bonded(focBondedRing), hed.Focus(), hed.Prev(), + prevBonded[prevBondedRing]); + // find the torsion that give the same dihedral in the ring + torDiff = phi - (hed.Phi(hed.Bonded(focBondedRing)) - prevPhi[prevBondedRing]); + } //select torsion based on all dihedral angles for (uint tor = 0; tor < nDihTrials; ++tor) { - torsion[tor] = data->prng.rand(M_PI * 2); + if(prevBondedRing != -1) { + torsion[tor] = torDiff; + } else { + torsion[tor] = data->prng.rand(M_PI * 2); + } torEnergy[tor] = 0.0; nonbonded_1_4[tor] = 0.0; for (uint b = 0; b < hed.NumBond(); ++b) { @@ -449,5 +506,27 @@ void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, } } +void DCLinkedCycle::CaclIntraEnergy(TrialMol& mol, const uint bIdx, const uint molIndex) +{ + double dihEnergy = 0.0; + double nonBondedEn = 0.0; + uint size = bondedFocusDih[bIdx].size(); + const std::vector &dih = bondedFocusDih[bIdx]; + for(uint d = 0; d < size; d++) { + //We know that a1(bonded[i]) and a2(focus) already exist + if(mol.AtomExists(dih[d].a0) && mol.AtomExists(dih[d].a3)) { + double phi = mol.GetPhi(dih[d].a0, dih[d].a1, dih[d].a2, dih[d].a3); + dihEnergy += data->ff.dihedrals.Calc(dih[d].kind, phi); + if(mol.OneFour()) { + double distSq = mol.DistSq(mol.AtomPosition(dih[d].a0), mol.AtomPosition(dih[d].a3)); + nonBondedEn += data->calc.IntraEnergy_1_4(distSq, dih[d].a0, dih[d].a3, molIndex); + } + } + } + double weight = exp(-1.0 * data->ff.beta * (dihEnergy + nonBondedEn)); + mol.MultWeight(weight); + mol.AddEnergy(Energy(dihEnergy, nonBondedEn, 0.0, 0.0, 0.0, 0.0, 0.0)); +} + } diff --git a/src/cbmc/DCLinkedCycle.h b/src/cbmc/DCLinkedCycle.h index dcf401f15..4a67472d8 100644 --- a/src/cbmc/DCLinkedCycle.h +++ b/src/cbmc/DCLinkedCycle.h @@ -40,9 +40,10 @@ class DCLinkedCycle : public DCComponent void ChooseTorsion(TrialMol& mol, uint molIndex, double prevPhi[], RotationMatrix& cross, RotationMatrix& tensor); double EvalLJ(TrialMol& mol, uint molIndex); - void SetBasis(TrialMol& mol, uint p1, uint p2); - void OldThetaAndPhi(TrialMol& mol, const uint atom, const uint lastAtom, - double& theta, double& phi) const; + //Calculate the dihedral using bCoords + double CalcDih(TrialMol& mol, uint a0, uint a1, uint a2, uint a3); + void CaclIntraEnergy(TrialMol& mol, const uint bIdx, const uint molIndex); + DCData* data; DCHedronCycle hed; uint nPrevBonds; @@ -61,10 +62,7 @@ class DCLinkedCycle : public DCComponent double bondLengthOld[MAX_BONDS]; //bondKind between bonded[i] and focus uint bondKinds[MAX_BONDS]; - //To find the theta and phi in bCoords - RotationMatrix growthToWorld; - RotationMatrix worldToGrowth; - XYZ basisPoint; + std::vector< std::vector > bondedFocusDih; }; } #endif diff --git a/src/cbmc/DCLinkedHedron.cpp b/src/cbmc/DCLinkedHedron.cpp index 4eadd2873..56f1b72b0 100644 --- a/src/cbmc/DCLinkedHedron.cpp +++ b/src/cbmc/DCLinkedHedron.cpp @@ -199,6 +199,7 @@ void DCLinkedHedron::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + newMol.AddBonds(hed.Bonded(b), hed.Focus()); } newMol.UpdateOverlap(overlap[winner]); newMol.AddEnergy(Energy(bondedEn[winner] + hed.GetEnergy() + bondEnergy, @@ -319,6 +320,7 @@ void DCLinkedHedron::BuildOld(TrialMol& oldMol, uint molIndex) double stepWeight = EvalLJ(oldMol, molIndex); for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); + oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } oldMol.UpdateOverlap(overlap[0]); oldMol.AddEnergy(Energy(bondedEn[0] + hed.GetEnergy() + bondEnergy, diff --git a/src/cbmc/DCOnSphere.cpp b/src/cbmc/DCOnSphere.cpp index 3ce6dbe69..2b007b99e 100644 --- a/src/cbmc/DCOnSphere.cpp +++ b/src/cbmc/DCOnSphere.cpp @@ -88,6 +88,7 @@ void DCOnSphere::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(bondEnergy, 0.0, inter[0], real[0], 0.0, 0.0, 0.0)); oldMol.ConfirmOldAtom(atom); + oldMol.AddBonds(atom, focus); } void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) @@ -127,5 +128,6 @@ void DCOnSphere::BuildNew(TrialMol& newMol, uint molIndex) newMol.AddEnergy(Energy(bondEnergy, 0, inter[winner], real[winner], 0.0, 0.0, 0.0)); newMol.AddAtom(atom, positions[winner]); + newMol.AddBonds(atom, focus); } } diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 3867b198d..8f340f8ba 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -26,7 +26,7 @@ namespace cbmc TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, uint box) : kind(&k), axes(&ax), box(box), tCoords(k.NumAtoms()), cavMatrix(3), - totalWeight(1.0), bCoords(k.NumAtoms()) + totalWeight(1.0), bCoords(k.NumAtoms()), bonds(k.bondList) { atomBuilt = new bool[k.NumAtoms()]; std::fill_n(atomBuilt, k.NumAtoms(), false); @@ -43,7 +43,7 @@ TrialMol::TrialMol(const MoleculeKind& k, const BoxDimensions& ax, TrialMol::TrialMol() : kind(NULL), axes(NULL), box(0), tCoords(0), atomBuilt(NULL), comInCav(false), comFix(false), rotateBB(false), overlap(false), - cavMatrix(3), bCoords(0) + cavMatrix(3), bCoords(0), bonds() { cavMatrix.Set(0, 1.0, 0.0, 0.0); cavMatrix.Set(1, 0.0, 1.0, 0.0); @@ -54,10 +54,11 @@ TrialMol::TrialMol(const TrialMol& other) : kind(other.kind), axes(other.axes), box(other.box), tCoords(other.tCoords), cavMatrix(other.cavMatrix), en(other.en), bCoords(other.bCoords), totalWeight(other.totalWeight), - basisPoint(other.basisPoint) + basisPoint(other.basisPoint), bonds(other.bonds) { atomBuilt = new bool[kind->NumAtoms()]; std::copy(other.atomBuilt, other.atomBuilt + kind->NumAtoms(), atomBuilt); + bonds.Unset(); comInCav = false; comFix = false; rotateBB = false; @@ -86,6 +87,9 @@ void swap(TrialMol& a, TrialMol& b) swap(a.atomBuilt, b.atomBuilt); swap(a.growthToWorld, b.growthToWorld); swap(a.worldToGrowth, b.worldToGrowth); + swap(a.bonds, b.bonds); + a.bonds.Unset(); + b.bonds.Unset(); a.comInCav = false; b.comInCav = false; a.comFix = false; @@ -177,6 +181,15 @@ double TrialMol::GetTheta(uint a, uint b, uint c) const axes->MinImage(tCoords.Difference(c, b), box)); } +//!Return dihedral in radians between confirmed atoms a-b-c-d +double TrialMol::GetPhi(uint a, uint b, uint c, uint d) const +{ + return geom::Phi( + axes->MinImage(tCoords.Difference(b, a), box), + axes->MinImage(tCoords.Difference(c, b), box), + axes->MinImage(tCoords.Difference(d, c), box)); +} + void TrialMol::SetBasis(const uint p1, const uint p2, const uint p3) { using namespace geom; diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 197d64c56..0d76cb3ee 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -21,6 +21,68 @@ class CalculateEnergy; //! Class for keeping track of part-built molecules during CBMC namespace cbmc { +struct Bonds +{ + public: + Bonds(const BondList &bList) + { + for(uint b = 0; b < bList.count; b++) { + a0.push_back(bList.part1[b]); + a1.push_back(bList.part2[b]); + kind.push_back(bList.kinds[b]); + bondExist.push_back(false); + count = bList.count; + } + } + + Bonds() + { + count = 0; + } + + Bonds(const Bonds& other) + { + a0 = other.a0; + a1 = other.a1; + kind = other.kind; + bondExist = other.bondExist; + count = other.count; + } + + void AddBond(const uint p0, const uint p1) + { + for(uint b = 0; b < count; b++) { + if(a0[b] == p0 && a1[b] == p1) { + bondExist[b] = true; + } else if(a0[b] == p1 && a1[b] == p0) { + bondExist[b] = true; + } + } + } + + bool BondExist(const uint p0, const uint p1) + { + for(uint b = 0; b < count; b++) { + if(a0[b] == p0 && a1[b] == p1) { + return bondExist[b]; + } else if(a0[b] == p1 && a1[b] == p0) { + return bondExist[b]; + } + } + //We should not reach here + return false; + } + + void Unset() + { + std::fill(bondExist.begin(), bondExist.end(), false); + } + + private: + std::vector a0, a1, kind; + std::vector bondExist; + uint count; +}; class TrialMol { @@ -90,6 +152,9 @@ class TrialMol //!Return angle in radians between confirmed atoms a-b-c double GetTheta(uint a, uint b, uint c) const; + //!Return dihedral in radians between confirmed atoms a-b-c-d + double GetPhi(uint a, uint b, uint c, uint d) const; + //!Calculates theta and phi coords for atom in the current basis //!centered on lastAtom. theta in [0, pi], phi in (-pi, pi] void OldThetaAndPhi(uint atom, uint lastAtom, @@ -196,7 +261,11 @@ class TrialMol XYZ GetCavity() const {return cavity;} //return unwrap com of tcoords so tcoords must be set XYZ GetCOM(); - uint GetAtomBB(const uint i) const { return backbone[i];} + uint GetAtomBB(const uint i) const {return backbone[i];} + //set built bond to true + void AddBonds(const uint p0, const uint p1) {bonds.AddBond(p0, p1);} + //check to see if bond exist or not + bool BondsExist(const uint p0, const uint p1) { return bonds.BondExist(p0, p1);} ~TrialMol(); @@ -218,7 +287,8 @@ class TrialMol bool comInCav, comFix, rotateBB; bool overlap; bool* atomBuilt; - + //To check the status of built bonds + Bonds bonds; }; } From 656550a0c8edf374ede56669369e2dca915d183a Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 28 Aug 2018 18:18:54 -0400 Subject: [PATCH 114/199] Finish DCCycle class and functions --- src/cbmc/DCCyclic.cpp | 425 ++++++++++++++++++++++++++++++++++--- src/cbmc/DCCyclic.h | 2 + src/cbmc/DCGraph.h | 1 + src/cbmc/DCLinkedCycle.cpp | 3 +- src/cbmc/TrialMol.cpp | 5 + src/cbmc/TrialMol.h | 5 +- 6 files changed, 404 insertions(+), 37 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index a29f512ab..b6ddd9903 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -31,6 +31,9 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, idExchange = new DCRotateCOM(&data, setupKind); + //init the coordinate + coords.Init(setupKind.atoms.size()); + std::vector atomToNode(setupKind.atoms.size(), 0); std::vector bondCount(setupKind.atoms.size(), 0); isRing.resize(setupKind.atoms.size(), false); @@ -44,6 +47,23 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, fwc.AddEdge(bond.a0, bond.a1); } cyclicAtoms = fwc.GetAllCommonCycles(); + //Find the ringindex that each atom belongs to + for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { + if (bondCount[atom] < 2) { + atomToNode[atom] = -1; + isRing[atom] = false; + ringIdx[atom] = -1; + } else { + for (uint i = 0; i < cyclicAtoms.size(); i++) { + if (std::find(cyclicAtoms[i].begin(), cyclicAtoms[i].end(), atom) + != cyclicAtoms[i].end()) { + isRing[atom] = true; + ringIdx[atom] = i; + break; + } + } + } + } //Find the node (number of bound > 1) //Construct the starting node (DCFreeHedron or DCFreeCycle) @@ -51,8 +71,6 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { if (bondCount[atom] < 2) { atomToNode[atom] = -1; - isRing[atom] = false; - ringIdx[atom] = -1; } else { //Get the information of other Atoms that are bonded to the atom std::vector bonds = AtomBonds(setupKind, atom); @@ -61,14 +79,7 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, // the first partner of the atom nodes.push_back(Node()); Node& node = nodes.back(); - for (uint i = 0; i < cyclicAtoms.size(); i++) { - if (std::find(cyclicAtoms[i].begin(), cyclicAtoms[i].end(), atom) - != cyclicAtoms[i].end()) { - isRing[atom] = true; - ringIdx[atom] = i; - break; - } - } + //Check if the node belong to a ring or not if(isRing[atom]) { //Atoms bonded to atom will be build from focus (atom) in random loc. @@ -96,25 +107,13 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, if(bondCount[partner] == 1) { continue; } - - //Check to see if the partner belongs to a ring or not - bool ring = false; - uint ringIndex = -1; - for (uint i = 0; i < cyclicAtoms.size(); i++) { - if (std::find(cyclicAtoms[i].begin(), cyclicAtoms[i].end(), partner) - != cyclicAtoms[i].end()) { - ring = true; - ringIndex = i; - break; - } - } - if (ring) { + if(isRing[atom]) { //Add partner to the edge list of node and initialize it with partner //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle //Atoms will be build from prev(atom) to focus(partner) - Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIndex], - partner,atom)); + Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], + partner, atom)); node.edges.push_back(e); } else { //Add partner to the edge list of node and initialize it with partner @@ -174,17 +173,17 @@ void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) //Check to see if atoms that are bonded to a1 belongs to same ring or not bool sameRing = false; if(isRing[a1]) { - //FInd the atoms that are bonded to a1 - vector bonds = AtomBonds(kind, a1); - for(uint b = 0; b < bonds.size(); b++) { - uint partner = bonds[b].a1; - if((partner == a0) || (partner == a2)) { - continue; - } - if(isRing[partner]) { - sameRing |= (ringIdx[a1] == ringIdx[partner]); - } + //FInd the atoms that are bonded to a1 + vector bonds = AtomBonds(kind, a1); + for(uint b = 0; b < bonds.size(); b++) { + uint partner = bonds[b].a1; + if((partner == a0) || (partner == a2)) { + continue; + } + if(isRing[partner]) { + sameRing |= (ringIdx[a1] == ringIdx[partner]); } + } } //If there was no fix angles and atom a1 and any atom bonded to a1 are not @@ -223,6 +222,12 @@ void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) void DCCyclic::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { + //Set bCoords to unwrap coordinate of actual molecule + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + oldMol.GetAxes().UnwrapPBC(coords, oldMol.GetBox(), oldMol.AtomPosition(0)); + oldMol.SetBCoords(coords, 0); + newMol.SetBCoords(coords, 0); + //Randomely pick a node to call DCFreeHedron on it uint current = data.prng.randIntExc(nodes.size()); visited.assign(nodes.size(), false); @@ -273,6 +278,127 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, } } +void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) +{ + //check if we want to grow all atoms from node's focus or not + bool growAll = data.prng() < 1.0 / nodes.size(); + + //Randomely pick a node to keep it fix and not grow it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + //Copy the current node's focus coordinate + uint seedInx = nodes[current].atomIndex; + + if(isRing[seedInx] && !growAll) { + //if selected node was part of ring and we did not grow all, perform crankshaft + return CrankShaft(oldMol, newMol, molIndex); + } + + //Set bCoords to unwrap coordinate of actual molecule + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + oldMol.GetAxes().UnwrapPBC(coords, oldMol.GetBox(), oldMol.AtomPosition(0)); + oldMol.SetBCoords(coords, 0); + newMol.SetBCoords(coords, 0); + + newMol.AddAtom(seedInx, oldMol.AtomPosition(seedInx)); + oldMol.ConfirmOldAtom(seedInx); + if(growAll) { + DCComponent* comp = nodes[current].restarting; + //Call DCFreeHedronSeed to build all Atoms connected to the node's focus + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Build all edges + BuildEdges(oldMol, newMol, molIndex, current); + } else { + //Copy the all atoms bonded to node's focus + for(uint b = 0; b < nodes[current].partnerIndex.size(); b++) { + uint partner = nodes[current].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + + if(nodes[current].edges.size() == 1) { + //If current is the terminal node, continue building all edges + BuildEdges(oldMol, newMol, molIndex, current); + } else { + //First we pick a edge and continue copying the coordinate + //Then continue to build the rest of the molecule from current + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //randomely pick one one of the edges connected to fixNode + uint pickFixEdg = data.prng.randIntExc(fringe.size()); + //Travel to picked edges and make it as new fixNode + uint fixNode = fringe[pickFixEdg].destination; + visited[fixNode] = true; + //Copy the all atoms bonded to fixNode's focus + for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { + uint partner = nodes[fixNode].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + //Copy the edges of the new node to fringe + fringe = nodes[fixNode].edges; + //remove the edge that we travelled from + for( uint f = 0; f < fringe.size(); f++) { + if(fringe[f].destination == current) + fringe.erase(fringe.begin() + f); + } + //Continue along picked edges and copy the coordinates + while(!fringe.empty()) { + fixNode = fringe[0].destination; + //Copy the all atoms bonded to fixNode's focus + for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { + uint partner = nodes[fixNode].partnerIndex[b]; + newMol.AddAtom(partner, oldMol.AtomPosition(partner)); + oldMol.ConfirmOldAtom(partner); + } + //Travel to new fixNode, remove traversed edge + fringe[0] = fringe.back(); + fringe.pop_back(); + visited[fixNode] = true; + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[fixNode].edges.size(); ++i) { + Edge& e = nodes[fixNode].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } + //Now Start building the rest of the molecule from current + //Copy the edges of the current node to fringe + fringe = nodes[current].edges; + //Remove the fixed edge from fringe + fringe.erase(fringe.begin() + pickFixEdg); + //Advance along edges, building as we go + while(!fringe.empty()) { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + visited[current] = true; + for(uint i = 0; i < nodes[current].edges.size(); ++i) { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) { + fringe.push_back(e); + } + } + } + } + } +} + void DCCyclic::BuildIDNew(TrialMol& newMol, uint molIndex) { idExchange->PrepareNew(newMol, molIndex); @@ -285,6 +411,235 @@ void DCCyclic::BuildIDOld(TrialMol& oldMol, uint molIndex) idExchange->BuildOld(oldMol, molIndex); } +void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) +{ + //Set bCoords to unwrap coordinate of actual molecule + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + //No need to unwrap since the copied coordinates are unwraped + oldMol.SetBCoords(coords, 0); + + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) +{ + //Set bCoords to unwrap coordinate of actual molecule + newMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + //No need to unwrap since copied coordinates are unwraped + newMol.SetBCoords(coords, 0); + + //Randomely pick a node to call DCFreeHedron on it + uint current = data.prng.randIntExc(nodes.size()); + visited.assign(nodes.size(), false); + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + +void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) +{ + //Set bCoords to unwrap coordinate of actual molecule + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + //No need to unwrap since copied coordinate is unwraped + oldMol.SetBCoords(coords, 0); + + visited.assign(nodes.size(), false); + //Use backbone atom to start the node + uint current = -1; + for(uint i = 0; i < nodes.size(); i++) { + if(nodes[i].atomIndex == oldMol.GetAtomBB(0)) { + current = i; + break; + } + } + + if(current == -1) { + std::cout << "Error: In MEMC-3 move, atom " << oldMol.GetKind().atomNames[oldMol.GetAtomBB(0)]<< + " in " << oldMol.GetKind().name << " must be a node.\n"; + std::cout << " This atom must be bounded to two or more atoms! \n"; + exit(1); + } + + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareOld(oldMol, molIndex); + comp->BuildOld(oldMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + + +void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) +{ + //Set bCoords to unwrap coordinate of actual molecule + newMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + //No need to unwrap since copied coordinate is unwraped + newMol.SetBCoords(coords, 0); + + visited.assign(nodes.size(), false); + //Use backbone atom to start the node + uint current = -1; + for(uint i = 0; i < nodes.size(); i++) { + if(nodes[i].atomIndex == newMol.GetAtomBB(0)) { + current = i; + break; + } + } + + if(current == -1) { + std::cout << "Error: In MEMC-3 move, atom " << newMol.GetKind().atomNames[newMol.GetAtomBB(0)]<< + " in " << newMol.GetKind().name << " must be a node.\n"; + std::cout << " This atom must be bounded to two or more atoms! \n"; + exit(1); + } + + //Visiting the node + visited[current] = true; + DCComponent* comp = nodes[current].starting; + //Call DCFreeHedron to build all Atoms connected to the node + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + //Advance along edges, building as we go + //Copy the edges of the node to fringe + fringe = nodes[current].edges; + //Advance along edges, building as we go + while(!fringe.empty()) + { + //Randomely pick one of the edges connected to node + uint pick = data.prng.randIntExc(fringe.size()); + DCComponent* comp = fringe[pick].connect; + //Call DCLinkedHedron and build all Atoms connected to selected edge + comp->PrepareNew(newMol, molIndex); + comp->BuildNew(newMol, molIndex); + + //Travel to new node, remove traversed edge + //Current node is the edge that we picked + current = fringe[pick].destination; + //Remove the edge that we visited + fringe[pick] = fringe.back(); + fringe.pop_back(); + //Visiting the node + visited[current] = true; + + //Add edges to unvisited nodes + for(uint i = 0; i < nodes[current].edges.size(); ++i) + { + Edge& e = nodes[current].edges[i]; + if(!visited[e.destination]) + { + fringe.push_back(e); + } + } + } +} + DCCyclic::~DCCyclic() { delete idExchange; diff --git a/src/cbmc/DCCyclic.h b/src/cbmc/DCCyclic.h index ba2506798..a28f84dac 100644 --- a/src/cbmc/DCCyclic.h +++ b/src/cbmc/DCCyclic.h @@ -37,6 +37,7 @@ class DCCyclic : public CBMC void CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, const uint current); + //Used in MEMC moves void BuildIDNew(TrialMol& newMol, uint molIndex); void BuildIDOld(TrialMol& oldMol, uint molIndex); void BuildNew(TrialMol& newMol, uint molIndex); @@ -81,6 +82,7 @@ class DCCyclic : public CBMC std::vector visited; std::vector crankshaft; std::vector< std::vector > cyclicAtoms; + XYZArray coords; }; } diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index edf73dae6..655858b06 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -36,6 +36,7 @@ class DCGraph : public CBMC void CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex); void BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, const uint current); + //used in MEMC moves void BuildIDNew(TrialMol& newMol, uint molIndex); void BuildIDOld(TrialMol& oldMol, uint molIndex); void BuildNew(TrialMol& newMol, uint molIndex); diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index e782e587b..264e64503 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -333,8 +333,10 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) positions[b].Add(lj, center); } } + //for actual atom position, we perform nDihTrials - 1 dihedral trial ljWeights[0] = 0.0; for (uint tor = 0; tor < nDihTrials; ++tor) { + //No trial torsion if it is not free end if(prevBondedRing == -1) { torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); } else { @@ -344,7 +346,6 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) nonbonded_1_4[tor] = 0.0; for (uint b = 0; b < hed.NumBond(); ++b) { double theta1 = hed.Theta(b); - double trialPhi; double trialPhi = hed.Phi(b) + torsion[tor]; XYZ bondedC; if(oldMol.OneFour()) { diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 8f340f8ba..145e5366f 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -265,6 +265,11 @@ void TrialMol::SetCoords(const XYZArray& coords, uint start) coords.CopyRange(tCoords, start, 0, tCoords.Count()); } +void TrialMol::SetBCoords(const XYZArray& coords, uint start) +{ + coords.CopyRange(bCoords, start, 0, bCoords.Count()); +} + double TrialMol::AngleDist(const double b1, const double b2, const double theta) { if(!kind->oneThree) diff --git a/src/cbmc/TrialMol.h b/src/cbmc/TrialMol.h index 0d76cb3ee..810133fc3 100644 --- a/src/cbmc/TrialMol.h +++ b/src/cbmc/TrialMol.h @@ -227,9 +227,12 @@ class TrialMol return tCoords.Get(atom); } - //!Copies 1 molecule's worth of coordinates from coords[start] onwards + //!Copies 1 molecule's worth of coordinates from coords[start] onwards to tCoords void SetCoords(const XYZArray& coords, uint start); + //!Copies 1 molecule's worth of coordinates from coords[start] onwards to bCoords + void SetBCoords(const XYZArray& coords, uint start); + bool AtomExists(uint index) const { return atomBuilt[index]; From 7f99a435d8da53e64adc29aaa5e69617dd1abbee Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 10:11:36 -0400 Subject: [PATCH 115/199] Avoid double calculating energy for existed atom --- src/cbmc/DCLinkedCycle.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index 264e64503..ada4d17fa 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -427,6 +427,10 @@ double DCLinkedCycle::EvalLJ(TrialMol& mol, uint molIndex) std::fill_n(real, nLJTrials, 0.0); for (uint b = 0; b < hed.NumBond(); ++b) { + //Avoid double calculating energy for existed atom + if(mol.AtomExists(hed.Bonded(b))) { + continue; + } data->calc.ParticleInter(inter, real, positions[b], overlap, hed.Bonded(b), molIndex, mol.GetBox(), nLJTrials); From 991921ad847024b9518be8ff50a7b584aa69774e Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 13:44:36 -0400 Subject: [PATCH 116/199] Change the logic to use fix angle or angles in the ring --- src/cbmc/DCCyclic.cpp | 13 ++- src/cbmc/DCHedron.cpp | 129 ++++++++++++-------------- src/cbmc/DCHedronCycle.cpp | 185 ++++++++++++++++--------------------- 3 files changed, 152 insertions(+), 175 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index b6ddd9903..e28dd49f1 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -82,12 +82,21 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, //Check if the node belong to a ring or not if(isRing[atom]) { + uint prev = -1; + for(uint i = 0; i < bonds.size(); i++) { + //Use one of the atoms that is in the ring as prev + if(isRing[bonds[i].a1]) { + prev = bonds[i].a1; + break; + } + } + assert(prev != -1); //Atoms bonded to atom will be build from focus (atom) in random loc. node.starting = new DCFreeCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], - atom, bonds[0].a1); + atom, prev); //Atoms bonded to atom will be build from focus (atom) in specified loc. node.restarting = new DCFreeCycleSeed(&data, setupKind, cyclicAtoms[ringIdx[atom]], - atom, bonds[0].a1); + atom, prev); } else { //Atoms bonded to atom will be build from focus (atom) in random loc. node.starting = new DCFreeHedron(&data, setupKind, atom, diff --git a/src/cbmc/DCHedron.cpp b/src/cbmc/DCHedron.cpp index c7486cda2..3f00b16ab 100644 --- a/src/cbmc/DCHedron.cpp +++ b/src/cbmc/DCHedron.cpp @@ -275,15 +275,34 @@ void DCHedron::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials) double* energies = data->angleEnergy; double* weights = data->angleWeights; double* nonbonded_1_3 = data->nonbonded_1_3; - std::fill_n(nonbonded_1_3, nTrials, 0.0); phi[0] = 0.0; for (uint b = 1; b < nBonds; ++b) { + std::fill_n(energies, nTrials, 0.0); + std::fill_n(nonbonded_1_3, nTrials, 0.0); //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { angles[i] = data->prng.rand(M_PI * 2); - energies[i] = 0.0; - nonbonded_1_3[i] = 0.0; + } + + //modify the twist angle if it was fixed + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + if (data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } } //compare to angles determined in previous iterations @@ -292,39 +311,11 @@ void DCHedron::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials) double sinTerm = sin(theta[b]) * sin(theta[c]); for (uint i = 0; i < nTrials; ++i) { - if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { - double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + - cosTerm); - double distSq = newMol.AngleDist(bondLength[b], bondLength[c], - bfcTheta); - double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], - molIndex); - - nonbonded_1_3[i] += tempEn; - energies[i] += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - } else { - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - angles[i] = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = newMol.AngleDist(bondLength[b], bondLength[c], - bfcTheta); - double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], - molIndex); - - nonbonded_1_3[i] += tempEn; - energies[i] += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles[i]) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } + double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + cosTerm); + double distSq = newMol.AngleDist(bondLength[b], bondLength[c], bfcTheta); + double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], bonded[c], molIndex); + nonbonded_1_3[i] += tempEn; + energies[i] += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); } } @@ -353,49 +344,49 @@ void DCHedron::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials) void DCHedron::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, uint molIndex) { + double* angles = data->angles; IncorporateOld(oldMol, molIndex); for (uint b = 1; b < nBonds; ++b) { double stepWeight = 0.0; + //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - double angles = data->prng.rand(M_PI * 2); + angles[i] = data->prng.rand(M_PI * 2); + } + + //modify the twist angle if it was fixed + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + if (data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } + } + + for (uint i = 0; i < nTrials; ++i) { double energies = 0.0; double nonbondedEng = 0.0; //compare to angles determined in previous iterations for (uint c = 0; c < b; ++c) { - if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { - double cosTerm = cos(theta[b]) * cos(theta[c]); - double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcTheta = acos(sinTerm * cos(angles - phi[c]) - + cosTerm); - double distSq = oldMol.AngleDist(bondLengthOld[b], - bondLengthOld[c], bfcTheta); - nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], molIndex); - - energies += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); - } else { - double cosTerm = cos(theta[b]) * cos(theta[c]); - double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - angles = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = oldMol.AngleDist(bondLengthOld[b], - bondLengthOld[c], bfcTheta); - nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], molIndex); - - energies += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + cosTerm); + double distSq = oldMol.AngleDist(bondLengthOld[b], bondLengthOld[c], bfcTheta); + nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], bonded[c], molIndex); + energies += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); } //calculate weights from combined energy diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index d230cb01e..c1ea4fac0 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -334,76 +334,60 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double* energies = data->angleEnergy; double* weights = data->angleWeights; double* nonbonded_1_3 = data->nonbonded_1_3; - std::fill_n(nonbonded_1_3, nTrials, 0.0); phi[0] = 0.0; for (uint b = 1; b < nBonds; ++b) { + std::fill_n(energies, nTrials, 0.0); + std::fill_n(nonbonded_1_3, nTrials, 0.0); //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { angles[i] = data->prng.rand(M_PI * 2); - energies[i] = 0.0; - nonbonded_1_3[i] = 0.0; } + //modify the twist angle if it was fixed or was part of ring + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + if(angleInRing[b][c]) { + double bfcTheta = CalcTheta(newMol, bonded[b], focus, bonded[c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring with flexible angle for " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } + } + + //compare to angles determined in previous iterations for (uint c = 0; c < b; ++c) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); for (uint i = 0; i < nTrials; ++i) { - if(angleInRing[b][c]) { - double bfcTheta = CalcTheta(newMol, bonded[b], focus, bonded[c]); - angles[i] = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = newMol.AngleDist(bondLength[b], bondLength[c], - bfcTheta); - double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], - molIndex); - - nonbonded_1_3[i] += tempEn; - energies[i] += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles[i]) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring with flexible angle for " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } else if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { - double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + - cosTerm); - double distSq = newMol.AngleDist(bondLength[b], bondLength[c], - bfcTheta); - double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], - molIndex); - - nonbonded_1_3[i] += tempEn; - energies[i] += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - } else { - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - angles[i] = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = newMol.AngleDist(bondLength[b], bondLength[c], - bfcTheta); - double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], - molIndex); - - nonbonded_1_3[i] += tempEn; - energies[i] += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles[i]) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } + double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + cosTerm); + double distSq = newMol.AngleDist(bondLength[b], bondLength[c], bfcTheta); + double tempEn = data->calc.IntraEnergy_1_3(distSq, bonded[b], bonded[c], molIndex); + nonbonded_1_3[i] += tempEn; + energies[i] += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); } } @@ -432,13 +416,49 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, uint molIndex) { + double* angles = data->angles; IncorporateOld(oldMol, molIndex); for (uint b = 1; b < nBonds; ++b) { double stepWeight = 0.0; //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - double angles = data->prng.rand(M_PI * 2); + angles[i] = data->prng.rand(M_PI * 2); + } + + //modify the twist angle if it was fixed or was part of ring + for (uint c = 0; c < b; ++c) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); + + if(angleInRing[b][c]) { + double bfcTheta = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring with flexible angle for " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { + double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); + double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot constrain fix angle for " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + break; + } + } + + for (uint i = 0; i < nTrials; ++i) { double energies = 0.0; double nonbondedEng = 0.0; //compare to angles determined in previous iterations @@ -446,54 +466,11 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - if(angleInRing[b][c]) { - double bfcTheta = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - angles = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = oldMol.AngleDist(bondLengthOld[b], - bondLengthOld[c], bfcTheta); - nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], molIndex); - - energies += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring with flexible angle for " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } else if(!data->ff.angles->AngleFixed(angleKinds[b][c])) { - double bfcTheta = acos(sinTerm * cos(angles - phi[c]) - + cosTerm); - double distSq = oldMol.AngleDist(bondLengthOld[b], - bondLengthOld[c], bfcTheta); - nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], molIndex); - - energies += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); - } else { - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - angles = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - double distSq = oldMol.AngleDist(bondLengthOld[b], - bondLengthOld[c], bfcTheta); - nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], - bonded[c], molIndex); - - energies += data->ff.angles->Calc(angleKinds[b][c], - bfcTheta); - - if(abs(angles) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } + double bfcTheta = acos(sinTerm * cos(angles[i] - phi[c]) + cosTerm); + double distSq = oldMol.AngleDist(bondLengthOld[b], bondLengthOld[c], bfcTheta); + nonbondedEng += data->calc.IntraEnergy_1_3(distSq, bonded[b], bonded[c], molIndex); + energies += data->ff.angles->Calc(angleKinds[b][c], bfcTheta); } - //calculate weights from combined energy double weights = exp(-1 * data->ff.beta * (energies + nonbondedEng)); stepWeight += weights; From bdfaff2d078937bd9c494ca1a7e3ce14d61737af Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 15:50:45 -0400 Subject: [PATCH 117/199] Fix the torsion. Avoid calling DCLinkedCycle on same node twice. --- src/cbmc/DCCyclic.cpp | 25 +++++++++++++++++++------ src/cbmc/DCLinkedCycle.cpp | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index e28dd49f1..95899fd76 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -118,18 +118,31 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, } if(isRing[atom]) { + //Check to see if we dont have any edges with same destination + bool exist = false; + for(uint i = 0; i < nodes.size(); i++) { + for(uint j = 0; j < nodes[i].edges.size(); j++) { + if(nodes[i].edges[j].destination == partner) { + exist = true; + } + } + } + + if(!exist) { //Add partner to the edge list of node and initialize it with partner //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle //Atoms will be build from prev(atom) to focus(partner) Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], - partner, atom)); + partner, atom)); node.edges.push_back(e); + } + } else { - //Add partner to the edge list of node and initialize it with partner - //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle - //Atoms will be build from prev(atom) to focus(partner) - Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner,atom)); - node.edges.push_back(e); + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle + //Atoms will be build from prev(atom) to focus(partner) + Edge e = Edge(partner, new DCLinkedHedron(&data, setupKind, partner,atom)); + node.edges.push_back(e); } } } diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index ada4d17fa..3cdae4812 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -471,7 +471,7 @@ void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, double phi = CalcDih(mol, hed.Bonded(focBondedRing), hed.Focus(), hed.Prev(), prevBonded[prevBondedRing]); // find the torsion that give the same dihedral in the ring - torDiff = phi - (hed.Phi(hed.Bonded(focBondedRing)) - prevPhi[prevBondedRing]); + torDiff = phi - (hed.Phi(focBondedRing) - prevPhi[prevBondedRing]); } //select torsion based on all dihedral angles for (uint tor = 0; tor < nDihTrials; ++tor) { From 9e9d0dca391e18b58c15d7d5e68d4434e94768c3 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 16:34:26 -0400 Subject: [PATCH 118/199] Fix to calling DCLinkedCycle on same node twice. --- src/cbmc/DCCyclic.cpp | 46 ++++++++++++++++++------------------------- src/cbmc/DCCyclic.h | 6 ++++-- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 95899fd76..59b3b4f56 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -28,17 +28,18 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, MolMap::const_iterator it = set.mol.kindMap.find(kind.name); assert(it != set.mol.kindMap.end()); const MolKind setupKind = it->second; + totAtom = setupKind.atoms.size(); idExchange = new DCRotateCOM(&data, setupKind); //init the coordinate - coords.Init(setupKind.atoms.size()); + coords.Init(totAtom); - std::vector atomToNode(setupKind.atoms.size(), 0); - std::vector bondCount(setupKind.atoms.size(), 0); - isRing.resize(setupKind.atoms.size(), false); - ringIdx.resize(setupKind.atoms.size(), -1); - FloydWarshallCycle fwc(setupKind.atoms.size()); + std::vector atomToNode(totAtom, 0); + std::vector bondCount(totAtom, 0); + isRing.resize(totAtom, false); + ringIdx.resize(totAtom, -1); + FloydWarshallCycle fwc(totAtom); //Count the number of bonds for each atom for (uint b = 0; b < setupKind.bonds.size(); ++b) { const Bond& bond = setupKind.bonds[b]; @@ -48,7 +49,7 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, } cyclicAtoms = fwc.GetAllCommonCycles(); //Find the ringindex that each atom belongs to - for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { + for (uint atom = 0; atom < totAtom; ++atom) { if (bondCount[atom] < 2) { atomToNode[atom] = -1; isRing[atom] = false; @@ -68,7 +69,7 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, //Find the node (number of bound > 1) //Construct the starting node (DCFreeHedron or DCFreeCycle) //Construct the Linking node (DCLinkHedron or DCLinkedCycle or DCCloseCycle) - for (uint atom = 0; atom < setupKind.atoms.size(); ++atom) { + for (uint atom = 0; atom < totAtom; ++atom) { if (bondCount[atom] < 2) { atomToNode[atom] = -1; } else { @@ -118,24 +119,12 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, } if(isRing[atom]) { - //Check to see if we dont have any edges with same destination - bool exist = false; - for(uint i = 0; i < nodes.size(); i++) { - for(uint j = 0; j < nodes[i].edges.size(); j++) { - if(nodes[i].edges[j].destination == partner) { - exist = true; - } - } - } - - if(!exist) { - //Add partner to the edge list of node and initialize it with partner - //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle - //Atoms will be build from prev(atom) to focus(partner) - Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], - partner, atom)); - node.edges.push_back(e); - } + //Add partner to the edge list of node and initialize it with partner + //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle + //Atoms will be build from prev(atom) to focus(partner) + Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], + partner, atom)); + node.edges.push_back(e); } else { //Add partner to the edge list of node and initialize it with partner @@ -253,8 +242,10 @@ void DCCyclic::Build(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Randomely pick a node to call DCFreeHedron on it uint current = data.prng.randIntExc(nodes.size()); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Visiting the node visited[current] = true; + destVisited[nodes[current].atomIndex] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareNew(newMol, molIndex); @@ -284,6 +275,7 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, //travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -293,7 +285,7 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, //add edges to unvisited nodes for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) { + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); } } diff --git a/src/cbmc/DCCyclic.h b/src/cbmc/DCCyclic.h index a28f84dac..68cc21237 100644 --- a/src/cbmc/DCCyclic.h +++ b/src/cbmc/DCCyclic.h @@ -53,9 +53,10 @@ class DCCyclic : public CBMC //Each edge is a node as well struct Edge { uint destination; //destination is partner node index. + uint atomIndex; //atom index of the edge //To build the next segment from prev-focus DCComponent* connect; - Edge(uint d, DCComponent* c) : destination(d), connect(c) {} + Edge(uint d, DCComponent* c) : destination(d), atomIndex(d), connect(c) {} }; //Store the branching atom and all Atoms that are connected to this @@ -79,10 +80,11 @@ class DCCyclic : public CBMC std::vector ringIdx; //index to the row of cyclicAtoms std::vector nodes; std::vector fringe; - std::vector visited; + std::vector visited, destVisited; std::vector crankshaft; std::vector< std::vector > cyclicAtoms; XYZArray coords; + uint totAtom; }; } From 549ba56f533fb221ae86ebe6706a2d5bb83cf94a Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 17:16:26 -0400 Subject: [PATCH 119/199] Fix to calling DCLinkedCycle on same node twice. --- src/cbmc/DCCyclic.cpp | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 59b3b4f56..1bb492788 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -287,6 +287,7 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, Edge& e = nodes[current].edges[i]; if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -300,10 +301,12 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Randomely pick a node to keep it fix and not grow it uint current = data.prng.randIntExc(nodes.size()); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Visiting the node visited[current] = true; //Copy the current node's focus coordinate uint seedInx = nodes[current].atomIndex; + destVisited[seedInx] = true; if(isRing[seedInx] && !growAll) { //if selected node was part of ring and we did not grow all, perform crankshaft @@ -348,6 +351,7 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Travel to picked edges and make it as new fixNode uint fixNode = fringe[pickFixEdg].destination; visited[fixNode] = true; + destVisited[nodes[fixNode].atomIndex] = true; //Copy the all atoms bonded to fixNode's focus for(uint b = 0; b < nodes[fixNode].partnerIndex.size(); b++) { uint partner = nodes[fixNode].partnerIndex[b]; @@ -374,11 +378,13 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) fringe[0] = fringe.back(); fringe.pop_back(); visited[fixNode] = true; + destVisited[nodes[fixNode].atomIndex] = true; //Add edges to unvisited nodes for(uint i = 0; i < nodes[fixNode].edges.size(); ++i) { Edge& e = nodes[fixNode].edges[i]; - if(!visited[e.destination]) { + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -398,14 +404,16 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) comp->PrepareOld(oldMol, molIndex); comp->BuildOld(oldMol, molIndex); current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); visited[current] = true; for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) { + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -435,8 +443,10 @@ void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) //Randomely pick a node to call DCFreeHedron on it uint current = data.prng.randIntExc(nodes.size()); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Visiting the node visited[current] = true; + destVisited[nodes[current].atomIndex] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareOld(oldMol, molIndex); @@ -457,6 +467,7 @@ void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -467,9 +478,10 @@ void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -485,8 +497,10 @@ void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) //Randomely pick a node to call DCFreeHedron on it uint current = data.prng.randIntExc(nodes.size()); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Visiting the node visited[current] = true; + destVisited[nodes[current].atomIndex] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareNew(newMol, molIndex); @@ -507,6 +521,7 @@ void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -517,9 +532,10 @@ void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -533,6 +549,7 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) oldMol.SetBCoords(coords, 0); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Use backbone atom to start the node uint current = -1; for(uint i = 0; i < nodes.size(); i++) { @@ -551,6 +568,7 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) //Visiting the node visited[current] = true; + destVisited[nodes[current].atomIndex] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareOld(oldMol, molIndex); @@ -571,6 +589,7 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -581,9 +600,10 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } @@ -598,6 +618,7 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) newMol.SetBCoords(coords, 0); visited.assign(nodes.size(), false); + destVisited.assign(totAtom, false); //Use backbone atom to start the node uint current = -1; for(uint i = 0; i < nodes.size(); i++) { @@ -616,6 +637,7 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) //Visiting the node visited[current] = true; + destVisited[nodes[current].atomIndex] = true; DCComponent* comp = nodes[current].starting; //Call DCFreeHedron to build all Atoms connected to the node comp->PrepareNew(newMol, molIndex); @@ -636,6 +658,7 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; + destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -646,9 +669,10 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) for(uint i = 0; i < nodes[current].edges.size(); ++i) { Edge& e = nodes[current].edges[i]; - if(!visited[e.destination]) + if(!visited[e.destination] && !destVisited[e.atomIndex]) { fringe.push_back(e); + destVisited[e.atomIndex] = true; } } } From 49b7aadc877423a99ddf2daf9a6be7dc0d934e32 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 29 Aug 2018 17:40:17 -0400 Subject: [PATCH 120/199] Fix to Bond Energy --- src/cbmc/DCLinkedCycle.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index 3cdae4812..27c91805a 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -116,7 +116,9 @@ void DCLinkedCycle::PrepareNew(TrialMol& newMol, uint molIndex) hed.PrepareNew(newMol, molIndex); bondEnergy = 0.0; for(uint i = 0; i < hed.NumBond(); ++i) { - bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); + if(!newMol.BondsExist(hed.Bonded(i), hed.Focus())) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); + } } } @@ -128,7 +130,9 @@ void DCLinkedCycle::PrepareOld(TrialMol& oldMol, uint molIndex) hed.PrepareOld(oldMol, molIndex); bondEnergy = 0.0; for(uint i = 0; i < hed.NumBond(); ++i) { - bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); + if(!oldMol.BondsExist(hed.Bonded(i), hed.Focus())) { + bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); + } } } From aa91c76f1edf4522ea0e1a10b048f37149317104 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 30 Aug 2018 10:47:13 -0400 Subject: [PATCH 121/199] Use Bcoordinate to build the bond in the ring rather than bond length in the forcefield --- src/cbmc/DCCyclic.cpp | 5 +++++ src/cbmc/DCFreeCycle.cpp | 25 ++++++++++++++++++++----- src/cbmc/DCFreeCycle.h | 1 + src/cbmc/DCFreeCycleSeed.cpp | 23 +++++++++++++++++++---- src/cbmc/DCFreeCycleSeed.h | 1 + src/cbmc/DCLinkedCycle.cpp | 24 +++++++++++------------- src/cbmc/DCLinkedCycle.h | 3 +++ 7 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 1bb492788..888bcb369 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -30,6 +30,11 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, const MolKind setupKind = it->second; totAtom = setupKind.atoms.size(); + if(totAtom < 4) { + std::cout << "Error: GOMC does not support cyclic molecule with 3 atoms!\n\n"; + exit(EXIT_FAILURE); + } + idExchange = new DCRotateCOM(&data, setupKind); //init the coordinate diff --git a/src/cbmc/DCFreeCycle.cpp b/src/cbmc/DCFreeCycle.cpp index 0b4a42bc2..f61d3207c 100644 --- a/src/cbmc/DCFreeCycle.cpp +++ b/src/cbmc/DCFreeCycle.cpp @@ -32,10 +32,14 @@ DCFreeCycle::DCFreeCycle(DCData* data, const mol_setup::MolKind& kind, { using namespace mol_setup; using namespace std; + std::fill_n(bondedInRing, MAX_BONDS, false); vector onFocus = AtomBonds(kind, hed.Focus()); for(uint i = 0; i < onFocus.size(); ++i) { - if (onFocus[i].a1 == prev) { + if(onFocus[i].a1 == prev) { anchorKind = onFocus[i].kind; + if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { + bondedInRing[hed.NumBond()] = true; + } break; } } @@ -43,8 +47,11 @@ DCFreeCycle::DCFreeCycle(DCData* data, const mol_setup::MolKind& kind, onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), onFocus.end()); //Find the atoms bonded to focus, except prev - for (uint i = 0; i < hed.NumBond(); ++i) { + for (uint i = 0; i < onFocus.size(); ++i) { bondKinds[i] = onFocus[i].kind; + if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { + bondedInRing[i] = true; + } } if(data->nLJTrialsNth < 1) { @@ -83,10 +90,18 @@ void DCFreeCycle::PrepareOld(TrialMol& oldMol, uint molIndex) void DCFreeCycle::SetBondLengthNew(TrialMol& newMol) { for(uint i = 0; i < hed.NumBond(); ++i) { - //We might need to use bondLength from bCoords - bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + //use bondLength from bCoords if it is in the ring body + if(bondedInRing[i]) { + bondLength[i] = newMol.GetBCoords().Difference(hed.Bonded(i), hed.Focus()).Length(); + } else { + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } + } + if(bondedInRing[hed.NumBond()]) { + anchorBond = newMol.GetBCoords().Difference(hed.Focus(), hed.Prev()).Length(); + } else { + anchorBond = data->ff.bonds.Length(anchorKind); } - anchorBond = data->ff.bonds.Length(anchorKind); } void DCFreeCycle::SetBondLengthOld(TrialMol& oldMol) diff --git a/src/cbmc/DCFreeCycle.h b/src/cbmc/DCFreeCycle.h index aac239c2c..a2ef31111 100644 --- a/src/cbmc/DCFreeCycle.h +++ b/src/cbmc/DCFreeCycle.h @@ -52,6 +52,7 @@ class DCFreeCycle : public DCComponent double bondLengthOld[MAX_BONDS]; //bondKind between bonded[i] and focus uint bondKinds[MAX_BONDS]; + bool bondedInRing[MAX_BONDS]; }; } diff --git a/src/cbmc/DCFreeCycleSeed.cpp b/src/cbmc/DCFreeCycleSeed.cpp index 885319eb6..2908eef7a 100644 --- a/src/cbmc/DCFreeCycleSeed.cpp +++ b/src/cbmc/DCFreeCycleSeed.cpp @@ -32,10 +32,14 @@ DCFreeCycleSeed::DCFreeCycleSeed(DCData* data, const mol_setup::MolKind& kind, { using namespace mol_setup; using namespace std; + std::fill_n(bondedInRing, MAX_BONDS, false); vector onFocus = AtomBonds(kind, hed.Focus()); for(uint i = 0; i < onFocus.size(); ++i) { if (onFocus[i].a1 == prev) { anchorKind = onFocus[i].kind; + if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { + bondedInRing[hed.NumBond()] = true; + } break; } } @@ -43,8 +47,11 @@ DCFreeCycleSeed::DCFreeCycleSeed(DCData* data, const mol_setup::MolKind& kind, onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), onFocus.end()); //Find the atoms bonded to focus, except prev - for (uint i = 0; i < hed.NumBond(); ++i) { + for (uint i = 0; i < onFocus.size(); ++i) { bondKinds[i] = onFocus[i].kind; + if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { + bondedInRing[i] = true; + } } if(data->nLJTrialsNth < 1) { @@ -83,10 +90,18 @@ void DCFreeCycleSeed::PrepareOld(TrialMol& oldMol, uint molIndex) void DCFreeCycleSeed::SetBondLengthNew(TrialMol& newMol) { for(uint i = 0; i < hed.NumBond(); ++i) { - //We might need to use bondLength from bCoords - bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + //use bondLength from bCoords if it is in the ring body + if(bondedInRing[i]) { + bondLength[i] = newMol.GetBCoords().Difference(hed.Bonded(i), hed.Focus()).Length(); + } else { + bondLength[i] = data->ff.bonds.Length(bondKinds[i]); + } + } + if(bondedInRing[hed.NumBond()]) { + anchorBond = newMol.GetBCoords().Difference(hed.Focus(), hed.Prev()).Length(); + } else { + anchorBond = data->ff.bonds.Length(anchorKind); } - anchorBond = data->ff.bonds.Length(anchorKind); } void DCFreeCycleSeed::SetBondLengthOld(TrialMol& oldMol) diff --git a/src/cbmc/DCFreeCycleSeed.h b/src/cbmc/DCFreeCycleSeed.h index e61c0a704..8d9e351ac 100644 --- a/src/cbmc/DCFreeCycleSeed.h +++ b/src/cbmc/DCFreeCycleSeed.h @@ -50,6 +50,7 @@ class DCFreeCycleSeed : public DCComponent double bondLengthOld[MAX_BONDS]; //bondKind between bonded[i] and focus uint bondKinds[MAX_BONDS]; + bool bondedInRing[MAX_BONDS]; }; } diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index 27c91805a..a84a9b29b 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -47,6 +47,7 @@ DCLinkedCycle::DCLinkedCycle { using namespace mol_setup; using namespace std; + std::fill_n(bondedInRing, MAX_BONDS, false); vector onFocus = AtomBonds(kind, hed.Focus()); onFocus.erase(remove_if(onFocus.begin(), onFocus.end(), FindA1(prev)), onFocus.end()); @@ -58,6 +59,7 @@ DCLinkedCycle::DCLinkedCycle bondedFocusDih.push_back(DihsOnBond(kind, onFocus[i].a1, focus)); if(std::find(cycAtoms.begin(), cycAtoms.end(), onFocus[i].a1) != cycAtoms.end()) { focBondedRing = i; + bondedInRing[i] = true; } } assert(focBondedRing != -1); @@ -115,8 +117,10 @@ void DCLinkedCycle::PrepareNew(TrialMol& newMol, uint molIndex) hed.SetBondNew(bondLength, anchorBond); hed.PrepareNew(newMol, molIndex); bondEnergy = 0.0; + bExist.resize(hed.NumBond(), false); for(uint i = 0; i < hed.NumBond(); ++i) { - if(!newMol.BondsExist(hed.Bonded(i), hed.Focus())) { + bExist[i] = newMol.BondsExist(hed.Bonded(i), hed.Focus()); + if(!bExist[i]) { bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLength[i]); } } @@ -129,8 +133,10 @@ void DCLinkedCycle::PrepareOld(TrialMol& oldMol, uint molIndex) hed.SetBondOld(bondLengthOld, anchorBondOld); hed.PrepareOld(oldMol, molIndex); bondEnergy = 0.0; + bExist.resize(hed.NumBond(), false); for(uint i = 0; i < hed.NumBond(); ++i) { - if(!oldMol.BondsExist(hed.Bonded(i), hed.Focus())) { + bExist[i] = oldMol.BondsExist(hed.Bonded(i), hed.Focus()); + if(!bExist[i]) { bondEnergy += data->ff.bonds.Calc(bondKinds[i], bondLengthOld[i]); } } @@ -139,9 +145,9 @@ void DCLinkedCycle::PrepareOld(TrialMol& oldMol, uint molIndex) void DCLinkedCycle::SetBondLengthNew(TrialMol& newMol) { for(uint i = 0; i < hed.NumBond(); ++i) { - if(newMol.AtomExists(hed.Bonded(i))) { - //if bonded[i] exist, we calculate the bond length - bondLength[i] = sqrt(newMol.OldDistSq(hed.Focus(), hed.Bonded(i))); + //use bondLength from bCoords if it is in the ring body + if(bondedInRing[i]) { + bondLength[i] = newMol.GetBCoords().Difference(hed.Bonded(i), hed.Focus()).Length(); } else { bondLength[i] = data->ff.bonds.Length(bondKinds[i]); } @@ -235,13 +241,9 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) double stepWeight = EvalLJ(newMol, molIndex); uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); - std::vector bExist(hed.NumBond(), false); for(uint b = 0; b < hed.NumBond(); ++b) { newMol.AddAtom(hed.Bonded(b), positions[b][winner]); - if(newMol.BondsExist(hed.Bonded(b), hed.Focus())) { - bExist[b] = true; - } newMol.AddBonds(hed.Bonded(b), hed.Focus()); } @@ -383,13 +385,9 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) data->axes.WrapPBC(positions[b], oldMol.GetBox()); } double stepWeight = EvalLJ(oldMol, molIndex); - std::vector bExist(hed.NumBond(), false); for(uint b = 0; b < hed.NumBond(); ++b) { oldMol.ConfirmOldAtom(hed.Bonded(b)); - if(oldMol.BondsExist(hed.Bonded(b), hed.Focus())) { - bExist[b] = true; - } oldMol.AddBonds(hed.Bonded(b), hed.Focus()); } diff --git a/src/cbmc/DCLinkedCycle.h b/src/cbmc/DCLinkedCycle.h index 4a67472d8..5239de571 100644 --- a/src/cbmc/DCLinkedCycle.h +++ b/src/cbmc/DCLinkedCycle.h @@ -62,7 +62,10 @@ class DCLinkedCycle : public DCComponent double bondLengthOld[MAX_BONDS]; //bondKind between bonded[i] and focus uint bondKinds[MAX_BONDS]; + bool bondedInRing[MAX_BONDS]; + std::vector< std::vector > bondedFocusDih; + std::vector bExist; }; } #endif From 1cb21c455494b6d94033604c082ea400a52c6af0 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 30 Aug 2018 15:05:46 -0400 Subject: [PATCH 122/199] Fix energy match --- src/cbmc/DCCyclic.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 888bcb369..3b4a60a53 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -267,6 +267,9 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, uint current = cur; //Copy the edges of the node to fringe fringe = nodes[current].edges; + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while (!fringe.empty()) { uint pick = data.prng.randIntExc(fringe.size()); @@ -280,7 +283,6 @@ void DCCyclic::BuildEdges(TrialMol& oldMol, TrialMol& newMol, uint molIndex, //travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -370,6 +372,10 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) if(fringe[f].destination == current) fringe.erase(fringe.begin() + f); } + + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Continue along picked edges and copy the coordinates while(!fringe.empty()) { fixNode = fringe[0].destination; @@ -383,7 +389,6 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) fringe[0] = fringe.back(); fringe.pop_back(); visited[fixNode] = true; - destVisited[nodes[fixNode].atomIndex] = true; //Add edges to unvisited nodes for(uint i = 0; i < nodes[fixNode].edges.size(); ++i) { Edge& e = nodes[fixNode].edges[i]; @@ -398,6 +403,9 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) fringe = nodes[current].edges; //Remove the fixed edge from fringe fringe.erase(fringe.begin() + pickFixEdg); + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while(!fringe.empty()) { //Randomely pick one of the edges connected to node @@ -409,7 +417,6 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) comp->PrepareOld(oldMol, molIndex); comp->BuildOld(oldMol, molIndex); current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -459,6 +466,9 @@ void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) //Advance along edges, building as we go //Copy the edges of the node to fringe fringe = nodes[current].edges; + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while(!fringe.empty()) { @@ -472,7 +482,6 @@ void DCCyclic::BuildOld(TrialMol& oldMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -513,6 +522,9 @@ void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) //Advance along edges, building as we go //Copy the edges of the node to fringe fringe = nodes[current].edges; + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while(!fringe.empty()) { @@ -526,7 +538,6 @@ void DCCyclic::BuildNew(TrialMol& newMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -581,6 +592,9 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) //Advance along edges, building as we go //Copy the edges of the node to fringe fringe = nodes[current].edges; + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while(!fringe.empty()) { @@ -594,7 +608,6 @@ void DCCyclic::BuildGrowOld(TrialMol& oldMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); @@ -650,6 +663,9 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) //Advance along edges, building as we go //Copy the edges of the node to fringe fringe = nodes[current].edges; + for(uint i = 0; i < fringe.size(); i++) { + destVisited[fringe[i].atomIndex] = true; + } //Advance along edges, building as we go while(!fringe.empty()) { @@ -663,7 +679,6 @@ void DCCyclic::BuildGrowNew(TrialMol& newMol, uint molIndex) //Travel to new node, remove traversed edge //Current node is the edge that we picked current = fringe[pick].destination; - destVisited[fringe[pick].atomIndex] = true; //Remove the edge that we visited fringe[pick] = fringe.back(); fringe.pop_back(); From 1e2edf5086dee20d079a7d1abdd7284377973118 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 30 Aug 2018 15:57:15 -0400 Subject: [PATCH 123/199] Fix to calling crankshaft through regrowth move. --- src/CrankShaft.h | 3 --- src/cbmc/DCCyclic.cpp | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index 6444d5da4..2ac614e09 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -83,9 +83,6 @@ inline uint CrankShaft::Prep(const double subDraw, const double movPerc) newMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, destBox); oldMol = cbmc::TrialMol(molRef.kinds[kindIndex], boxDimRef, sourceBox); oldMol.SetCoords(coordCurrRef, pStart); - //Set the newMol coordinate same as oldMol. Later after Transform, coordinates - //will be updated. - newMol.SetCoords(coordCurrRef, pStart); } return state; } diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 3b4a60a53..8e19064cc 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -226,6 +226,9 @@ void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Instead we perform IntraSwap move Build(oldMol, newMol, molIndex); } else { + //Set tCoords to coordinate of actual molecule, it will be modified + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + newMol.SetCoords(coords, 0); //Pick a random node pair uint pick = data.prng.randIntExc(crankshaft.size()); //Call DCCrankShaftAng and rotate a1 node around a0-a2 shaft From 57f22926f3543d16cb1fae01adc21390f4c6e402 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 31 Aug 2018 17:18:15 -0400 Subject: [PATCH 124/199] Fix to assigning edge if edge is not in the ring body --- src/cbmc/DCCyclic.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 8e19064cc..149cb5ed8 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -123,11 +123,11 @@ DCCyclic::DCCyclic(System& sys, const Forcefield& ff, continue; } - if(isRing[atom]) { + if(isRing[partner]) { //Add partner to the edge list of node and initialize it with partner //and the atom in DCLinkedHedron or DCLinkedCycle or DCCloseCycle //Atoms will be build from prev(atom) to focus(partner) - Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[atom]], + Edge e = Edge(partner, new DCLinkedCycle(&data, setupKind, cyclicAtoms[ringIdx[partner]], partner, atom)); node.edges.push_back(e); From 37d72be8939372ec81a4f5a612eecb8f74a59e0f Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 5 Sep 2018 11:37:16 -0400 Subject: [PATCH 125/199] Use bCoords to determin the phi for rings body --- src/cbmc/DCHedronCycle.cpp | 64 +++++++++++++++++++++++++++----------- src/cbmc/DCHedronCycle.h | 13 +++++++- src/cbmc/DCLinkedCycle.cpp | 34 ++++++++++++-------- src/cbmc/DCLinkedCycle.h | 2 ++ 4 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c1ea4fac0..a96d33ff9 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -334,7 +334,9 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double* energies = data->angleEnergy; double* weights = data->angleWeights; double* nonbonded_1_3 = data->nonbonded_1_3; - phi[0] = 0.0; + + SetBasis(newMol, focus, prev); + phi[0] = CalcOldPhi(newMol, bonded[0], focus); for (uint b = 1; b < nBonds; ++b) { std::fill_n(energies, nTrials, 0.0); @@ -349,12 +351,13 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - if(angleInRing[b][c]) { - double bfcTheta = CalcTheta(newMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + if(angleInRing[b][b] || angleInRing[b][c]) { + double ang = CalcOldPhi(newMol, bonded[b], focus); + double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); + double bfcTheta = acos(sinTerm * cos(ang - phi[c]) + cosTerm); std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring with flexible angle for " << + if(abs(bfcRing - bfcTheta) > 0.01) { + std::cout << "Error: Cannot Construct ring frame " << newMol.GetKind().atomTypeNames[bonded[b]] << " " << newMol.GetKind().atomTypeNames[focus] << " " << newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; @@ -398,8 +401,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri #pragma omp parallel for default(shared) private(i) reduction(+:stepWeight) #endif for (i = 0; i < nTrials; ++i) { - weights[i] = exp(-1 * data->ff.beta * (energies[i] + - nonbonded_1_3[i])); + weights[i] = exp(-1 * data->ff.beta * (energies[i] + nonbonded_1_3[i])); stepWeight += weights[i]; } @@ -431,17 +433,9 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - if(angleInRing[b][c]) { - double bfcTheta = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + if(angleInRing[b][b] || angleInRing[b][c]) { + double ang = phi[b]; std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring with flexible angle for " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } break; } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); @@ -478,4 +472,38 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, phiWeight[b] += stepWeight; } } + +void DCHedronCycle::SetBasis(TrialMol& mol, uint p1, uint p2) +{ + //Calculate the dihedral using bCoords + const XYZArray &coords = mol.GetBCoords(); + //W is unit vec of p1->p2 + XYZ wVec = coords.Difference(p2, p1); + wVec.Normalize(); + XYZ uVec; + //check to make sure our W isn't in line with the standard X Axis + if (abs(wVec.x) < 0.8) { + //V will be W x the standard X unit vec + uVec = XYZ(1.0, 0.0, 0.0); + } else { + //V will be W x the standard Y unit vec + uVec = XYZ(0.0, 1.0, 0.0); + } + XYZ vVec = geom::Cross(wVec, uVec); + vVec.Normalize(); + //U is unit vec perpendicular to both V and W + uVec = geom::Cross(vVec, wVec); + growthToWorld.BasisRotation(uVec, vVec, wVec); + worldToGrowth = growthToWorld.Inverse(); +} + +double DCHedronCycle::CalcOldPhi(TrialMol& mol, uint atom, uint lastAtom) const +{ + //Calculate the dihedral using bCoords + const XYZArray &coords = mol.GetBCoords(); + XYZ diff = coords.Difference(atom, lastAtom); + XYZ growthCoords = worldToGrowth.Apply(diff); + return atan2(growthCoords.y, growthCoords.x); +} + } diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index 711ce21c1..3898d0e13 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -8,6 +8,7 @@ along with this program, also can be found at . #define DCHEDRONCYCLE_H #include "DCComponent.h" #include "CBMC.h" +#include "TransformMatrix.h" namespace mol_setup { @@ -77,6 +78,14 @@ class DCHedronCycle void ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials); //to calculate the angle in the ring from bCoords or tCoords a0-a1-a2 double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2); + //!Sets an orthonormal basis for coordinate conversion. + /*!\param p1 Index of focus + * \param p2 Index of prev + */ + void SetBasis(TrialMol& mol, uint p1, uint p2); + //!Calculates theta and phi coords for atom in the current basis + //!centered on lastAtom. phi in (-pi, pi] + double CalcOldPhi(TrialMol& mol, uint atom, uint lastAtom) const; DCData* data; uint focus, prev; @@ -96,7 +105,9 @@ class DCHedronCycle double phi[MAX_BONDS]; double phiWeight[MAX_BONDS]; double bendEnergy, oneThree; - double anchorBond, anchorBondOld; + double anchorBond, anchorBondOld; + RotationMatrix growthToWorld; + RotationMatrix worldToGrowth; }; } diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index a84a9b29b..fd6e51da7 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -210,6 +210,13 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) //not using theta, so this is a wasted cos and sqrt newMol.OldThetaAndPhi(prevBonded[i], hed.Prev(), th, prevPhi[i]); } + if(prevBondedRing != -1) { + //calculate dihedral in ring using bCoords + double phi = CalcDih(newMol, hed.Bonded(focBondedRing), hed.Focus(), + hed.Prev(), prevBonded[prevBondedRing]); + // find the torsion that give the same dihedral in the ring + torDiff = phi - (hed.Phi(focBondedRing) - prevPhi[prevBondedRing]); + } XYZ rotationAxis = newMol.AtomPosition(hed.Focus()) - newMol.AtomPosition(hed.Prev()); rotationAxis = data->axes.MinImage(rotationAxis, newMol.GetBox()); @@ -315,6 +322,13 @@ void DCLinkedCycle::BuildOld(TrialMol& oldMol, uint molIndex) //not using theta, so this is a wasted cos and sqrt oldMol.OldThetaAndPhi(prevBonded[i], hed.Prev(), t, prevPhi[i]); } + if(prevBondedRing != -1) { + //calculate dihedral in ring using bCoords + double phi = CalcDih(oldMol, hed.Bonded(focBondedRing), hed.Focus(), + hed.Prev(), prevBonded[prevBondedRing]); + // find the torsion that give the same dihedral in the ring + torDiff = phi - (hed.Phi(focBondedRing) - prevPhi[prevBondedRing]); + } XYZ rotationAxis = oldMol.AtomPosition(hed.Focus()) - oldMol.AtomPosition(hed.Prev()); rotationAxis = data->axes.MinImage(rotationAxis, oldMol.GetBox()); @@ -467,14 +481,6 @@ void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, std::fill_n(nonbonded_1_4, data->nDihTrials, 0.0); const XYZ center = mol.AtomPosition(hed.Focus()); - double torDiff = 0.0; - if(prevBondedRing != -1) { - //calculate dihedral in ring using bCoords - double phi = CalcDih(mol, hed.Bonded(focBondedRing), hed.Focus(), hed.Prev(), - prevBonded[prevBondedRing]); - // find the torsion that give the same dihedral in the ring - torDiff = phi - (hed.Phi(focBondedRing) - prevPhi[prevBondedRing]); - } //select torsion based on all dihedral angles for (uint tor = 0; tor < nDihTrials; ++tor) { if(prevBondedRing != -1) { @@ -505,15 +511,15 @@ void DCLinkedCycle::ChooseTorsion(TrialMol& mol, uint molIndex, nonbonded_1_4[tor] = num::BIGNUM; } - torEnergy[tor] += ff.dihedrals.Calc(dihKinds[b][p], - trialPhi - prevPhi[p]); + torEnergy[tor] += ff.dihedrals.Calc(dihKinds[b][p],trialPhi-prevPhi[p]); } } torWeights[tor] = exp(-ff.beta * (torEnergy[tor] + nonbonded_1_4[tor])); } } -void DCLinkedCycle::CaclIntraEnergy(TrialMol& mol, const uint bIdx, const uint molIndex) +void DCLinkedCycle::CaclIntraEnergy(TrialMol& mol, const uint bIdx, + const uint molIndex) { double dihEnergy = 0.0; double nonBondedEn = 0.0; @@ -525,8 +531,10 @@ void DCLinkedCycle::CaclIntraEnergy(TrialMol& mol, const uint bIdx, const uint m double phi = mol.GetPhi(dih[d].a0, dih[d].a1, dih[d].a2, dih[d].a3); dihEnergy += data->ff.dihedrals.Calc(dih[d].kind, phi); if(mol.OneFour()) { - double distSq = mol.DistSq(mol.AtomPosition(dih[d].a0), mol.AtomPosition(dih[d].a3)); - nonBondedEn += data->calc.IntraEnergy_1_4(distSq, dih[d].a0, dih[d].a3, molIndex); + double distSq = mol.DistSq(mol.AtomPosition(dih[d].a0), + mol.AtomPosition(dih[d].a3)); + nonBondedEn += data->calc.IntraEnergy_1_4(distSq, dih[d].a0, dih[d].a3, + molIndex); } } } diff --git a/src/cbmc/DCLinkedCycle.h b/src/cbmc/DCLinkedCycle.h index 5239de571..d8e5e952e 100644 --- a/src/cbmc/DCLinkedCycle.h +++ b/src/cbmc/DCLinkedCycle.h @@ -52,6 +52,8 @@ class DCLinkedCycle : public DCComponent uint dihKinds[MAX_BONDS][MAX_BONDS]; //Used in finding the atom bonded to prev and focus and bith are in the ring uint prevBondedRing, focBondedRing; + //Calculate torsion difference to match ring dihedral + double torDiff; //bond energy of built branch double bondEnergy; From a03e29ef61dc076299602408136e0f61f7c47cee Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 5 Sep 2018 11:52:31 -0400 Subject: [PATCH 126/199] Fix to the logic to generate error if anglebfc was not in the ring --- src/cbmc/DCHedronCycle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index a96d33ff9..1d51d4c6d 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -356,7 +356,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); double bfcTheta = acos(sinTerm * cos(ang - phi[c]) + cosTerm); std::fill_n(angles, nTrials, ang); - if(abs(bfcRing - bfcTheta) > 0.01) { + if(angleInRing[b][c] && abs(bfcRing - bfcTheta) > 0.01) { std::cout << "Error: Cannot Construct ring frame " << newMol.GetKind().atomTypeNames[bonded[b]] << " " << newMol.GetKind().atomTypeNames[focus] << " " << From 1c57e9139efc8602b418a782d1ffcde30dd0c8a4 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 5 Sep 2018 15:18:31 -0400 Subject: [PATCH 127/199] Fix to the case when we have free prev node. --- src/cbmc/DCHedronCycle.cpp | 55 +++++++++++++++++++++++++++++--------- src/cbmc/DCHedronCycle.h | 1 + 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 1d51d4c6d..1391b63f4 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -69,6 +69,12 @@ DCHedronCycle::DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, onFocus.end()); nBonds = onFocus.size(); + if(std::find(cycAtoms.begin(), cycAtoms.end(), prev) != cycAtoms.end()) { + prevInRing = true; + } else { + prevInRing = false; + } + for (uint i = 0; i < nBonds; ++i) { bonded[i] = onFocus[i].a1; } @@ -352,17 +358,29 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double sinTerm = sin(theta[b]) * sin(theta[c]); if(angleInRing[b][b] || angleInRing[b][c]) { - double ang = CalcOldPhi(newMol, bonded[b], focus); double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); - double bfcTheta = acos(sinTerm * cos(ang - phi[c]) + cosTerm); - std::fill_n(angles, nTrials, ang); - if(angleInRing[b][c] && abs(bfcRing - bfcTheta) > 0.01) { - std::cout << "Error: Cannot Construct ring frame " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } + if(prevInRing) { + double ang = CalcOldPhi(newMol, bonded[b], focus); + double bfcTheta = acos(sinTerm * cos(ang - phi[c]) + cosTerm); + std::fill_n(angles, nTrials, ang); + if(angleInRing[b][c] && abs(bfcRing - bfcTheta) > 0.01) { + std::cout << "Error: Cannot Construct ring frame " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } else { + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring frame " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } break; } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); @@ -434,8 +452,21 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double sinTerm = sin(theta[b]) * sin(theta[c]); if(angleInRing[b][b] || angleInRing[b][c]) { - double ang = phi[b]; - std::fill_n(angles, nTrials, ang); + if(prevInRing) { + double ang = phi[b]; + std::fill_n(angles, nTrials, ang); + } else { + double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; + std::fill_n(angles, nTrials, ang); + if(abs(ang) > 2.0 * M_PI) { + std::cout << "Error: Cannot Construct ring frame " << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + exit(EXIT_FAILURE); + } + } break; } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index 3898d0e13..502378b91 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -100,6 +100,7 @@ class DCHedronCycle //except angleKinds[i][i] = kind between bonded[i] and prev uint angleKinds[MAX_BONDS][MAX_BONDS]; bool angleInRing[MAX_BONDS][MAX_BONDS]; + bool prevInRing; double theta[MAX_BONDS]; double thetaWeight[MAX_BONDS]; double phi[MAX_BONDS]; From 2bc92f6ac9d8bc0650a65cd328b7662f6618edbf Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 6 Sep 2018 14:16:21 -0400 Subject: [PATCH 128/199] Use current angle if angle was defined to be fix. --- src/cbmc/DCHedronCycle.cpp | 90 ++++++++++++-------------------------- 1 file changed, 27 insertions(+), 63 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 1391b63f4..d5c1ae8c0 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -155,11 +155,11 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, { double* nonbonded_1_3 = data->nonbonded_1_3; int i; - double distSq, thetaFix; - bool angleFix = false; + double distSq; + bool angleFix = data->ff.angles->AngleFixed(kind); std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring - if(angleInRing[bType][bType]) { + if(angleInRing[bType][bType] || angleFix) { double th = CalcTheta(newMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); @@ -172,16 +172,8 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, return; } - if(data->ff.angles->AngleFixed(kind)) { - angleFix = true; - thetaFix = data->ff.angles->Angle(kind); - } - for (i = 0; i < nTrials; ++i) { - if(angleFix) - data->angles[i] = thetaFix; - else - data->angles[i] = data->prng.rand(M_PI); + data->angles[i] = data->prng.rand(M_PI); } #ifdef _OPENMP @@ -203,11 +195,11 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, { double* nonbonded_1_3 = data->nonbonded_1_3; int i; - double distSq, thetaFix; - bool angleFix = false; + double distSq; + bool angleFix = data->ff.angles->AngleFixed(kind); std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring - if(angleInRing[bType][bType]) { + if(angleInRing[bType][bType] || angleFix) { double th = CalcTheta(oldMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); @@ -220,16 +212,8 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, return; } - if(data->ff.angles->AngleFixed(kind)) { - angleFix = true; - thetaFix = data->ff.angles->Angle(kind); - } - for (i = 0; i < nTrials; ++i) { - if(angleFix) - data->angles[i] = thetaFix; - else - data->angles[i] = data->prng.rand(M_PI); + data->angles[i] = data->prng.rand(M_PI); } #ifdef _OPENMP @@ -356,8 +340,9 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri for (uint c = 0; c < b; ++c) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); + bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - if(angleInRing[b][b] || angleInRing[b][c]) { + if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); if(prevInRing) { double ang = CalcOldPhi(newMol, bonded[b], focus); @@ -373,28 +358,17 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri } else { double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring frame " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + if(abs(ang) > 2.0 * M_PI || isnan(ang)) { + std::cout << "Error: Cannot Construct Angle " << + newMol.GetKind().atomNames[bonded[b]] << " " << + newMol.GetKind().atomNames[focus] << " " << + newMol.GetKind().atomNames[bonded[c]] << " !\n"; + std::cout << "Note: This issue might happened due to defining fix angle.\n"; exit(EXIT_FAILURE); } } break; - } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - break; - } + } } @@ -434,7 +408,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri //Calculate OldMol Bond Energy & //Calculate phi weight for nTrials using actual theta of OldMol void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, - uint molIndex) + uint molIndex) { double* angles = data->angles; IncorporateOld(oldMol, molIndex); @@ -450,8 +424,9 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, for (uint c = 0; c < b; ++c) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); + bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - if(angleInRing[b][b] || angleInRing[b][c]) { + if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { if(prevInRing) { double ang = phi[b]; std::fill_n(angles, nTrials, ang); @@ -459,28 +434,17 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot Construct ring frame " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; + if(abs(ang) > 2.0 * M_PI || isnan(ang)) { + std::cout << "Error: Cannot Construct Angle" << + oldMol.GetKind().atomNames[bonded[b]] << " " << + oldMol.GetKind().atomNames[focus] << " " << + oldMol.GetKind().atomNames[bonded[c]] << " !\n"; + std::cout << "Note: This issue might happened due to defining fix angle.\n"; exit(EXIT_FAILURE); } } break; - } else if (data->ff.angles->AngleFixed(angleKinds[b][c])) { - double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; - std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { - std::cout << "Error: Cannot constrain fix angle for " << - oldMol.GetKind().atomTypeNames[bonded[b]] << " " << - oldMol.GetKind().atomTypeNames[focus] << " " << - oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - break; - } + } } for (uint i = 0; i < nTrials; ++i) { From 42541d66bd91e83f0d2389750d75ca135b0f0a01 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 10:43:00 -0400 Subject: [PATCH 129/199] Fix to the fix angle, still has some issue with C7Cyclic molecule. --- src/cbmc/DCHedronCycle.cpp | 90 ++++++++++++++++++-------------------- src/cbmc/DCHedronCycle.h | 1 - 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index d5c1ae8c0..94ffb6e89 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -69,12 +69,6 @@ DCHedronCycle::DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, onFocus.end()); nBonds = onFocus.size(); - if(std::find(cycAtoms.begin(), cycAtoms.end(), prev) != cycAtoms.end()) { - prevInRing = true; - } else { - prevInRing = false; - } - for (uint i = 0; i < nBonds; ++i) { bonded[i] = onFocus[i].a1; } @@ -326,7 +320,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double* nonbonded_1_3 = data->nonbonded_1_3; SetBasis(newMol, focus, prev); - phi[0] = CalcOldPhi(newMol, bonded[0], focus); + phi[0] = 0.0; for (uint b = 1; b < nBonds; ++b) { std::fill_n(energies, nTrials, 0.0); @@ -344,31 +338,27 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); - if(prevInRing) { - double ang = CalcOldPhi(newMol, bonded[b], focus); - double bfcTheta = acos(sinTerm * cos(ang - phi[c]) + cosTerm); - std::fill_n(angles, nTrials, ang); - if(angleInRing[b][c] && abs(bfcRing - bfcTheta) > 0.01) { - std::cout << "Error: Cannot Construct ring frame " << - newMol.GetKind().atomTypeNames[bonded[b]] << " " << - newMol.GetKind().atomTypeNames[focus] << " " << - newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; - exit(EXIT_FAILURE); - } - } else { - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; - std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI || isnan(ang)) { - std::cout << "Error: Cannot Construct Angle " << - newMol.GetKind().atomNames[bonded[b]] << " " << - newMol.GetKind().atomNames[focus] << " " << - newMol.GetKind().atomNames[bonded[c]] << " !\n"; - std::cout << "Note: This issue might happened due to defining fix angle.\n"; - exit(EXIT_FAILURE); - } + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or -ang + double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - + CalcOldPhi(newMol, bonded[c], focus); + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + ang *= (phiDiff > 0.0 ? -1.0 : 1.0); + ang += phi[c]; + std::fill_n(angles, nTrials, ang); + if(isnan(ang)) { + std::cout << "Error: Cannot Construct Angle " << + newMol.GetKind().atomNames[bonded[b]] << " " << + newMol.GetKind().atomNames[focus] << " " << + newMol.GetKind().atomNames[bonded[c]] << " !\n"; + if(angleFix) + std::cout << "Note: This issue might happened due to defining " << + "fix angle.\n"; + exit(EXIT_FAILURE); } - break; - } + break; + } } @@ -427,25 +417,29 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { - if(prevInRing) { - double ang = phi[b]; - std::fill_n(angles, nTrials, ang); - } else { - double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm) + phi[c]; - std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI || isnan(ang)) { - std::cout << "Error: Cannot Construct Angle" << - oldMol.GetKind().atomNames[bonded[b]] << " " << - oldMol.GetKind().atomNames[focus] << " " << - oldMol.GetKind().atomNames[bonded[c]] << " !\n"; - std::cout << "Note: This issue might happened due to defining fix angle.\n"; - exit(EXIT_FAILURE); - } + double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or -ang + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + double phiDiff = phi[b] - phi[c]; + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + ang *= (phiDiff > 0.0 ? -1.0 : 1.0); + ang += phi[c]; + std::fill_n(angles, nTrials, ang); + if(isnan(ang)) { + std::cout << "Error: Cannot Construct Angle" << + oldMol.GetKind().atomNames[bonded[b]] << " " << + oldMol.GetKind().atomNames[focus] << " " << + oldMol.GetKind().atomNames[bonded[c]] << " !\n"; + if(angleFix) + std::cout << "Note: This issue might happened due to defining " << + "fix angle.\n"; + exit(EXIT_FAILURE); } - break; - } + break; + } } + for (uint i = 0; i < nTrials; ++i) { double energies = 0.0; diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index 502378b91..3898d0e13 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -100,7 +100,6 @@ class DCHedronCycle //except angleKinds[i][i] = kind between bonded[i] and prev uint angleKinds[MAX_BONDS][MAX_BONDS]; bool angleInRing[MAX_BONDS][MAX_BONDS]; - bool prevInRing; double theta[MAX_BONDS]; double thetaWeight[MAX_BONDS]; double phi[MAX_BONDS]; From 51f3d84b3320f994014a29584b1d9899202ff065 Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 13:14:34 -0400 Subject: [PATCH 130/199] Continue fixing the ring problem --- src/cbmc/DCHedronCycle.cpp | 94 ++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 94ffb6e89..c734bde8e 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -327,37 +327,44 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri std::fill_n(nonbonded_1_3, nTrials, 0.0); //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - angles[i] = data->prng.rand(M_PI * 2); + angles[i] = data->prng.rand(M_PI); } //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { + bool flip = false; double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or ang+2pi + double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - + CalcOldPhi(newMol, bonded[c], focus); + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + flip = (phiDiff > 0.0 ? true : false); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); - //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or -ang - double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - - CalcOldPhi(newMol, bonded[c], focus); - phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); - ang *= (phiDiff > 0.0 ? -1.0 : 1.0); - ang += phi[c]; - std::fill_n(angles, nTrials, ang); - if(isnan(ang)) { - std::cout << "Error: Cannot Construct Angle " << - newMol.GetKind().atomNames[bonded[b]] << " " << - newMol.GetKind().atomNames[focus] << " " << - newMol.GetKind().atomNames[bonded[c]] << " !\n"; - if(angleFix) - std::cout << "Note: This issue might happened due to defining " << - "fix angle.\n"; - exit(EXIT_FAILURE); - } - break; + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + ang *= (flip ? -1.0 : 1.0); + ang += phi[c]; + std::fill_n(angles, nTrials, ang); + if(isnan(ang)) { + std::cout << "NewMol: Error: Cannot Construct Angle " << + newMol.GetKind().atomNames[bonded[b]] << " " << + newMol.GetKind().atomNames[focus] << " " << + newMol.GetKind().atomNames[bonded[c]] << " !\n"; + if(angleFix) { + std::cout << "Note: This issue might happened due to defining " << + "fix angle.\n"; + } + exit(EXIT_FAILURE); + } + break; + } else if (flip) { + for (uint i = 0; i < nTrials; ++i) { + angles[i] *= -1.0; + } } } @@ -407,36 +414,43 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double stepWeight = 0.0; //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - angles[i] = data->prng.rand(M_PI * 2); + angles[i] = data->prng.rand(M_PI); } //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { + bool flip = false; double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); + double phiDiff = phi[b] - phi[c]; + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + flip = (phiDiff > 0.0 ? true : false); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or -ang - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); - double phiDiff = phi[b] - phi[c]; - phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); - ang *= (phiDiff > 0.0 ? -1.0 : 1.0); - ang += phi[c]; - std::fill_n(angles, nTrials, ang); - if(isnan(ang)) { - std::cout << "Error: Cannot Construct Angle" << - oldMol.GetKind().atomNames[bonded[b]] << " " << - oldMol.GetKind().atomNames[focus] << " " << - oldMol.GetKind().atomNames[bonded[c]] << " !\n"; - if(angleFix) - std::cout << "Note: This issue might happened due to defining " << - "fix angle.\n"; - exit(EXIT_FAILURE); + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or ang+2pi + double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + ang *= (flip ? -1.0 : 1.0); + ang += phi[c]; + std::fill_n(angles, nTrials, ang); + if(isnan(ang)) { + std::cout << "oldMol: Error: Cannot Construct Angle" << + oldMol.GetKind().atomNames[bonded[b]] << " " << + oldMol.GetKind().atomNames[focus] << " " << + oldMol.GetKind().atomNames[bonded[c]] << " !\n"; + if(angleFix) { + std::cout << "Note: This issue might happened due to defining " << + "fix angle.\n"; + } + exit(EXIT_FAILURE); + } + break; + } else if (flip) { + for (uint i = 0; i < nTrials; ++i) { + angles[i] *= -1.0; } - break; } } From 6f52ddf063af85898274ce88f4bc9f1a0a9b36bf Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 13:53:35 -0400 Subject: [PATCH 131/199] Continue fixing the ring problem --- src/cbmc/DCHedronCycle.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c734bde8e..31b3e7222 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -330,6 +330,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri angles[i] = data->prng.rand(M_PI); } + double refPhi = CalcOldPhi(newMol, bonded[0], focus); //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { bool flip = false; @@ -337,9 +338,9 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double sinTerm = sin(theta[b]) * sin(theta[c]); bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or ang+2pi - double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - - CalcOldPhi(newMol, bonded[c], focus); + //Need to determine if we want to use ang or -ang + //Use phi[0] to compare it + double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - refPhi; phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); flip = (phiDiff > 0.0 ? true : false); @@ -423,14 +424,15 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - double phiDiff = phi[b] - phi[c]; + double phiDiff = phi[b] - phi[0]; phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); flip = (phiDiff > 0.0 ? true : false); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or ang+2pi + //Need to determine if we want to use ang or -ang + //Use phi[0] to compare it double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; From 4527593e2f0b70ba553477717cc79c03b1d8ad0f Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 15:15:47 -0400 Subject: [PATCH 132/199] Continue fixing the ring problem --- src/cbmc/DCHedronCycle.cpp | 51 ++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 31b3e7222..c7b82cc20 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -321,6 +321,8 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri SetBasis(newMol, focus, prev); phi[0] = 0.0; + //reference phi + double refPhi = CalcOldPhi(newMol, bonded[0], focus); for (uint b = 1; b < nBonds; ++b) { std::fill_n(energies, nTrials, 0.0); @@ -330,21 +332,22 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri angles[i] = data->prng.rand(M_PI); } - double refPhi = CalcOldPhi(newMol, bonded[0], focus); + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or -ang + //Use phi[0] to compare it + double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - refPhi; + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + double flip = (phiDiff > 0.0 ? true : false); + //avoid flipping twice for each b + bool fliped = false; + //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { - bool flip = false; - double cosTerm = cos(theta[b]) * cos(theta[c]); - double sinTerm = sin(theta[b]) * sin(theta[c]); - bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or -ang - //Use phi[0] to compare it - double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - refPhi; - phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); - flip = (phiDiff > 0.0 ? true : false); + bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); ang *= (flip ? -1.0 : 1.0); @@ -362,10 +365,11 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri exit(EXIT_FAILURE); } break; - } else if (flip) { + } else if (flip && !fliped) { for (uint i = 0; i < nTrials; ++i) { angles[i] *= -1.0; } + fliped = true; } } @@ -418,21 +422,23 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, angles[i] = data->prng.rand(M_PI); } + //tan2 output is [-pi, pi], acos output is [0, pi] + //Need to determine if we want to use ang or -ang + //Use phi[0] to compare it + double phiDiff = phi[b] - phi[0]; + phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); + bool flip = (phiDiff > 0.0 ? true : false); + //avoid flipping twice for each b + bool fliped = false; + //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { - bool flip = false; - double cosTerm = cos(theta[b]) * cos(theta[c]); - double sinTerm = sin(theta[b]) * sin(theta[c]); bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - double phiDiff = phi[b] - phi[0]; - phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); - flip = (phiDiff > 0.0 ? true : false); if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { + double cosTerm = cos(theta[b]) * cos(theta[c]); + double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - //tan2 output is [-pi, pi], acos output is [0, pi] - //Need to determine if we want to use ang or -ang - //Use phi[0] to compare it double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; @@ -449,10 +455,11 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, exit(EXIT_FAILURE); } break; - } else if (flip) { + } else if (flip && !fliped) { for (uint i = 0; i < nTrials; ++i) { angles[i] *= -1.0; } + fliped = true; } } From 79f99debef650427bcd74191303261588cb63a7c Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 15:39:27 -0400 Subject: [PATCH 133/199] Continue fixing the ring problem --- src/cbmc/DCHedronCycle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c7b82cc20..ad761e4e2 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -345,7 +345,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri for (uint c = 0; c < b; ++c) { bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { + if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); @@ -435,7 +435,7 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, for (uint c = 0; c < b; ++c) { bool angleFix = data->ff.angles->AngleFixed(angleKinds[b][c]); - if(angleInRing[b][b] || angleInRing[b][c] || angleFix) { + if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); From ccc27fb4fe9c03c7fd45b40586197565d50eb0ec Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 22:20:59 -0400 Subject: [PATCH 134/199] Fix to the numerical issue when molecule is completely flat --- src/cbmc/DCHedronCycle.cpp | 26 ++++++++++++++++---------- src/cbmc/DCLinkedCycle.cpp | 3 ++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index ad761e4e2..7d3679365 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -349,15 +349,18 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + double var = (cos(bfcRing) - cosTerm) / sinTerm; + //To fix the numerical problem for flat molecule + var = (var < -1.0 ? -1.0 : var); + double ang = acos(var); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; std::fill_n(angles, nTrials, ang); if(isnan(ang)) { - std::cout << "NewMol: Error: Cannot Construct Angle " << - newMol.GetKind().atomNames[bonded[b]] << " " << - newMol.GetKind().atomNames[focus] << " " << - newMol.GetKind().atomNames[bonded[c]] << " !\n"; + std::cout << "Error: Cannot Construct Angle " << + newMol.GetKind().atomTypeNames[bonded[b]] << " " << + newMol.GetKind().atomTypeNames[focus] << " " << + newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; if(angleFix) { std::cout << "Note: This issue might happened due to defining " << "fix angle.\n"; @@ -439,15 +442,18 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - double ang = acos((cos(bfcRing) - cosTerm) / sinTerm); + double var = (cos(bfcRing) - cosTerm) / sinTerm; + //To fix the numerical problem for flat molecule + var = (var < -1.0 ? -1.0 : var); + double ang = acos(var); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; std::fill_n(angles, nTrials, ang); if(isnan(ang)) { - std::cout << "oldMol: Error: Cannot Construct Angle" << - oldMol.GetKind().atomNames[bonded[b]] << " " << - oldMol.GetKind().atomNames[focus] << " " << - oldMol.GetKind().atomNames[bonded[c]] << " !\n"; + std::cout << "Error: Cannot Construct Angle" << + oldMol.GetKind().atomTypeNames[bonded[b]] << " " << + oldMol.GetKind().atomTypeNames[focus] << " " << + oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; if(angleFix) { std::cout << "Note: This issue might happened due to defining " << "fix angle.\n"; diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index fd6e51da7..c89312850 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -250,7 +250,8 @@ void DCLinkedCycle::BuildNew(TrialMol& newMol, uint molIndex) uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); for(uint b = 0; b < hed.NumBond(); ++b) { - newMol.AddAtom(hed.Bonded(b), positions[b][winner]); + if(!newMol.AtomExists(hed.Bonded(b))) + newMol.AddAtom(hed.Bonded(b), positions[b][winner]); newMol.AddBonds(hed.Bonded(b), hed.Focus()); } From 88ad8b9def5140994f1a8fd8f34aaa496c98841e Mon Sep 17 00:00:00 2001 From: msoroush Date: Fri, 7 Sep 2018 23:12:35 -0400 Subject: [PATCH 135/199] Improve picking crankshaft nodes. --- src/MolSetup.cpp | 30 +++++++++++++ src/MolSetup.h | 6 +++ src/cbmc/DCCyclic.cpp | 101 ++++++++++++++++++++---------------------- 3 files changed, 85 insertions(+), 52 deletions(-) diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index b39a6468a..f06aade8c 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -118,6 +118,16 @@ std::vector mol_setup::DihsOnBond(const MolKind& molKind, uint atom, u return result; } +std::vector mol_setup::DihsAll(const MolKind& molKind) +{ + std::vector result; + typedef std::vector::const_iterator Diter; + for (Diter it = molKind.dihedrals.begin(), end = molKind.dihedrals.end(); it < end; ++it) { + result.push_back(*it); + } + return result; +} + //List of angles with atom at one end, atom first std::vector mol_setup::AtomEndAngles(const MolKind& molKind, uint atom) { @@ -163,6 +173,16 @@ std::vector mol_setup::AtomMidEndAngles(const MolKind& molKind, uint mid, return result; } +std::vector mol_setup::AngsAll(const MolKind& molKind) +{ + std::vector result; + typedef std::vector::const_iterator Aiter; + for (Aiter it = molKind.angles.begin(), end = molKind.angles.end(); it < end; ++it) { + result.push_back(*it); + } + return result; +} + //List of bonds with atom at one end, atom first std::vector mol_setup::AtomBonds(const MolKind& molKind, uint atom) { @@ -179,6 +199,16 @@ std::vector mol_setup::AtomBonds(const MolKind& molKind, uint atom) return result; } +std::vector mol_setup::BondsAll(const MolKind& molKind) +{ + std::vector result; + typedef std::vector::const_iterator Biter; + for (Biter it = molKind.bonds.begin(), end = molKind.bonds.end(); it < end; ++it) { + result.push_back(*it); + } + return result; +} + int mol_setup::ReadCombinePSF(MolMap& kindMap, std::string const*const psfFilename, const int numFiles) diff --git a/src/MolSetup.h b/src/MolSetup.h index 1a76d17cc..0e402f8ee 100644 --- a/src/MolSetup.h +++ b/src/MolSetup.h @@ -101,14 +101,20 @@ class MolKind std::vector AtomEndDihs(const MolKind& molKind, uint atom); //List of dihedrals with atom and partner in middle, atom in a1 std::vector DihsOnBond(const MolKind& molKind, uint atom, uint partner); +//List of all dihedrals in the molecule kind +std::vector DihsAll(const MolKind& molKind); //List of angles with atom at one end, atom first std::vector AtomEndAngles(const MolKind& molKind, uint atom); //List of angles with atom in middle std::vector AtomMidAngles(const MolKind& molKind, uint atom); //List of angles with atom at one end, and mid in middle, atom first std::vector AtomMidEndAngles(const MolKind& molKind, uint mid, uint atom); +//List of all angles in the molecule kind +std::vector AngsAll(const MolKind& molKind); //List of bonds with atom at one end, atom first std::vector AtomBonds(const MolKind& molKind, uint atom); +//List of all bonds in the molecule kind +std::vector BondsAll(const MolKind& molKind); //first element (string) is name of molecule type typedef std::map MolMap; diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index 149cb5ed8..e711e472b 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -158,62 +158,59 @@ void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) { using namespace mol_setup; using namespace std; - //Start with the atoms that form angles. - vector tempNodes = nodes; - vector visited(kind.atoms.size(), false); - - while(!tempNodes.empty()) { - //start from last node, find the atom index of the node - uint a0 = tempNodes.back().atomIndex; - //Find the angle that end with a0 - vector angles = AtomEndAngles(kind, a0); - while(!angles.empty()) { - //find the last atomindex in the angle - uint a1 = angles.back().a1; - uint a2 = angles.back().a2; - - if(!(visited[a0] && visited[a1] && visited[a2])) { - bool fixAngle = false; - //Find all the angle that forms x-a0-a1 - vector angle = AtomMidEndAngles(kind, a0, a1); - //Find all the angle that forms a1-a2-x - vector tempAng = AtomMidEndAngles(kind, a2, a1); - //merge all the angle - angle.insert(angle.end(), tempAng.begin(), tempAng.end()); - //Check to see if any of these angles are fixed or not. - for(uint a = 0; a < angle.size(); a++) { - if(data.ff.angles->AngleFixed(angle[a].kind)) { - fixAngle = true; - } - } - //Check to see if atoms that are bonded to a1 belongs to same ring or not - bool sameRing = false; - if(isRing[a1]) { - //FInd the atoms that are bonded to a1 - vector bonds = AtomBonds(kind, a1); - for(uint b = 0; b < bonds.size(); b++) { - uint partner = bonds[b].a1; - if((partner == a0) || (partner == a2)) { - continue; - } - if(isRing[partner]) { - sameRing |= (ringIdx[a1] == ringIdx[partner]); - } - } - } + vector angles = AngsAll(kind); + std::vector bondCount(totAtom, 0); + vector allBonds = BondsAll(kind); + //Count the number of bonds for each atom + for (uint b = 0; b < allBonds.size(); ++b) { + ++bondCount[allBonds[b].a0]; + ++bondCount[allBonds[b].a1]; + } + + for(uint a = 0; a < angles.size(); a++) { + //find the last atomindex in the angle + uint a0 = angles[a].a0; + uint a1 = angles[a].a1; + uint a2 = angles[a].a2; + //ignore single bonded atoms + if(bondCount[a0] == 1 && bondCount[a2] == 1) { + continue; + } - //If there was no fix angles and atom a1 and any atom bonded to a1 are not - // in the same ring, we create DCCrankShaftAngle - if(!fixAngle && !sameRing) { - crankshaft.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a1-a2-x + vector tempAng = AtomMidEndAngles(kind, a2, a1); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint i = 0; i < angle.size(); i++) { + if(data.ff.angles->AngleFixed(angle[i].kind)) { + fixAngle = true; + } + } + //Check to see if atoms that are bonded to a1 belongs to same ring or not + bool sameRing = false; + if(isRing[a1]) { + //FInd the atoms that are bonded to a1 + vector bonds = AtomBonds(kind, a1); + for(uint b = 0; b < bonds.size(); b++) { + uint partner = bonds[b].a1; + if((partner == a0) || (partner == a2)) { + continue; + } + if(isRing[partner]) { + sameRing |= (ringIdx[a1] == ringIdx[partner]); } - visited[a0] = true; - visited[a1] = true; - visited[a2] = true; } - angles.pop_back(); } - tempNodes.pop_back(); + + //If there was no fix angles and atom a1 and any atom bonded to a1 are not + // in the same ring, we create DCCrankShaftAngle + if(!fixAngle && !sameRing) { + crankshaft.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + } } hasCrankShaft = (crankshaft.size() != 0); From f65dc19176422687e817a93b968de20c9dd5662a Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 8 Sep 2018 12:36:08 -0400 Subject: [PATCH 136/199] Fix the logic of fixing angle and fixing numerical problem. Fix to crankshaft move for noncyclic molecule --- src/cbmc/DCCyclic.cpp | 2 +- src/cbmc/DCGraph.cpp | 162 ++++++++++++++++--------------------- src/cbmc/DCGraph.h | 3 +- src/cbmc/DCHedron.cpp | 20 +++-- src/cbmc/DCHedronCycle.cpp | 6 +- 5 files changed, 90 insertions(+), 103 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index e711e472b..cee432938 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -223,7 +223,7 @@ void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Instead we perform IntraSwap move Build(oldMol, newMol, molIndex); } else { - //Set tCoords to coordinate of actual molecule, it will be modified + //Set tCoords to coordinate of actual molecule, it will be modified oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); newMol.SetCoords(coords, 0); //Pick a random node pair diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 08445870c..17c36ac25 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -26,6 +26,8 @@ DCGraph::DCGraph(System& sys, const Forcefield& ff, const MolKind setupKind = it->second; idExchange = new DCRotateCOM(&data, setupKind); + //init the coordinate + coords.Init(setupKind.atoms.size()); std::vector atomToNode(setupKind.atoms.size(), 0); std::vector bondCount(setupKind.atoms.size(), 0); @@ -93,102 +95,80 @@ void DCGraph::InitCrankShaft(const mol_setup::MolKind& kind) { using namespace mol_setup; using namespace std; - vector tempNodes = nodes; - vector visited(kind.atoms.size(), false); + std::vector bondCount(kind.atoms.size(), 0); + vector allBonds = BondsAll(kind); + //Count the number of bonds for each atom + for (uint b = 0; b < allBonds.size(); ++b) { + ++bondCount[allBonds[b].a0]; + ++bondCount[allBonds[b].a1]; + } + //Start with atoms that form dihedral - while(!tempNodes.empty()) { - //start from last node, find the atom index of the node - uint a0 = tempNodes.back().atomIndex; - //Find the dihedrals that end with a0 - vector dihs = AtomEndDihs(kind, a0); - while(!dihs.empty()) { - //find the last atomindex in the dihedral - uint a1 = dihs.back().a1; - uint a2 = dihs.back().a2; - uint a3 = dihs.back().a3; - - if(!(visited[a0] && visited[a1] && visited[a2] && visited[a3])) { - bool fixAngle = false; - //Find all the angle that forms x-a0-a1 - vector angle = AtomMidEndAngles(kind, a0, a1); - //Find all the angle that forms a2-a3-x - vector tempAng = AtomMidEndAngles(kind, a3, a2); - //merge all the angle - angle.insert(angle.end(), tempAng.begin(), tempAng.end()); - //Check to see if any of these angles are fixed or not. - for(uint a = 0; a < angle.size(); a++) { - if(data.ff.angles->AngleFixed(angle[a].kind)) { - fixAngle = true; - } - } - //If there was no fix angles, we create DCCrankShaftDih - if(!fixAngle) { - shaftNodesDih.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); - } - visited[a0] = true; - visited[a1] = true; - visited[a2] = true; - visited[a3] = true; + vector dihs = DihsAll(kind); + for(uint d = 0; d < dihs.size(); d++) { + //find the last atomindex in the dihedral + uint a0 = dihs[d].a0; + uint a1 = dihs[d].a1; + uint a2 = dihs[d].a2; + uint a3 = dihs[d].a3; + //ignore single bonded atoms + if(bondCount[a0] == 1 && bondCount[a3] == 1) { + continue; + } + + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a2-a3-x + vector tempAng = AtomMidEndAngles(kind, a3, a2); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint a = 0; a < angle.size(); a++) { + if(data.ff.angles->AngleFixed(angle[a].kind)) { + fixAngle = true; } - dihs.pop_back(); } - tempNodes.pop_back(); + + //If there was no fix angles, we create DCCrankShaftDih + if(!fixAngle) { + shaftNodes.push_back(new DCCrankShaftDih(&data, kind, a0, a1, a2, a3)); + } } //Continue with the atoms that form angles. - tempNodes = nodes; - visited.assign(kind.atoms.size(), false); - while(!tempNodes.empty()) { - //start from last node, find the atom index of the node - uint a0 = tempNodes.back().atomIndex; - //Find the angle that end with a0 - vector angles = AtomEndAngles(kind, a0); - while(!angles.empty()) { - //find the last atomindex in the angle - uint a1 = angles.back().a1; - uint a2 = angles.back().a2; - - if(!(visited[a0] && visited[a1] && visited[a2])) { - bool fixAngle = false; - //Find all the angle that forms x-a0-a1 - vector angle = AtomMidEndAngles(kind, a0, a1); - //Find all the angle that forms a1-a2-x - vector tempAng = AtomMidEndAngles(kind, a2, a1); - //merge all the angle - angle.insert(angle.end(), tempAng.begin(), tempAng.end()); - //Check to see if any of these angles are fixed or not. - for(uint a = 0; a < angle.size(); a++) { - if(data.ff.angles->AngleFixed(angle[a].kind)) { - fixAngle = true; - } - } - //If there was no fix angles, we create DCCrankShaftAngle - if(!fixAngle) { - shaftNodesAng.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); - } - visited[a0] = true; - visited[a1] = true; - visited[a2] = true; - } - angles.pop_back(); + vector angles = AngsAll(kind); + for(uint a = 0; a < angles.size(); a++) { + //find the last atomindex in the angle + uint a0 = angles[a].a0; + uint a1 = angles[a].a1; + uint a2 = angles[a].a2; + //ignore single bonded atoms + if(bondCount[a0] == 1 && bondCount[a2] == 1) { + continue; } - tempNodes.pop_back(); - } - hasCrankShaft = true; - if((shaftNodesAng.size() == 0) || (shaftNodesDih.size() == 0)) { - if(shaftNodesAng.size() == 0) { - shaftNodesAng = shaftNodesDih; - } else { - shaftNodesDih = shaftNodesAng; + bool fixAngle = false; + //Find all the angle that forms x-a0-a1 + vector angle = AtomMidEndAngles(kind, a0, a1); + //Find all the angle that forms a1-a2-x + vector tempAng = AtomMidEndAngles(kind, a2, a1); + //merge all the angle + angle.insert(angle.end(), tempAng.begin(), tempAng.end()); + //Check to see if any of these angles are fixed or not. + for(uint i = 0; i < angle.size(); i++) { + if(data.ff.angles->AngleFixed(angle[i].kind)) { + fixAngle = true; + } } - } - if((shaftNodesAng.size() == 0) && (shaftNodesDih.size() == 0)) { - hasCrankShaft = false; + //If there was no fix angles, we create DCCrankShaftAngle + if(!fixAngle) { + shaftNodes.push_back(new DCCrankShaftAng(&data, kind, a0, a1, a2)); + } } - + hasCrankShaft = (shaftNodes.size() != 0); } void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) @@ -198,9 +178,9 @@ void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Instead we perform Regrowth move within the same box Regrowth(oldMol, newMol, molIndex); } else { - //Decide to perform rotation around two atoms that form angle or dihedral - std::vector& shaftNodes = data.prng.randInt(1) ? - shaftNodesDih : shaftNodesAng; + //Set tCoords to coordinate of actual molecule, it will be modified + oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); + newMol.SetCoords(coords, 0); //Pick a random node pair uint pick = data.prng.randIntExc(shaftNodes.size()); shaftNodes[pick]->PrepareNew(newMol, molIndex); @@ -604,12 +584,8 @@ DCGraph::~DCGraph() } } - for(uint i = 0; i < shaftNodesDih.size(); i++) { - delete shaftNodesDih[i]; - } - - for(uint i = 0; i < shaftNodesAng.size(); i++) { - delete shaftNodesAng[i]; + for(uint i = 0; i < shaftNodes.size(); i++) { + delete shaftNodes[i]; } } diff --git a/src/cbmc/DCGraph.h b/src/cbmc/DCGraph.h index 655858b06..abac4b990 100644 --- a/src/cbmc/DCGraph.h +++ b/src/cbmc/DCGraph.h @@ -76,7 +76,8 @@ class DCGraph : public CBMC std::vector nodes; std::vector fringe; std::vector visited; - std::vector shaftNodesDih, shaftNodesAng; + std::vector shaftNodes; + XYZArray coords; }; } diff --git a/src/cbmc/DCHedron.cpp b/src/cbmc/DCHedron.cpp index 3f00b16ab..78205403f 100644 --- a/src/cbmc/DCHedron.cpp +++ b/src/cbmc/DCHedron.cpp @@ -292,16 +292,20 @@ void DCHedron::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials) if (data->ff.angles->AngleFixed(angleKinds[b][c])) { double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double var = (cos(bfcTheta) - cosTerm) / sinTerm; + //To fix the numerical problem for flat molecule + var = (var > 1.0 && var < 1.1 ? 1.0 : var); + var = (var < -1.0 && var > -1.1 ? -1.0 : var); + double ang = acos(var) + phi[c]; std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { + if(isnan(ang)) { + //printf("Val: %2.10f, angle: %2.5f \n", var, ang); std::cout << "Error: Cannot constrain fix angle for " << newMol.GetKind().atomTypeNames[bonded[b]] << " " << newMol.GetKind().atomTypeNames[focus] << " " << newMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; exit(EXIT_FAILURE); } - break; } } @@ -362,16 +366,20 @@ void DCHedron::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, if (data->ff.angles->AngleFixed(angleKinds[b][c])) { double bfcTheta = data->ff.angles->Angle(angleKinds[b][c]); - double ang = acos((cos(bfcTheta) - cosTerm) / sinTerm) + phi[c]; + double var = (cos(bfcTheta) - cosTerm) / sinTerm; + //To fix the numerical problem for flat molecule + var = (var > 1.0 && var < 1.1 ? 1.0 : var); + var = (var < -1.0 && var > -1.1 ? -1.0 : var); + double ang = acos(var) + phi[c]; std::fill_n(angles, nTrials, ang); - if(abs(ang) > 2.0 * M_PI) { + if(isnan(ang)) { + //printf("Val: %2.10f, angle: %2.5f \n", var, ang); std::cout << "Error: Cannot constrain fix angle for " << oldMol.GetKind().atomTypeNames[bonded[b]] << " " << oldMol.GetKind().atomTypeNames[focus] << " " << oldMol.GetKind().atomTypeNames[bonded[c]] << " !\n"; exit(EXIT_FAILURE); } - break; } } diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 7d3679365..c575cf03f 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -351,7 +351,8 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule - var = (var < -1.0 ? -1.0 : var); + var = (var > 1.0 && var < 1.1 ? 1.0 : var); + var = (var < -1.0 && var > -1.1 ? -1.0 : var); double ang = acos(var); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; @@ -444,7 +445,8 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule - var = (var < -1.0 ? -1.0 : var); + var = (var > 1.0 && var < 1.1 ? 1.0 : var); + var = (var < -1.0 && var > -1.1 ? -1.0 : var); double ang = acos(var); ang *= (flip ? -1.0 : 1.0); ang += phi[c]; From 449f3095a2976400deb73fb7d0d6abf3b712127d Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 8 Sep 2018 13:56:04 -0400 Subject: [PATCH 137/199] improve coding of TotalAndDensity function --- src/MoleculeLookup.cpp | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/MoleculeLookup.cpp b/src/MoleculeLookup.cpp index 0891c6d49..01fd401bf 100644 --- a/src/MoleculeLookup.cpp +++ b/src/MoleculeLookup.cpp @@ -78,34 +78,29 @@ void MoleculeLookup::TotalAndDensity (uint * numByBox, uint * numByKindBox, double * molFractionByKindBox, double * densityByKindBox, double const*const volInv) const { - double invBoxTotal = 0; - uint mkIdx1, mkIdx2, sum; - sum = mkIdx1 = mkIdx2 = 0; for (uint b = 0; b < BOX_TOTAL; ++b) { - sum = 0; for (uint k = 0; k < numKinds; ++k) { uint numMK = NumKindInBox(k, b); - numByKindBox[mkIdx1] = numMK; - densityByKindBox[mkIdx1] = numByKindBox[mkIdx1] * volInv[b]; - sum += numMK; - ++mkIdx1; + uint mkIdx = k + numKinds * b; + numByKindBox[mkIdx] = numMK; + densityByKindBox[mkIdx] = numMK * volInv[b]; + numByBox[b] += numMK; } - numByBox[b] = sum; + //Calculate mol fractions - if (sum > 0) - invBoxTotal = 1.0 / sum; if (numKinds > 1) { for (uint k = 0; k < numKinds; ++k) { - if (sum > 0) { - molFractionByKindBox[mkIdx2] = - numByKindBox[mkIdx2] * invBoxTotal; + uint mkIdx = k + numKinds * b; + if (numByBox[b] > 0) { + molFractionByKindBox[mkIdx] = numByKindBox[mkIdx] / + numByBox[b]; } else { - molFractionByKindBox[mkIdx2] = 0.0; + molFractionByKindBox[mkIdx] = 0.0; } - ++mkIdx2; } } } + } #ifdef VARIABLE_PARTICLE_NUMBER From b259aa91f9da81a1cceab357b505dff4a94161d0 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 10 Sep 2018 14:13:49 -0400 Subject: [PATCH 138/199] Fix to calculate molFraction, cast numbe of molecule to double before calculating molfracture --- src/MoleculeLookup.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/MoleculeLookup.cpp b/src/MoleculeLookup.cpp index 01fd401bf..de8f320c2 100644 --- a/src/MoleculeLookup.cpp +++ b/src/MoleculeLookup.cpp @@ -79,6 +79,7 @@ void MoleculeLookup::TotalAndDensity double * densityByKindBox, double const*const volInv) const { for (uint b = 0; b < BOX_TOTAL; ++b) { + numByBox[b] = 0.0; for (uint k = 0; k < numKinds; ++k) { uint numMK = NumKindInBox(k, b); uint mkIdx = k + numKinds * b; @@ -92,13 +93,14 @@ void MoleculeLookup::TotalAndDensity for (uint k = 0; k < numKinds; ++k) { uint mkIdx = k + numKinds * b; if (numByBox[b] > 0) { - molFractionByKindBox[mkIdx] = numByKindBox[mkIdx] / - numByBox[b]; + molFractionByKindBox[mkIdx] = (double)numByKindBox[mkIdx] / + (double)numByBox[b]; } else { molFractionByKindBox[mkIdx] = 0.0; } } } + } } From 3751558869447dc56f00d2ea377f67b348044466 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 15 Sep 2018 18:02:58 -0400 Subject: [PATCH 139/199] Set cutoffCoulomb to 0.0 --- src/ConfigSetup.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index 2342e2daf..b24b3e134 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -178,6 +178,7 @@ struct ElectroStatic { ElectroStatic(void) { std::fill_n(cutoffCoulombRead, BOX_TOTAL, false); + std::fill_n(cutoffCoulomb, BOX_TOTAL, 0.0); } }; From bec1ef41e69de1899de45ac9593e60144fea4609 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 15 Sep 2018 18:54:37 -0400 Subject: [PATCH 140/199] Set cellist cutoff after initialazation of boxdimension --- src/CellList.cpp | 8 +++++++- src/CellList.h | 1 + src/System.cpp | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/CellList.cpp b/src/CellList.cpp index fdcc85351..375e9a6ad 100644 --- a/src/CellList.cpp +++ b/src/CellList.cpp @@ -20,7 +20,13 @@ CellList::CellList(const Molecules& mols, BoxDimensions& dims) isBuilt = false; for(uint b = 0; b < BOX_TOTAL; b++) { edgeCells[b][0] = edgeCells[b][1] = edgeCells[b][2] = 0; - cutoff[b] = dims.rCut[b]; + } +} + +void CellList::SetCutoff() +{ + for(uint b = 0; b < BOX_TOTAL; b++) { + cutoff[b] = dimensions->rCut[b]; } } diff --git a/src/CellList.h b/src/CellList.h index dbec6aa4e..74090b4cc 100644 --- a/src/CellList.h +++ b/src/CellList.h @@ -23,6 +23,7 @@ class CellList { public: explicit CellList(const Molecules& mols, BoxDimensions& dims); + void SetCutoff(); void RemoveMol(const int molIndex, const int box, const XYZArray& pos); void AddMol(const int molIndex, const int box, const XYZArray& pos); diff --git a/src/System.cpp b/src/System.cpp index 6b2c225e5..7845e2fdc 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -92,6 +92,7 @@ void System::Init(Setup const& set) //particle/molecule ensemble, e.g. NVT coordinates.InitFromPDB(set.pdb.atoms); com.CalcCOM(); + cellList.SetCutoff(); cellList.GridAll(boxDimRef, coordinates, molLookupRef); //check if we have to use cached version of ewlad or not. From e7ff760be7d9bfd8c449e0aaf5b051d7f163e49c Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 18 Sep 2018 18:54:23 -0400 Subject: [PATCH 141/199] Exiting the simulation if box size shrinked bellow 2*rCut during volume move. --- src/BoxDimensions.cpp | 12 ++++++------ src/BoxDimensionsNonOrth.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/BoxDimensions.cpp b/src/BoxDimensions.cpp index fc9cc28ff..0b9258e1f 100644 --- a/src/BoxDimensions.cpp +++ b/src/BoxDimensions.cpp @@ -112,10 +112,10 @@ uint BoxDimensions::ShiftVolume(BoxDimensions & newDim, XYZ & scale, //automatically reject to prevent errors. if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newVolume < minVol[b])) { - std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" - << std::endl; + std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!\n"; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; - rejectState = mv::fail_state::VOL_TRANS_WOULD_SHRINK_BOX_BELOW_CUTOFF; + std::cout << "Exiting!\n"; + exit(EXIT_FAILURE); } scale = newDim.axis.Get(b) / axis.Get(b); @@ -138,10 +138,10 @@ uint BoxDimensions::ExchangeVolume(BoxDimensions & newDim, XYZ * scale, scale[b] = newDim.axis.Get(b) / axis.Get(b); if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { - std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" - << std::endl; + std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!\n"; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; - return mv::fail_state::VOL_TRANS_WOULD_SHRINK_BOX_BELOW_CUTOFF; + std::cout << "Exiting!\n"; + exit(EXIT_FAILURE); } } return state; diff --git a/src/BoxDimensionsNonOrth.cpp b/src/BoxDimensionsNonOrth.cpp index 004c2b53d..fb856dccc 100644 --- a/src/BoxDimensionsNonOrth.cpp +++ b/src/BoxDimensionsNonOrth.cpp @@ -163,10 +163,10 @@ uint BoxDimensionsNonOrth::ShiftVolume(BoxDimensionsNonOrth & newDim, //automatically reject to prevent errors. if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newVolume < minVol[b])) { - std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" - << std::endl; + std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!\n"; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; - rejectState = mv::fail_state::VOL_TRANS_WOULD_SHRINK_BOX_BELOW_CUTOFF; + std::cout << "Exiting!\n"; + exit(EXIT_FAILURE); } scale = newDim.axis.Get(b) / axis.Get(b); @@ -190,10 +190,10 @@ uint BoxDimensionsNonOrth::ExchangeVolume(BoxDimensionsNonOrth & newDim, scale[b] = newDim.axis.Get(b) / axis.Get(b); if ((newDim.halfAx.x[b] < rCut[b] || newDim.halfAx.y[b] < rCut[b] || newDim.halfAx.z[b] < rCut[b] || newDim.volume[b] < minVol[b])) { - std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!" - << std::endl; + std::cout << "WARNING!!! box shrunk below 2*Rcut! Auto-rejecting!\n"; std::cout << "AxisDimensions: " << newDim.GetAxis(b) << std::endl; - return mv::fail_state::VOL_TRANS_WOULD_SHRINK_BOX_BELOW_CUTOFF; + std::cout << "Exiting!\n"; + exit(EXIT_FAILURE); } } return state; From 4039e183e664d4edc3fedcef067c7ce7a461d42d Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 20 Sep 2018 14:25:56 -0400 Subject: [PATCH 142/199] Fix to the bug of detecting densBox in MEMC move --- src/IntraMoleculeExchange1.h | 2 +- src/MoleculeExchange1.h | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/IntraMoleculeExchange1.h b/src/IntraMoleculeExchange1.h index 4dc32f1b4..37c3acd96 100644 --- a/src/IntraMoleculeExchange1.h +++ b/src/IntraMoleculeExchange1.h @@ -297,7 +297,7 @@ inline uint IntraMoleculeExchange1::GetBoxPairAndMol(const double subDraw, overlap = false; #if ENSEMBLE == GCMC - sourceBox = 0; + sourceBox = mv::BOX0; #else prng.PickBox(sourceBox, subDraw, movPerc); #endif diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 6ef522e95..274f5b043 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -58,6 +58,13 @@ class MoleculeExchange1 : public MoveBase trial[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); accepted[b].resize(molRef.GetKindsCount() * molRef.GetKindsCount(), 0.0); } + #if ENSEMBLE == GEMC + //start with box0 and modify it if Box0 was not the dense box + sourceBox = mv::BOX0; + #elif ENSEMBLE == GCMC + sourceBox = mv::BOX0; + destBox = mv::BOX1; + #endif } } @@ -230,7 +237,7 @@ inline void MoleculeExchange1::AdjustExRatio() inline void MoleculeExchange1::SetBox() { #if ENSEMBLE == GEMC - uint densB = mv::BOX0; + uint densB = sourceBox; if(((counter + 1) % perAdjust) == 0) { double density; double maxDens = 0.0; @@ -253,10 +260,6 @@ inline void MoleculeExchange1::SetBox() //Pick the destination box prng.SetOtherBox(destBox, sourceBox); //prng.PickBoxPair(sourceBox, destBox, subDraw, movPerc); - -#elif ENSEMBLE == GCMC - sourceBox = 0; - destBox = 1; #endif } From 98dca844668fc064bc364696c415b51a386059ac Mon Sep 17 00:00:00 2001 From: niloofartf <33426204+niloofartf@users.noreply.github.com> Date: Mon, 24 Sep 2018 11:34:39 -0400 Subject: [PATCH 143/199] Update ConfigSetup.cpp define the function to check two string without case sensitive. --- src/ConfigSetup.cpp | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 7bbe82460..a146f7d4a 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -145,6 +145,19 @@ bool ConfigSetup::checkBool(string str) exit(EXIT_FAILURE); } +bool ConfigSetup::CheckString(string str1, string str2) #case insensitive +{ + for(int k = 0; k < str1.length(); k++) { + str1[k] = toupper(str1[k]); + } + + for(int j = 0; j < str2.length(); j++) { + str2[j] = toupper(str2[j]); + } + + return (str1 == str2); +} + void ConfigSetup::Init(const char *fileName) { std::vector line; @@ -155,18 +168,18 @@ void ConfigSetup::Init(const char *fileName) if(line.size() == 0) continue; - if(line[0] == "Restart") { + if(CheckString(line[0], "Restart")) { in.restart.enable = checkBool(line[1]); if(in.restart.enable) { printf("%-40s %-s \n", "Info: Restart simulation", "Active"); } - } else if(line[0] == "FirstStep") { + } else if(CheckString(line[0], "FirstStep")) { in.restart.step = stringtoi(line[1]); } else if(line[0] == "PRNG") { in.prng.kind = line[1]; if("RANDOM" == line[1]) printf("%-40s %-s \n", "Info: Random seed", "Active"); - } else if(line[0] == "ParaTypeCHARMM") { + } else if(CheckString(line[0], "ParaTypeCHARMM")) { if(checkBool(line[1])) { in.ffKind.numOfKinds++; in.ffKind.isEXOTIC = false; @@ -174,7 +187,7 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isCHARMM = true; printf("%-40s %-s \n", "Info: PARAMETER file", "CHARMM format!"); } - } else if(line[0] == "ParaTypeEXOTIC") { + } else if(CheckString(line[0], "ParaTypeEXOTIC")) { if(checkBool(line[1])) { in.ffKind.numOfKinds++; in.ffKind.isCHARMM = false; @@ -182,7 +195,7 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isEXOTIC = true; printf("%-40s %-s \n", "Info: PARAMETER file", "EXOTIC format!"); } - } else if(line[0] == "ParaTypeMARTINI") { + } else if(CheckString(line[0], "ParaTypeMARTINI")) { if(checkBool(line[1])) { in.ffKind.numOfKinds ++; in.ffKind.isEXOTIC = false; @@ -190,16 +203,16 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isCHARMM = true; printf("%-40s %-s \n", "Info: PARAMETER file", "MARTINI using CHARMM format!"); } - } else if(line[0] == "Parameters") { + } else if(CheckString(line[0], "Parameters")) { in.files.param.name = line[1]; - } else if(line[0] == "Coordinates") { + } else if(CheckString(line[0], "Coordinates")) { uint boxnum = stringtoi(line[1]); if(boxnum >= BOX_TOTAL) { std::cout << "Error: Simulation requires " << BOX_TOTAL << " PDB file(s)!\n"; exit(EXIT_FAILURE); } in.files.pdb.name[boxnum] = line[2]; - } else if(line[0] == "Structure") { + } else if(CheckString(line[0], "Structure")) { uint boxnum = stringtoi(line[1]); if(boxnum >= BOX_TOTAL) { std::cout << "Error: Simulation requires " << BOX_TOTAL << " PSF file(s)!\n"; @@ -208,15 +221,15 @@ void ConfigSetup::Init(const char *fileName) in.files.psf.name[boxnum] = line[2]; } #if ENSEMBLE == GEMC - else if(line[0] == "GEMC") { - if(line[1] == "NVT") { + else if(CheckString(line[0], "GEMC")) { + if(CheckString(line[1], "NVT")) { sys.gemc.kind = mv::GEMC_NVT; printf("Info: Running NVT_GEMC\n"); - } else if(line[1] == "NPT") { + } else if(CheckString(line[1], "NPT")) { sys.gemc.kind = mv::GEMC_NPT; printf("Info: Running NPT_GEMC\n"); } - } else if(line[0] == "Pressure") { + } else if(CheckString(line[0], "Pressure")) { sys.gemc.pressure = stringtod(line[1]); printf("%-40s %-4.4f bar\n", "Info: Input Pressure", sys.gemc.pressure); sys.gemc.pressure *= unit::BAR_TO_K_MOLECULE_PER_A3; From 58f42c910f7c05f5224eb591301298a75483c390 Mon Sep 17 00:00:00 2001 From: Niloofar Torabifard Date: Fri, 5 Oct 2018 12:35:07 -0400 Subject: [PATCH 144/199] Finished implementing the case sensitive issue for config file --- src/ConfigSetup.cpp | 30 +++++++++++++++--------------- src/ConfigSetup.h | 1 + 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index a146f7d4a..d5e16c6ee 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -145,7 +145,7 @@ bool ConfigSetup::checkBool(string str) exit(EXIT_FAILURE); } -bool ConfigSetup::CheckString(string str1, string str2) #case insensitive +bool ConfigSetup::CheckString(string str1, string str2) { for(int k = 0; k < str1.length(); k++) { str1[k] = toupper(str1[k]); @@ -236,37 +236,37 @@ void ConfigSetup::Init(const char *fileName) } #endif #if ENSEMBLE == NPT - else if(line[0] == "Pressure") { + else if(CheckString(line[0], "Pressure")) { sys.gemc.kind = mv::GEMC_NPT; sys.gemc.pressure = stringtod(line[1]); printf("%-40s %-4.4f bar\n", "Info: Input Pressure", sys.gemc.pressure); sys.gemc.pressure *= unit::BAR_TO_K_MOLECULE_PER_A3; } #endif - else if(line[0] == "Temperature") { + else if(CheckString(line[0], "Temperature")) { sys.T.inKelvin = stringtod(line[1]); printf("%-40s %-4.4f K\n", "Info: Input Temperature", sys.T.inKelvin); - } else if(line[0] == "Potential") { - if(line[1] == "VDW") { + } else if(CheckString(line[0], "Potential")) { + if(CheckString(line[1],"VDW")) { sys.ff.VDW_KIND = sys.ff.VDW_STD_KIND; printf("%-40s %-s \n", "Info: Non-truncated potential", "Active"); - } else if(line[1] == "SHIFT") { + } else if(CheckString(line[1],"SHIFT")) { sys.ff.VDW_KIND = sys.ff.VDW_SHIFT_KIND; printf("%-40s %-s \n", "Info: Shift truncated potential", "Active"); - } else if(line[1] == "SWITCH") { + } else if(CheckString(line[1], "SWITCH")) { sys.ff.VDW_KIND = sys.ff.VDW_SWITCH_KIND; printf("%-40s %-s \n", "Info: Switch truncated potential", "Active"); } - } else if(line[0] == "LRC") { + } else if(CheckString(line[0], "LRC")) { sys.ff.doTailCorr = checkBool(line[1]); if(sys.ff.doTailCorr) printf("%-40s %-s \n", "Info: Long Range Correction", "Active"); else printf("%-40s %-s \n", "Info: Long Range Correction", "Inactive"); - } else if(line[0] == "Rswitch") { + } else if(CheckString(line[0], "Rswitch")) { sys.ff.rswitch = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Switch distance", sys.ff.rswitch); - } else if(line[0] == "ExchangeVolumeDim") { + } else if(CheckString(line[0], "ExchangeVolumeDim")) { if(line.size() == 4) { XYZ temp; temp.x = stringtod(line[1]); @@ -279,7 +279,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readVol = true; sys.intraMemcVal.readVol = true; } - } else if(line[0] == "ExchangeRatio") { + } else if(CheckString(line[0],"ExchangeRatio")) { if(line.size() >= 2) { printf("%-41s", "Info: ExchangeRatio"); for(uint i = 1; i < line.size(); i++) { @@ -292,7 +292,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readRatio = true; sys.intraMemcVal.readRatio = true; } - } else if(line[0] == "ExchangeLargeKind") { + } else if(CheckString(line[0], "ExchangeLargeKind")) { if(line.size() >= 2) { printf("%-41s", "Info: Exchange Large Kind"); for(uint i = 1; i < line.size(); i++) { @@ -305,7 +305,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readLK = true; sys.intraMemcVal.readLK = true; } - } else if(line[0] == "ExchangeSmallKind") { + } else if(CheckString(line[0], "ExchangeSmallKind")) { if(line.size() >= 2) { printf("%-41s", "Info: Exchange Small Kind"); for(uint i = 1; i < line.size(); i++) { @@ -318,7 +318,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readSK = true; sys.intraMemcVal.readSK = true; } - } else if(line[0] == "SmallKindBackBone") { + } else if(CheckString(line[0], "SmallKindBackBone")) { if((line.size() % 2) == 0) { std::cout <<"Error: Atom Names in Small Kind BackBone must be in pair!\n"; exit(EXIT_FAILURE); @@ -341,7 +341,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readSmallBB = true; sys.intraMemcVal.readSmallBB = true; } - } else if(line[0] == "LargeKindBackBone") { + } else if(CheckString(line[0], "LargeKindBackBone")) { if((line.size() % 2) == 0) { std::cout <<"Error: Atom Names in Large Kind BackBone must be in pair!\n"; exit(EXIT_FAILURE); diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index b24b3e134..d19e7b647 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -340,6 +340,7 @@ class ConfigSetup private: void fillDefaults(void); bool checkBool(string str); + bool CheckString(string str1, string str2); void verifyInputs(void); InputFileReader reader; From 23a5502f23482860edb4c5e11557e5a07cdd91b2 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 8 Oct 2018 10:33:46 -0400 Subject: [PATCH 145/199] Perform rotation on axis for groups that are attached to the ring. e.g. methylcyclohexane. --- CMake/FileLists.cmake | 4 +- src/cbmc/DCCrankShaftAng.cpp | 12 +- src/cbmc/DCCyclic.cpp | 53 +++- src/cbmc/DCRotateOnAtom.cpp | 514 +++++++++++++++++++++++++++++++++++ src/cbmc/DCRotateOnAtom.h | 61 +++++ 5 files changed, 639 insertions(+), 5 deletions(-) create mode 100644 src/cbmc/DCRotateOnAtom.cpp create mode 100644 src/cbmc/DCRotateOnAtom.h diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index cc6e5431d..fc06ed32f 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -44,7 +44,7 @@ set(sources src/cbmc/DCFreeCycle.cpp src/cbmc/DCFreeHedron.cpp src/cbmc/DCFreeHedronSeed.cpp - src/cbmc/DCFreeCycleSeed.cpp + src/cbmc/DCFreeCycleSeed.cpp src/cbmc/DCLinkedHedron.cpp src/cbmc/DCLinkedCycle.cpp src/cbmc/DCHedron.cpp @@ -52,6 +52,7 @@ set(sources src/cbmc/DCLinear.cpp src/cbmc/DCOnSphere.cpp src/cbmc/DCRotateCOM.cpp + src/cbmc/DCRotateOnAtom.cpp src/cbmc/DCSingle.cpp src/cbmc/TrialMol.cpp) @@ -151,6 +152,7 @@ set(headers src/cbmc/DCLinear.h src/cbmc/DCOnSphere.h src/cbmc/DCRotateCOM.h + src/cbmc/DCRotateOnAtom.h src/cbmc/DCSingle.h src/cbmc/TrialMol.h) diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index db1bed1d4..075e96399 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -90,10 +90,18 @@ DCCrankShaftAng::DCCrankShaftAng(DCData* data, const mol_setup::MolKind& kind, dih.insert(dih.end(), tempDih.begin(), tempDih.end()); //Add dihedral with atom a1 in one end: x-x-x-a1 tempDih = AtomEndDihs(kind, a1); - dih.insert(dih.end(), tempDih.begin(), tempDih.end()); + for(uint i = 0; i < tempDih.size(); i++){ + //Make sure that the dihedral atoms are not in the list since they are constant. + if(std::find(atoms.begin(), atoms.end(), tempDih[i].a3) == atoms.end()) { + dih.push_back(tempDih[i]); + } + } /* + for(uint i = 0; i < ang.size(); i++) { + printf("R:Angle on %d-%d-%d: %d -> %d -> %d \n", a0, a1, a2, ang[i].a0, ang[i].a1, ang[i].a2); + } for(uint i = 0; i < dih.size(); i++) { - printf("Angle on %d-%d--%d: %d -> %d -> %d -> %d \n", a0, a1, a2, dih[i].a0, dih[i].a1, dih[i].a2, dih[i].a3); + printf("Angle on %d-%d-%d: %d -> %d -> %d -> %d \n", a0, a1, a2, dih[i].a0, dih[i].a1, dih[i].a2, dih[i].a3); } */ } diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index cee432938..ffe6d6741 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -12,8 +12,8 @@ along with this program, also can be found at . #include "DCLinkedCycle.h" #include "DCFreeCycleSeed.h" #include "DCRotateCOM.h" -#include "DCCrankShaftDih.h" #include "DCCrankShaftAng.h" +#include "DCRotateOnAtom.h" #include "FloydWarshallCycle.h" #include #include @@ -168,7 +168,7 @@ void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) } for(uint a = 0; a < angles.size(); a++) { - //find the last atomindex in the angle + //find the atomindex in the angle uint a0 = angles[a].a0; uint a1 = angles[a].a1; uint a2 = angles[a].a2; @@ -213,6 +213,55 @@ void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) } } + //find the atoms that attached to the edge of the ring + for (uint atom = 0; atom < totAtom; ++atom) { + //If this atom is in the ring + if(isRing[atom]) { + //Find all the angle that forms x-atom-x + vector angle = AtomMidAngles(kind, atom); + for(uint a = 0; a < angle.size(); a++) { + //find the atomindex in the angle + uint a0 = angle[a].a0; + uint a1 = angle[a].a1; + uint a2 = angle[a].a2; + //If number of bonds are less than 3, there is no atom attached + if(bondCount[a1] < 3) { + continue; + } + //To be on the edge, both a0 and a2 must be in the ring + if(isRing[a0] && isRing[a2]) { + bool fixAngle = false; + bool sameRing = false; + //Find the atoms that are bonded to a1 + vector bonds = AtomBonds(kind, a1); + for(uint b = 0; b < bonds.size(); b++) { + uint partner = bonds[b].a1; + if((partner == a0) || (partner == a2)) { + continue; + } + if(isRing[partner]) { + sameRing |= (ringIdx[a1] == ringIdx[partner]); + } + //Find all the angle that forms partner-a1-x (x is either a0 or a2) + vector ang = AtomMidEndAngles(kind, a1, partner); + //Check to see if any of these angles are fixed or not. + for(uint i = 0; i < ang.size(); i++) { + fixAngle |= data.ff.angles->AngleFixed(ang[i].kind); + } + } + + //If there was no fix angles and atom a1 and any atom bonded to a1 are not + // in the same ring, we create DCCrankShaftAngle + if(!fixAngle && !sameRing) { + crankshaft.push_back(new DCRotateOnAtom(&data, kind, a0, a1, a2)); + } + + } + } + } + } + + hasCrankShaft = (crankshaft.size() != 0); } diff --git a/src/cbmc/DCRotateOnAtom.cpp b/src/cbmc/DCRotateOnAtom.cpp new file mode 100644 index 000000000..7183eaba3 --- /dev/null +++ b/src/cbmc/DCRotateOnAtom.cpp @@ -0,0 +1,514 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#include "DCRotateOnAtom.h" +#include "TrialMol.h" +#include "PRNG.h" +#include "Forcefield.h" +#include "NumLib.h" +#include "Geometry.h" +#include "CalculateEnergy.h" +#include "XYZArray.h" +#include +#include + +namespace cbmc +{ + struct FindA1 { + FindA1(uint x) : x(x) {}; + bool operator()(const mol_setup::Bond& b) { + return (b.a1 == x); + } + uint x; +}; + +struct FindAngle { + FindAngle(uint x, uint y) : x(x), y(y) {} + uint y, x; + bool operator()(const mol_setup::Angle& a) + { + return (a.a0 == x && a.a2 == y) || (a.a0 == y && a.a2 == x); + } +}; + +DCRotateOnAtom::DCRotateOnAtom(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2) : + data(data), a0(a0), a1(a1), a2(a2) +{ + using namespace mol_setup; + using namespace std; + vector visited(kind.atoms.size(), false); + totAtoms = kind.atoms.size(); + //Find all the atoms that bonds with atoms a1 + vector bonds = AtomBonds(kind, a1); + //Remove the a0-a1 and a1-a2 bond + bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a0)), bonds.end()); + bonds.erase(remove_if(bonds.begin(), bonds.end(), FindA1(a2)), bonds.end()); + visited[a1] = true; + + //Loop through other atoms that are bonded to a1 + for(uint b = 0; b < bonds.size(); b++) { + //Store the atom index if it doesnot exist + if(!visited[bonds[b].a0]) { + atoms.push_back(bonds[b].a0); + visited[bonds[b].a0] = true; + } + + vector temp = AtomBonds(kind, bonds[b].a1); + for(uint i = 0; i < temp.size(); i++) { + if(!visited[temp[i].a0]) { + bonds.push_back(temp[i]); + } + } + } + + numAtom = atoms.size(); + + multiPosRotions = new XYZArray[numAtom]; + for(uint i = 0; i < numAtom; ++i) { + multiPosRotions[i] = XYZArray(data->nLJTrialsNth); + } + + if(data->nLJTrialsNth < 1) { + std::cout << "Error: CBMC secondary atom trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } + + if(data->nDihTrials < 1) { + std::cout << "Error: CBMC dihedral trials must be greater than 0.\n"; + exit(EXIT_FAILURE); + } + + //Find the angles affected by rotation + //First find the angle x-a1-x + ang = AtomMidAngles(kind, a1); + //Remove the a0-a1-a2 angle + ang.erase(remove_if(ang.begin(), ang.end(), FindAngle(a0, a2)), ang.end()); + + //Find the dihedral affected by rotation + //First find the dihedral with x-a0-a1-x in the middle + vectortempDih = DihsOnBond(kind, a1, a0); + for(uint i = 0; i < tempDih.size(); i++){ + //Make sure that the dihedral atoms are in the list since they are constant. + if(std::find(atoms.begin(), atoms.end(), tempDih[i].a0) != atoms.end()) { + dih.push_back(tempDih[i]); + } + } + //Add dihedral with x-a1-a2-x + tempDih = DihsOnBond(kind, a1, a2); + for(uint i = 0; i < tempDih.size(); i++){ + //Make sure that the dihedral atoms are in the list since they are constant. + if(std::find(atoms.begin(), atoms.end(), tempDih[i].a0) != atoms.end()) { + dih.push_back(tempDih[i]); + } + } + + //Add dihedral with atom a0 in one end: x-x-x-a0 + tempDih = AtomEndDihs(kind, a0); + for(uint i = 0; i < tempDih.size(); i++){ + //Make sure that the dihedral atoms are in the list since they are constant. + if(std::find(atoms.begin(), atoms.end(), tempDih[i].a3) != atoms.end()) { + dih.push_back(tempDih[i]); + } + } + //Add dihedral with atom a2 in one end: x-x-x-a2 + tempDih = AtomEndDihs(kind, a2); + for(uint i = 0; i < tempDih.size(); i++){ + //Make sure that the dihedral atoms are in the list since they are constant. + if(std::find(atoms.begin(), atoms.end(), tempDih[i].a3) != atoms.end()) { + dih.push_back(tempDih[i]); + } + } + /* + for(uint i = 0; i < ang.size(); i++) { + printf("R:Angle on %d-%d-%d: %d -> %d -> %d \n", a0, a1, a2, ang[i].a0, ang[i].a1, ang[i].a2); + } + for(uint i = 0; i < dih.size(); i++) { + printf("R:Angle on %d-%d-%d: %d -> %d -> %d -> %d \n", a0, a1, a2, dih[i].a0, dih[i].a1, dih[i].a2, dih[i].a3); + } */ +} + +void DCRotateOnAtom::PrepareOld(TrialMol& oldMol, uint molIndex) +{ + for (uint a = 0; a < totAtoms; a++) { + oldMol.ConfirmOldAtom(a); + } + + XYZ center = oldMol.AtomPosition(a1); + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ temp = oldMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, oldMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); + } +} + +void DCRotateOnAtom::PrepareNew(TrialMol& newMol, uint molIndex) +{ + for (uint a = 0; a < totAtoms; a++) { + newMol.ConfirmOldAtom(a); + } + + XYZ center = newMol.AtomPosition(a1); + for(uint i = 0; i < numAtom; i++) { + //Unwrap the coordinates with respect to a0. + XYZ temp = newMol.AtomPosition(atoms[i]); + XYZ coord = data->axes.UnwrapPBC(temp, newMol.GetBox(), center); + //Shift the atoms to origin + coord -= center; + multiPosRotions[i].Set(0, coord); + } +} + + +void DCRotateOnAtom::BuildOld(TrialMol& oldMol, uint molIndex) +{ + PRNG& prng = data->prng; + uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + double stepWeight = 0; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //Set up rotation matrix using. + // rotaxis = (a0 - a2) + XYZ center = oldMol.AtomPosition(a1); + XYZ rotAxis = oldMol.AtomPosition(a0) - oldMol.AtomPosition(a2); + rotAxis = data->axes.MinImage(rotAxis, oldMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Spin all nLJTrial except the original coordinates + for (uint lj = nLJTrials; lj-- > 1;) { + ChooseTorsion(oldMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } + } + + ChooseTorsionOld(oldMol, molIndex, cross, tensor); + ljWeights[0] = std::accumulate(torWeights, torWeights + nDihTrials, 0.0); + bondedEn[0] = torEnergy[0]; + + for (uint a = 0; a < numAtom; a++) { + //Shift original coordinate back. + multiPosRotions[a].Add(0, center); + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], oldMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, oldMol.GetBox(), nLJTrials); + ParticleNonbonded(oldMol, multiPosRotions[a], atoms[a], nLJTrials); + } + + for (uint trial = 0; trial < nLJTrials; ++trial) { + ljWeights[trial] *= exp(-1 * data->ff.beta * + (inter[trial] + real[trial] + nonbonded[trial])); + stepWeight += ljWeights[trial]; + } + oldMol.UpdateOverlap(overlap[0]); + oldMol.MultWeight(stepWeight / nLJTrials); + oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], + inter[0], real[0], + 0.0, 0.0, 0.0)); +} + +void DCRotateOnAtom::BuildNew(TrialMol& newMol, uint molIndex) +{ + PRNG& prng = data->prng; + uint nLJTrials = data->nLJTrialsNth; + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + double* bondedEn = data->bonded; + double* nonbonded = data->nonbonded; + double* ljWeights = data->ljWeights; + double* inter = data->inter; + double* real = data->real; + bool* overlap = data->overlap; + double stepWeight = 0; + + std::fill_n(inter, nLJTrials, 0.0); + std::fill_n(real, nLJTrials, 0.0); + std::fill_n(ljWeights, nLJTrials, 0.0); + std::fill_n(nonbonded, nLJTrials, 0.0); + std::fill_n(overlap, nLJTrials, false); + + //Set up rotation matrix + // rotaxis = (a0 - a2) + XYZ center = newMol.AtomPosition(a1); + XYZ rotAxis = newMol.AtomPosition(a0) - newMol.AtomPosition(a2); + rotAxis = data->axes.MinImage(rotAxis, newMol.GetBox()); + rotAxis.Normalize(); + RotationMatrix cross = RotationMatrix::CrossProduct(rotAxis); + RotationMatrix tensor = RotationMatrix::TensorProduct(rotAxis); + + //Go backward to to preserve prototype + for (uint lj = nLJTrials; lj-- > 0;) { + ChooseTorsion(newMol, molIndex, cross, tensor); + ljWeights[lj] = std::accumulate(torWeights, + torWeights + nDihTrials, 0.0); + uint winner = prng.PickWeighted(torWeights, nDihTrials, ljWeights[lj]); + bondedEn[lj] = torEnergy[winner]; + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[winner], + cross, tensor); + + for (uint a = 0; a < numAtom; a++) { + //find positions + multiPosRotions[a].Set(lj, spin.Apply(multiPosRotions[a][0])); + multiPosRotions[a].Add(lj, center); + } + } + + for (uint a = 0; a < numAtom; a++) { + //Wrap the atom coordinates + data->axes.WrapPBC(multiPosRotions[a], newMol.GetBox()); + //Calculate nonbonded energy + data->calc.ParticleInter(inter, real, multiPosRotions[a], overlap, + atoms[a], molIndex, newMol.GetBox(), nLJTrials); + ParticleNonbonded(newMol, multiPosRotions[a], atoms[a], nLJTrials); + } + + for (uint trial = 0; trial < nLJTrials; trial++) { + ljWeights[trial] *= exp(-1 * data->ff.beta * + (inter[trial] + real[trial] + nonbonded[trial])); + stepWeight += ljWeights[trial]; + } + uint winner = prng.PickWeighted(ljWeights, nLJTrials, stepWeight); + newMol.UpdateOverlap(overlap[winner]); + newMol.MultWeight(stepWeight / nLJTrials); + newMol.AddEnergy(Energy(bondedEn[winner], nonbonded[winner], + inter[winner], real[winner], + 0.0, 0.0, 0.0)); + + for (uint a = 0; a < numAtom; a++) { + newMol.AddAtom(atoms[a], multiPosRotions[a][winner]); + } + +} + +void DCRotateOnAtom::ChooseTorsion(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + + XYZ center = mol.AtomPosition(a1); + for (uint tor = 0; tor < nDihTrials; ++tor) { + torsion[tor] = data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); + } +} + +void DCRotateOnAtom::ChooseTorsionOld(TrialMol& mol, uint molIndex, + RotationMatrix& cross, + RotationMatrix& tensor) +{ + uint nDihTrials = data->nDihTrials; + double* torsion = data->angles; + double* torWeights = data->angleWeights; + double* torEnergy = data->angleEnergy; + + XYZ center = mol.AtomPosition(a1); + for (uint tor = 0; tor < nDihTrials; ++tor) { + //Use actual coordinate fir first torsion trial + torsion[tor] = (tor == 0) ? 0.0 : data->prng.rand(M_PI * 2); + //convert chosen torsion to 3D positions + RotationMatrix spin = RotationMatrix::FromAxisAngle(torsion[tor], + cross, tensor); + for (uint a = 0; a < numAtom; a++) { + XYZ coord = spin.Apply(multiPosRotions[a][0]); + mol.AddAtom(atoms[a], coord + center); + } + double en = CalcIntraBonded(mol, molIndex); + torEnergy[tor] = en; + torWeights[tor] = exp(-1 * data->ff.beta * en); + } +} + +double DCRotateOnAtom::CalcIntraBonded(TrialMol& mol, uint molIndex) +{ + + double bondedEn = 0.0; + uint box = mol.GetBox(); + const MoleculeKind& molKind = mol.GetKind(); + XYZ b1, b2, b3; + const XYZArray &coords = mol.GetCoords(); + for(uint i = 0; i < ang.size(); i++) { + b1 = data->axes.MinImage(coords.Difference(ang[i].a0, ang[i].a1), box); + b2 = data->axes.MinImage(coords.Difference(ang[i].a2, ang[i].a1), box); + bondedEn += data->ff.angles->Calc(ang[i].kind, geom::Theta(b1, b2)); + } + + for(uint i = 0; i < dih.size(); i++) { + //No need to calcminImage since we unwrap it + b1 = data->axes.MinImage(coords.Difference(dih[i].a1, dih[i].a0), box); + b2 = data->axes.MinImage(coords.Difference(dih[i].a2, dih[i].a1), box); + b3 = data->axes.MinImage(coords.Difference(dih[i].a3, dih[i].a2), box); + bondedEn += data->ff.dihedrals.Calc(dih[i].kind, geom::Phi(b1, b2, b3)); + } + return bondedEn; +} + +void DCRotateOnAtom::ParticleNonbonded(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + ParticleNonbonded1_N(mol, trialPos, partIndex, trials); + ParticleNonbonded1_4(mol, trialPos, partIndex, trials); + ParticleNonbonded1_3(mol, trialPos, partIndex, trials); +} + +void DCRotateOnAtom::ParticleNonbonded1_N(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB.Begin(partIndex); + const uint* end = kind.sortedNB.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + nonbonded[t] += data->ff.particles->CalcEn(distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +void DCRotateOnAtom::ParticleNonbonded1_4(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneFour) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_4.Begin(partIndex); + const uint* end = kind.sortedNB_1_4.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +void DCRotateOnAtom::ParticleNonbonded1_3(cbmc::TrialMol const& mol, + XYZArray const& trialPos, + const uint partIndex, + const uint trials) +{ + if(!data->ff.OneThree) + return; + + double* nonbonded = data->nonbonded; + uint box = mol.GetBox(); + const MoleculeKind& kind = mol.GetKind(); + //loop over all partners of the trial particle + const uint* partner = kind.sortedNB_1_3.Begin(partIndex); + const uint* end = kind.sortedNB_1_3.End(partIndex); + while (partner != end) { + if(mol.AtomExists(*partner) && + (std::find(atoms.begin(), atoms.end(), *partner) == atoms.end())) { + for (uint t = 0; t < trials; ++t) { + double distSq; + if(data->axes.InRcut(distSq, trialPos, t, mol.GetCoords(), + *partner, box)) { + data->ff.particles->CalcAdd_1_4(nonbonded[t],distSq, + kind.AtomKind(partIndex), + kind.AtomKind(*partner)); + if(data->ff.electrostatic) { + double qi_qj_Fact = kind.AtomCharge(partIndex) * + kind.AtomCharge(*partner) * num::qqFact; + data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, + qi_qj_Fact, true); + } + } + } + } + ++partner; + } +} + +} diff --git a/src/cbmc/DCRotateOnAtom.h b/src/cbmc/DCRotateOnAtom.h new file mode 100644 index 000000000..a2a5de346 --- /dev/null +++ b/src/cbmc/DCRotateOnAtom.h @@ -0,0 +1,61 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#ifndef DCROTATEONATOM +#define DCROTATEONATOM + +#include "DCComponent.h" +#include "DCData.h" +#include "BasicTypes.h" +#include "TransformMatrix.h" +#include "MolSetup.h" +#include + +using namespace mol_setup; + +namespace cbmc +{ +class DCRotateOnAtom; + +class DCRotateOnAtom : public DCComponent +{ +public: + DCRotateOnAtom(DCData* data, const mol_setup::MolKind& kind, + uint a0, uint a1, uint a2); + ~DCRotateOnAtom() {delete[] multiPosRotions;} + void PrepareNew(TrialMol& newMol, uint molIndex); + void PrepareOld(TrialMol& oldMol, uint molIndex); + void BuildOld(TrialMol& oldMol, uint molIndex); + void BuildNew(TrialMol& newMol, uint molIndex); + DCComponent* Clone() + { + return new DCRotateOnAtom(*this); + } + +private: + void ChooseTorsion(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); + void ChooseTorsionOld(TrialMol& mol, uint molIndex, RotationMatrix& cross, + RotationMatrix& tensor); + double CalcIntraBonded(TrialMol& mol, uint molIndex); + void ParticleNonbonded(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_N(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_4(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + void ParticleNonbonded1_3(cbmc::TrialMol const& mol,XYZArray const& trialPos, + const uint partIndex, const uint trials); + + DCData* data; + XYZArray *multiPosRotions; + uint a0, a1, a2, numAtom, totAtoms; + std::vector atoms; + std::vector ang; + std::vector dih; +}; +} +#endif From 6713a565f8ec0aa255c468cc0c588b7d2a23eb2b Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 8 Oct 2018 22:14:07 -0400 Subject: [PATCH 146/199] Use fix angle defined in parameter file rather than using acutal angle of the molecule if it is not in the frame of the ring. --- src/cbmc/DCHedronCycle.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c575cf03f..71727cba5 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -154,7 +154,12 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(newMol, bonded[bType], focus, prev); + double th; + if(angleInRing[bType][bType]) { + th = CalcTheta(newMol, bonded[bType], focus, prev); + } else { + th = data->ff.angles->Angle(kind); + } std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -194,7 +199,12 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(oldMol, bonded[bType], focus, prev); + double th; + if(angleInRing[bType][bType]) { + th = CalcTheta(oldMol, bonded[bType], focus, prev); + } else { + th = data->ff.angles->Angle(kind); + } std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -348,7 +358,12 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); + double bfcRing; + if(angleInRing[b][c]) { + bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); + } else { + bfcRing = data->ff.angles->Angle(angleKinds[b][c]); + } double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); @@ -442,7 +457,12 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + double bfcRing; + if(angleInRing[b][c]) { + bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + } else { + bfcRing = data->ff.angles->Angle(angleKinds[b][c]); + } double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); From e9fed3df5e0c46d046e26121dd2642b7ae169645 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 9 Oct 2018 13:31:44 -0400 Subject: [PATCH 147/199] Revert "Use fix angle defined in parameter file rather than using acutal angle of the molecule if it is not in the frame of the ring." This reverts commit 6713a565f8ec0aa255c468cc0c588b7d2a23eb2b. --- src/cbmc/DCHedronCycle.cpp | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 71727cba5..c575cf03f 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -154,12 +154,7 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th; - if(angleInRing[bType][bType]) { - th = CalcTheta(newMol, bonded[bType], focus, prev); - } else { - th = data->ff.angles->Angle(kind); - } + double th = CalcTheta(newMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -199,12 +194,7 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th; - if(angleInRing[bType][bType]) { - th = CalcTheta(oldMol, bonded[bType], focus, prev); - } else { - th = data->ff.angles->Angle(kind); - } + double th = CalcTheta(oldMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -358,12 +348,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing; - if(angleInRing[b][c]) { - bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); - } else { - bfcRing = data->ff.angles->Angle(angleKinds[b][c]); - } + double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); @@ -457,12 +442,7 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing; - if(angleInRing[b][c]) { - bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); - } else { - bfcRing = data->ff.angles->Angle(angleKinds[b][c]); - } + double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); From 50719053e24ef50bd69d2ee1e154273b9c9b8671 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 9 Oct 2018 14:05:14 -0400 Subject: [PATCH 148/199] Use fix angle defined in parameter file rather than using acutal angle of the molecule if it is not in the frame of the ring. --- src/cbmc/DCHedronCycle.cpp | 19 +++++++++++++------ src/cbmc/DCHedronCycle.h | 4 +++- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c575cf03f..1efe70d43 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -128,17 +128,20 @@ double DCHedronCycle::GetWeight() } double DCHedronCycle::CalcTheta(TrialMol& mol, const uint a0, const uint a1, - const uint a2) + const uint a2, const bool isRing, const uint kind) { double theta = 0.0; if(mol.AtomExists(a0) && mol.AtomExists(a2)) { //Calculate theta using tCoords theta = mol.GetTheta(a0, a1, a2); - } else { + } else if(isRing){ //Calculate theta using bCoords const XYZArray &coords = mol.GetBCoords(); //Since data in bCoords in unwrap, no need to calc minImage theta = geom::Theta(coords.Difference(a0, a1), coords.Difference(a2, a1)); + } else { + //Angle is fixed + theta = data->ff.angles->Angle(kind); } return theta; } @@ -154,7 +157,8 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(newMol, bonded[bType], focus, prev); + double th = CalcTheta(newMol, bonded[bType], focus, prev, + angleInRing[bType][bType], kind); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -194,7 +198,8 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(oldMol, bonded[bType], focus, prev); + double th = CalcTheta(oldMol, bonded[bType], focus, prev, + angleInRing[bType][bType], kind); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -348,7 +353,8 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); + double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c], + angleInRing[b][c], angleKinds[b][c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); @@ -442,7 +448,8 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); + double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c], + angleInRing[b][c], angleKinds[b][c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index 3898d0e13..00f9855e8 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -77,7 +77,9 @@ class DCHedronCycle void FreeAnglesOld(TrialMol& oldMol, uint molIndex, uint nTrials); void ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials); //to calculate the angle in the ring from bCoords or tCoords a0-a1-a2 - double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2); + //If it atom was not exist and it was not in the ring, it means it is fix + double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2, + const bool isRing, const uint kind); //!Sets an orthonormal basis for coordinate conversion. /*!\param p1 Index of focus * \param p2 Index of prev From 2084a0c87736110ad6cfbcbe11c982c735fc956b Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 9 Oct 2018 14:58:16 -0400 Subject: [PATCH 149/199] Revert "Use fix angle defined in parameter file rather than using acutal angle of the molecule if it is not in the frame of the ring." This reverts commit 50719053e24ef50bd69d2ee1e154273b9c9b8671. --- src/cbmc/DCHedronCycle.cpp | 19 ++++++------------- src/cbmc/DCHedronCycle.h | 4 +--- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 1efe70d43..c575cf03f 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -128,20 +128,17 @@ double DCHedronCycle::GetWeight() } double DCHedronCycle::CalcTheta(TrialMol& mol, const uint a0, const uint a1, - const uint a2, const bool isRing, const uint kind) + const uint a2) { double theta = 0.0; if(mol.AtomExists(a0) && mol.AtomExists(a2)) { //Calculate theta using tCoords theta = mol.GetTheta(a0, a1, a2); - } else if(isRing){ + } else { //Calculate theta using bCoords const XYZArray &coords = mol.GetBCoords(); //Since data in bCoords in unwrap, no need to calc minImage theta = geom::Theta(coords.Difference(a0, a1), coords.Difference(a2, a1)); - } else { - //Angle is fixed - theta = data->ff.angles->Angle(kind); } return theta; } @@ -157,8 +154,7 @@ void DCHedronCycle::GenerateAnglesNew(TrialMol& newMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(newMol, bonded[bType], focus, prev, - angleInRing[bType][bType], kind); + double th = CalcTheta(newMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -198,8 +194,7 @@ void DCHedronCycle::GenerateAnglesOld(TrialMol& oldMol, uint molIndex, std::fill_n(nonbonded_1_3, nTrials, 0.0); //use backup coordinate to find theta and phi of the ring if(angleInRing[bType][bType] || angleFix) { - double th = CalcTheta(oldMol, bonded[bType], focus, prev, - angleInRing[bType][bType], kind); + double th = CalcTheta(oldMol, bonded[bType], focus, prev); std::fill_n(data->angles, nTrials, th); double en = data->ff.angles->Calc(kind, th); std::fill_n(data->angleEnergy, nTrials, en); @@ -353,8 +348,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c], - angleInRing[b][c], angleKinds[b][c]); + double bfcRing = CalcTheta(newMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); @@ -448,8 +442,7 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, if(angleInRing[b][c] || angleFix) { double cosTerm = cos(theta[b]) * cos(theta[c]); double sinTerm = sin(theta[b]) * sin(theta[c]); - double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c], - angleInRing[b][c], angleKinds[b][c]); + double bfcRing = CalcTheta(oldMol, bonded[b], focus, bonded[c]); double var = (cos(bfcRing) - cosTerm) / sinTerm; //To fix the numerical problem for flat molecule var = (var > 1.0 && var < 1.1 ? 1.0 : var); diff --git a/src/cbmc/DCHedronCycle.h b/src/cbmc/DCHedronCycle.h index 00f9855e8..3898d0e13 100644 --- a/src/cbmc/DCHedronCycle.h +++ b/src/cbmc/DCHedronCycle.h @@ -77,9 +77,7 @@ class DCHedronCycle void FreeAnglesOld(TrialMol& oldMol, uint molIndex, uint nTrials); void ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTrials); //to calculate the angle in the ring from bCoords or tCoords a0-a1-a2 - //If it atom was not exist and it was not in the ring, it means it is fix - double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2, - const bool isRing, const uint kind); + double CalcTheta(TrialMol& mol, const uint a0, const uint a1, const uint a2); //!Sets an orthonormal basis for coordinate conversion. /*!\param p1 Index of focus * \param p2 Index of prev From aab2624ae25d53218bae9920d468659949f39bdb Mon Sep 17 00:00:00 2001 From: Niloofar Torabifard Date: Mon, 15 Oct 2018 12:58:36 -0400 Subject: [PATCH 150/199] Cont. Implementation. --- src/ConfigSetup.cpp | 116 ++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index d5e16c6ee..aa6c3d31e 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -175,7 +175,7 @@ void ConfigSetup::Init(const char *fileName) } } else if(CheckString(line[0], "FirstStep")) { in.restart.step = stringtoi(line[1]); - } else if(line[0] == "PRNG") { + } else if(CheckString(line[0], "PRNG")) { in.prng.kind = line[1]; if("RANDOM" == line[1]) printf("%-40s %-s \n", "Info: Random seed", "Active"); @@ -364,17 +364,17 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.readLargeBB = true; sys.intraMemcVal.readLargeBB = true; } - } else if(line[0] == "VDWGeometricSigma") { + } else if(CheckString(line[0], "VDWGeometricSigma")) { sys.ff.vdwGeometricSigma = checkBool(line[1]); if(sys.ff.vdwGeometricSigma) printf("%-40s %-s A\n", "Info: Geometric mean to combine LJ sigma", "Active"); - } else if(line[0] == "Rcut") { + } else if(CheckString(line[0], "Rcut")) { sys.ff.cutoff = stringtod(line[1]); printf("%-40s %-4.4f A\n", "Info: Cutoff", sys.ff.cutoff); - } else if(line[0] == "RcutLow") { + } else if(CheckString(line[0], "RcutLow")) { sys.ff.cutoffLow = stringtod(line[1]); printf("%-40s %-4.4f A\n", "Info: Short Range Cutoff", sys.ff.cutoffLow); - } else if(line[0] == "Exclude") { + } else if(CheckString(line[0], "Exclude")) { if(line[1] == sys.exclude.EXC_ONETWO) { sys.exclude.EXCLUDE_KIND = sys.exclude.EXC_ONETWO_KIND; printf("%-40s %-s \n", "Info: Exclude", "ONE-TWO"); @@ -385,20 +385,20 @@ void ConfigSetup::Init(const char *fileName) sys.exclude.EXCLUDE_KIND = sys.exclude.EXC_ONEFOUR_KIND; printf("%-40s %-s \n", "Info: Exclude", "ONE-FOUR"); } - } else if(line[0] == "Ewald") { + } else if(CheckString(line[0], "Ewald")) { sys.elect.ewald = checkBool(line[1]); sys.elect.readEwald = true; if(sys.elect.ewald) { printf("%-40s %-s \n", "Info: Ewald Summation", "Active"); } - } else if(line[0] == "ElectroStatic") { + } else if(CheckString(line[0], "ElectroStatic")) { sys.elect.enable = checkBool(line[1]); sys.elect.readElect = true; - } else if(line[0] == "Tolerance") { + } else if(CheckString(line[0], "Tolerance")) { sys.elect.tolerance = stringtod(line[1]); printf("%-40s %-1.3E \n", "Info: Ewald Summation Tolerance", sys.elect.tolerance); - } else if(line[0] == "RcutCoulomb") { + } else if(CheckString(line[0], "RcutCoulomb")) { if(line.size() == 3) { uint b = stringtoi(line[1]); if(b < BOX_TOTAL) { @@ -411,7 +411,7 @@ void ConfigSetup::Init(const char *fileName) exit(EXIT_FAILURE); } } - } else if(line[0] == "CachedFourier") { + } else if(CheckString(line[0], "CachedFourier")) { sys.elect.cache = checkBool(line[1]); sys.elect.readCache = true; if(sys.elect.cache) { @@ -419,23 +419,23 @@ void ConfigSetup::Init(const char *fileName) } else { printf("%-40s %-s \n", "Info: Cache Ewald Fourier", "Inactive"); } - } else if(line[0] == "1-4scaling") { + } else if(CheckString(line[0], "1-4scaling")) { sys.elect.oneFourScale = stringtod(line[1]); - } else if(line[0] == "Dielectric") { + } else if(CheckString(line[0], "Dielectric")) { sys.elect.dielectric = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Dielectric", sys.elect.dielectric); - } else if(line[0] == "RunSteps") { + } else if(CheckString(line[0], "RunSteps")) { sys.step.total = stringtoi(line[1]); printf("%-40s %-lu \n", "Info: Total number of steps", sys.step.total); - } else if(line[0] == "EqSteps") { + } else if(CheckString(line[0], "EqSteps")) { sys.step.equil = stringtoi(line[1]); printf("%-40s %-lu \n", "Info: Number of equilibration steps", sys.step.equil); - } else if(line[0] == "AdjSteps") { + } else if(CheckString(line[0], "AdjSteps")) { sys.step.adjustment = stringtoi(line[1]); printf("%-40s %-lu \n", "Info: Move adjustment frequency", sys.step.adjustment); - } else if(line[0] == "PressureCalc") { + } else if(CheckString(line[0], "PressureCalc")) { sys.step.pressureCalc = checkBool(line[1]); if(line.size() == 3) sys.step.pressureCalcFreq = stringtoi(line[2]); @@ -450,27 +450,27 @@ void ConfigSetup::Init(const char *fileName) printf("%-40s %-lu \n", "Info: Pressure calculation frequency", sys.step.pressureCalcFreq); } - } else if(line[0] == "DisFreq") { + } else if(CheckString(line[0], "DisFreq")) { sys.moves.displace = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Displacement move frequency", sys.moves.displace); - } else if(line[0] == "IntraSwapFreq") { + } else if(CheckString(line[0], "IntraSwapFreq")) { sys.moves.intraSwap = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Intra-Swap move frequency", sys.moves.intraSwap); - } else if(line[0] == "RegrowthFreq") { + } else if(CheckString(line[0], "RegrowthFreq")) { sys.moves.regrowth = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Regrowth move frequency", sys.moves.regrowth); - } else if(line[0] == "CrankShaftFreq") { + } else if(CheckString(line[0], "CrankShaftFreq")) { sys.moves.crankShaft = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Crank-Shaft move frequency", sys.moves.crankShaft); - } else if(line[0] == "RotFreq") { + } else if(CheckString(line[0], "RotFreq")) { sys.moves.rotate = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Rotation move frequency", sys.moves.rotate); - } else if(line[0] == "IntraMEMC-1Freq") { + } else if(CheckString(line[0], "IntraMEMC-1Freq")) { sys.moves.intraMemc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: IntraMEMC-1 move frequency", sys.moves.intraMemc); @@ -478,7 +478,7 @@ void ConfigSetup::Init(const char *fileName) sys.intraMemcVal.enable = true; sys.intraMemcVal.MEMC1 = true; } - } else if(line[0] == "IntraMEMC-2Freq") { + } else if(CheckString(line[0], "IntraMEMC-2Freq")) { sys.moves.intraMemc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: IntraMEMC-2 move frequency", sys.moves.intraMemc); @@ -486,7 +486,7 @@ void ConfigSetup::Init(const char *fileName) sys.intraMemcVal.enable = true; sys.intraMemcVal.MEMC2 = true; } - } else if(line[0] == "IntraMEMC-3Freq") { + } else if(CheckString(line[0], "IntraMEMC-3Freq")) { sys.moves.intraMemc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: IntraMEMC-3 move frequency", sys.moves.intraMemc); @@ -496,24 +496,24 @@ void ConfigSetup::Init(const char *fileName) } } #ifdef VARIABLE_VOLUME - else if(line[0] == "VolFreq") { + else if(CheckString(line[0], "VolFreq")) { sys.moves.volume = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: Volume move frequency", sys.moves.volume); - } else if(line[0] == "useConstantArea") { + } else if(CheckString(line[0], "useConstantArea")) { sys.volume.cstArea = checkBool(line[1]); if(sys.volume.cstArea) printf("Info: Volume change using constant X-Y area.\n"); else printf("Info: Volume change using constant ratio.\n"); - } else if(line[0] == "FixVolBox0") { + } else if(CheckString(line[0], "FixVolBox0")) { sys.volume.cstVolBox0 = checkBool(line[1]); if(sys.volume.cstVolBox0) printf("%-40s %-d \n", "Info: Fix volume box", 0); } #endif #ifdef VARIABLE_PARTICLE_NUMBER - else if(line[0] == "SwapFreq") { + else if(CheckString(line[0], "SwapFreq")) { #if ENSEMBLE == NVT || ENSEMBLE == NPT sys.moves.transfer = 0.000; #else @@ -521,7 +521,7 @@ void ConfigSetup::Init(const char *fileName) #endif printf("%-40s %-4.4f \n", "Info: Molecule swap move frequency", sys.moves.transfer); - } else if(line[0] == "MEMC-1Freq") { + } else if(CheckString(line[0], "MEMC-1Freq")) { sys.moves.memc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: MEMC-1 move frequency", sys.moves.memc); @@ -529,7 +529,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.enable = true; sys.memcVal.MEMC1 = true; } - } else if(line[0] == "MEMC-2Freq") { + } else if(CheckString(line[0], "MEMC-2Freq")) { sys.moves.memc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: MEMC-2 move frequency", sys.moves.memc); @@ -537,7 +537,7 @@ void ConfigSetup::Init(const char *fileName) sys.memcVal.enable = true; sys.memcVal.MEMC2 = true; } - } else if(line[0] == "MEMC-3Freq") { + } else if(CheckString(line[0], "MEMC-3Freq")) { sys.moves.memc = stringtod(line[1]); printf("%-40s %-4.4f \n", "Info: MEMC-3 move frequency", sys.moves.memc); @@ -547,7 +547,7 @@ void ConfigSetup::Init(const char *fileName) } } #endif - else if(line[0] == "CellBasisVector1") { + else if(CheckString(line[0], "CellBasisVector1")) { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { if(!sys.volume.readCellBasis[box][0]) { @@ -564,7 +564,7 @@ void ConfigSetup::Init(const char *fileName) " sets of Cell Basis Vector!" << std::endl; exit(EXIT_FAILURE); } - } else if(line[0] == "CellBasisVector2") { + } else if(CheckString(line[0], "CellBasisVector2")) { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { if(!sys.volume.readCellBasis[box][1]) { @@ -581,7 +581,7 @@ void ConfigSetup::Init(const char *fileName) " sets of Cell Basis Vector!" << std::endl; exit(EXIT_FAILURE); } - } else if(line[0] == "CellBasisVector3") { + } else if(CheckString(line[0], "CellBasisVector3")) { uint box = stringtoi(line[1]); if(box < BOX_TOTAL) { if(!sys.volume.readCellBasis[box][2]) { @@ -600,26 +600,26 @@ void ConfigSetup::Init(const char *fileName) } } #ifdef VARIABLE_PARTICLE_NUMBER - else if(line[0] == "CBMC_First") { + else if(CheckString(line[0], "CBMC_First")) { sys.cbmcTrials.nonbonded.first = stringtoi(line[1]); printf("%-40s %-4d \n", "Info: CBMC First atom trials", sys.cbmcTrials.nonbonded.first); - } else if(line[0] == "CBMC_Nth") { + } else if(CheckString(line[0], "CBMC_Nth")) { sys.cbmcTrials.nonbonded.nth = stringtoi(line[1]); printf("%-40s %-4d \n", "Info: CBMC Secondary atom trials", sys.cbmcTrials.nonbonded.nth); - } else if(line[0] == "CBMC_Ang") { + } else if(CheckString(line[0], "CBMC_Ang")) { sys.cbmcTrials.bonded.ang = stringtoi(line[1]); printf("%-40s %-4d \n", "Info: CBMC Angle trials", sys.cbmcTrials.bonded.ang); - } else if(line[0] == "CBMC_Dih") { + } else if(CheckString(line[0], "CBMC_Dih")) { sys.cbmcTrials.bonded.dih = stringtoi(line[1]); printf("%-40s %-4d \n", "Info: CBMC Dihedral trials", sys.cbmcTrials.bonded.dih); } #endif #if ENSEMBLE == GCMC - else if(line[0] == "ChemPot") { + else if(CheckString(line[0], "ChemPot")) { if(line.size() != 3) { std::cout << "Error: Chemical potential parameters are not specified!\n"; exit(EXIT_FAILURE); @@ -629,7 +629,7 @@ void ConfigSetup::Init(const char *fileName) sys.chemPot.cp[resName] = val; printf("%-40s %-6s %-6.4f K\n", "Info: Chemical potential", resName.c_str(), val); - } else if(line[0] == "Fugacity") { + } else if(CheckString(line[0], "Fugacity")) { if(line.size() != 3) { std::cout << "Error: Fugacity parameters are not specified!\n"; exit(EXIT_FAILURE); @@ -642,10 +642,10 @@ void ConfigSetup::Init(const char *fileName) val); } #endif - else if(line[0] == "OutputName") { + else if(CheckString(line[0], "OutputName")) { out.statistics.settings.uniqueStr.val = line[1]; printf("%-40s %-s \n", "Info: Output name", line[1].c_str()); - } else if(line[0] == "CoordinatesFreq") { + } else if(CheckString(line[0], "CoordinatesFreq")) { out.state.settings.enable = checkBool(line[1]); if(line.size() == 3) out.state.settings.frequency = stringtoi(line[2]); @@ -658,7 +658,7 @@ void ConfigSetup::Init(const char *fileName) out.state.settings.frequency); } else printf("%-40s %-s \n", "Info: Printing coordinate", "Inactive"); - } else if(line[0] == "RestartFreq") { + } else if(CheckString(line[0], "RestartFreq")) { out.restart.settings.enable = checkBool(line[1]); if(line.size() == 3) out.restart.settings.frequency = stringtoi(line[2]); @@ -671,7 +671,7 @@ void ConfigSetup::Init(const char *fileName) out.restart.settings.frequency); } else printf("%-40s %-s \n", "Info: Printing restart coordinate", "Inactive"); - } else if(line[0] == "ConsoleFreq") { + } else if(CheckString(line[0], "ConsoleFreq")) { out.console.enable = checkBool(line[1]); if(line.size() == 3) out.console.frequency = stringtoi(line[2]); @@ -688,7 +688,7 @@ void ConfigSetup::Init(const char *fileName) out.console.frequency); } else printf("%-40s %-s \n", "Info: Console output", "Inactive"); - } else if(line[0] == "BlockAverageFreq") { + } else if(CheckString(line[0], "BlockAverageFreq")) { out.statistics.settings.block.enable = checkBool(line[1]); if(line.size() == 3) out.statistics.settings.block.frequency = stringtoi(line[2]); @@ -703,7 +703,7 @@ void ConfigSetup::Init(const char *fileName) printf("%-40s %-s \n", "Info: Average output", "Inactive"); } #if ENSEMBLE == GCMC - else if(line[0] == "HistogramFreq") { + else if(CheckString(line[0], "HistogramFreq")) { out.statistics.settings.hist.enable = checkBool(line[1]); if(line.size() == 3) out.statistics.settings.hist.frequency = stringtoi(line[2]); @@ -721,47 +721,47 @@ void ConfigSetup::Init(const char *fileName) out.statistics.settings.hist.frequency); } else printf("%-40s %-s \n", "Info: Histogram output", "Inactive"); - } else if(line[0] == "DistName") { + } else if(CheckString(line[0], "DistName")) { out.state.files.hist.histName = line[1]; - } else if(line[0] == "HistName") { + } else if(CheckString(line[0], "HistName")) { out.state.files.hist.sampleName = line[1]; - } else if(line[0] == "RunNumber") { + } else if(CheckString(line[0], "RunNumber")) { out.state.files.hist.number = line[1]; - } else if(line[0] == "RunLetter") { + } else if(CheckString(line[0], "RunLetter")) { out.state.files.hist.letter = line[1]; - } else if(line[0] == "SampleFreq") { + } else if(CheckString(line[0], "SampleFreq")) { out.state.files.hist.stepsPerHistSample = stringtoi(line[1]); printf("%-40s %-d \n", "Info: Histogram sample frequency", out.state.files.hist.stepsPerHistSample); } #endif - else if(line[0] == "OutEnergy") { + else if(CheckString(line[0], "OutEnergy")) { out.statistics.vars.energy.block = checkBool(line[1]); out.statistics.vars.energy.fluct = checkBool(line[2]); - } else if(line[0] == "OutPressure") { + } else if(CheckString(line[0], "OutPressure")) { out.statistics.vars.pressure.block = checkBool(line[1]); out.statistics.vars.pressure.fluct = checkBool(line[2]); } #ifdef VARIABLE_PARTICLE_NUMBER - else if(line[0] == "OutMolNum") { + else if(CheckString(line[0], "OutMolNum")) { out.statistics.vars.molNum.block = checkBool(line[1]); out.statistics.vars.molNum.fluct = checkBool(line[2]); } #endif - else if(line[0] == "OutDensity") { + else if(CheckString(line[0], "OutDensity")) { out.statistics.vars.density.block = checkBool(line[1]); out.statistics.vars.density.fluct = checkBool(line[2]); - } else if(line[0] == "OutSurfaceTension") { + } else if(CheckString(line[0], "OutSurfaceTension")) { out.statistics.vars.surfaceTension.block = checkBool(line[1]); out.statistics.vars.surfaceTension.fluct = checkBool(line[2]); } #ifdef VARIABLE_VOLUME - else if(line[0] == "OutVolume") { + else if(CheckString(line[0], "OutVolume")) { out.statistics.vars.volume.block = checkBool(line[1]); out.statistics.vars.volume.fluct = checkBool(line[2]); } #endif - else if(line[0] == "Random_Seed") { + else if(CheckString(line[0], "Random_Seed")) { in.prng.seed = stringtoi(line[1]); if("INTSEED" == in.prng.kind) printf("%-40s %-s \n", "Info: Constant seed", "Active"); From 642eb774a4c5b5f302c95dc388fdaa6cc18288ee Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 18 Oct 2018 10:44:12 -0400 Subject: [PATCH 151/199] Remove bias from sampling angles at branching point in rings --- src/cbmc/DCHedronCycle.cpp | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index c575cf03f..84b61ccc4 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -329,7 +329,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri std::fill_n(nonbonded_1_3, nTrials, 0.0); //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - angles[i] = data->prng.rand(M_PI); + angles[i] = data->prng.rand(2.0 * M_PI); } //tan2 output is [-pi, pi], acos output is [0, pi] @@ -337,9 +337,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri //Use phi[0] to compare it double phiDiff = CalcOldPhi(newMol, bonded[b], focus) - refPhi; phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); - double flip = (phiDiff > 0.0 ? true : false); - //avoid flipping twice for each b - bool fliped = false; + bool flip = (phiDiff > 0.0 ? true : false); //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { @@ -354,7 +352,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri var = (var > 1.0 && var < 1.1 ? 1.0 : var); var = (var < -1.0 && var > -1.1 ? -1.0 : var); double ang = acos(var); - ang *= (flip ? -1.0 : 1.0); + ang = (flip ? 2.0 * M_PI - ang : ang); ang += phi[c]; std::fill_n(angles, nTrials, ang); if(isnan(ang)) { @@ -369,12 +367,7 @@ void DCHedronCycle::ConstrainedAngles(TrialMol& newMol, uint molIndex, uint nTri exit(EXIT_FAILURE); } break; - } else if (flip && !fliped) { - for (uint i = 0; i < nTrials; ++i) { - angles[i] *= -1.0; - } - fliped = true; - } + } } @@ -423,7 +416,7 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double stepWeight = 0.0; //pick "twist" angles for (uint i = 0; i < nTrials; ++i) { - angles[i] = data->prng.rand(M_PI); + angles[i] = data->prng.rand(2.0 * M_PI); } //tan2 output is [-pi, pi], acos output is [0, pi] @@ -432,8 +425,6 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, double phiDiff = phi[b] - phi[0]; phiDiff += (phiDiff < 0.0 ? M_PI : -M_PI); bool flip = (phiDiff > 0.0 ? true : false); - //avoid flipping twice for each b - bool fliped = false; //modify the twist angle if it was fixed or was part of ring for (uint c = 0; c < b; ++c) { @@ -448,7 +439,7 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, var = (var > 1.0 && var < 1.1 ? 1.0 : var); var = (var < -1.0 && var > -1.1 ? -1.0 : var); double ang = acos(var); - ang *= (flip ? -1.0 : 1.0); + ang = (flip ? 2.0 * M_PI - ang : ang); ang += phi[c]; std::fill_n(angles, nTrials, ang); if(isnan(ang)) { @@ -463,11 +454,6 @@ void DCHedronCycle::ConstrainedAnglesOld(uint nTrials, TrialMol& oldMol, exit(EXIT_FAILURE); } break; - } else if (flip && !fliped) { - for (uint i = 0; i < nTrials; ++i) { - angles[i] *= -1.0; - } - fliped = true; } } From 9e6816d21125dd1a4dd7ec04d162632e3d4abe06 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 18 Oct 2018 15:08:25 -0400 Subject: [PATCH 152/199] Turn off the GPU compilation --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 243fea881..067cb636e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,10 +28,10 @@ set(ENSEMBLE_NVT ON CACHE BOOL "Build NVT version") set(ENSEMBLE_GEMC ON CACHE BOOL "Build GEMC version") set(ENSEMBLE_GCMC ON CACHE BOOL "Build GCMC version") set(ENSEMBLE_NPT ON CACHE BOOL "Build NPT version") -set(ENSEMBLE_GPU_NVT ON CACHE BOOL "Build GPU NVT version") -set(ENSEMBLE_GPU_GEMC ON CACHE BOOL "Build GPU GEMC version") -set(ENSEMBLE_GPU_GCMC ON CACHE BOOL "Build GPU GCMC version") -set(ENSEMBLE_GPU_NPT ON CACHE BOOL "Build GPU NPT version") +set(ENSEMBLE_GPU_NVT OFF CACHE BOOL "Build GPU NVT version") +set(ENSEMBLE_GPU_GEMC OFF CACHE BOOL "Build GPU GEMC version") +set(ENSEMBLE_GPU_GCMC OFF CACHE BOOL "Build GPU GCMC version") +set(ENSEMBLE_GPU_NPT OFF CACHE BOOL "Build GPU NPT version") #enable config header configure_file( From 7fa96c924543b99530461376f06a89ee22da06d9 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 18 Oct 2018 18:27:09 -0400 Subject: [PATCH 153/199] Avoid reading the pdbfile again when we dont do framerecalculation. --- src/Simulation.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 20021bf98..5f8c3eb5b 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -37,7 +37,9 @@ Simulation::Simulation(char const*const configFileName) std::cout << "Printed combined psf to file " << set.config.out.state.files.psf.name << '\n'; - frameSteps = set.pdb.GetFrameSteps(set.config.in.files.pdb.name); + if(totalSteps == 0) { + frameSteps = set.pdb.GetFrameSteps(set.config.in.files.pdb.name); + } } Simulation::~Simulation() From f734efb4ae5e44ec849105e8cb8cc22347b1b2f7 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Sat, 20 Oct 2018 21:53:30 -0400 Subject: [PATCH 154/199] Fixed a bug with newer gcc On ubuntu and newer gcc version (6.3.0 tested) we get an error where END_CELL is not recognized. We are going to define it in cpp as well. --- src/CellList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CellList.cpp b/src/CellList.cpp index 375e9a6ad..36dae3245 100644 --- a/src/CellList.cpp +++ b/src/CellList.cpp @@ -13,6 +13,8 @@ along with this program, also can be found at . #include +const int CellList::END_CELL; + CellList::CellList(const Molecules& mols, BoxDimensions& dims) : mols(&mols) { From 9bc4b4e00232030a8130fd5923609f1b86c86cca Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Sat, 20 Oct 2018 23:27:35 -0400 Subject: [PATCH 155/199] Update CMakeLists.txt fix the issue with macos. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 067cb636e..b9b3144ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ configure_file( include_directories("${PROJECT_BINARY_DIR}") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -stdlib=libstdc++") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -stdlib=libstdc++") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -stdlib=libc++") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -stdlib=libc++") endif() if(CMAKE_COMPILER_IS_GNUCXX) From f1ac25242b070337322d762c5720859b9afa615e Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 3 Nov 2018 16:04:56 -0400 Subject: [PATCH 156/199] In Regrowth move, if selected atom is in the ring and growAll is false, we perform Crankshaft move. In case that there is no crankshaft move, we call IntraSwap. We change this logic and if there is no cranckshaft move, we set growAll true. --- src/cbmc/DCCyclic.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index ffe6d6741..d3067f2ad 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -267,11 +267,7 @@ void DCCyclic::InitCrankShaft(const mol_setup::MolKind& kind) void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { - if(!hasCrankShaft) { - //No crank shaft move means all angles are fixed. - //Instead we perform IntraSwap move - Build(oldMol, newMol, molIndex); - } else { + if(hasCrankShaft) { //Set tCoords to coordinate of actual molecule, it will be modified oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); newMol.SetCoords(coords, 0); @@ -282,6 +278,10 @@ void DCCyclic::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) crankshaft[pick]->BuildNew(newMol, molIndex); crankshaft[pick]->PrepareOld(oldMol, molIndex); crankshaft[pick]->BuildOld(oldMol, molIndex); + } else { + //No crank shaft move means all angles are fixed. + //Instead we perform IntraSwap move + Build(oldMol, newMol, molIndex); } } @@ -353,6 +353,9 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { //check if we want to grow all atoms from node's focus or not bool growAll = data.prng() < 1.0 / nodes.size(); + //Avoid the case where we dont have any crankshaft move. Its better to regrowth + //the molecule rather than call IntraSwap move + growAll |= !hasCrankShaft; //Randomely pick a node to keep it fix and not grow it uint current = data.prng.randIntExc(nodes.size()); From 7de7b738614921eb5eeb24edce9e24bc09318eb9 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sat, 3 Nov 2018 17:47:58 -0400 Subject: [PATCH 157/199] If angles are near plane formation and constrained angles belong to ring, we keep them fix and let crankshaft handle it --- src/cbmc/DCHedronCycle.cpp | 23 +++++++++++++++++++++++ src/cbmc/DCLinkedCycle.cpp | 14 ++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/cbmc/DCHedronCycle.cpp b/src/cbmc/DCHedronCycle.cpp index 84b61ccc4..ec9f2ebe8 100644 --- a/src/cbmc/DCHedronCycle.cpp +++ b/src/cbmc/DCHedronCycle.cpp @@ -74,6 +74,16 @@ DCHedronCycle::DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, } vector angles = AtomMidAngles(kind, focus); + double sumAngle = 0.0; + for (uint a = 0; a < angles.size(); a++) { + sumAngle += data->ff.angles->Angle(angles[a].kind); + } + //If sum of angles = 2*pi = 6.283, it means they are in a plane + //To avoid geometric conflict for flexible angle, we consider it fix and + //let crankshaft to sample it. 0.044 ~= 5 degree + bool angleInPlane = (abs(2.0 * M_PI - sumAngle) < 0.044); + bool constrainAngInRing = false; + for (uint i = 0; i < nBonds; ++i) { typedef vector::const_iterator Aiter; Aiter free = find_if(angles.begin(), angles.end(), @@ -89,6 +99,19 @@ DCHedronCycle::DCHedronCycle(DCData* data, const mol_setup::MolKind& kind, angleKinds[j][i] = pair->kind; angleInRing[i][j] = IsInRing(cycAtoms, *pair); angleInRing[j][i] = angleInRing[i][j]; + constrainAngInRing |= angleInRing[i][j]; + } + } + + //If one of the constrained angle is belong to ring and angle form a plane + // we fix the free and constrained angles + if(constrainAngInRing && angleInPlane) { + for (uint i = 0; i < nBonds; ++i) { + angleInRing[i][i] = true; + for (uint j = i + 1; j < nBonds; ++j) { + angleInRing[i][j] = true; + angleInRing[j][i] = true; + } } } diff --git a/src/cbmc/DCLinkedCycle.cpp b/src/cbmc/DCLinkedCycle.cpp index c89312850..c0946c75a 100644 --- a/src/cbmc/DCLinkedCycle.cpp +++ b/src/cbmc/DCLinkedCycle.cpp @@ -102,10 +102,16 @@ DCLinkedCycle::DCLinkedCycle double DCLinkedCycle::CalcDih(TrialMol& mol, uint a0, uint a1, uint a2, uint a3) { - //Calculate the dihedral using bCoords - const XYZArray &coords = mol.GetBCoords(); - double phi = geom::Phi(coords.Difference(a1, a0), coords.Difference(a2, a1), - coords.Difference(a3, a2)); + double phi = 0.0; + if(mol.AtomExists(a0)) { + //Calculate theta using tCoords + phi = mol.GetPhi(a0, a1, a2, a3); + } else { + //Calculate the dihedral using bCoords + const XYZArray &coords = mol.GetBCoords(); + phi = geom::Phi(coords.Difference(a1, a0), coords.Difference(a2, a1), + coords.Difference(a3, a2)); + } return phi; } From 41214291a5388f47c26fa9339ad25234f62d3a0c Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 4 Nov 2018 13:50:40 -0500 Subject: [PATCH 158/199] Fix to the console printing of bonded info, use tab! --- .vscode/settings.json | 12 ++++++++++- src/MolSetup.cpp | 47 ++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f743dd9aa..a21a01a53 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,16 @@ { "files.associations": { "__tree": "cpp", - "ios": "cpp" + "ios": "cpp", + "__config": "cpp", + "__nullptr": "cpp", + "cstddef": "cpp", + "exception": "cpp", + "initializer_list": "cpp", + "new": "cpp", + "stdexcept": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "algorithm": "cpp" } } \ No newline at end of file diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index f06aade8c..61b55dba4 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -257,19 +257,19 @@ void MolSetup::AssignKinds(const pdb_setup::Atoms& pdbAtoms, const FFSetup& ffDa //Print bonded Information printf("Bonds parameter:\n"); - printf("%-19s %15s %20s \n", "Atom Types", "Kb(K)", "b0(A)"); + printf("%s\t\t\t\t%s\t\t%s \n", "Atom Types", "Kb(K)", "b0(A)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefBondKinds(it->second, ffData); } printf("Angles parameter:\n"); - printf("%-19s %15s %20s \n", "Atom Types", "Ktheta(K)", "theta0(degree)"); + printf("%s\t\t\t\t%s\t%s \n", "Atom Types", "Ktheta(K)", "theta0(degree)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefAngleKinds(it->second, ffData); } printf("Dihedrals parameter:\n"); - printf("%-19s %15s %4s %15s \n", "Atom Types", "Kchi(K)", "n", + printf("%s\t\t\t\t%s\t\t%s\t%s \n", "Atom Types", "Kchi(K)", "n", "delta(degree)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefDihKinds(it->second, ffData); @@ -334,26 +334,24 @@ void BriefBondKinds(MolKind& kind, const FFSetup& ffData) for(uint i = 0; i < kind.bonds.size(); ++i) { uint search = kind.bonds[i].kind; - std::string bondName, bondNameReverse; + std::string bondName; elementNames[0] = kind.atoms[kind.bonds[i].a0].type; elementNames[1] = kind.atoms[kind.bonds[i].a1].type; for(uint m = 0; m < ATOMS_PER; ++m) { - bondName.append(elementNames[m]).append(" "); - bondNameReverse.append(elementNames[ATOMS_PER - m - 1]).append(" "); + bondName.append(elementNames[m]).append("\t"); } if(find(printed.begin(), printed.end(), bondName) == printed.end()) { - printf("%-20s", bondName.c_str()); + printf("%s", bondName.c_str()); if(ffData.bond.GetKb(search) > 99999999) - printf("%15s %20.4f \n", "FIX", ffData.bond.Getb0(search)); + printf("\t\t\t%s\t\t%5.4f \n", "FIX", ffData.bond.Getb0(search)); else - printf("%15.6f %20.4f \n", ffData.bond.GetKb(search), + printf("\t\t\t%5.4f\t%5.4f \n", ffData.bond.GetKb(search), ffData.bond.Getb0(search)); printed.push_back(bondName); - printed.push_back(bondNameReverse); } } std::cout << std::endl; @@ -394,27 +392,25 @@ void BriefAngleKinds(MolKind& kind, const FFSetup& ffData) return; for(uint i = 0; i < kind.angles.size(); ++i) { - std::string angleName, angleNameReverse; + std::string angleName; uint search = kind.angles[i].kind; elementNames[0] = kind.atoms[kind.angles[i].a0].type; elementNames[1] = kind.atoms[kind.angles[i].a1].type; elementNames[2] = kind.atoms[kind.angles[i].a2].type; for(uint m = 0; m < ATOMS_PER; ++m) { - angleName.append(elementNames[m]).append(" "); - angleNameReverse.append(elementNames[ATOMS_PER - m - 1]).append(" "); + angleName.append(elementNames[m]).append("\t"); } if(find(printed.begin(), printed.end(), angleName) == printed.end()) { - printf("%-20s", angleName.c_str()); + printf("%s", angleName.c_str()); if(ffData.angle.GetKtheta(search) > 99999999) - printf("%15s %20.4f \n", "FIX", ffData.angle.Gettheta0(search) *coef); + printf("\t\t%s\t\t%5.4f \n", "FIX", ffData.angle.Gettheta0(search) *coef); else - printf("%15.6f %20.4f \n", ffData.angle.GetKtheta(search), + printf("\t\t%5.4f\t%5.4f \n", ffData.angle.GetKtheta(search), ffData.angle.Gettheta0(search) * coef); printed.push_back(angleName); - printed.push_back(angleNameReverse); } } std::cout << std::endl; @@ -456,7 +452,7 @@ void BriefDihKinds(MolKind& kind, const FFSetup& ffData) for(uint i = 0; i < kind.dihedrals.size(); ++i) { std::string dName = ffData.dih.name[kind.dihedrals[i].kind]; - std::string dihedralName, dihedralNameReverse; + std::string dihedralName; uint dihsize = ffData.dih.GetSizeDih(dName); elementNames[0] = kind.atoms[kind.dihedrals[i].a0].type; @@ -465,20 +461,17 @@ void BriefDihKinds(MolKind& kind, const FFSetup& ffData) elementNames[3] = kind.atoms[kind.dihedrals[i].a3].type; for(uint m = 0; m < ATOMS_PER; ++m) { - dihedralName.append(elementNames[m]).append(" "); - dihedralNameReverse.append(elementNames[ATOMS_PER - m - 1]).append(" "); + dihedralName.append(elementNames[m]).append("\t"); } if(find(printed.begin(), printed.end(), dihedralName) == printed.end()) { for(uint j = 0; j < dihsize; j++) { - printf("%-20s", dihedralName.c_str()); - printf("%15.6f %4d %15.4f \n", ffData.dih.GetKchi(dName, j), + printf("%s", dihedralName.c_str()); + printf("\t%5.4f\t%d\t%5.4f \n", ffData.dih.GetKchi(dName, j), ffData.dih.Getn(dName, j), ffData.dih.Getdelta(dName, j) * coef); } printed.push_back(dihedralName); - printed.push_back(dihedralNameReverse); - std::cout << endl; } } } @@ -502,13 +495,13 @@ void mol_setup::PrintMolMapVerbose(const MolMap& kindMap) } std::cout << "\nBonds:"; for (uint i = 0; i < it->second.bonds.size(); i++) { - if (i % 20 == 0) + if (i % 10 == 0) std::cout << std::endl; std::cout << "[" << it->second.bonds[i].a0 << ' ' << it->second.bonds[i].a1 << ']' << ' '; } std::cout << std::endl << "\nAngles:"; for (uint i = 0; i < it->second.angles.size(); i++) { - if (i % 24 == 0) + if (i % 7 == 0) std::cout << std::endl; std::cout << "[" << it->second.angles[i].a0 << ' ' << it->second.angles[i].a1 << ' ' @@ -516,7 +509,7 @@ void mol_setup::PrintMolMapVerbose(const MolMap& kindMap) } std::cout << std::endl << "\nDihedrals:"; for (uint i = 0; i < it->second.dihedrals.size(); i++) { - if (i % 24 == 0) + if (i % 5 == 0) std::cout << std::endl; std::cout << "[" << it->second.dihedrals[i].a0 << ' ' << it->second.dihedrals[i].a1 << ' ' From 423cabbbe9eaa4b6a67d446af402549046d46758 Mon Sep 17 00:00:00 2001 From: msoroush Date: Sun, 4 Nov 2018 14:00:04 -0500 Subject: [PATCH 159/199] Fix to Issue #105 --- src/ConfigSetup.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index b8cccd8e2..44273d558 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -194,7 +194,15 @@ void ConfigSetup::Init(const char *fileName) in.ffKind.isCHARMM = false; in.ffKind.isMARTINI = false; in.ffKind.isEXOTIC = true; - printf("%-40s %-s \n", "Info: PARAMETER file", "EXOTIC format!"); + printf("%-40s %-s \n", "Info: PARAMETER file", "MIE format!"); + } + } else if(CheckString(line[0], "ParaTypeMIE")) { + if(checkBool(line[1])) { + in.ffKind.numOfKinds++; + in.ffKind.isCHARMM = false; + in.ffKind.isMARTINI = false; + in.ffKind.isEXOTIC = true; + printf("%-40s %-s \n", "Info: PARAMETER file", "MIE format!"); } } else if(CheckString(line[0], "ParaTypeMARTINI")) { if(checkBool(line[1])) { From 10d351630cd755c267360a8858b4efd1d4792f8a Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 5 Nov 2018 17:25:59 -0500 Subject: [PATCH 160/199] Clean printing the bonded info --- src/MolSetup.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/MolSetup.cpp b/src/MolSetup.cpp index 61b55dba4..e9f335c47 100644 --- a/src/MolSetup.cpp +++ b/src/MolSetup.cpp @@ -257,19 +257,19 @@ void MolSetup::AssignKinds(const pdb_setup::Atoms& pdbAtoms, const FFSetup& ffDa //Print bonded Information printf("Bonds parameter:\n"); - printf("%s\t\t\t\t%s\t\t%s \n", "Atom Types", "Kb(K)", "b0(A)"); + printf("%s %33s %15s \n", "Atom Types", "Kb(K)", "b0(A)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefBondKinds(it->second, ffData); } printf("Angles parameter:\n"); - printf("%s\t\t\t\t%s\t%s \n", "Atom Types", "Ktheta(K)", "theta0(degree)"); + printf("%s %33s %22s \n", "Atom Types", "Ktheta(K)", "theta0(degree)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefAngleKinds(it->second, ffData); } printf("Dihedrals parameter:\n"); - printf("%s\t\t\t\t%s\t\t%s\t%s \n", "Atom Types", "Kchi(K)", "n", + printf("%s %33s %4s %16s \n", "Atom Types", "Kchi(K)", "n", "delta(degree)"); for (MapIt it = kindMap.begin(), end = kindMap.end(); it != end; ++it) { BriefDihKinds(it->second, ffData); @@ -346,9 +346,9 @@ void BriefBondKinds(MolKind& kind, const FFSetup& ffData) if(find(printed.begin(), printed.end(), bondName) == printed.end()) { printf("%s", bondName.c_str()); if(ffData.bond.GetKb(search) > 99999999) - printf("\t\t\t%s\t\t%5.4f \n", "FIX", ffData.bond.Getb0(search)); + printf("%28s %16.4f \n", "FIX", ffData.bond.Getb0(search)); else - printf("\t\t\t%5.4f\t%5.4f \n", ffData.bond.GetKb(search), + printf("%28.4f %16.4f \n", ffData.bond.GetKb(search), ffData.bond.Getb0(search)); printed.push_back(bondName); @@ -405,9 +405,9 @@ void BriefAngleKinds(MolKind& kind, const FFSetup& ffData) if(find(printed.begin(), printed.end(), angleName) == printed.end()) { printf("%s", angleName.c_str()); if(ffData.angle.GetKtheta(search) > 99999999) - printf("\t\t%s\t\t%5.4f \n", "FIX", ffData.angle.Gettheta0(search) *coef); + printf("%20s %16.4f \n", "FIX", ffData.angle.Gettheta0(search) *coef); else - printf("\t\t%5.4f\t%5.4f \n", ffData.angle.GetKtheta(search), + printf("%20.4f %16.4f \n", ffData.angle.GetKtheta(search), ffData.angle.Gettheta0(search) * coef); printed.push_back(angleName); @@ -467,7 +467,7 @@ void BriefDihKinds(MolKind& kind, const FFSetup& ffData) if(find(printed.begin(), printed.end(), dihedralName) == printed.end()) { for(uint j = 0; j < dihsize; j++) { printf("%s", dihedralName.c_str()); - printf("\t%5.4f\t%d\t%5.4f \n", ffData.dih.GetKchi(dName, j), + printf("%12.4f %4d %11.4f \n", ffData.dih.GetKchi(dName, j), ffData.dih.Getn(dName, j), ffData.dih.Getdelta(dName, j) * coef); } From fbf9fe4d52c3675363243453028e91a646aef2a5 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Mon, 12 Nov 2018 01:02:34 -0500 Subject: [PATCH 161/199] Fixed issue #110 It's better to allocate dynamically with "new" rather than allocating array when the size dynamic. --- src/MoleculeExchange1.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MoleculeExchange1.h b/src/MoleculeExchange1.h index 274f5b043..768f84186 100644 --- a/src/MoleculeExchange1.h +++ b/src/MoleculeExchange1.h @@ -539,7 +539,7 @@ inline void MoleculeExchange1::CalcTc() if (ffRef.useLRC) { double delTC = 0.0; for (uint b = 0; b < BOX_TOTAL; ++b) { - uint kCount[molRef.kindsCount]; + uint* kCount = new uint[molRef.kindsCount]; for (uint k = 0; k < molRef.kindsCount; ++k) { kCount[k] = molLookRef.NumKindInBox(k, b); } @@ -553,6 +553,7 @@ inline void MoleculeExchange1::CalcTc() } tcNew[b].energy = calcEnRef.EnergyCorrection(b, kCount); delTC += tcNew[b].energy - sysPotRef.boxEnergy[b].tc; + delete[] kCount; } W_tc = exp(-1.0 * ffRef.beta * delTC); } From 502134694f06923c58373b1c9837e315b5a66533 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 12 Nov 2018 10:19:03 -0500 Subject: [PATCH 162/199] Call regrowth all when selected node is in ring and we dont have crankshaft move --- src/cbmc/DCCyclic.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/cbmc/DCCyclic.cpp b/src/cbmc/DCCyclic.cpp index d3067f2ad..aa1dad455 100644 --- a/src/cbmc/DCCyclic.cpp +++ b/src/cbmc/DCCyclic.cpp @@ -353,9 +353,6 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) { //check if we want to grow all atoms from node's focus or not bool growAll = data.prng() < 1.0 / nodes.size(); - //Avoid the case where we dont have any crankshaft move. Its better to regrowth - //the molecule rather than call IntraSwap move - growAll |= !hasCrankShaft; //Randomely pick a node to keep it fix and not grow it uint current = data.prng.randIntExc(nodes.size()); @@ -369,7 +366,13 @@ void DCCyclic::Regrowth(TrialMol& oldMol, TrialMol& newMol, uint molIndex) if(isRing[seedInx] && !growAll) { //if selected node was part of ring and we did not grow all, perform crankshaft - return CrankShaft(oldMol, newMol, molIndex); + //Avoid the case where we dont have any crankshaft move. Its better to regrowth + //the whole molecule rather than call IntraSwap move + if(hasCrankShaft) { + return CrankShaft(oldMol, newMol, molIndex); + } else { + growAll = true; + } } //Set bCoords to unwrap coordinate of actual molecule From 08d8163d016290362c0bdaa1b30c93e47bf1b77b Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 12 Nov 2018 16:05:54 -0500 Subject: [PATCH 163/199] GPU fixed. --- CMakeLists.txt | 8 ++--- src/FFParticle.cpp | 6 ++-- src/GPU/CalculateEnergyCUDAKernel.cu | 20 +++++++----- src/GPU/CalculateEnergyCUDAKernel.cuh | 7 +++-- src/GPU/CalculateForceCUDAKernel.cu | 45 ++++++--------------------- src/GPU/CalculateForceCUDAKernel.cuh | 7 +++-- src/GPU/VariablesCUDA.cuh | 31 ++++++++++++++++++ 7 files changed, 68 insertions(+), 56 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9b3144ce..6af3884fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,10 +28,10 @@ set(ENSEMBLE_NVT ON CACHE BOOL "Build NVT version") set(ENSEMBLE_GEMC ON CACHE BOOL "Build GEMC version") set(ENSEMBLE_GCMC ON CACHE BOOL "Build GCMC version") set(ENSEMBLE_NPT ON CACHE BOOL "Build NPT version") -set(ENSEMBLE_GPU_NVT OFF CACHE BOOL "Build GPU NVT version") -set(ENSEMBLE_GPU_GEMC OFF CACHE BOOL "Build GPU GEMC version") -set(ENSEMBLE_GPU_GCMC OFF CACHE BOOL "Build GPU GCMC version") -set(ENSEMBLE_GPU_NPT OFF CACHE BOOL "Build GPU NPT version") +set(ENSEMBLE_GPU_NVT ON CACHE BOOL "Build GPU NVT version") +set(ENSEMBLE_GPU_GEMC ON CACHE BOOL "Build GPU GEMC version") +set(ENSEMBLE_GPU_GCMC ON CACHE BOOL "Build GPU GCMC version") +set(ENSEMBLE_GPU_NPT ON CACHE BOOL "Build GPU NPT version") #enable config header configure_file( diff --git a/src/FFParticle.cpp b/src/FFParticle.cpp index d6817e107..217293a72 100644 --- a/src/FFParticle.cpp +++ b/src/FFParticle.cpp @@ -96,9 +96,9 @@ void FFParticle::Init(ff_setup::Particle const& mie, double diElectric_1 = 1.0 / forcefield.dielectric; InitGPUForceField(*varCUDA, sigmaSq, epsilon_cn, n, forcefield.vdwKind, forcefield.isMartini, count, forcefield.rCut, - forcefield.rCutCoulomb,forcefield.rCutLow, - forcefield.rswitch, forcefield.alpha, forcefield.ewald, - diElectric_1); + forcefield.rCutCoulomb,forcefield.rCutLow, + forcefield.rswitch, forcefield.alpha, forcefield.ewald, + diElectric_1); #endif } diff --git a/src/GPU/CalculateEnergyCUDAKernel.cu b/src/GPU/CalculateEnergyCUDAKernel.cu index 4984237f2..4c2d31e74 100644 --- a/src/GPU/CalculateEnergyCUDAKernel.cu +++ b/src/GPU/CalculateEnergyCUDAKernel.cu @@ -10,6 +10,7 @@ along with this program, also can be found at . #include "ConstantDefinitionsCUDAKernel.cuh" #include "CalculateMinImageCUDAKernel.cuh" #include "cub/cub.cuh" +#include using namespace cub; @@ -87,10 +88,10 @@ void CallBoxInterGPU(VariablesCUDA *vars, vars->gpu_isMartini, vars->gpu_count, vars->gpu_rCut, - vars->gpu_rCutCoulomb[box], + vars->gpu_rCutCoulomb, vars->gpu_rCutLow, vars->gpu_rOn, - vars->gpu_alpha[box], + vars->gpu_alpha, vars->gpu_ewald, vars->gpu_diElectric_1, vars->gpu_nonOrth, @@ -99,7 +100,8 @@ void CallBoxInterGPU(VariablesCUDA *vars, vars->gpu_cell_z[box], vars->gpu_Invcell_x[box], vars->gpu_Invcell_y[box], - vars->gpu_Invcell_z[box]); + vars->gpu_Invcell_z[box], + box); // ReduceSum void * d_temp_storage = NULL; @@ -159,10 +161,10 @@ __global__ void BoxInterGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, - double gpu_rCutCoulomb, + double *gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double gpu_alpha, + double *gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, int *gpu_nonOrth, @@ -171,7 +173,8 @@ __global__ void BoxInterGPU(int *gpu_pair1, double *gpu_cell_z, double *gpu_Invcell_x, double *gpu_Invcell_y, - double *gpu_Invcell_z) + double *gpu_Invcell_z, + int box) { int threadID = blockIdx.x * blockDim.x + threadIdx.x; if(threadID >= pairSize) @@ -181,7 +184,7 @@ __global__ void BoxInterGPU(int *gpu_pair1, double qqFact = 167000.0; gpu_REn[threadID] = 0.0; gpu_LJEn[threadID] = 0.0; - double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb); + double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb[box]); if(InRcutGPU(distSq, gpu_x[gpu_pair1[threadID]], gpu_y[gpu_pair1[threadID]], gpu_z[gpu_pair1[threadID]], gpu_x[gpu_pair2[threadID]], gpu_y[gpu_pair2[threadID]], gpu_z[gpu_pair2[threadID]], @@ -193,7 +196,8 @@ __global__ void BoxInterGPU(int *gpu_pair1, gpu_particleCharge[gpu_pair2[threadID]] * qqFact; gpu_REn[threadID] = CalcCoulombGPU(distSq, qi_qj_fact, gpu_rCutLow[0], gpu_ewald[0], gpu_VDW_Kind[0], - gpu_alpha, gpu_rCutCoulomb, + gpu_alpha[box], + gpu_rCutCoulomb[box], gpu_isMartini[0], gpu_diElectric_1[0]); } diff --git a/src/GPU/CalculateEnergyCUDAKernel.cuh b/src/GPU/CalculateEnergyCUDAKernel.cuh index 4947607b7..d18151ded 100644 --- a/src/GPU/CalculateEnergyCUDAKernel.cuh +++ b/src/GPU/CalculateEnergyCUDAKernel.cuh @@ -48,10 +48,10 @@ __global__ void BoxInterGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, - double gpu_rCutCoulomb, + double *gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double gpu_alpha, + double *gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, int *gpu_nonOrth, @@ -60,7 +60,8 @@ __global__ void BoxInterGPU(int *gpu_pair1, double *gpu_cell_z, double *gpu_Invcell_x, double *gpu_Invcell_y, - double *gpu_Invcell_z); + double *gpu_Invcell_z, + int box); __device__ double CalcCoulombGPU(double distSq, double qi_qj_fact, diff --git a/src/GPU/CalculateForceCUDAKernel.cu b/src/GPU/CalculateForceCUDAKernel.cu index 94c012baf..b47729650 100644 --- a/src/GPU/CalculateForceCUDAKernel.cu +++ b/src/GPU/CalculateForceCUDAKernel.cu @@ -15,33 +15,6 @@ along with this program, also can be found at . using namespace cub; -#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } -inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort = true) -{ - if (code != cudaSuccess) { - fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); - if (abort) exit(code); - } -} - -void printFreeMemory() -{ - size_t free_byte ; - size_t total_byte ; - cudaError_t cuda_status = cudaMemGetInfo( &free_byte, &total_byte ) ; - - if ( cudaSuccess != cuda_status ) { - printf("Error: cudaMemGetInfo fails, %s \n", - cudaGetErrorString(cuda_status) ); - exit(1); - } - double free_db = (double)free_byte ; - double total_db = (double)total_byte ; - double used_db = total_db - free_db ; - printf("GPU memory usage: used = %f, free = %f MB, total = %f MB\n", - used_db / 1024.0 / 1024.0, free_db / 1024.0 / 1024.0, total_db / 1024.0 / 1024.0); -} - void CallBoxInterForceGPU(VariablesCUDA *vars, vector &pair1, vector &pair2, @@ -147,10 +120,10 @@ void CallBoxInterForceGPU(VariablesCUDA *vars, vars->gpu_isMartini, vars->gpu_count, vars->gpu_rCut, - vars->gpu_rCutCoulomb[box], + vars->gpu_rCutCoulomb, vars->gpu_rCutLow, vars->gpu_rOn, - vars->gpu_alpha[box], + vars->gpu_alpha, vars->gpu_ewald, vars->gpu_diElectric_1, vars->gpu_cell_x[box], @@ -159,7 +132,8 @@ void CallBoxInterForceGPU(VariablesCUDA *vars, vars->gpu_Invcell_x[box], vars->gpu_Invcell_y[box], vars->gpu_Invcell_z[box], - vars->gpu_nonOrth); + vars->gpu_nonOrth, + box); cudaDeviceSynchronize(); // ReduceSum // Virial of LJ void *d_temp_storage = NULL; @@ -367,10 +341,10 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, - double gpu_rCutCoulomb, + double *gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double gpu_alpha, + double *gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, double *gpu_cell_x, @@ -379,7 +353,8 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, double *gpu_Invcell_x, double *gpu_Invcell_y, double *gpu_Invcell_z, - int *gpu_nonOrth) + int *gpu_nonOrth, + int box) { int threadID = blockIdx.x * blockDim.x + threadIdx.x; if(threadID >= pairSize) @@ -395,7 +370,7 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, gpu_vT12[threadID] = 0.0, gpu_vT13[threadID] = 0.0, gpu_vT23[threadID] = 0.0; gpu_rT12[threadID] = 0.0, gpu_rT13[threadID] = 0.0, gpu_rT23[threadID] = 0.0; double diff_comx, diff_comy, diff_comz; - double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb); + double cutoff = fmax(gpu_rCut[0], gpu_rCutCoulomb[box]); if(InRcutGPU(distSq, virX, virY, virZ, gpu_x[gpu_pair1[threadID]], gpu_y[gpu_pair1[threadID]], gpu_z[gpu_pair1[threadID]], @@ -419,7 +394,7 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, qi_qj = gpu_particleCharge[gpu_pair1[threadID]] * gpu_particleCharge[gpu_pair2[threadID]]; pRF = CalcCoulombForceGPU(distSq, qi_qj, gpu_VDW_Kind[0], gpu_ewald[0], - gpu_isMartini[0], gpu_alpha, gpu_rCutCoulomb, + gpu_isMartini[0], gpu_alpha[box], gpu_rCutCoulomb[box], gpu_diElectric_1[0]); gpu_rT11[threadID] = pRF * (virX * diff_comx); diff --git a/src/GPU/CalculateForceCUDAKernel.cuh b/src/GPU/CalculateForceCUDAKernel.cuh index 4e0c31a49..e09cd3bd8 100644 --- a/src/GPU/CalculateForceCUDAKernel.cuh +++ b/src/GPU/CalculateForceCUDAKernel.cuh @@ -88,10 +88,10 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, int *gpu_isMartini, int *gpu_count, double *gpu_rCut, - double gpu_rCutCoulomb, + double *gpu_rCutCoulomb, double *gpu_rCutLow, double *gpu_rOn, - double gpu_alpha, + double *gpu_alpha, int *gpu_ewald, double *gpu_diElectric_1, double *gpu_cell_x, @@ -100,7 +100,8 @@ __global__ void BoxInterForceGPU(int *gpu_pair1, double *gpu_Invcell_x, double *gpu_Invcell_y, double *gpu_Invcell_z, - int *gpu_nonOrth); + int *gpu_nonOrth, + int box); __global__ void ForceReciprocalGPU(double *gpu_x, double *gpu_y, diff --git a/src/GPU/VariablesCUDA.cuh b/src/GPU/VariablesCUDA.cuh index 1bcf7a626..c0b6c65af 100644 --- a/src/GPU/VariablesCUDA.cuh +++ b/src/GPU/VariablesCUDA.cuh @@ -7,7 +7,38 @@ along with this program, also can be found at . #pragma once #ifdef GOMC_CUDA +#include +#include +#include #include "EnsemblePreprocessor.h" + +#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } +inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort = true) +{ + if (code != cudaSuccess) { + fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); + if (abort) exit(code); + } +} + +inline void printFreeMemory() +{ + size_t free_byte ; + size_t total_byte ; + cudaError_t cuda_status = cudaMemGetInfo( &free_byte, &total_byte ) ; + + if ( cudaSuccess != cuda_status ) { + printf("Error: cudaMemGetInfo fails, %s \n", + cudaGetErrorString(cuda_status) ); + exit(1); + } + double free_db = (double)free_byte ; + double total_db = (double)total_byte ; + double used_db = total_db - free_db ; + printf("GPU memory usage: used = %f, free = %f MB, total = %f MB\n", + used_db / 1024.0 / 1024.0, free_db / 1024.0 / 1024.0, total_db / 1024.0 / 1024.0); +} + class VariablesCUDA { public: From 065ec5fbf34db34219e8bc2d6b3820b8ec5716f1 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 13 Nov 2018 12:17:39 -0500 Subject: [PATCH 164/199] Fix to GPU pressure calculation for NPT simulation. --- src/CalculateEnergy.cpp | 13 +++++++++++++ src/VolumeTransfer.h | 8 ++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index 7b16a812b..ad08e0163 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -277,6 +277,19 @@ Virial CalculateEnergy::ForceCalc(const uint box) #ifdef GOMC_CUDA uint pairSize = pair1.size(); + //update unitcell in GPU + UpdateCellBasisCUDA(forcefield.particles->getCUDAVars(), box, + currentAxes.cellBasis[box].x, + currentAxes.cellBasis[box].y, + currentAxes.cellBasis[box].z); + + if(!currentAxes.orthogonal[box]) { + BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(¤tAxes)); + UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), box, + newAxes.cellBasis_Inv[box].x, newAxes.cellBasis_Inv[box].y, + newAxes.cellBasis_Inv[box].z); + } + uint currentIndex = 0; double vT11t = 0.0, vT12t = 0.0, vT13t = 0.0; double vT22t = 0.0, vT23t = 0.0, vT33t = 0.0; diff --git a/src/VolumeTransfer.h b/src/VolumeTransfer.h index 040dd7797..8013656d9 100644 --- a/src/VolumeTransfer.h +++ b/src/VolumeTransfer.h @@ -162,8 +162,8 @@ inline void VolumeTransfer::CalcEn() calcEwald->RecipInit(bPick[b], newDim); //setup reciprocate terms calcEwald->BoxReciprocalSetup(bPick[b], newMolsPos); - sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, newDim, - bPick[b]); + sysPotNew = calcEnRef.BoxInter(sysPotNew, newMolsPos, newCOMs, + newDim, bPick[b]); } else { calcEwald->RecipInit(bPick[b], newDimNonOrth); //setup reciprocate terms @@ -172,7 +172,7 @@ inline void VolumeTransfer::CalcEn() newDimNonOrth, bPick[b]); } //calculate reciprocate term of electrostatic interaction - sysPotNew.boxEnergy[bPick[b]].recip = calcEwald->BoxReciprocal(bPick[b]); + sysPotNew.boxEnergy[bPick[b]].recip=calcEwald->BoxReciprocal(bPick[b]); } } else { //calculate new K vectors @@ -290,7 +290,7 @@ inline void VolumeTransfer::Accept(const uint rejectState, const uint step) boxDimRef.cellBasis[box].y, boxDimRef.cellBasis[box].z); if(!isOrth) { - BoxDimensionsNonOrth newAxes = *((BoxDimensionsNonOrth*)(&boxDimRef)); + BoxDimensionsNonOrth newAxes= *((BoxDimensionsNonOrth*)(&boxDimRef)); UpdateInvCellBasisCUDA(forcefield.particles->getCUDAVars(), box, newAxes.cellBasis_Inv[box].x, newAxes.cellBasis_Inv[box].y, From 903561863e7914914f0374e633bcb578c188da78 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 15 Nov 2018 10:51:52 -0500 Subject: [PATCH 165/199] Fix function name, and typo in movesetting --- .vscode/settings.json | 3 ++- src/ConsoleOutput.cpp | 36 ++++++++++++++++++------------------ src/MoveSettings.cpp | 2 +- src/OutputVars.cpp | 2 +- src/OutputVars.h | 2 +- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a21a01a53..1c42e59e7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,7 @@ "stdexcept": "cpp", "type_traits": "cpp", "typeinfo": "cpp", - "algorithm": "cpp" + "algorithm": "cpp", + "iostream": "cpp" } } \ No newline at end of file diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index ea91539f5..28c78ec4d 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -96,7 +96,7 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const #if ENSEMBLE == GCMC if(box == mv::BOX0) { #endif - if(var->Perfromed(mv::DISPLACE)) { + if(var->Performed(mv::DISPLACE)) { sub = mv::DISPLACE; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); @@ -104,7 +104,7 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const printElement(var->GetScale(box, sub), elementWidth); } - if(var->Perfromed(mv::ROTATE)) { + if(var->Performed(mv::ROTATE)) { sub = mv::ROTATE; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); @@ -112,28 +112,28 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const printElement(var->GetScale(box, sub), elementWidth); } - if(var->Perfromed(mv::INTRA_SWAP)) { + if(var->Performed(mv::INTRA_SWAP)) { sub = mv::INTRA_SWAP; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); printElement(var->GetAcceptPercent(box, sub), elementWidth); } - if(var->Perfromed(mv::REGROWTH)) { + if(var->Performed(mv::REGROWTH)) { sub = mv::REGROWTH; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); printElement(var->GetAcceptPercent(box, sub), elementWidth); } - if(var->Perfromed(mv::INTRA_MEMC)) { + if(var->Performed(mv::INTRA_MEMC)) { sub = mv::INTRA_MEMC; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); printElement(var->GetAcceptPercent(box, sub), elementWidth); } - if(var->Perfromed(mv::CRANKSHAFT)) { + if(var->Performed(mv::CRANKSHAFT)) { sub = mv::CRANKSHAFT; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); @@ -145,14 +145,14 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const #endif #if ENSEMBLE == GEMC || ENSEMBLE == GCMC - if(var->Perfromed(mv::MOL_TRANSFER)) { + if(var->Performed(mv::MOL_TRANSFER)) { sub = mv::MOL_TRANSFER; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); printElement(var->GetAcceptPercent(box, sub), elementWidth); } - if(var->Perfromed(mv::MEMC)) { + if(var->Performed(mv::MEMC)) { sub = mv::MEMC; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); @@ -161,7 +161,7 @@ void ConsoleOutput::PrintMove(const uint box, const ulong step) const #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT - if(var->Perfromed(mv::VOL_TRANSFER)) { + if(var->Performed(mv::VOL_TRANSFER)) { sub = mv::VOL_TRANSFER; printElement(var->GetTries(box, sub), elementWidth); printElement(var->GetAccepted(box, sub), elementWidth); @@ -319,52 +319,52 @@ void ConsoleOutput::PrintMoveTitle() std::string title = "MTITLE:"; title += " STEP"; printElement(title, elementWidth); - if(var->Perfromed(mv::DISPLACE)) { + if(var->Performed(mv::DISPLACE)) { printElement("DISTRY", elementWidth); printElement("DISACCEPT", elementWidth); printElement("DISACCEPT%", elementWidth); printElement("DISMAX", elementWidth); } - if(var->Perfromed(mv::ROTATE)) { + if(var->Performed(mv::ROTATE)) { printElement("ROTATE", elementWidth); printElement("ROTACCEPT", elementWidth); printElement("ROTACCEPT%", elementWidth); printElement("ROTMAX", elementWidth); } - if(var->Perfromed(mv::INTRA_SWAP)) { + if(var->Performed(mv::INTRA_SWAP)) { printElement("INTRASWAP", elementWidth); printElement("INTACCEPT", elementWidth); printElement("INTACCEPT%", elementWidth); } - if(var->Perfromed(mv::REGROWTH)) { + if(var->Performed(mv::REGROWTH)) { printElement("REGROWTH", elementWidth); printElement("REGROWACCEPT", elementWidth); printElement("REGROWACCEPT%", elementWidth); } - if(var->Perfromed(mv::INTRA_MEMC)) { + if(var->Performed(mv::INTRA_MEMC)) { printElement("INTRAMOLEXCHANGE", elementWidth); printElement("INTMOLEXCACCEPT", elementWidth); printElement("INTMOLEXACCEPT%", elementWidth); } - if(var->Perfromed(mv::CRANKSHAFT)) { + if(var->Performed(mv::CRANKSHAFT)) { printElement("CRANKSHAFT", elementWidth); printElement("CRKSHAFTACCEPT", elementWidth); printElement("CRKSHAFTACCEPT%", elementWidth); } #if ENSEMBLE == GEMC || ENSEMBLE == GCMC - if(var->Perfromed(mv::MOL_TRANSFER)) { + if(var->Performed(mv::MOL_TRANSFER)) { printElement("TRANSFER", elementWidth); printElement("TRANACCEPT", elementWidth); printElement("TRANACCEPT%", elementWidth); } - if(var->Perfromed(mv::MEMC)) { + if(var->Performed(mv::MEMC)) { printElement("MOLEXCHANGE", elementWidth); printElement("MOLEXACCEPT", elementWidth); printElement("MOLEXACCEPT%", elementWidth); @@ -372,7 +372,7 @@ void ConsoleOutput::PrintMoveTitle() #endif #if ENSEMBLE == GEMC || ENSEMBLE == NPT - if(var->Perfromed(mv::VOL_TRANSFER)) { + if(var->Performed(mv::VOL_TRANSFER)) { printElement("VOLUME", elementWidth); printElement("VOLACCEPT", elementWidth); printElement("VOLACCEPT%", elementWidth); diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index a79f2d224..5014f6372 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -82,7 +82,7 @@ void MoveSettings::Update(const uint move, const bool isAccepted, //in the if condition if (move == mv::INTRA_MEMC #if ENSEMBLE == GEMC || ENSEMBLE == GCMC - || move == mv::INTRA_MEMC + || move == mv::MEMC #endif #if ENSEMBLE == NPT || ENSEMBLE == GEMC || move == mv::VOL_TRANSFER diff --git a/src/OutputVars.cpp b/src/OutputVars.cpp index e79d90528..735fe9567 100644 --- a/src/OutputVars.cpp +++ b/src/OutputVars.cpp @@ -40,7 +40,7 @@ void OutputVars::InitRef(System & sys, StaticVals const& statV) virial = new Virial[BOXES_WITH_U_NB]; } -bool OutputVars::Perfromed(uint moveKind) +bool OutputVars::Performed(uint moveKind) { return (movePercRef[moveKind] > 0.0); } diff --git a/src/OutputVars.h b/src/OutputVars.h index 94482b9b9..739f65556 100644 --- a/src/OutputVars.h +++ b/src/OutputVars.h @@ -30,7 +30,7 @@ class OutputVars void InitRef(System & sys, StaticVals const& statV); void CalcAndConvert(ulong step); - bool Perfromed(uint moveKind); + bool Performed(uint moveKind); uint GetTries(uint box, uint sub); uint GetAccepted(uint box, uint sub); double GetAcceptPercent(uint box, uint sub); From 5a58b39c35898c98ef3e1581135e10d1e2828d05 Mon Sep 17 00:00:00 2001 From: msoroush Date: Thu, 15 Nov 2018 15:59:12 -0500 Subject: [PATCH 166/199] Fix to printing total tries and acceptance for volume, Intra-MEMC and MEMC move. --- src/MoveSettings.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index 5014f6372..15ad13285 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -171,6 +171,18 @@ uint MoveSettings::GetAcceptTot(const uint box, const uint move) const for(uint k = 0; k < totKind; k++) { sum += accepted[box][move][k]; } + + if(move == mv::INTRA_MEMC + #if ENSEMBLE == GEMC || ENSEMBLE == GCMC + || move == mv::MEMC + #endif + #if ENSEMBLE == NPT || ENSEMBLE == GEMC + || move == mv::VOL_TRANSFER + #endif + ) { + sum /= totKind; + } + return sum; } @@ -189,5 +201,17 @@ uint MoveSettings::GetTrialTot(const uint box, const uint move) const for(uint k = 0; k < totKind; k++) { sum += tries[box][move][k]; } + + if(move == mv::INTRA_MEMC + #if ENSEMBLE == GEMC || ENSEMBLE == GCMC + || move == mv::MEMC + #endif + #if ENSEMBLE == NPT || ENSEMBLE == GEMC + || move == mv::VOL_TRANSFER + #endif + ) { + sum /= totKind; + } + return sum; } \ No newline at end of file From 3f114ef014c15d1dd316d18382ca8a619b1c0f21 Mon Sep 17 00:00:00 2001 From: msoroush Date: Tue, 20 Nov 2018 17:42:46 -0500 Subject: [PATCH 167/199] Fix to 1-3 and 1-4 electrostatic intrabonded energy in crankshaft files. --- src/cbmc/DCCrankShaftAng.cpp | 4 ++-- src/cbmc/DCCrankShaftDih.cpp | 4 ++-- src/cbmc/DCRotateOnAtom.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 075e96399..92abd780b 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -437,7 +437,7 @@ void DCCrankShaftAng::ParticleNonbonded1_4(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } @@ -474,7 +474,7 @@ void DCCrankShaftAng::ParticleNonbonded1_3(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index 445d8e362..c8b145117 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -448,7 +448,7 @@ void DCCrankShaftDih::ParticleNonbonded1_4(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } @@ -485,7 +485,7 @@ void DCCrankShaftDih::ParticleNonbonded1_3(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } diff --git a/src/cbmc/DCRotateOnAtom.cpp b/src/cbmc/DCRotateOnAtom.cpp index 7183eaba3..3c6585791 100644 --- a/src/cbmc/DCRotateOnAtom.cpp +++ b/src/cbmc/DCRotateOnAtom.cpp @@ -465,7 +465,7 @@ void DCRotateOnAtom::ParticleNonbonded1_4(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } @@ -502,7 +502,7 @@ void DCRotateOnAtom::ParticleNonbonded1_3(cbmc::TrialMol const& mol, double qi_qj_Fact = kind.AtomCharge(partIndex) * kind.AtomCharge(*partner) * num::qqFact; data->ff.particles->CalcCoulombAdd_1_4(nonbonded[t], distSq, - qi_qj_Fact, true); + qi_qj_Fact, false); } } } From a8430330d01df56a77b16790c65ed30a5e527eb6 Mon Sep 17 00:00:00 2001 From: YounesN Date: Sun, 20 Jan 2019 11:27:22 -0500 Subject: [PATCH 168/199] initial commit --- .vscode/c_cpp_properties.json | 90 +++++++++++++++++++++++++++++++++++ src/CheckpointOutput.cpp | 30 ++++++++++++ src/CheckpointOutput.h | 34 +++++++++++++ src/ConfigSetup.cpp | 11 ++++- src/ConfigSetup.h | 4 +- src/PDBOutput.cpp | 8 ++-- 6 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 src/CheckpointOutput.cpp create mode 100644 src/CheckpointOutput.h diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 000000000..a99937d37 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,90 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "defines": [], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ + "/usr/include", + "/usr/local/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "macFrameworkPath": [ + "/System/Library/Frameworks", + "/Library/Frameworks" + ] + }, + { + "name": "Linux", + "includePath": [ + "/opt/intel/compilers_and_libraries_2016.4.258/linux/ipp/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/mkl/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/tbb/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/daal/include", + "/usr/include/c++/6", + "/usr/include/x86_64-linux-gnu/c++/6", + "/usr/include/c++/6/backward", + "/usr/lib/gcc/x86_64-linux-gnu/6/include", + "/usr/local/include", + "/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed", + "/usr/include/x86_64-linux-gnu", + "/usr/include", + "${workspaceRoot}", + "${workspaceRoot}/src", + "${workspaceRoot}/lib", + "${workspaceRoot}/src/cbmc" + ], + "defines": [], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ + "/opt/intel/compilers_and_libraries_2016.4.258/linux/ipp/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/mkl/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/tbb/include", + "/opt/intel/compilers_and_libraries_2016.4.258/linux/daal/include", + "/usr/include/c++/6", + "/usr/include/x86_64-linux-gnu/c++/6", + "/usr/include/c++/6/backward", + "/usr/lib/gcc/x86_64-linux-gnu/6/include", + "/usr/local/include", + "/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed", + "/usr/include/x86_64-linux-gnu", + "/usr/include", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + }, + { + "name": "Win32", + "includePath": [ + "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include", + "${workspaceRoot}" + ], + "defines": [ + "_DEBUG", + "UNICODE" + ], + "intelliSenseMode": "msvc-x64", + "browse": { + "path": [ + "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*", + "${workspaceRoot}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + } + } + ], + "version": 3 +} \ No newline at end of file diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp new file mode 100644 index 000000000..77fe6afab --- /dev/null +++ b/src/CheckpointOutput.cpp @@ -0,0 +1,30 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ + +#include "CheckpointOutput.h" +#include "System.h" + +CheckpointOutput::CheckpointOutput(System & sys, StaticVals const& statV) : + moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), + boxDimRef(sys.boxDimRef), molRef(statV.mol), + coordCurrRef(sys.coordinates), comCurrRef(sys.com) +{ + +} + +void CheckpointOutput::Init(pdb_setup::Atoms const& atoms, + config_setup::Output const& output) +{ + enableOutCheckpoint = output.checkpoint.enable; +} + +void CheckpointOutput::DoOutput(const ulong step) +{ + if(enableOutCheckpoint) { + + } +} \ No newline at end of file diff --git a/src/CheckpointOutput.h b/src/CheckpointOutput.h new file mode 100644 index 000000000..5e52837d9 --- /dev/null +++ b/src/CheckpointOutput.h @@ -0,0 +1,34 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ +#pragma once + +#include "OutputAbstracts.h" +#include "MoveSettings.h" +#include + +class CheckpointOutput : OutputableBase +{ +public: + CheckpointOutput(System & sys, StaticVals const& statV); + + ~CheckpointOutput(); + + virtual void DoOutput(const ulong step); + virtual void Init(pdb_setup::Atoms const& atoms, + config_setup::Output const& output); + +private: + MoveSettings & moveSetRef; + MoleculeLookup & molLookupRef; + BoxDimensions& boxDimRef; + Molecules const& molRef; + Coordinates & coordCurrRef; + COM & comCurrRef; + std::string filename; + + bool enableOutCheckpoint; +}; diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index 44273d558..abcd6f5c4 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -12,8 +12,6 @@ along with this program, also can be found at . #include "ConfigSetup.h" -//#define UINT_MAX 0xffffffff -//#define ULONG_MAX 0xffffffffUL #define DBL_MAX 1.7976931348623158e+308 int stringtoi(const std::string& s) @@ -658,6 +656,15 @@ void ConfigSetup::Init(const char *fileName) else if(CheckString(line[0], "OutputName")) { out.statistics.settings.uniqueStr.val = line[1]; printf("%-40s %-s \n", "Info: Output name", line[1].c_str()); + } else if(CheckString(line[0], "CheckpointFreq")) { + out.checkpoint.enable = checkBool(line[1]); + if(line.size() == 3) + out.checkpoint.frequency = stringtoi(line[2]); + if(out.checkpoint.enable) + printf("%-40s %-lu \n", "Info: Checkpoint frequency", + out.checkpoint.frequency); + else + printf("%-40s %-s \n", "Info: Saving checkpoint", "Inactive"); } else if(CheckString(line[0], "CoordinatesFreq")) { out.state.settings.enable = checkBool(line[1]); if(line.size() == 3) diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index eef8d29e3..db1ed0b00 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -274,8 +274,6 @@ struct EventSettings { /* : ReadableStepDependentBase*/ } }; - - struct UniqueStr { /* : ReadableBase*/ std::string val; }; @@ -324,7 +322,7 @@ struct Statistics { struct Output { SysState state, restart; Statistics statistics; - EventSettings console; + EventSettings console, checkpoint; }; } diff --git a/src/PDBOutput.cpp b/src/PDBOutput.cpp index 65689d609..b71fdcea7 100644 --- a/src/PDBOutput.cpp +++ b/src/PDBOutput.cpp @@ -8,14 +8,12 @@ along with this program, also can be found at . #include "EnsemblePreprocessor.h" //For BOX_TOTAL, ensemble #include "System.h" //for init #include "StaticVals.h" //for init -#include "MoleculeLookup.h" //for lookup array (to get kind cnts, etc.) +#include "MoleculeLookup.h" //for lookup array (to get kind cnts, etc.) #include "MoleculeKind.h" //For kind names #include "MoveSettings.h" //For move settings/state #include "PDBConst.h" //For field locations/lengths - -#include "StrStrmLib.h" //For conversion from uint to string - -#include // for cout; +#include "StrStrmLib.h" //For conversion from uint to string +#include //for cout; PDBOutput::PDBOutput(System & sys, StaticVals const& statV) : moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), From b1c8f97df33342a8f5ff87ce308331c3a31a58e2 Mon Sep 17 00:00:00 2001 From: YounesN Date: Tue, 22 Jan 2019 13:05:22 -0500 Subject: [PATCH 169/199] print prng, mollookup --- .vscode/settings.json | 8 +- CMake/FileLists.cmake | 2 + src/CheckpointOutput.cpp | 166 ++++++++++++++++++++++++++++++++++++++- src/CheckpointOutput.h | 17 +++- src/MersenneTwister.h | 1 + src/MoleculeLookup.cpp | 2 + src/MoleculeLookup.h | 7 ++ src/PRNG.h | 2 + src/Setup.h | 3 +- 9 files changed, 201 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1c42e59e7..22fc25869 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,6 +12,12 @@ "type_traits": "cpp", "typeinfo": "cpp", "algorithm": "cpp", - "iostream": "cpp" + "iostream": "cpp", + "cctype": "cpp", + "cmath": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp" } } \ No newline at end of file diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index fc06ed32f..63a5b9752 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -9,6 +9,7 @@ set(sources src/Coordinates.cpp src/CPUSide.cpp src/CalculateEnergy.cpp + src/CheckpointOutput.cpp src/EnPartCntSampleOutput.cpp src/Ewald.cpp src/EwaldCached.cpp @@ -63,6 +64,7 @@ set(headers src/CalculateEnergy.h src/CBMC.h src/CellList.h + src/CheckpointOutput.h src/Clock.h src/COM.h src/ConfigSetup.h diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 77fe6afab..8a98754f9 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -5,13 +5,29 @@ A copy of the GNU General Public License can be found in the COPYRIGHT.txt along with this program, also can be found at . ********************************************************************************/ +#include #include "CheckpointOutput.h" +#include "MoleculeLookup.h" #include "System.h" +namespace +{ + union dbl_output_union { + char bin_value[8]; + double dbl_value; + }; + + union uint32_output_union { + char bin_value[8]; + uint32_t uint_value; + }; +} + CheckpointOutput::CheckpointOutput(System & sys, StaticVals const& statV) : moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), - boxDimRef(sys.boxDimRef), molRef(statV.mol), - coordCurrRef(sys.coordinates), comCurrRef(sys.com) + boxDimRef(sys.boxDimRef), molRef(statV.mol), prngRef(sys.prng), + coordCurrRef(sys.coordinates), comCurrRef(sys.com), + filename("checkpoint.dat") { } @@ -25,6 +41,152 @@ void CheckpointOutput::Init(pdb_setup::Atoms const& atoms, void CheckpointOutput::DoOutput(const ulong step) { if(enableOutCheckpoint) { + openOutputFile(); + printStepNumber(step); + printRandomNumbers(); + printCoordinates(); + printMoleculeLookupData(); + } +} + +void CheckpointOutput::printStepNumber(const ulong step) +{ + uint32_t s = step; + outputUintIn8Chars(s); +} + +void CheckpointOutput::printRandomNumbers() +{ + // First let's save the state array inside prng + // the length of the array is 624 + // there is a save function inside MersenneTwister.h file + // to read back we can use the load function + const int N = 624; + uint32_t* saveArray = new uint32_t[N]; + prngRef.GetGenerator()->save(saveArray); + for(int i=0; ipNext - + prngRef.GetGenerator()->state; + outputUintIn8Chars(location); + + // save the "left" value so we can restore it later + outputUintIn8Chars(prngRef.GetGenerator()->left); + + // let's save seedValue just in case + // not sure if that is used or not, or how important it is + outputUintIn8Chars(prngRef.GetGenerator()->seedValue); +} + +void CheckpointOutput::printCoordinates() +{ + // first let's print the count + uint32_t count = coordCurrRef.Count(); + outputUintIn8Chars(count); + + // now let's print the coordinates one by one + for(int i=0; i. #include "OutputAbstracts.h" #include "MoveSettings.h" +#include "Coordinates.h" #include class CheckpointOutput : OutputableBase @@ -24,11 +25,21 @@ class CheckpointOutput : OutputableBase private: MoveSettings & moveSetRef; MoleculeLookup & molLookupRef; - BoxDimensions& boxDimRef; - Molecules const& molRef; + BoxDimensions & boxDimRef; + Molecules const & molRef; Coordinates & coordCurrRef; COM & comCurrRef; - std::string filename; + PRNG & prngRef; bool enableOutCheckpoint; + std::string filename; + FILE* outputFile; + + void openOutputFile(); + void printStepNumber(const ulong step); + void printRandomNumbers(); + void printCoordinates(); + void printMoleculeLookupData(); + void outputDoubleIn8Chars(double data); + void outputUintIn8Chars(uint32_t data); }; diff --git a/src/MersenneTwister.h b/src/MersenneTwister.h index 7d2c78d76..9b3128c89 100644 --- a/src/MersenneTwister.h +++ b/src/MersenneTwister.h @@ -128,6 +128,7 @@ class MTRand void load( uint32 *const loadArray ); // from such array friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); + friend class CheckpointOutput; MTRand& operator=( const MTRand& o ); protected: void initialize( const uint32 oneSeed ); diff --git a/src/MoleculeLookup.cpp b/src/MoleculeLookup.cpp index de8f320c2..a3fd91078 100644 --- a/src/MoleculeLookup.cpp +++ b/src/MoleculeLookup.cpp @@ -18,9 +18,11 @@ void MoleculeLookup::Init(const Molecules& mols, { numKinds = mols.GetKindsCount(); molLookup = new uint[mols.count]; + molLookupCount = mols.count; //+1 to store end value boxAndKindStart = new uint[numKinds * BOX_TOTAL + 1]; + boxAndKindStartCount = numKinds * BOX_TOTAL + 1; // vector[box][kind] = list of mol indices for kind in box std::vector > > indexVector; diff --git a/src/MoleculeLookup.h b/src/MoleculeLookup.h index 69799cc42..ba668718b 100644 --- a/src/MoleculeLookup.h +++ b/src/MoleculeLookup.h @@ -11,6 +11,8 @@ along with this program, also can be found at . #include "BasicTypes.h" //For uint #include +class CheckpointOutput; + namespace pdb_setup { class Atoms; @@ -116,15 +118,20 @@ class MoleculeLookup //array of indices for type Molecule, sorted by box and kind for //move selection uint* molLookup; + uint molLookupCount; //index [BOX_TOTAL * kind + box] is the first element of that kind/box in //molLookup //index [BOX_TOTAL * kind + box + 1] is the element after the end //of that kind/box uint* boxAndKindStart; + uint boxAndKindStartCount; uint numKinds; std::vector fixedAtom; std::vector canSwapKind; //Kinds that can move intra and inter box std::vector canMoveKind; //Kinds that can move intra box only + + // make CheckpointOutput class a friend so it can print all the private data + friend class CheckpointOutput; }; inline uint MoleculeLookup::NumKindInBox(const uint kind, const uint box) const diff --git a/src/PRNG.h b/src/PRNG.h index f5028960a..b99142b7d 100644 --- a/src/PRNG.h +++ b/src/PRNG.h @@ -418,6 +418,8 @@ class PRNG return PickMol(m, mk, b, subDraw, boxDiv); } + MTRand * GetGenerator() { return gen; } + private: MTRand * gen; MoleculeLookup & molLookRef; diff --git a/src/Setup.h b/src/Setup.h index 61d4a2e35..40cd70c5a 100644 --- a/src/Setup.h +++ b/src/Setup.h @@ -34,9 +34,10 @@ class Setup ff.Init(config.in.files.param.name, config.in.ffKind.isCHARMM); //Read PDB data pdb.Init(config.in.restart, config.in.files.pdb.name); - //Read molecule data from psf + //Initialize PRNG prng.Init(config.in.restart, config.in.prng, config.in.files.seed.name); + //Read molecule data from psf if(mol.Init(config.in.restart, config.in.files.psf.name) != 0) { exit(EXIT_FAILURE); } From 94d01ac2f80915691b0a516a8bc741306faf46dc Mon Sep 17 00:00:00 2001 From: YounesN Date: Tue, 22 Jan 2019 14:28:16 -0500 Subject: [PATCH 170/199] added movesettings data to checkpointoutput --- src/CheckpointOutput.cpp | 113 +++++++++++++++++++++++++++++++++++++-- src/CheckpointOutput.h | 2 + src/MoveSettings.h | 3 ++ 3 files changed, 113 insertions(+), 5 deletions(-) diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 8a98754f9..338ef1f51 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -46,6 +46,7 @@ void CheckpointOutput::DoOutput(const ulong step) printRandomNumbers(); printCoordinates(); printMoleculeLookupData(); + printMoveSettingsData(); } } @@ -99,7 +100,6 @@ void CheckpointOutput::printMoleculeLookupData() { // print the size of molLookup array outputUintIn8Chars(molLookupRef.molLookupCount); - // print the molLookup array itself for(int i=0; i Date: Tue, 22 Jan 2019 15:21:07 -0500 Subject: [PATCH 171/199] added boxdimensions info to checkpoint --- src/CheckpointOutput.cpp | 31 +++++++++++++++++-------------- src/CheckpointOutput.h | 1 + 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 338ef1f51..0b1aad095 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -43,6 +43,7 @@ void CheckpointOutput::DoOutput(const ulong step) if(enableOutCheckpoint) { openOutputFile(); printStepNumber(step); + printBoxDimensionsData(); printRandomNumbers(); printCoordinates(); printMoleculeLookupData(); @@ -56,6 +57,22 @@ void CheckpointOutput::printStepNumber(const ulong step) outputUintIn8Chars(s); } +void CheckpointOutput::printBoxDimensionsData() +{ + // print the number of boxes + uint32_t totalBoxes = BOX_TOTAL; + outputUintIn8Chars(totalBoxes); + for(int b=0; b Date: Tue, 22 Jan 2019 21:57:47 -0500 Subject: [PATCH 172/199] finished adding checkpoint output to cpuside objective --- src/CPUSide.cpp | 4 +++- src/CPUSide.h | 2 ++ src/CheckpointOutput.cpp | 4 ++-- src/CheckpointOutput.h | 20 ++++++++++++++++---- src/ConfigSetup.cpp | 8 ++++++++ src/ConfigSetup.h | 1 + 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/CPUSide.cpp b/src/CPUSide.cpp index 30441a72a..733c6bb8f 100644 --- a/src/CPUSide.cpp +++ b/src/CPUSide.cpp @@ -10,7 +10,7 @@ along with this program, also can be found at . CPUSide::CPUSide(System & sys, StaticVals & statV) : varRef(sys, statV), pdb(sys, statV), console(varRef), block(varRef), - hist(varRef) + hist(varRef), checkpoint(sys, statV) #if ENSEMBLE == GCMC , sample_N_E(varRef) #endif @@ -28,6 +28,8 @@ void CPUSide::Init(PDBSetup const& pdbSet, config_setup::Output const& out, outObj.push_back(&pdb); if (out.statistics.settings.block.enable) outObj.push_back(&block); + if (out.checkpoint.enable) + outObj.push_back(&checkpoint); #if ENSEMBLE == GCMC outObj.push_back(&hist); diff --git a/src/CPUSide.h b/src/CPUSide.h index c1121765b..f2d97d71c 100644 --- a/src/CPUSide.h +++ b/src/CPUSide.h @@ -15,6 +15,7 @@ along with this program, also can be found at . #include "HistOutput.h" #include "ConfigSetup.h" #include "OutputVars.h" +#include "CheckpointOutput.h" #include "EnPartCntSampleOutput.h" #include @@ -37,6 +38,7 @@ struct CPUSide { PDBOutput pdb; BlockAverages block; Histogram hist; + CheckpointOutput checkpoint; #if ENSEMBLE == GCMC EnPartCntSample sample_N_E; #endif diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 0b1aad095..2c29c33cd 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -26,8 +26,7 @@ namespace CheckpointOutput::CheckpointOutput(System & sys, StaticVals const& statV) : moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), boxDimRef(sys.boxDimRef), molRef(statV.mol), prngRef(sys.prng), - coordCurrRef(sys.coordinates), comCurrRef(sys.com), - filename("checkpoint.dat") + coordCurrRef(sys.coordinates), filename("checkpoint.dat") { } @@ -36,6 +35,7 @@ void CheckpointOutput::Init(pdb_setup::Atoms const& atoms, config_setup::Output const& output) { enableOutCheckpoint = output.checkpoint.enable; + stepsPerCheckpoint = output.checkpoint.frequency; } void CheckpointOutput::DoOutput(const ulong step) diff --git a/src/CheckpointOutput.h b/src/CheckpointOutput.h index 06e2544b8..8fccbfc1b 100644 --- a/src/CheckpointOutput.h +++ b/src/CheckpointOutput.h @@ -11,16 +11,28 @@ along with this program, also can be found at . #include "Coordinates.h" #include -class CheckpointOutput : OutputableBase -{ +class CheckpointOutput : public OutputableBase { public: CheckpointOutput(System & sys, StaticVals const& statV); - ~CheckpointOutput(); + ~CheckpointOutput() { + if(outputFile) + fclose(outputFile); + } virtual void DoOutput(const ulong step); virtual void Init(pdb_setup::Atoms const& atoms, config_setup::Output const& output); + virtual void Sample(const ulong step) {} + virtual void Output(const ulong step) { + if(!enableOutCheckpoint) { + return; + } + + if((step+1) % stepsPerCheckpoint == 0) { + DoOutput(step); + } + } private: MoveSettings & moveSetRef; @@ -28,12 +40,12 @@ class CheckpointOutput : OutputableBase BoxDimensions & boxDimRef; Molecules const & molRef; Coordinates & coordCurrRef; - COM & comCurrRef; PRNG & prngRef; bool enableOutCheckpoint; std::string filename; FILE* outputFile; + uint stepsPerCheckpoint; void openOutputFile(); void printStepNumber(const ulong step); diff --git a/src/ConfigSetup.cpp b/src/ConfigSetup.cpp index abcd6f5c4..e564b2430 100644 --- a/src/ConfigSetup.cpp +++ b/src/ConfigSetup.cpp @@ -37,6 +37,7 @@ ConfigSetup::ConfigSetup(void) in.restart.enable = false; in.restart.step = ULONG_MAX; in.restart.recalcTrajectory = false; + in.restart.restartFromCheckpoint = false; in.prng.seed = UINT_MAX; sys.elect.readEwald = false; sys.elect.readElect = false; @@ -98,6 +99,8 @@ ConfigSetup::ConfigSetup(void) out.state.files.hist.sampleName = ""; out.state.files.hist.stepsPerHistSample = UINT_MAX; #endif + out.checkpoint.enable = false; + out.checkpoint.frequency = ULONG_MAX; out.statistics.settings.uniqueStr.val = ""; out.state.settings.frequency = ULONG_MAX; out.restart.settings.frequency = ULONG_MAX; @@ -172,6 +175,11 @@ void ConfigSetup::Init(const char *fileName) if(in.restart.enable) { printf("%-40s %-s \n", "Info: Restart simulation", "Active"); } + } else if(CheckString(line[0], "RestartCheckpoint")) { + in.restart.restartFromCheckpoint = checkBool(line[1]); + if(in.restart.restartFromCheckpoint) { + printf("%-40s %-s \n", "Info: Restart checkpoint", "Active"); + } } else if(CheckString(line[0], "FirstStep")) { in.restart.step = stringtoi(line[1]); } else if(CheckString(line[0], "PRNG")) { diff --git a/src/ConfigSetup.h b/src/ConfigSetup.h index db1ed0b00..6c1571edc 100644 --- a/src/ConfigSetup.h +++ b/src/ConfigSetup.h @@ -51,6 +51,7 @@ struct RestartSettings { bool enable; ulong step; bool recalcTrajectory; + bool restartFromCheckpoint; bool operator()(void) { return enable; From ff315fd30194cce6ab882bf9dc13cb04932824eb Mon Sep 17 00:00:00 2001 From: YounesN Date: Wed, 23 Jan 2019 00:33:11 -0500 Subject: [PATCH 173/199] we now read all checkpoint data, next we should initialize the class members --- src/CheckpointOutput.cpp | 8 +- src/CheckpointSetup.cpp | 295 +++++++++++++++++++++++++++++++++++++++ src/CheckpointSetup.h | 68 +++++++++ src/System.cpp | 5 + src/System.h | 3 + 5 files changed, 375 insertions(+), 4 deletions(-) create mode 100644 src/CheckpointSetup.cpp create mode 100644 src/CheckpointSetup.h diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 2c29c33cd..c13246c63 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -264,8 +264,8 @@ void CheckpointOutput::outputDoubleIn8Chars(double data) filename.c_str()); exit(EXIT_FAILURE); } - uint32_output_union temp; - temp.uint_value = data; + dbl_output_union temp; + temp.dbl_value = data; fprintf(outputFile, "%c%c%c%c%c%c%c%c", temp.bin_value[0], temp.bin_value[1], @@ -284,8 +284,8 @@ void CheckpointOutput::outputUintIn8Chars(uint32_t data) filename.c_str()); exit(EXIT_FAILURE); } - dbl_output_union temp; - temp.dbl_value = data; + uint32_output_union temp; + temp.uint_value = data; fprintf(outputFile, "%c%c%c%c%c%c%c%c", temp.bin_value[0], temp.bin_value[1], diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp new file mode 100644 index 000000000..0fa1d158e --- /dev/null +++ b/src/CheckpointSetup.cpp @@ -0,0 +1,295 @@ +/******************************************************************************* +GPU OPTIMIZED MONTE CARLO (GOMC) 2.31 +Copyright (C) 2018 GOMC Group +A copy of the GNU General Public License can be found in the COPYRIGHT.txt +along with this program, also can be found at . +********************************************************************************/ + +#include +#include "CheckpointSetup.h" +#include "MoleculeLookup.h" +#include "System.h" + +namespace +{ + union dbl_input_union { + char bin_value[8]; + double dbl_value; + }; + + union uint32_input_union { + char bin_value[8]; + uint32_t uint_value; + }; +} + +CheckpointSetup::CheckpointSetup(System & sys, StaticVals const& statV) : + moveSetRef(sys.moveSettings), molLookupRef(sys.molLookupRef), + boxDimRef(sys.boxDimRef), molRef(statV.mol), prngRef(sys.prng), + coordCurrRef(sys.coordinates), filename("checkpoint.dat") +{ +} + +void CheckpointSetup::ReadAll() +{ + openInputFile(); + readStepNumber(); + readBoxDimensionsData(); + readRandomNumbers(); + readCoordinates(); + readMoleculeLookupData(); + readMoveSettingsData(); + closeInputFile(); +} + +void CheckpointSetup::readStepNumber() +{ + stepNumber = readUintIn8Chars(); +} + +void CheckpointSetup::readBoxDimensionsData() +{ + // read the number of boxes + totalBoxes = readUintIn8Chars(); + axis.resize(totalBoxes); + cosAngle.resize(totalBoxes); + + for(int b=0; b. +********************************************************************************/ +#pragma once + +#include "OutputAbstracts.h" +#include "MoveSettings.h" +#include "Coordinates.h" +#include + +class CheckpointSetup{ +public: + CheckpointSetup(System & sys, StaticVals const& statV); + + ~CheckpointSetup() { + if(inputFile) { + fclose(inputFile); + } + if(saveArray) + delete [] saveArray; + } + + void ReadAll(); + ulong GetStepNumber() { return stepNumber; } + +private: + MoveSettings & moveSetRef; + MoleculeLookup & molLookupRef; + BoxDimensions & boxDimRef; + Molecules const & molRef; + Coordinates & coordCurrRef; + PRNG & prngRef; + + std::string filename; + FILE* inputFile; + + // the following variables will hold the data read from checkpoint + // and will be passed to the rest of the code via Get functions + ulong stepNumber; + uint32_t totalBoxes; + vector> axis; + vector> cosAngle; + uint32_t* saveArray; + uint32_t seedLocation, seedLeft, seedValue; + uint32_t coordLength; + XYZArray coords; + vector molLookupVec, boxAndKindStartVec, fixedAtomVec; + uint32_t numKinds; + vector>> scaleVec, acceptPercentVec; + vector>> acceptedVec, triesVec, tempAcceptedVec, + tempTriesVec; + + // private functions used by ReadAll and Get functions + void openInputFile(); + void readStepNumber(); + void readRandomNumbers(); + void readCoordinates(); + void readMoleculeLookupData(); + void readMoveSettingsData(); + void readBoxDimensionsData(); + void closeInputFile(); + + double readDoubleIn8Chars(); + uint32_t readUintIn8Chars(); +}; diff --git a/src/System.cpp b/src/System.cpp index 8df8b9ebe..6e8d8738c 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -91,6 +91,11 @@ void System::Init(Setup const& set) //the molecule lookup initialization, in case we're in a constant //particle/molecule ensemble, e.g. NVT coordinates.InitFromPDB(set.pdb.atoms); + + // At this point see if checkpoint is enabled. if so re-initialize + // coordinates, prng, mollookup, step, boxdim, and movesettings + checkpointSet.ReadAll(); + com.CalcCOM(); cellList.SetCutoff(); cellList.GridAll(boxDimRef, coordinates, molLookupRef); diff --git a/src/System.h b/src/System.h index 70fadb8ad..dc6bd14ae 100644 --- a/src/System.h +++ b/src/System.h @@ -23,6 +23,7 @@ along with this program, also can be found at . #include "MoveSettings.h" #include "CellList.h" #include "Clock.h" +#include "CheckpointSetup.h" //Initialization variables class Setup; @@ -99,6 +100,8 @@ class System CellList cellList; PRNG prng; + CheckpointSetup checkpointSet; + //Procedure to run once move is picked... can also be called directly for //debugging... void RunMove(uint majKind, double draw, const uint step); From 28868e8fecdb899c5b8e1ca268edfcb7d8ef9358 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 23 Jan 2019 14:37:27 -0500 Subject: [PATCH 174/199] Fix to the error in calculating correction term of Ewald in Crankshaft move. --- src/CrankShaft.h | 2 +- src/MoleculeTransfer.h | 2 +- src/Regrowth.h | 2 +- src/cbmc/DCCrankShaftAng.cpp | 4 ++++ src/cbmc/DCCrankShaftDih.cpp | 4 ++++ src/cbmc/DCGraph.cpp | 3 ++- src/cbmc/DCRotateOnAtom.cpp | 4 ++++ src/cbmc/TrialMol.cpp | 2 +- 8 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/CrankShaft.h b/src/CrankShaft.h index 2ac614e09..9ee077cfe 100644 --- a/src/CrankShaft.h +++ b/src/CrankShaft.h @@ -125,7 +125,7 @@ inline void CrankShaft::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_recip; //safety to make sure move will be rejected in overlap case - if(!overlap) { + if(newMol.GetWeight() != 0.0 && !overlap) { result = prng() < Wrat; } else result = false; diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index d37ff8137..bac37fc0b 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -174,7 +174,7 @@ inline void MoleculeTransfer::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_tc * W_recip; //safety to make sure move will be rejected in overlap case - if(!overlap) { + if(newMol.GetWeight() != 0.0 && !overlap) { result = prng() < molTransCoeff * Wrat; } else result = false; diff --git a/src/Regrowth.h b/src/Regrowth.h index 73f1931fe..d1193ea9d 100644 --- a/src/Regrowth.h +++ b/src/Regrowth.h @@ -124,7 +124,7 @@ inline void Regrowth::Accept(const uint rejectState, const uint step) double Wrat = Wn / Wo * W_recip; //safety to make sure move will be rejected in overlap case - if(!overlap) { + if(newMol.GetWeight() != 0.0 && !overlap) { result = prng() < Wrat; } else result = false; diff --git a/src/cbmc/DCCrankShaftAng.cpp b/src/cbmc/DCCrankShaftAng.cpp index 92abd780b..575b050ab 100644 --- a/src/cbmc/DCCrankShaftAng.cpp +++ b/src/cbmc/DCCrankShaftAng.cpp @@ -213,6 +213,10 @@ void DCCrankShaftAng::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], 0.0, 0.0, 0.0)); + + for (uint a = 0; a < numAtom; a++) { + oldMol.AddAtom(atoms[a], multiPosRotions[a][0]); + } } void DCCrankShaftAng::BuildNew(TrialMol& newMol, uint molIndex) diff --git a/src/cbmc/DCCrankShaftDih.cpp b/src/cbmc/DCCrankShaftDih.cpp index c8b145117..933ab5146 100644 --- a/src/cbmc/DCCrankShaftDih.cpp +++ b/src/cbmc/DCCrankShaftDih.cpp @@ -223,6 +223,10 @@ void DCCrankShaftDih::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], 0.0, 0.0, 0.0)); + + for (uint a = 0; a < numAtom; a++) { + oldMol.AddAtom(atoms[a], multiPosRotions[a][0]); + } } void DCCrankShaftDih::BuildNew(TrialMol& newMol, uint molIndex) diff --git a/src/cbmc/DCGraph.cpp b/src/cbmc/DCGraph.cpp index 17c36ac25..9e982062c 100644 --- a/src/cbmc/DCGraph.cpp +++ b/src/cbmc/DCGraph.cpp @@ -178,7 +178,8 @@ void DCGraph::CrankShaft(TrialMol& oldMol, TrialMol& newMol, uint molIndex) //Instead we perform Regrowth move within the same box Regrowth(oldMol, newMol, molIndex); } else { - //Set tCoords to coordinate of actual molecule, it will be modified + //Set coords to coordinate of actual molecule, it will be modified + //No need to unwrap because box is same. oldMol.GetCoords().CopyRange(coords, 0, 0, coords.Count()); newMol.SetCoords(coords, 0); //Pick a random node pair diff --git a/src/cbmc/DCRotateOnAtom.cpp b/src/cbmc/DCRotateOnAtom.cpp index 3c6585791..b9599ca7c 100644 --- a/src/cbmc/DCRotateOnAtom.cpp +++ b/src/cbmc/DCRotateOnAtom.cpp @@ -240,6 +240,10 @@ void DCRotateOnAtom::BuildOld(TrialMol& oldMol, uint molIndex) oldMol.AddEnergy(Energy(bondedEn[0], nonbonded[0], inter[0], real[0], 0.0, 0.0, 0.0)); + + for (uint a = 0; a < numAtom; a++) { + oldMol.AddAtom(atoms[a], multiPosRotions[a][0]); + } } void DCRotateOnAtom::BuildNew(TrialMol& newMol, uint molIndex) diff --git a/src/cbmc/TrialMol.cpp b/src/cbmc/TrialMol.cpp index 145e5366f..ab0e35d5f 100644 --- a/src/cbmc/TrialMol.cpp +++ b/src/cbmc/TrialMol.cpp @@ -328,7 +328,7 @@ XYZ TrialMol::GetCOM() { XYZ tcom; XYZArray temp(tCoords); - //axes->UnwrapPBC(temp, box, tCoords.Get(0)); + axes->UnwrapPBC(temp, box, tCoords.Get(0)); tCoords = temp; for(uint p = 0; p < tCoords.Count(); p++) { From 5f0126b77ac9439a7fde3e9966832476a64e63df Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Thu, 24 Jan 2019 17:32:59 -0500 Subject: [PATCH 175/199] fixed compiling issues --- CMake/FileLists.cmake | 2 ++ src/CheckpointSetup.h | 8 ++++---- src/System.cpp | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 63a5b9752..0136e7cc8 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -10,6 +10,7 @@ set(sources src/CPUSide.cpp src/CalculateEnergy.cpp src/CheckpointOutput.cpp + src/CheckpointSetup.cpp src/EnPartCntSampleOutput.cpp src/Ewald.cpp src/EwaldCached.cpp @@ -65,6 +66,7 @@ set(headers src/CBMC.h src/CellList.h src/CheckpointOutput.h + src/CheckpointSetup.h src/Clock.h src/COM.h src/ConfigSetup.h diff --git a/src/CheckpointSetup.h b/src/CheckpointSetup.h index 4b542124c..62f9c3ade 100644 --- a/src/CheckpointSetup.h +++ b/src/CheckpointSetup.h @@ -41,16 +41,16 @@ class CheckpointSetup{ // and will be passed to the rest of the code via Get functions ulong stepNumber; uint32_t totalBoxes; - vector> axis; - vector> cosAngle; + vector > axis; + vector > cosAngle; uint32_t* saveArray; uint32_t seedLocation, seedLeft, seedValue; uint32_t coordLength; XYZArray coords; vector molLookupVec, boxAndKindStartVec, fixedAtomVec; uint32_t numKinds; - vector>> scaleVec, acceptPercentVec; - vector>> acceptedVec, triesVec, tempAcceptedVec, + vector > > scaleVec, acceptPercentVec; + vector > > acceptedVec, triesVec, tempAcceptedVec, tempTriesVec; // private functions used by ReadAll and Get functions diff --git a/src/System.cpp b/src/System.cpp index 6e8d8738c..b9de73936 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -47,7 +47,7 @@ System::System(StaticVals& statics) : coordinates(boxDimRef, com, molLookupRef, prng, statics.mol), com(boxDimRef, coordinates, molLookupRef, statics.mol), moveSettings(boxDimRef), cellList(statics.mol, boxDimRef), - calcEnergy(statics, *this) + calcEnergy(statics, *this), checkpointSet(*this, statics) { calcEwald = NULL; } @@ -94,7 +94,8 @@ void System::Init(Setup const& set) // At this point see if checkpoint is enabled. if so re-initialize // coordinates, prng, mollookup, step, boxdim, and movesettings - checkpointSet.ReadAll(); + if(set.config.in.restart.restartFromCheckpoint) + checkpointSet.ReadAll(); com.CalcCOM(); cellList.SetCutoff(); From 47e1dda2b0581940f8ab40747b6165aa0605d7cf Mon Sep 17 00:00:00 2001 From: YounesN Date: Thu, 24 Jan 2019 21:09:53 -0500 Subject: [PATCH 176/199] update checkpoint --- .vscode/c_cpp_properties.json | 5 ++++- src/Simulation.cpp | 2 -- src/System.cpp | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index a99937d37..9e652bf57 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -63,7 +63,10 @@ ], "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - } + }, + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17" }, { "name": "Win32", diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 5f8c3eb5b..0da0db9ba 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -49,8 +49,6 @@ Simulation::~Simulation() delete staticValues; } - - void Simulation::RunSimulation(void) { double startEnergy = system->potential.totalEnergy.total; diff --git a/src/System.cpp b/src/System.cpp index b9de73936..ed7898082 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -94,8 +94,10 @@ void System::Init(Setup const& set) // At this point see if checkpoint is enabled. if so re-initialize // coordinates, prng, mollookup, step, boxdim, and movesettings - if(set.config.in.restart.restartFromCheckpoint) + if(set.config.in.restart.restartFromCheckpoint) { checkpointSet.ReadAll(); + + } com.CalcCOM(); cellList.SetCutoff(); From 59c343a3b87c24acabf057c99b495cf63b070077 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Thu, 24 Jan 2019 21:13:30 -0500 Subject: [PATCH 177/199] added few folders CLion creates to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3f4dd0abf..77664c8b3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,6 @@ *.app bin -lib/cub \ No newline at end of file +lib/cub +.idea +cmake-build-debug \ No newline at end of file From 7e262b80ff4259724015ff6962170ad65a587231 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Thu, 24 Jan 2019 22:22:18 -0500 Subject: [PATCH 178/199] finished coding checkpoint; will start debugging --- src/CheckpointSetup.cpp | 50 ++++++++++++++++++++++++++++++++++++++++- src/CheckpointSetup.h | 8 ++++++- src/MersenneTwister.h | 1 + src/MoleculeLookup.h | 1 + src/MoveSettings.h | 4 +++- src/Simulation.cpp | 5 +++-- src/Simulation.h | 1 + src/System.cpp | 9 ++++++-- src/System.h | 2 +- 9 files changed, 73 insertions(+), 8 deletions(-) diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index 0fa1d158e..d786cdeb2 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -292,4 +292,52 @@ uint32_t CheckpointSetup::readUintIn8Chars() &temp.bin_value[6], &temp.bin_value[7]); return temp.uint_value; -} \ No newline at end of file +} + +void CheckpointSetup::SetStepNumber(ulong &startStep) { + startStep = stepNumber; +} + +void CheckpointSetup::SetBoxDimensions(BoxDimensions &boxDimRef) { + for(int b=0; bcosAngle[b][0]; + boxDimRef.cosAngle[b][1] = this->cosAngle[b][1]; + boxDimRef.cosAngle[b][2] = this->cosAngle[b][2]; + } +} + +void CheckpointSetup::SetPRNGVariables(PRNG &prng) { + prng.GetGenerator()->load(saveArray); + prng.GetGenerator()->pNext = prng.GetGenerator()->state + seedLocation; + prng.GetGenerator()->left = seedLeft; + prng.GetGenerator()->seedValue = seedValue; +} + +void CheckpointSetup::SetCoordinates(Coordinates coordinates) { + coords.CopyRange(coordinates, 0, 0, coordLength); +} + +void CheckpointSetup::SetMoleculeLookup(MoleculeLookup &molLookupRef) { + if(molLookupRef.molLookupCount != this->molLookupVec.size()) { + std::cerr << "ERROR: Restarting from checkpoint...\n" + << "molLookup size does not match with restart file\n"; + exit(EXIT_FAILURE); + } + for(int i=0; imolLookupVec.size(); i++) { + molLookupRef.molLookup[i] = this->molLookupVec[i]; + } + for(int i=0; iboxAndKindStartVec.size(); i++) { + molLookupRef.boxAndKindStart[i] = this->boxAndKindStartVec[i]; + } + molLookupRef.numKinds = this->numKinds; +} + +void CheckpointSetup::SetMoveSettings(MoveSettings moveSettings) { + moveSettings.scale = this->scaleVec; + moveSettings.acceptPercent = this->acceptPercentVec; + moveSettings.accepted = this->acceptedVec; + moveSettings.tries = this->triesVec; + moveSettings.tempAccepted = this->tempAcceptedVec; + moveSettings.tempTries = this->tempTriesVec; +} diff --git a/src/CheckpointSetup.h b/src/CheckpointSetup.h index 62f9c3ade..222ee8ee6 100644 --- a/src/CheckpointSetup.h +++ b/src/CheckpointSetup.h @@ -24,7 +24,13 @@ class CheckpointSetup{ } void ReadAll(); - ulong GetStepNumber() { return stepNumber; } + void SetStepNumber(ulong &startStep); + void SetPRNGVariables(PRNG &prng); + void SetBoxDimensions(BoxDimensions &boxDimRef); + void SetCoordinates(Coordinates coordinates); + void SetMoleculeLookup(MoleculeLookup &molLookupRef); + + void SetMoveSettings(MoveSettings moveSettings); private: MoveSettings & moveSetRef; diff --git a/src/MersenneTwister.h b/src/MersenneTwister.h index 9b3128c89..436dd208d 100644 --- a/src/MersenneTwister.h +++ b/src/MersenneTwister.h @@ -129,6 +129,7 @@ class MTRand friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); friend class CheckpointOutput; + friend class CheckpointSetup; MTRand& operator=( const MTRand& o ); protected: void initialize( const uint32 oneSeed ); diff --git a/src/MoleculeLookup.h b/src/MoleculeLookup.h index ba668718b..d519f694d 100644 --- a/src/MoleculeLookup.h +++ b/src/MoleculeLookup.h @@ -104,6 +104,7 @@ class MoleculeLookup //iterator to traverse all the molecules in a particular box class box_iterator; friend class MoleculeLookup::box_iterator; + friend class CheckpointSetup; box_iterator BoxBegin(const uint box) const; box_iterator BoxEnd(const uint box) const; diff --git a/src/MoveSettings.h b/src/MoveSettings.h index 72cdae81d..dab311941 100644 --- a/src/MoveSettings.h +++ b/src/MoveSettings.h @@ -92,8 +92,10 @@ class MoveSettings static const double TARGET_ACCEPT_FRACT; static const double TINY_AMOUNT; - // make checkopintoutput a friend class to have access to private data + // make checkopintoutput and checkpointsetup a friend class to have access to + // private data friend class CheckpointOutput; + friend class CheckpointSetup; }; diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 0da0db9ba..0d85c211e 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -14,6 +14,7 @@ along with this program, also can be found at . Simulation::Simulation(char const*const configFileName) { + startStep = 0; //NOTE: //IMPORTANT! Keep this order... //as system depends on staticValues, and cpu sometimes depends on both. @@ -22,7 +23,7 @@ Simulation::Simulation(char const*const configFileName) staticValues = new StaticVals(set); system = new System(*staticValues); staticValues->Init(set, *system); - system->Init(set); + system->Init(set, startStep); //recal Init for static value for initializing ewald since ewald is //initialized in system staticValues->InitOver(set, *system); @@ -62,7 +63,7 @@ void Simulation::RunSimulation(void) cpu->Output(frameSteps[i]-1); } } - for (ulong step = 0; step < totalSteps; step++) { + for (ulong step = startStep; step < totalSteps; step++) { system->moveSettings.AdjustMoves(step); system->ChooseAndRunMove(step); cpu->Output(step); diff --git a/src/Simulation.h b/src/Simulation.h index 351a55437..3033fb3f5 100644 --- a/src/Simulation.h +++ b/src/Simulation.h @@ -33,6 +33,7 @@ class Simulation Setup set; std::vector frameSteps; uint remarksCount; + ulong startStep; }; #endif /*SIMULATION_H*/ diff --git a/src/System.cpp b/src/System.cpp index ed7898082..e2222c549 100644 --- a/src/System.cpp +++ b/src/System.cpp @@ -75,7 +75,7 @@ System::~System() #endif } -void System::Init(Setup const& set) +void System::Init(Setup const& set, ulong & startStep) { prng.Init(set.prng.prngMaker.prng); #ifdef VARIABLE_VOLUME @@ -96,7 +96,12 @@ void System::Init(Setup const& set) // coordinates, prng, mollookup, step, boxdim, and movesettings if(set.config.in.restart.restartFromCheckpoint) { checkpointSet.ReadAll(); - + checkpointSet.SetStepNumber(startStep); + checkpointSet.SetBoxDimensions(boxDimRef); + checkpointSet.SetPRNGVariables(prng); + checkpointSet.SetCoordinates(coordinates); + checkpointSet.SetMoleculeLookup(molLookupRef); + checkpointSet.SetMoveSettings(moveSettings); } com.CalcCOM(); diff --git a/src/System.h b/src/System.h index dc6bd14ae..b7385fc56 100644 --- a/src/System.h +++ b/src/System.h @@ -35,7 +35,7 @@ class System public: explicit System(StaticVals& statics); - void Init(Setup const& setupData); + void Init(Setup const& setupData, ulong & startStep); //Runs move, picked at random void ChooseAndRunMove(const uint step); From 2e013d40ffa02671303cf8e858eab93e0b0ca4e7 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Fri, 25 Jan 2019 11:48:38 -0500 Subject: [PATCH 179/199] some fixes --- src/CheckpointOutput.cpp | 5 ++++- src/CheckpointOutput.h | 2 +- src/CheckpointSetup.cpp | 10 +++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index c13246c63..54aca5acf 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -53,7 +53,7 @@ void CheckpointOutput::DoOutput(const ulong step) void CheckpointOutput::printStepNumber(const ulong step) { - uint32_t s = step; + uint32_t s = (uint32_t) step; outputUintIn8Chars(s); } @@ -71,6 +71,7 @@ void CheckpointOutput::printBoxDimensionsData() outputDoubleIn8Chars(boxDimRef.cosAngle[b][1]); outputDoubleIn8Chars(boxDimRef.cosAngle[b][2]); } + std::cout << "Checkpoint saved to " << filename << std::endl; } void CheckpointOutput::printRandomNumbers() @@ -275,6 +276,7 @@ void CheckpointOutput::outputDoubleIn8Chars(double data) temp.bin_value[5], temp.bin_value[6], temp.bin_value[7]); + fflush(outputFile); } void CheckpointOutput::outputUintIn8Chars(uint32_t data) @@ -295,4 +297,5 @@ void CheckpointOutput::outputUintIn8Chars(uint32_t data) temp.bin_value[5], temp.bin_value[6], temp.bin_value[7]); + fflush(outputFile); } \ No newline at end of file diff --git a/src/CheckpointOutput.h b/src/CheckpointOutput.h index 8fccbfc1b..749143580 100644 --- a/src/CheckpointOutput.h +++ b/src/CheckpointOutput.h @@ -45,7 +45,7 @@ class CheckpointOutput : public OutputableBase { bool enableOutCheckpoint; std::string filename; FILE* outputFile; - uint stepsPerCheckpoint; + ulong stepsPerCheckpoint; void openOutputFile(); void printStepNumber(const ulong step); diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index d786cdeb2..68d93c8ad 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -40,6 +40,7 @@ void CheckpointSetup::ReadAll() readMoleculeLookupData(); readMoveSettingsData(); closeInputFile(); + std::cout << "Checkpoint loaded from " << filename << std::endl; } void CheckpointSetup::readStepNumber() @@ -97,9 +98,11 @@ void CheckpointSetup::readCoordinates() // now let's read the coordinates one by one coords.Init(coordLength); for(int i=0; i Date: Tue, 29 Jan 2019 20:46:56 -0500 Subject: [PATCH 180/199] finished and tested checkpoint feature --- src/CPUSide.cpp | 4 ++-- src/CPUSide.h | 2 +- src/CheckpointOutput.cpp | 4 ++-- src/CheckpointSetup.cpp | 16 ++++++++++------ src/CheckpointSetup.h | 13 ++++++------- src/Clock.h | 3 ++- src/Simulation.cpp | 2 +- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/CPUSide.cpp b/src/CPUSide.cpp index 733c6bb8f..7e6498de5 100644 --- a/src/CPUSide.cpp +++ b/src/CPUSide.cpp @@ -17,13 +17,13 @@ CPUSide::CPUSide(System & sys, StaticVals & statV) : {} void CPUSide::Init(PDBSetup const& pdbSet, config_setup::Output const& out, - const ulong tillEquil, const ulong totSteps) + const ulong tillEquil, const ulong totSteps, ulong startStep) { equilSteps = tillEquil; //Initialize arrays in object that collects references and calc'ed vals. varRef.Init(pdbSet.atoms); //Initialize output components. - timer.Init(out.console.frequency, totSteps); + timer.Init(out.console.frequency, totSteps, startStep); outObj.push_back(&console); outObj.push_back(&pdb); if (out.statistics.settings.block.enable) diff --git a/src/CPUSide.h b/src/CPUSide.h index f2d97d71c..6480ebc32 100644 --- a/src/CPUSide.h +++ b/src/CPUSide.h @@ -27,7 +27,7 @@ class OutputableBase; struct CPUSide { CPUSide(System & sys, StaticVals & statV); void Init(PDBSetup const& pdbSet, config_setup::Output const& out, - const ulong tillEquil, const ulong totSteps); + const ulong tillEquil, const ulong totSteps, ulong startStep); void Output(const ulong step); ulong equilSteps; diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index 54aca5acf..efc22dacd 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -48,12 +48,13 @@ void CheckpointOutput::DoOutput(const ulong step) printCoordinates(); printMoleculeLookupData(); printMoveSettingsData(); + std::cout << "Checkpoint saved to " << filename << std::endl; } } void CheckpointOutput::printStepNumber(const ulong step) { - uint32_t s = (uint32_t) step; + uint32_t s = (uint32_t) step + 1; outputUintIn8Chars(s); } @@ -71,7 +72,6 @@ void CheckpointOutput::printBoxDimensionsData() outputDoubleIn8Chars(boxDimRef.cosAngle[b][1]); outputDoubleIn8Chars(boxDimRef.cosAngle[b][2]); } - std::cout << "Checkpoint saved to " << filename << std::endl; } void CheckpointOutput::printRandomNumbers() diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index 68d93c8ad..ab8006f2e 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -298,31 +298,35 @@ uint32_t CheckpointSetup::readUintIn8Chars() return temp.uint_value; } -void CheckpointSetup::SetStepNumber(ulong &startStep) { +void CheckpointSetup::SetStepNumber(ulong & startStep) { startStep = stepNumber; } -void CheckpointSetup::SetBoxDimensions(BoxDimensions &boxDimRef) { +void CheckpointSetup::SetBoxDimensions(BoxDimensions & boxDimRef) { for(int b=0; bcosAngle[b][0]; boxDimRef.cosAngle[b][1] = this->cosAngle[b][1]; boxDimRef.cosAngle[b][2] = this->cosAngle[b][2]; + boxDimRef.volume[b] = axis[b][0] * axis[b][1] * axis[b][2]; + boxDimRef.volInv[b] = 1.0 / boxDimRef.volume[b]; } + boxDimRef.axis.CopyRange(boxDimRef.halfAx, 0, 0, BOX_TOTAL); + boxDimRef.halfAx.ScaleRange(0, BOX_TOTAL, 0.5); } -void CheckpointSetup::SetPRNGVariables(PRNG &prng) { +void CheckpointSetup::SetPRNGVariables(PRNG & prng) { prng.GetGenerator()->load(saveArray); prng.GetGenerator()->pNext = prng.GetGenerator()->state + seedLocation; prng.GetGenerator()->left = seedLeft; prng.GetGenerator()->seedValue = seedValue; } -void CheckpointSetup::SetCoordinates(Coordinates coordinates) { +void CheckpointSetup::SetCoordinates(Coordinates & coordinates) { coords.CopyRange(coordinates, 0, 0, coordLength); } -void CheckpointSetup::SetMoleculeLookup(MoleculeLookup &molLookupRef) { +void CheckpointSetup::SetMoleculeLookup(MoleculeLookup & molLookupRef) { if(molLookupRef.molLookupCount != this->molLookupVec.size()) { std::cerr << "ERROR: Restarting from checkpoint...\n" << "molLookup size does not match with restart file\n"; @@ -337,7 +341,7 @@ void CheckpointSetup::SetMoleculeLookup(MoleculeLookup &molLookupRef) { molLookupRef.numKinds = this->numKinds; } -void CheckpointSetup::SetMoveSettings(MoveSettings moveSettings) { +void CheckpointSetup::SetMoveSettings(MoveSettings & moveSettings) { moveSettings.scale = this->scaleVec; moveSettings.acceptPercent = this->acceptPercentVec; moveSettings.accepted = this->acceptedVec; diff --git a/src/CheckpointSetup.h b/src/CheckpointSetup.h index 222ee8ee6..706d31861 100644 --- a/src/CheckpointSetup.h +++ b/src/CheckpointSetup.h @@ -24,13 +24,12 @@ class CheckpointSetup{ } void ReadAll(); - void SetStepNumber(ulong &startStep); - void SetPRNGVariables(PRNG &prng); - void SetBoxDimensions(BoxDimensions &boxDimRef); - void SetCoordinates(Coordinates coordinates); - void SetMoleculeLookup(MoleculeLookup &molLookupRef); - - void SetMoveSettings(MoveSettings moveSettings); + void SetStepNumber(ulong & startStep); + void SetPRNGVariables(PRNG & prng); + void SetBoxDimensions(BoxDimensions & boxDimRef); + void SetCoordinates(Coordinates & coordinates); + void SetMoleculeLookup(MoleculeLookup & molLookupRef); + void SetMoveSettings(MoveSettings & moveSettings); private: MoveSettings & moveSetRef; diff --git a/src/Clock.h b/src/Clock.h index 9498de392..b080e5740 100644 --- a/src/Clock.h +++ b/src/Clock.h @@ -20,9 +20,10 @@ along with this program, also can be found at . struct Clock { Clock(): stepsPerOut(0), prevStep(0), lastStep(0), lastTime(0.0) {} - void Init(const ulong steps, const ulong totSt) + void Init(const ulong steps, const ulong totSt, const ulong startStep) { stepsPerOut = steps; + prevStep = startStep; #if defined(__linux__) || defined(__APPLE__) gettimeofday(&tv, &tz); strt = (double)tv.tv_sec + (double)tv.tv_usec / 1000000; diff --git a/src/Simulation.cpp b/src/Simulation.cpp index 0d85c211e..ee0ac3d21 100644 --- a/src/Simulation.cpp +++ b/src/Simulation.cpp @@ -29,7 +29,7 @@ Simulation::Simulation(char const*const configFileName) staticValues->InitOver(set, *system); cpu = new CPUSide(*system, *staticValues); cpu->Init(set.pdb, set.config.out, set.config.sys.step.equil, - totalSteps); + totalSteps, startStep); //Dump combined PSF PSFOutput psfOut(staticValues->mol, *system, set.mol.kindMap, From bbdf5392fac00b2714eb671070d44480b27c2135 Mon Sep 17 00:00:00 2001 From: msoroush Date: Wed, 13 Feb 2019 16:54:12 -0500 Subject: [PATCH 181/199] Fix to the updating adjustable value in MoveSetting, when we have more than one component. Avoid infinit loop in NPT-GEMC with fix volume activated. --- src/MoveSettings.cpp | 16 ++++++++-------- src/VolumeTransfer.h | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/MoveSettings.cpp b/src/MoveSettings.cpp index 15ad13285..f565d7e9d 100644 --- a/src/MoveSettings.cpp +++ b/src/MoveSettings.cpp @@ -78,7 +78,7 @@ void MoveSettings::Update(const uint move, const bool isAccepted, acceptPercent[box][move][kind] = (double)(accepted[box][move][kind]) / (double)(tries[box][move][kind]); - // for any move that we dont care about kind of molecule, it should be included + //for any move that we dont care about kind of molecule, it should be included //in the if condition if (move == mv::INTRA_MEMC #if ENSEMBLE == GEMC || ENSEMBLE == GCMC @@ -89,14 +89,14 @@ void MoveSettings::Update(const uint move, const bool isAccepted, #endif ) { for (uint k = 1; k < totKind; k++) { - tries[box][move][kind]++; - tempTries[box][move][kind]++; + tries[box][move][k]++; + tempTries[box][move][k]++; if(isAccepted) { - tempAccepted[box][move][kind]++; - accepted[box][move][kind]++; + tempAccepted[box][move][k]++; + accepted[box][move][k]++; } - acceptPercent[box][move][kind] = (double)(accepted[box][move][kind]) / - (double)(tries[box][move][kind]); + acceptPercent[box][move][k] = (double)(accepted[box][move][k]) / + (double)(tries[box][move][k]); } } } @@ -214,4 +214,4 @@ uint MoveSettings::GetTrialTot(const uint box, const uint move) const } return sum; -} \ No newline at end of file +} diff --git a/src/VolumeTransfer.h b/src/VolumeTransfer.h index 8013656d9..7ebf428fa 100644 --- a/src/VolumeTransfer.h +++ b/src/VolumeTransfer.h @@ -81,7 +81,8 @@ inline uint VolumeTransfer::Prep(const double subDraw, const double movePerc) if(fixBox0) { //For NPT-GEMC and when box0 is fixed, we cannot pick box 0 while(box == 0) { - prng.PickBox(box, subDraw, movePerc); + //To avoid infinit loop, we dont use sunDraw + box = prng.randIntExc(BOX_TOTAL); } } } From d65a0cacaede9322d0c5717bfc481721bb3e2f7a Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Fri, 15 Feb 2019 18:56:06 -0500 Subject: [PATCH 182/199] delete some allocated memory in EwaldCached --- src/EwaldCached.cpp | 75 +++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index af827d1fa..4d2adc82d 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -17,32 +17,57 @@ EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) EwaldCached::~EwaldCached() { - if(ff.ewald) { - for(int i = 0; i < mols.count; i++) { - //when cached option is choosen - if (cosMolRef[i] != NULL) { - delete[] cosMolRef[i]; - delete[] sinMolRef[i]; - delete[] cosMolBoxRecip[i]; - delete[] sinMolBoxRecip[i]; - } - } + delete [] kmax; + delete [] imageSize; + delete [] imageSizeRef; + for(uint b=0; b < BOXES_WITH_U_NB; b++) { + delete [] kx[b]; + delete [] ky[b]; + delete [] kz[b]; + delete [] hsqr[b]; + delete [] prefact[b]; + delete [] kxRef[b]; + delete [] kyRef[b]; + delete [] kzRef[b]; + delete [] hsqrRef[b]; + delete [] prefactRef[b]; + delete [] sumRnew[b]; + delete [] sumInew[b]; + delete [] sumRref[b]; + delete [] sumIref[b]; + } + delete [] kx; + delete [] ky; + delete [] kz; + delete [] hsqr; + delete [] prefact; + delete [] kxRef; + delete [] kyRef; + delete [] kzRef; + delete [] hsqrRef; + delete [] prefactRef; + delete [] sumRnew; + delete [] sumInew; + delete [] sumRref; + delete [] sumIref; - if (kx != NULL) { - //when cached option is choosen - if (cosMolRestore != NULL) { - delete[] cosMolRestore; - delete[] sinMolRestore; - } - //when cached option is choosen - if (cosMolRef != NULL) { - delete[] cosMolRef; - delete[] sinMolRef; - delete[] cosMolBoxRecip; - delete[] sinMolBoxRecip; - } - } + int i; +#ifdef _OPENMP +#pragma omp parallel for default(shared) private(i) +#endif + for (i = 0; i < mols.count; i++) { + delete [] cosMolRef[i]; + delete [] sinMolRef[i]; + delete [] cosMolBoxRecip[i]; + delete [] sinMolBoxRecip[i]; } + delete [] cosMolRef; + delete [] sinMolRef; + delete [] cosMolBoxRecip; + delete [] sinMolBoxRecip; + + delete [] cosMolRestore; + delete [] sinMolRestore; } void EwaldCached::Init() @@ -85,8 +110,6 @@ void EwaldCached::AllocMem() sinMolRef = new double*[mols.count]; cosMolBoxRecip = new double*[mols.count]; sinMolBoxRecip = new double*[mols.count]; - imageSize = new uint[BOXES_WITH_U_NB]; - imageSizeRef = new uint[BOXES_WITH_U_NB]; for(uint b = 0; b < BOXES_WITH_U_NB; b++) { RecipCountInit(b, currentAxes); From c61fd6836386ab1d17060d10dffe068607ead308 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Fri, 15 Feb 2019 19:14:40 -0500 Subject: [PATCH 183/199] added SafeDeleteArray() function to securely delete arrays --- src/EwaldCached.cpp | 94 +++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index 4d2adc82d..196cc1697 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -15,59 +15,71 @@ EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) #endif {} +template< class T > void SafeDelete( T*& pVal ) +{ + delete pVal; + pVal = NULL; +} + +template< class T > void SafeDeleteArray( T*& pVal ) +{ + delete[] pVal; + pVal = NULL; +} + EwaldCached::~EwaldCached() { - delete [] kmax; - delete [] imageSize; - delete [] imageSizeRef; + SafeDeleteArray(kmax); + SafeDeleteArray(imageSize); + SafeDeleteArray(imageSizeRef); for(uint b=0; b < BOXES_WITH_U_NB; b++) { - delete [] kx[b]; - delete [] ky[b]; - delete [] kz[b]; - delete [] hsqr[b]; - delete [] prefact[b]; - delete [] kxRef[b]; - delete [] kyRef[b]; - delete [] kzRef[b]; - delete [] hsqrRef[b]; - delete [] prefactRef[b]; - delete [] sumRnew[b]; - delete [] sumInew[b]; - delete [] sumRref[b]; - delete [] sumIref[b]; + SafeDeleteArray(kx[b]); + SafeDeleteArray(ky[b]); + SafeDeleteArray(kz[b]); + SafeDeleteArray(hsqr[b]); + SafeDeleteArray(prefact[b]); + SafeDeleteArray(kxRef[b]); + SafeDeleteArray(kyRef[b]); + SafeDeleteArray(kzRef[b]); + SafeDeleteArray(hsqrRef[b]); + SafeDeleteArray(prefactRef[b]); + SafeDeleteArray(sumRnew[b]); + SafeDeleteArray(sumInew[b]); + SafeDeleteArray(sumRref[b]); + SafeDeleteArray(sumIref[b]); } - delete [] kx; - delete [] ky; - delete [] kz; - delete [] hsqr; - delete [] prefact; - delete [] kxRef; - delete [] kyRef; - delete [] kzRef; - delete [] hsqrRef; - delete [] prefactRef; - delete [] sumRnew; - delete [] sumInew; - delete [] sumRref; - delete [] sumIref; + SafeDeleteArray(kx); + SafeDeleteArray(ky); + SafeDeleteArray(kz); + SafeDeleteArray(hsqr); + SafeDeleteArray(prefact); + SafeDeleteArray(kxRef); + SafeDeleteArray(kyRef); + SafeDeleteArray(kzRef); + SafeDeleteArray(hsqrRef); + SafeDeleteArray(prefactRef); + SafeDeleteArray(sumRnew); + SafeDeleteArray(sumInew); + SafeDeleteArray(sumRref); + SafeDeleteArray(sumIref); int i; #ifdef _OPENMP #pragma omp parallel for default(shared) private(i) #endif for (i = 0; i < mols.count; i++) { - delete [] cosMolRef[i]; - delete [] sinMolRef[i]; - delete [] cosMolBoxRecip[i]; - delete [] sinMolBoxRecip[i]; + SafeDeleteArray(cosMolRef[i]); + SafeDeleteArray(sinMolRef[i]); + SafeDeleteArray(cosMolBoxRecip[i]); + SafeDeleteArray(sinMolBoxRecip[i]); } - delete [] cosMolRef; - delete [] sinMolRef; - delete [] cosMolBoxRecip; - delete [] sinMolBoxRecip; + SafeDeleteArray(cosMolRef); + SafeDeleteArray(sinMolRef); + SafeDeleteArray(cosMolBoxRecip); + SafeDeleteArray(sinMolBoxRecip); - delete [] cosMolRestore; - delete [] sinMolRestore; + SafeDeleteArray(cosMolRestore); + SafeDeleteArray(sinMolRestore); } void EwaldCached::Init() From dab3579cba922a601461bb1803fba04f7351d362 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Fri, 15 Feb 2019 19:27:56 -0500 Subject: [PATCH 184/199] fixed segfault at the end of simulation caused by closing a file twice --- src/CheckpointOutput.cpp | 2 +- src/CheckpointSetup.cpp | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/CheckpointOutput.cpp b/src/CheckpointOutput.cpp index efc22dacd..3ae9e3e1c 100644 --- a/src/CheckpointOutput.cpp +++ b/src/CheckpointOutput.cpp @@ -28,7 +28,7 @@ CheckpointOutput::CheckpointOutput(System & sys, StaticVals const& statV) : boxDimRef(sys.boxDimRef), molRef(statV.mol), prngRef(sys.prng), coordCurrRef(sys.coordinates), filename("checkpoint.dat") { - + outputFile = NULL; } void CheckpointOutput::Init(pdb_setup::Atoms const& atoms, diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index ab8006f2e..410752e75 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -39,7 +39,6 @@ void CheckpointSetup::ReadAll() readCoordinates(); readMoleculeLookupData(); readMoveSettingsData(); - closeInputFile(); std::cout << "Checkpoint loaded from " << filename << std::endl; } @@ -251,12 +250,6 @@ void CheckpointSetup::openInputFile() } } -void CheckpointSetup::closeInputFile() -{ - if(inputFile) - fclose(inputFile); -} - double CheckpointSetup::readDoubleIn8Chars() { if(inputFile == NULL) { From 647a0abd828e81bbaebaa9eadfa1e114698d79cf Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Fri, 15 Feb 2019 23:10:46 -0500 Subject: [PATCH 185/199] removed some unused variables --- src/CheckpointOutput.h | 2 +- src/Ewald.cpp | 2 +- src/Ewald.h | 2 +- src/EwaldCached.cpp | 26 ++++++++++---------------- src/EwaldCached.h | 2 +- src/MoleculeTransfer.h | 2 +- src/NoEwald.cpp | 2 +- src/NoEwald.h | 2 +- 8 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/CheckpointOutput.h b/src/CheckpointOutput.h index 749143580..4103e1d95 100644 --- a/src/CheckpointOutput.h +++ b/src/CheckpointOutput.h @@ -39,8 +39,8 @@ class CheckpointOutput : public OutputableBase { MoleculeLookup & molLookupRef; BoxDimensions & boxDimRef; Molecules const & molRef; - Coordinates & coordCurrRef; PRNG & prngRef; + Coordinates & coordCurrRef; bool enableOutCheckpoint; std::string filename; diff --git a/src/Ewald.cpp b/src/Ewald.cpp index 5dd1bcc27..b3dada3de 100644 --- a/src/Ewald.cpp +++ b/src/Ewald.cpp @@ -346,7 +346,7 @@ double Ewald::MolReciprocal(XYZArray const& molCoords, //calculate reciprocate term in destination box for swap move double Ewald::SwapDestRecip(const cbmc::TrialMol &newMol, - const uint box, const int sourceBox, + const uint box, const int molIndex) { double energyRecipNew = 0.0; diff --git a/src/Ewald.h b/src/Ewald.h index 235cf68da..b756c0893 100644 --- a/src/Ewald.h +++ b/src/Ewald.h @@ -87,7 +87,7 @@ class Ewald //calculate reciprocate term in destination box for swap move virtual double SwapDestRecip(const cbmc::TrialMol &newMol, const uint box, - const int sourceBox, const int molIndex); + const int molIndex); //calculate reciprocate term in source box for swap move virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, diff --git a/src/EwaldCached.cpp b/src/EwaldCached.cpp index 196cc1697..028a69ac2 100644 --- a/src/EwaldCached.cpp +++ b/src/EwaldCached.cpp @@ -9,17 +9,6 @@ along with this program, also can be found at . using namespace geom; -EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) -#if ENSEMBLE == GEMC - , GEMC_KIND(stat.kindOfGEMC) -#endif - {} - -template< class T > void SafeDelete( T*& pVal ) -{ - delete pVal; - pVal = NULL; -} template< class T > void SafeDeleteArray( T*& pVal ) { @@ -27,6 +16,13 @@ template< class T > void SafeDeleteArray( T*& pVal ) pVal = NULL; } +EwaldCached::EwaldCached(StaticVals & stat, System & sys) : Ewald(stat, sys) +#if ENSEMBLE == GEMC + , GEMC_KIND(stat.kindOfGEMC) +#endif + {} + + EwaldCached::~EwaldCached() { SafeDeleteArray(kmax); @@ -241,14 +237,13 @@ double EwaldCached::MolReciprocal(XYZArray const& molCoords, if (box < BOXES_WITH_U_NB) { MoleculeKind const& thisKind = mols.GetKind(molIndex); uint length = thisKind.NumAtoms(); - uint startAtom = mols.MolStart(molIndex); - uint p, atom; + uint p; int i; double sumRealNew, sumImaginaryNew, dotProductNew, sumRealOld, sumImaginaryOld; #ifdef _OPENMP - #pragma omp parallel for default(shared) private(i, p, atom, sumRealNew, sumImaginaryNew, sumRealOld, sumImaginaryOld, dotProductNew) reduction(+:energyRecipNew) + #pragma omp parallel for default(shared) private(i, p, sumRealNew, sumImaginaryNew, sumRealOld, sumImaginaryOld, dotProductNew) reduction(+:energyRecipNew) #endif for (i = 0; i < imageSizeRef[box]; i++) { sumRealNew = 0.0; @@ -260,7 +255,6 @@ double EwaldCached::MolReciprocal(XYZArray const& molCoords, sinMolRestore[i] = sinMolRef[molIndex][i]; for (p = 0; p < length; ++p) { - atom = startAtom + p; dotProductNew = Dot(p, kxRef[box][i], kyRef[box][i], kzRef[box][i], molCoords); @@ -284,7 +278,7 @@ double EwaldCached::MolReciprocal(XYZArray const& molCoords, //calculate reciprocate term in destination box for swap move double EwaldCached::SwapDestRecip(const cbmc::TrialMol &newMol, - const uint box, const int sourceBox, + const uint box, const int molIndex) { double energyRecipNew = 0.0; diff --git a/src/EwaldCached.h b/src/EwaldCached.h index 5b531d826..589913d9b 100644 --- a/src/EwaldCached.h +++ b/src/EwaldCached.h @@ -32,7 +32,7 @@ class EwaldCached : public Ewald //calculate reciprocate term in destination box for swap move virtual double SwapDestRecip(const cbmc::TrialMol &newMol, const uint box, - const int sourceBox, const int molIndex); + const int molIndex); //calculate reciprocate term in source box for swap move virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, diff --git a/src/MoleculeTransfer.h b/src/MoleculeTransfer.h index bac37fc0b..f81266979 100644 --- a/src/MoleculeTransfer.h +++ b/src/MoleculeTransfer.h @@ -121,7 +121,7 @@ inline void MoleculeTransfer::CalcEn() self_new = calcEwald->SwapSelf(newMol); self_old = calcEwald->SwapSelf(oldMol); recipGain.energy = - calcEwald->SwapDestRecip(newMol, destBox, sourceBox, molIndex); + calcEwald->SwapDestRecip(newMol, destBox, molIndex); recipLose.energy = calcEwald->SwapSourceRecip(oldMol, sourceBox, molIndex); //need to contribute the self and correction energy diff --git a/src/NoEwald.cpp b/src/NoEwald.cpp index 7ed670195..e2fe870f1 100644 --- a/src/NoEwald.cpp +++ b/src/NoEwald.cpp @@ -73,7 +73,7 @@ double NoEwald::MolCorrection(uint molIndex, uint box) const //calculate reciprocate term in destination box for swap move double NoEwald::SwapDestRecip(const cbmc::TrialMol &newMol, - const uint box, const int sourceBox, + const uint box, const int molIndex) { return 0.0; diff --git a/src/NoEwald.h b/src/NoEwald.h index 687866a1c..67a2eece9 100644 --- a/src/NoEwald.h +++ b/src/NoEwald.h @@ -54,7 +54,7 @@ class NoEwald : public Ewald //calculate reciprocate term in destination box for swap move virtual double SwapDestRecip(const cbmc::TrialMol &newMol, const uint box, - const int sourceBox, const int molIndex); + const int molIndex); //calculate reciprocate term in source box for swap move virtual double SwapSourceRecip(const cbmc::TrialMol &oldMol, From fc7d75dc79062a07cbb810c95433fe708c839e65 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Sat, 16 Feb 2019 03:06:40 -0500 Subject: [PATCH 186/199] another attempt to fix segfault --- src/CheckpointSetup.cpp | 1 + src/CheckpointSetup.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index 410752e75..efe2cee44 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -28,6 +28,7 @@ CheckpointSetup::CheckpointSetup(System & sys, StaticVals const& statV) : boxDimRef(sys.boxDimRef), molRef(statV.mol), prngRef(sys.prng), coordCurrRef(sys.coordinates), filename("checkpoint.dat") { + inputFile = NULL; } void CheckpointSetup::ReadAll() diff --git a/src/CheckpointSetup.h b/src/CheckpointSetup.h index 706d31861..f8e68031f 100644 --- a/src/CheckpointSetup.h +++ b/src/CheckpointSetup.h @@ -18,6 +18,7 @@ class CheckpointSetup{ ~CheckpointSetup() { if(inputFile) { fclose(inputFile); + inputFile = NULL; } if(saveArray) delete [] saveArray; From a949f59eb59e6e85794ba0d79d04ac35ee881507 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Tue, 26 Feb 2019 11:55:01 -0500 Subject: [PATCH 187/199] updated block average and console oupput; changed the format to scientific --- .vscode/c_cpp_properties.json | 2 +- .vscode/settings.json | 3 +- src/BlockOutput.cpp | 58 ++++++++++++++++++++++++----------- src/BlockOutput.h | 2 +- src/ConsoleOutput.cpp | 26 +++++++++++----- src/OutConst.cpp | 1 + src/OutConst.h | 4 ++- src/OutputVars.cpp | 10 +++--- 8 files changed, 71 insertions(+), 35 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 9e652bf57..69d93ca53 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -89,5 +89,5 @@ } } ], - "version": 3 + "version": 4 } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 22fc25869..3b62c5316 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,6 +18,7 @@ "cstdio": "cpp", "cstdlib": "cpp", "cstring": "cpp", - "ctime": "cpp" + "ctime": "cpp", + "iomanip": "cpp" } } \ No newline at end of file diff --git a/src/BlockOutput.cpp b/src/BlockOutput.cpp index dbfb161e5..ae3c7866d 100644 --- a/src/BlockOutput.cpp +++ b/src/BlockOutput.cpp @@ -56,12 +56,12 @@ void BlockAverage::DoWrite(const ulong step, uint precision) { if (tot >= 1) { if (outBlock0->is_open()) { - if(abs(block[0]) > 9999999999.9999) { - (*outBlock0) << left << std::fixed << std::setprecision(0) << + if(abs(block[0]) > 1e99) { + (*outBlock0) << right << std::scientific << std::setprecision(precision-1) << std::setw(OUTPUTWIDTH); - (*outBlock0) << 9999999999; + (*outBlock0) << block[0]; } else { - (*outBlock0) << left << std::fixed << std::setprecision(precision) << + (*outBlock0) << right << std::scientific << std::setprecision(precision) << std::setw(OUTPUTWIDTH); (*outBlock0) << block[0]; } @@ -70,12 +70,12 @@ void BlockAverage::DoWrite(const ulong step, uint precision) } if (tot >= 2) { if (outBlock1->is_open()) { - if(abs(block[0]) > 9999999999.9999) { - (*outBlock1) << left << std::fixed << std::setprecision(0) << + if(abs(block[0]) > 1e99) { + (*outBlock1) << right << std::scientific << std::setprecision(precision-1) << std::setw(OUTPUTWIDTH); - (*outBlock1) << 9999999999; + (*outBlock1) << block[1]; } else { - (*outBlock1) << left << std::fixed << std::setprecision(precision) << + (*outBlock1) << right << std::scientific << std::setprecision(precision) << std::setw(OUTPUTWIDTH); (*outBlock1) << block[1]; } @@ -107,9 +107,9 @@ void BlockAverages::AllocBlocks(void) { numKindBlocks = out::TOTAL_K * var->numKinds; #if ENSEMBLE == GCMC || ENSEMBLE == GEMC - //we don't have mole fraction with only one kind + //we don't have mole fraction and mol density with only one kind if (var->numKinds == 1) - numKindBlocks--; + numKindBlocks = 0; #endif totalBlocks = out::TOTAL_SINGLE + numKindBlocks; blocks = new BlockAverage[totalBlocks]; @@ -124,11 +124,11 @@ void BlockAverages::Sample(const ulong step) void BlockAverages::DoOutput(const ulong step) { ulong nextStep = step + 1; - outBlock0 << left << std::fixed << std::setw(OUTPUTWIDTH) << nextStep; - outBlock1 << left << std::fixed << std::setw(OUTPUTWIDTH) << nextStep; + outBlock0 << left << std::scientific << std::setw(OUTPUTWIDTH) << nextStep; + outBlock1 << left << std::scientific << std::setw(OUTPUTWIDTH) << nextStep; for (uint v = 0; v < totalBlocks; ++v) { if(v < out::TOTAL_SINGLE) - blocks[v].Write(nextStep, firstPrint); + blocks[v].Write(nextStep, firstPrint, 8); else blocks[v].Write(nextStep, firstPrint, 8); } @@ -139,9 +139,9 @@ void BlockAverages::DoOutput(const ulong step) void BlockAverages::InitWatchSingle(config_setup::TrackedVars const& tracked) { - outBlock0 << left << std::fixed << std::setw(OUTPUTWIDTH) << "#STEPS"; + outBlock0 << left << std::scientific << std::setw(OUTPUTWIDTH) << "#STEPS"; if(outBlock1.is_open()) - outBlock1 << left << std::fixed << std::setw(OUTPUTWIDTH) << "#STEPS"; + outBlock1 << left << std::scientific << std::setw(OUTPUTWIDTH) << "#STEPS"; //Note: The order of Init should be same as order of SetRef blocks[out::ENERGY_TOTAL_IDX].Init(&outBlock0, &outBlock1, tracked.energy.block, invSteps, out::ENERGY_TOTAL, BOXES_WITH_U_NB); blocks[out::ENERGY_INTER_IDX].Init(&outBlock0, &outBlock1, tracked.energy.block, invSteps, out::ENERGY_INTER, BOXES_WITH_U_NB); @@ -209,9 +209,31 @@ void BlockAverages::InitWatchMulti(config_setup::TrackedVars const& tracked) } for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { uint kArrIdx = b * var->numKinds + k; - if (var->numKinds > 1) + if (var->numKinds > 1) { blocks[bkStart + out::MOL_FRACTION_IDX * var->numKinds].SetRef (&var->molFractionByKindBox[kArrIdx], b); + } + } + } + //I cannot put this in previous loop because the Title will be printed + // as soon as it is initialized. + for (uint k = 0; k < var->numKinds; ++k) { + uint bkStart = start + k; + //Copy each char of the name string. + std::string trimKindName = var->kindsRef[k].name; + //If more than one kind, output mol fractions. + if (var->numKinds > 1) { + //Init mol density + name = out::MOL_DENSITY + "_" + trimKindName; + blocks[bkStart + out::MOL_DENSITY_IDX * var->numKinds].Init + (&outBlock0, &outBlock1, tracked.molNum.block, invSteps, name, BOXES_WITH_U_NB); + } + for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { + uint kArrIdx = b * var->numKinds + k; + if (var->numKinds > 1) { + blocks[bkStart + out::MOL_DENSITY_IDX * var->numKinds].SetRef + (&var->densityByKindBox[kArrIdx], b); + } } } #endif @@ -221,14 +243,14 @@ void BlockAverage::printTitle(std::string output, uint boxes) { if(tot >= 1) { if((*outBlock0).is_open()) { - (*outBlock0) << left << std::fixed << std::setw(OUTPUTWIDTH) << output; + (*outBlock0) << left << std::scientific << std::setw(OUTPUTWIDTH) << output; } else { std::cerr << "Unable to write to Block_0 output file!" << std::endl; } } if(tot >= 2) { if((*outBlock1).is_open()) { - (*outBlock1) << left << std::fixed << std::setw(OUTPUTWIDTH) << output; + (*outBlock1) << left << std::scientific << std::setw(OUTPUTWIDTH) << output; } else { std::cerr << "Unable to write to Block_1 output file!" << std::endl; } diff --git a/src/BlockOutput.h b/src/BlockOutput.h index 28147b663..b3ee42ebb 100644 --- a/src/BlockOutput.h +++ b/src/BlockOutput.h @@ -60,7 +60,7 @@ struct BlockAverage { dblSrc[b] = NULL; } void Sum(void); - void Write(const ulong step, const bool firstPrint, uint precision = 4) + void Write(const ulong step, const bool firstPrint, uint precision) { first = firstPrint; if (enable) diff --git a/src/ConsoleOutput.cpp b/src/ConsoleOutput.cpp index 28c78ec4d..b8a937a79 100644 --- a/src/ConsoleOutput.cpp +++ b/src/ConsoleOutput.cpp @@ -197,9 +197,13 @@ void ConsoleOutput::PrintStatistic(const uint box, const ulong step) const for(uint k = 0; k < var->numKinds; k++) { uint kb = k + offset; - if(var->numKinds > 1) - printElement(var->molFractionByKindBox[kb], elementWidth, 6); + printElement(var->molFractionByKindBox[kb], elementWidth, 8); + } + for(uint k = 0; k < var->numKinds; k++) { + uint kb = k + offset; + if(var->numKinds > 1) + printElement(var->densityByKindBox[kb], elementWidth, 8); } } @@ -303,6 +307,12 @@ void ConsoleOutput::PrintStatisticTitle() printElement(molName, elementWidth); } } + for(uint k = 0; k < var->numKinds; k++) { + if(var->numKinds > 1) { + std::string molName = "MOLDENS_" + var->resKindNames[k]; + printElement(molName, elementWidth); + } + } } if(enableDens) @@ -387,11 +397,11 @@ void ConsoleOutput::printElement(const double t, const int width, uint percision) const { const char separator = ' '; - if(abs(t) > 9999999999.9999) { - std::cout << right << std::fixed << std::setprecision(0) << - setw(width) << setfill(separator) << 9999999999; + if(abs(t) > 1e99) { + std::cout << right << std::scientific << std::setprecision(percision-1) << + setw(width) << setfill(separator) << t; } else { - std::cout << right << std::fixed << std::setprecision(percision) << + std::cout << right << std::scientific << std::setprecision(percision) << setw(width) << setfill(separator) << t; } @@ -400,14 +410,14 @@ void ConsoleOutput::printElement(const double t, const int width, void ConsoleOutput::printElement(const uint t, const int width) const { const char separator = ' '; - std::cout << right << std::fixed << setw(width) << + std::cout << right << std::scientific << setw(width) << setfill(separator) << t; } void ConsoleOutput::printElement(const std::string t, const int width) const { const char separator = ' '; - std::cout << right << std::fixed << setw(width) << + std::cout << right << std::scientific << setw(width) << setfill(separator) << t; } diff --git a/src/OutConst.cpp b/src/OutConst.cpp index 363bd8d0a..e53439189 100644 --- a/src/OutConst.cpp +++ b/src/OutConst.cpp @@ -28,5 +28,6 @@ const std::string VOLUME = "VOLUME"; const std::string DENSITY = "TOT_DENS"; const std::string MOL_NUM = "TOT_MOL"; const std::string MOL_FRACTION = "MOLFRACT"; +const std::string MOL_DENSITY = "MOLDENS"; const std::string SURF_TENSION = "SURF_TENSION"; } diff --git a/src/OutConst.h b/src/OutConst.h index 59a917d28..8cf411222 100644 --- a/src/OutConst.h +++ b/src/OutConst.h @@ -56,8 +56,10 @@ static const uint TOTAL_SINGLE = 15; //MULTI extern const std::string MOL_FRACTION; +extern const std::string MOL_DENSITY; static const uint MOL_FRACTION_IDX = 0; -static const uint TOTAL_K = 1; +static const uint MOL_DENSITY_IDX = 1; +static const uint TOTAL_K = 2; } #endif /*OUT_CONST_H*/ diff --git a/src/OutputVars.cpp b/src/OutputVars.cpp index 735fe9567..03fbd3f77 100644 --- a/src/OutputVars.cpp +++ b/src/OutputVars.cpp @@ -153,14 +153,14 @@ void OutputVars::CalcAndConvert(ulong step) rawPressure[b] = 0.0; densityTot[b] = 0.0; for (uint k = 0; k < numKinds; k++) { - double * density = &densityByKindBox[k + numKinds * b]; + double density = densityByKindBox[k + numKinds * b]; // Instead of converting to mass first // (an alternate route to calculate the ideal gas pressure) // the form of the Boltzmann constant that kcal/mol/K is used // such that a single conversion factor can be applied to both // the ideal and virial components of the pressure. - rawPressure[b] += *density; + rawPressure[b] += density; } // Finish ideal component rawPressure[b] *= T_in_K; @@ -175,13 +175,13 @@ void OutputVars::CalcAndConvert(ulong step) for (uint b = 0; b < BOX_TOTAL; b++) { densityTot[b] = 0.0; for (uint k = 0; k < numKinds; k++) { - double * density = &densityByKindBox[k + numKinds * b]; + double density = densityByKindBox[k + numKinds * b]; // Convert density to g/ml (which is equivalent to g/cm3) // To get kg/m3, multiply output densities by 1000. - *density *= unit::MOLECULES_PER_A3_TO_MOL_PER_CM3 * + density *= unit::MOLECULES_PER_A3_TO_MOL_PER_CM3 * kindsRef[k].molMass; - densityTot[b] += densityByKindBox[k + numKinds * b]; + densityTot[b] += density; } densityTot[b] *= 1000; } From eadd6f884076e843abf5d6e10063323591c00234 Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Tue, 26 Feb 2019 13:11:25 -0500 Subject: [PATCH 188/199] fixed warning format --- src/CalculateEnergy.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CalculateEnergy.cpp b/src/CalculateEnergy.cpp index ad08e0163..fc34f3e8d 100644 --- a/src/CalculateEnergy.cpp +++ b/src/CalculateEnergy.cpp @@ -719,10 +719,10 @@ void CalculateEnergy::MolBond(double & energy, if(abs(molLength - eqLength) > 0.02) { uint p1 = molKind.bondList.part1[b]; uint p2 = molKind.bondList.part2[b]; - printf("Warning: Box %d, %d %s ,", box, molIndex, molKind.name.c_str()); - printf("Bond %s-%s: In Par. file ", molKind.atomNames[p1].c_str(), + printf("Warning: Box%d, %6d %4s,", box, molIndex, molKind.name.c_str()); + printf("%3s-%-3s bond: Par-file ", molKind.atomNames[p1].c_str(), molKind.atomNames[p2].c_str()); - printf("%2.3f A, in PDB file %2.3f A!\n", eqLength, molLength); + printf("%2.3f A, PDB file %2.3f A!\n", eqLength, molLength); } } } From 0afc5776da9f274d8ecca652195809da62e2f94e Mon Sep 17 00:00:00 2001 From: Younes Nejahi Date: Tue, 26 Feb 2019 17:17:50 -0500 Subject: [PATCH 189/199] fixed another bug --- src/CheckpointSetup.cpp | 7 +++++-- src/CheckpointSetup.h | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/CheckpointSetup.cpp b/src/CheckpointSetup.cpp index efe2cee44..3209c9d54 100644 --- a/src/CheckpointSetup.cpp +++ b/src/CheckpointSetup.cpp @@ -29,6 +29,7 @@ CheckpointSetup::CheckpointSetup(System & sys, StaticVals const& statV) : coordCurrRef(sys.coordinates), filename("checkpoint.dat") { inputFile = NULL; + saveArray = NULL; } void CheckpointSetup::ReadAll() @@ -72,8 +73,10 @@ void CheckpointSetup::readRandomNumbers() // First let's read the state array // the length of the array is 624 const int N = 624; - if(saveArray) - delete [] saveArray; + if(saveArray != NULL) { + delete[] saveArray; + saveArray = NULL; + } saveArray = new uint32_t[N]; for(int i=0; i Date: Mon, 4 Mar 2019 15:29:53 -0500 Subject: [PATCH 190/199] Update README, CHANGELOG, move the GOMC move to separate directory, set the phase shif to 90 for dihedral parameter for n=0 --- Change log => CHANGELOG.md | 14 +++++++++++ CMake/FileLists.cmake | 30 ++++++++++++------------ CMakeLists.txt | 3 ++- README.md | 4 +++- src/FFSetup.cpp | 5 ++++ src/{ => moves}/CrankShaft.h | 0 src/{ => moves}/IntraMoleculeExchange1.h | 0 src/{ => moves}/IntraMoleculeExchange2.h | 0 src/{ => moves}/IntraMoleculeExchange3.h | 0 src/{ => moves}/IntraSwap.h | 0 src/{ => moves}/MoleculeExchange1.h | 0 src/{ => moves}/MoleculeExchange2.h | 0 src/{ => moves}/MoleculeExchange3.h | 0 src/{ => moves}/MoleculeTransfer.h | 0 src/{ => moves}/MoveBase.h | 0 src/{ => moves}/Regrowth.h | 0 src/{ => moves}/Rotation.h | 0 src/{ => moves}/Translate.h | 0 src/{ => moves}/VolumeTransfer.h | 0 19 files changed, 39 insertions(+), 17 deletions(-) rename Change log => CHANGELOG.md (88%) rename src/{ => moves}/CrankShaft.h (100%) rename src/{ => moves}/IntraMoleculeExchange1.h (100%) rename src/{ => moves}/IntraMoleculeExchange2.h (100%) rename src/{ => moves}/IntraMoleculeExchange3.h (100%) rename src/{ => moves}/IntraSwap.h (100%) rename src/{ => moves}/MoleculeExchange1.h (100%) rename src/{ => moves}/MoleculeExchange2.h (100%) rename src/{ => moves}/MoleculeExchange3.h (100%) rename src/{ => moves}/MoleculeTransfer.h (100%) rename src/{ => moves}/MoveBase.h (100%) rename src/{ => moves}/Regrowth.h (100%) rename src/{ => moves}/Rotation.h (100%) rename src/{ => moves}/Translate.h (100%) rename src/{ => moves}/VolumeTransfer.h (100%) diff --git a/Change log b/CHANGELOG.md similarity index 88% rename from Change log rename to CHANGELOG.md index 29c87a58b..4e47855d9 100644 --- a/Change log +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ # Change Log All notable changes to this project will be documented in this file. +## [2.40] - 3/15/2018 ++ Added support for Cyclic molecules. ++ Added Inter Molecular Exchange Monte Carlo move in GCMC and GEMC simulation. ++ Added Intra Molecular Exchange Monte Carlo move. ++ Added Crankshaft move. ++ Added separate cutoff for short range electrostatic, for each simulation box. ++ Added reporting the molecule density value for each species. ++ Added support to process the configuration file's keyword with case-insensitive. ++ Changed printing format to scientific mode. ++ Fixed the overlap detection with hard cutoff value. ++ Fixed a bug where, cutoff value was greater than half of the box length and no error was generated. ++ Fixed to the bug in the updating adjustable value in MoveSetting, when we have more than one component. ++ Fixed to the bug in GPU pressure calculation for NPT simulation. + ## [2.31] - 5/21/2018 + Compiling problem fixed on CYGWIN + Fix to the error checking of volume exchange if simulation volume became negative diff --git a/CMake/FileLists.cmake b/CMake/FileLists.cmake index 0136e7cc8..892076250 100644 --- a/CMake/FileLists.cmake +++ b/CMake/FileLists.cmake @@ -74,7 +74,6 @@ set(headers src/ConstField.h src/Coordinates.h src/CoordinateSetup.h - src/CrankShaft.h src/CPUSide.h src/EnergyTypes.h src/EnPartCntSampleOutput.h @@ -97,21 +96,12 @@ set(headers src/HistOutput.h src/InputAbstracts.h src/InputFileReader.h - src/IntraMoleculeExchange1.h - src/IntraMoleculeExchange2.h - src/IntraMoleculeExchange3.h - src/IntraSwap.h src/MersenneTwister.h - src/MoleculeExchange1.h - src/MoleculeExchange2.h - src/MoleculeExchange3.h src/MoleculeKind.h src/MoleculeLookup.h - src/MoleculeTransfer.h src/Molecules.h src/MolPick.h src/MolSetup.h - src/MoveBase.h src/MoveConst.h src/MoveSettings.h src/NoEwald.h @@ -125,8 +115,6 @@ set(headers src/PRNGSetup.h src/PSFOutput.h src/Reader.h - src/Regrowth.h - src/Rotation.h src/SeedReader.h src/Setup.h src/SimEventFrequency.h @@ -135,8 +123,6 @@ set(headers src/SubdividedArray.h src/System.h src/TransformMatrix.h - src/Translate.h - src/VolumeTransfer.h src/Writer.h src/XYZArray.h src/cbmc/DCComponent.h @@ -158,7 +144,21 @@ set(headers src/cbmc/DCRotateCOM.h src/cbmc/DCRotateOnAtom.h src/cbmc/DCSingle.h - src/cbmc/TrialMol.h) + src/cbmc/TrialMol.h + src/moves/CrankShaft.h + src/moves/IntraMoleculeExchange1.h + src/moves/IntraMoleculeExchange2.h + src/moves/IntraMoleculeExchange3.h + src/moves/IntraSwap.h + src/moves/MoleculeExchange1.h + src/moves/MoleculeExchange2.h + src/moves/MoleculeExchange3.h + src/moves/MoleculeTransfer.h + src/moves/MoveBase.h + src/moves/Regrowth.h + src/moves/Rotation.h + src/moves/Translate.h + src/moves/VolumeTransfer.h) set(libHeaders lib/BasicTypes.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6af3884fa..90bfa2619 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ project(GOMC) include_directories(lib) include_directories(src) include_directories(src/cbmc) +include_directories(src/moves) #fix new policy of cmake about FindOpenMP.cmake (will have to check later if they fixed this issue) if(POLICY CMP0012) @@ -16,7 +17,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) #Versioning set (GOMC_VERSION_MAJOR 2) -set (GOMC_VERSION_MINOR 31) +set (GOMC_VERSION_MINOR 40) IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release CACHE STRING diff --git a/README.md b/README.md index 834058523..c6c3052a7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ # GOMC - GPU Optimized Monte Carlo -Current Release: 2.31 (5/21/2018) +Current Release: 2.40 (5/21/2018) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/GOMC_WSU/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link) [![Build Status](https://travis-ci.org/GOMC-WSU/GOMC.svg?branch=master)](https://travis-ci.org/GOMC-WSU/GOMC) We recommend the [GOMC Project Website](http://gomc.eng.wayne.edu/ "GOMC Website") and the [user manual](http://gomc.eng.wayne.edu/GOMC_files/GOMC_Manual.pdf "User Manual") for further information and examples. +To cite GOMC project, please use [GOMC SoftwareX paper](https://www.sciencedirect.com/science/article/pii/S2352711018301171?via%3Dihub "SoftwareX"). + ## Building GOMC on GNU/Linux, macOS, or Cygwin: 1. Clone or download our code from GitHub: diff --git a/src/FFSetup.cpp b/src/FFSetup.cpp index 785d415cd..1b635681b 100644 --- a/src/FFSetup.cpp +++ b/src/FFSetup.cpp @@ -273,6 +273,11 @@ void Dihedral::Read(Reader & param, std::string const& firstVar) uint index; std::string merged = ReadKind(param, firstVar); param.file >> coeff >> index >> def; + if(index == 0) { + //set phase shif for n=0 to 90 degree + // We will have C0 = Kchi (1 + cos(0 * phi + 90)) = Kchi + def = 90.00; + } Add(merged, coeff, index, def); last = merged; } diff --git a/src/CrankShaft.h b/src/moves/CrankShaft.h similarity index 100% rename from src/CrankShaft.h rename to src/moves/CrankShaft.h diff --git a/src/IntraMoleculeExchange1.h b/src/moves/IntraMoleculeExchange1.h similarity index 100% rename from src/IntraMoleculeExchange1.h rename to src/moves/IntraMoleculeExchange1.h diff --git a/src/IntraMoleculeExchange2.h b/src/moves/IntraMoleculeExchange2.h similarity index 100% rename from src/IntraMoleculeExchange2.h rename to src/moves/IntraMoleculeExchange2.h diff --git a/src/IntraMoleculeExchange3.h b/src/moves/IntraMoleculeExchange3.h similarity index 100% rename from src/IntraMoleculeExchange3.h rename to src/moves/IntraMoleculeExchange3.h diff --git a/src/IntraSwap.h b/src/moves/IntraSwap.h similarity index 100% rename from src/IntraSwap.h rename to src/moves/IntraSwap.h diff --git a/src/MoleculeExchange1.h b/src/moves/MoleculeExchange1.h similarity index 100% rename from src/MoleculeExchange1.h rename to src/moves/MoleculeExchange1.h diff --git a/src/MoleculeExchange2.h b/src/moves/MoleculeExchange2.h similarity index 100% rename from src/MoleculeExchange2.h rename to src/moves/MoleculeExchange2.h diff --git a/src/MoleculeExchange3.h b/src/moves/MoleculeExchange3.h similarity index 100% rename from src/MoleculeExchange3.h rename to src/moves/MoleculeExchange3.h diff --git a/src/MoleculeTransfer.h b/src/moves/MoleculeTransfer.h similarity index 100% rename from src/MoleculeTransfer.h rename to src/moves/MoleculeTransfer.h diff --git a/src/MoveBase.h b/src/moves/MoveBase.h similarity index 100% rename from src/MoveBase.h rename to src/moves/MoveBase.h diff --git a/src/Regrowth.h b/src/moves/Regrowth.h similarity index 100% rename from src/Regrowth.h rename to src/moves/Regrowth.h diff --git a/src/Rotation.h b/src/moves/Rotation.h similarity index 100% rename from src/Rotation.h rename to src/moves/Rotation.h diff --git a/src/Translate.h b/src/moves/Translate.h similarity index 100% rename from src/Translate.h rename to src/moves/Translate.h diff --git a/src/VolumeTransfer.h b/src/moves/VolumeTransfer.h similarity index 100% rename from src/VolumeTransfer.h rename to src/moves/VolumeTransfer.h From 4fe9f0caca5662f3f7b6b6199e6ae56a88315e54 Mon Sep 17 00:00:00 2001 From: msoroush Date: Mon, 4 Mar 2019 15:33:03 -0500 Subject: [PATCH 191/199] Update the GOMC_Manual.pdf --- CHANGELOG.md | 2 +- GOMC_Manual.pdf | Bin 1915839 -> 1833807 bytes README.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e47855d9..94cc04230 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Change Log All notable changes to this project will be documented in this file. -## [2.40] - 3/15/2018 +## [2.40] - 3/15/2019 + Added support for Cyclic molecules. + Added Inter Molecular Exchange Monte Carlo move in GCMC and GEMC simulation. + Added Intra Molecular Exchange Monte Carlo move. diff --git a/GOMC_Manual.pdf b/GOMC_Manual.pdf index 91a03d3360f1d760014d8c20cb69447a7525ec4f..5067c62e4c981e1cf114d28a15361954a8e41423 100644 GIT binary patch delta 536125 zcmZs?V|Zmj(>6M>Z95a&6HGXDclSQIPCq(OQ7MW^FtRdn!c)yG{9A!%C1oLXFt�=Z9yOHM6&HwIt=? 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 z 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 RURqL0PJ%^HP}2a(@-I|akq!U= delta 616681 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 W-$dQ?}gbXX^euqW+R`T4tA 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

    L_OyzYjR8{yrojBY?#M5Du)Z&Y%=xGnYfI- z`XCpWDLMOKS=YX7(7JSlM9nDg6tat(Ph9SoM_d?oKP04)Ovpxc>r%7GK)p~YF%i_- zMp+K9CC;9StJteU{xo+9I*>&7J=9VC98gXrQK(;F#KfzyZ`92yva@jhc_%>z9qezo z>wmUDIFdwH88Xe4%hJW$Ke0b2`cb{xH)C#ujM1d(=jLoniM`}mH@j?LvzdHy57vdP zJwpa>&QYZU@knxO7kKcj`|KoF<{0pOG@G=9)0Q=Pr&E5h*uB^0#uaIaP6MxvLRP`5 z@HbBkS_MRF$q?gC58Zw$65_7)RU@HQjHaZbhFa=mQw@+^u zuP(N^6D&=cn#PPalRW4Y;%({j>CLrcfc=daqM5BQ2et%IfNWEhXjAo$fY!DOAtlpj zmN#%a32D>WIXaN1%_!J1*#-8E48hUkEZ1m3s~dmq)C-yy*O6t=7loe}&5ag|$C1+= zs!l^yBx)=LP#V@;qjOz6htQW;|J-H}zivza!@&A~D&wj>R%;x?ek&kVRw)xBQ2(xv<4ZLW5M@EWoR*FKaM~H_0tP;t| zG7k~Gb2OTK%k!Z=cJYGbF}9(3b{V-Qqqq>LQx&EEk>cTHe=Uxrd+uf!desM5S}R!; z9`j>gHdTg;WH1cI!eYFk?jRVor%%98uv{ksmAnE>C~781xZ9EyKe?Bk)=950P}q;G zCZWLQYTJs{Pw@{mc^0pYb-(DAub_l?!gEI0Rg5wos-*ruNSHhV1R4?=6)8!P6GC zat~}thb*%Oi#{-Ix&7sVgVV?hFzwh+b2L+HHcGBw=K5@bGF9xBR8y9YjWd;W38kq3 zzThHlW~fl6RT;5Hx{99-v96afal#*#t(+p^I0|boh;F02=hXB>f41y|?KMw})RwwN z^yAy>Z01+_nvf<{w6QBnV2-!D)%-9+2qMhf)&I}XWB*Q??8O3WB0(Tq@pwRr5Ho&s zW3}09d(P-r@pH_B`OqYK2Q~dwTvs3Hec7#%$JB|cQcgN*C+|3$K zior?hK5kJf@t`&M3}!gPtVRX!`uYDxv#@Q+qM5bH?j_;Rg9RwPB!Bwds_$_{`cTdD z53KJ65j(wtRD_UXA@vRAI+)EWY&5nmCkW@RB8e96@&0KMDjHh)?jf%Kw<(N80pMp6 zpDn0~|70?&;oT_Qe_a%$R$@CucX5pyOuG*iR`SNHMjG=D9UIiqXT|q=+w5sPLs# z42kPa{shy!EoK&ZrGh0E7QpdNlSj!uYMi0B6Ru5N(J5t(tRuEkui`uzx=i?}Y!Y>U zjhP25R%(neKI5EH`XtekDKgcX8~H)NWgF8_6w7(dKJ4+z*&w#&G`+`&L(6*_VG8A| zzWbK(Yz91ewjMR;>imKWvd52Znh01-ht&JH? z>Adv*x8kNh-ziR}58^mS8Xa3my-$8uN&{!OYmu-xtUrK<`D z`}n}5I2w1k+XkRbbNg!cXvUCH`%?JvOZ<@zw>YR<>2kp-h5N70Cq~fU%^VdLKmq7EF?$eZ?YY&4^SsMpiJC3FSf}!+U54O(Ravn1_Os#L+V>5$&Oy_ zdOvLkcq1NHJ_(xsjq7@!JsVZjZssI`#zY?~6nJTIvW~!IA$c5Cj(_P57`ySV2#*|q z1(sZ%?n_bwX90I<(3_6^lk;PPdiFdW-A^RzZ)_h5>hXEFmDkRCQSWG^euuBV5bI?;Z2bO9|3J$dA;_gCodnHMi2=iHPSb68)epA?s z@vls$oE8!fJQ`stcVA(uam;2K90tGE0&J$P5IV39(A4<%3$@-fm)WC~?tgs&_a;0H z=LC8BaAs2u5_;HFnRB`SzWYpkqYGS7eJ!e!WsdI;9o*AzY-hw$Bu(a&r1P5AG3E9B#u=&j5P_Gn z9?b^;p+?MAMP?cyM6p)bGH66I$Z1((S@`F#uenlgdhqo%FoFRUHa|+qS)^Pl(nKEO z$qo>7mUoDCA2FOga~muxs+g5zj)#Z?2Lwcu4&VKMti5MgQ(M=v85D0Jr?&o>mbDi_!`|;&Z z2V6OG>G&}K=(FtQ!^s_eYZI6i!BUzO_%E$SmId2xFhD@(Tj z?uP;xgRvz2r?XXpTh~esU0nxU4Ip;24?PIbboNa zoTcuolVO6TK@~)|>pqj+bH*^a+NkVBJkX1ITc}2PqvjJhpSEhMq27@+CtTI47+DZE zuDf3u_|0|yGoyy_lBe`@XuW3gxms$o!7J`FW@r55*|S3DzJ4W_xM8lg-$|Fg1IqzH z8MjQ|m+Zjg5zF1>l_pyyP)WhXxmfa5p2;qkjA>#-fh-L{;H4)U752(=JOunjyBoaU zkL%d_adrr5FgK@mxV&MW-6E`k&vlWrly=hqTIv z#sU7qN?`w~7h>{+FRF0ig zAS-c3($ofN0?JuKLwt#*=<%FFq4Fy%Zo6Y~dOI_G5)G+Y^jcwP;v3jnN;=NcAet zYEvw6h)jh=mZUZmkJk;R+`N3rK9uToWZas2HO-X#(2cR4CG~TdkHMqjl^<2#@QnBG z?0WpOkqIPJS^i2E!u)t4jf{V4q=2BW%od;DG?=-3NlKP(0h^^uh*=r%4cvSetKNNu zlFSERmJ$9;&`&~5>qxW%bm?-g- zd*UV1&?a!XIqEI(X1`*uHZ7z5mI1YMCw-m{Nj#jPA-BLdbmxwE08_oHY>Q6s<30gmR0}%~)skY6Ftr{#CdnuDi|h zQCg;{L~`Ytk=+Zd%#lRNVAtV0{R@7gra7dLp&tC3M=Q&5Q=Q`oow~CZ(Y7Vve z+qk!e5mB|vo7blxefssBMu_{h6+2Y{A@m1pc%PJHf6lX=t`(saP+%sFwRFz zud37Z$J$^2w5UT?I{JsoNwydsxn<{2bK&D@gkQb;K}KAA*Q{AtWmEli?1n?R9j7$R zdTB|b8LHUqqPtRKb7${Vi!`l%WO9OZi!$?!tdEq2_KaeIG*`Di>><}{#>=l~XLJ__ zdlCxrLmUmO9A8T+F{!zPmdi+fQSob(&3kp^)^D`#lJ%z6SfQQV+Pny0g?^-AW!93&b&ctRZO!!jsDNJ?i_>yT}tMk6y&5g?zb2giT_BuGciEChn zNnZKm^ghV0nXw=jfBLbn{JqB)YSV$q4GS7ZB9$Q?GjIIXxorEv-BU9a$}J0}!oTO& zx~3eosOW0+@rn`$ue28zb>2Cb2_yKP4LAy1Fax-H<-V-KP(xr+N$a71H{dG4v z_NU~o*nJju>VhmO8C#0@ zbEC47`wm@7A+%Euvz&*hv&^6C6Xl8D`G2)&5YvArk{_=e7UEITIW!Rc*HGRQ)AA$< zB5gvuH3!eNaX&`B_XD-ZJ9l8Y^xdcWFI;#tQoaVUqlS-2Fj99*ZSm{6TEY@u#L#`}f{tP*3*KiX_eVv;z~oV$ zGqnaDnGCY)R%c%o4cG4;S%kR!vuRpGo-10(X{^B1+hP;qOGvT2=wOwLU0FJY3 zKCl%Y2`fVX%RW?$A^#9Pp3g#k%~X`LOcoH%`R<&n5O;;f=@s{6ca4qgyP2bYCSv)| z@g_XOvVCMo?rEkT3-t%*$2&$XC;sReiT_v6;*>d40lgcotq0rNu9PL`N@~T~RUXuS zqa-G7`$K=wP@)7p)P^Xf*o_8BP}l}W70-9nlu};l{x=X#(+!>ur|iQ~3_`dl9gTya%AGD7fLXn= z6E3#&O>IpTdQsNpg0R_}+ZnEYwT4cfJ4!RJphr4*P=u&yVN9ZaQR?i(PV5O!QiHo$ ziYbxE)5Z}ZQ#|(Msj3ry?GL{3|E&@&TI)LLRf7{V9nE|l*^lh|s?kb$T~}pE!Dt&Q zCwrc!^aWJrK+cLTG4i(mmdIoy*R==plL3S95oDa(k(E+HH~sO%+DKP~)sK&*at@#e zn$%xbD#kzC6gU=%;mex)Tt4RVA!)i`zzHlk$>K1P^OLAxb#|bK! z{fxFfSR?$MeDM0Ow$SJ+`8t{zclHL$Xvf`ofGjC2i+qZ=D^H^U*J#Txf1M4S-2lP# zX~vhN1{LMbJ)ts=2#)TYKe0LqYg2mLZS!Hhbi_Q4?~4>6axNpXmsgGKB`=RN%v5|D zn#lSSOA`%tBtc*co<$NIebaiF)9OebbM80YKU9abaeF*|wN3xV(V`C`7a0#&D43B1 zxsLUU=jgJ5YD3JvLBeg&@2hEslJho)et2Z*M)iTQSwb>9l^@kKP({B%H4ANqi(Wz5 zO`ESd?-z zNxpvJ8)adv|JB$T8aI(i!pHoB8!wj)hHm^4rA_%_3H9)%N)jW+A3wDkA8vi*1gh|| zCxFbSuyp9v;JO!6rF|wrs;8V*-#(~Aso1{Q9Bf(&vX2>v1V<=JgCg>Q_)?2yWozYm zb3}8zA|irJUTZiuFZK)+Xh@|HhkhfhzMU-a;nor|gBsQ<2-R26VCYAeC1up_M6jk> zdY2ogua%=ZrW(^R2{B(MF9ZjOU7Y z=_I3-Si5wjC;-gTA6?CK3s}ASE0c*(k7{s9~|eH{6LD7YZT+Vlo;sM#iL%d6Lo>JGQo3_2X9vxZt+r*5p^J{myn9PH+m=D5r@ ze>`YYl4|+Ipwk;d=8*fS#Ma}pn+pmM_6B;=NF(IJFKo`>_<&n0VI*zU=Ty{`>wwYx zyP?U=t4+v9h2ZMNitH8J4S1l#55;>zz-%5P$zbiM`<0Ry6V@G(q?TnbZ89c5zXrj!+6PTdO-Sr4YpzwZxpkAbm z0s`D07f-IU7a1#Jqq-}6x)i0MaOcB>mJ3B7rciw;y`Bpb>P9yf=)mdCbYFk`}R<|yf!h~3t+BUtGoPXAQ?m6&@KHr3_(I^Bc)ka`7>+a#0@Av#@#Dy znr+WjDf?E=`=W$H(os2?W)s1{Ey>+#T?m&bDO4A^tEPFblToMpnHPDq{`j2#_z*6B zL9Xsn691F(Hz{Dls6psX=TaSY$6ObZovuhZ#BX zPOKilKDQ8cU+On->S=}SU^01)YO9Uv)K#?5#8($zY<*f*->cw!{wKa z%!_|bzoz8__XR=dx^wuZ>#6}43|ZshguRr@8TwEEu+_nS%mLf*)Dx1y+j$_Z$wv3P zS<;us(>@8&BKBC1XAdsZVKT+^#jnG>(Ef{A9;~9B68=!)gFfKm;1ip;iJMW%#EO?g zUHe<7z!tgw!6*L9K|>bVCBJ_iZjX|>J~8oAmS2{J*hF}+m`ZBj;Y&peCA4y7zT=%v zx1NCQpN`M0gZx4lerPCgq{`m$1sT5=pms8zEiweZCuQSCOfjbV24NMBN zA1D<+%kKfW9?6DnpEj;Or(sJoTA!TIFTHzhDSy6|T0OcE-o^f&6%*^adSIp~8Z1y= z>!TYpOdhHffXfnVHzI-`-p)!PLDR*Foj=3<^eMa%-tX^v=zgZ<)8KHtH#y!LJ+)wI0*`3`JzUyiEo43nGfSu48jb?=0luoUK!^-S-8Pr2Md~ zwY6V#c|BDG3Ug^`fMpWoTG%NcNR z43?GX;=H*(IgGFk%K_=fd_whR&3@u!B}vvOn$A#L*(O<2^IZKlMw**Sy)uG9HF>)I zdqP?%nWpQ(+!nn|eYJaOiRyDvWyd7SqisHpU?DB;{2o%b0ZKIWu1>fP0sz9@z_siLcVnY-;D5! zkqIgXfeD|WO>&wkyN4r-IiaD~L(h-S6@z>0tYbBMZZmS7jc{J10YOx*voGX}xNMfb zI3Sc%x%A5VXk)iG{v`9SLA|~$28QXJ-?#>7Kh3H%DYW0usM*+rJixSW@LpeNPp z?mO|95a?maj0TFXw^;*a+VGXywwT?t#uZ{TKZ)0JxaZ=61yS>+SVo!CIc0HqEB5Md zZAAH7i?+8)RXfczcpN_zB5q{pnlnvHU`E30ajF7`#wF3b*}2I>r5v9z#)AnVvNX}_ zfG>t*@Hb-UdQvEJOq45zuwW`djo6GaJ>Zoih=h0Q;aKoN7-reP!`Zbgy_bZ1Y9L^j zL~1$m`r`7q1hnDI@RjcYff_YriZBV>UVko)U-Eh7d)gufJ3X46E|1;oR)PV%as9(> zD%QoUS}k{gtu>83R5VcMi-&ZAx`gz6b{EG?fyYB>L*Q2gwuRQ5-P6TmmA#~WRF@ne zuF~&%U^h9(B1QLdE6{KCGJYK%ln-{6R#!VAkwp6Lv}mv_EkJnz;_E1i^Q&QeL)TAG z(%!q`p2}wLqBsM+<0)uO0Q^VGMBUCA30?l^GtUKQY9C|ROW(ep)d|%wj+!IXPk&6R zl_FgcJ^o82Sd}V`&I@cso?)YzHTO z_+WB`tsgHlf}wLRDL>g3SUtnZp02{5*PgEK)~RHoW{{qb_vysv^}BK-4l_5vh(>XaY&Sh2s&8qzEe(G9g)qS{ZFVK;wcqXD49}3 z4To$~Ga2W=g_E=7*o8`ojvokT4mk4`8@f0UrO2A5X-xRZvat{m4QJ60{iYKVP=_C1 zpwii40Kp>C2Ow{&@y|;R5wz&z9Sxw~7r#65 zU{7ZC6PmybBM`8Nv++{lld&9P<>X)iwj2?#Px;Dsb9XS5 zt^Igi4Cp{vG#=)-)1ILL*umrDgY`lf;>NTQEgz)Mn{l(z(_G9#8aPKv%-++3Nm`JL zrOJO@uE7g4(}&9^E}{_(>})QlbAoFTHtikmK55$+P{JPFG!9ZXZg4uaF*!RSw|KYh zCpLa_NoCQ*f4y93%cCx+%Me;P7Z(jQJgch!@9rNby^}X}ev(_+=Sm5a6&->Z^8Cph%U*y_5cA6+ zCiu7Q?O$SNhlAwzA_-g6<}Ofs##*}Eprz&-F-I{vKOf<^%3 zWs8~jiWVe#&`EuC&MC1bQb$GNjT}o~ljOF&bKH!GlL=^?NAa4s2Z|TY>aBKRBclO) zC+ciDe8F-GxUgRQj{PDAV>I?bzj~Dr|E2rE*-`4*N~af`VjUkI!&2j{St+rfBn8lO zrA|(nlLXPt9P=)uKpUU2x;Y!e)SY&-j_93~rfns`ApYXBeRAHY(P17mZs87s-t>M7&zJB zb$lLux+~bX^u&ZN)ARIs@#%t>sS$HDzkp95X9Qvao^5Ap=oWBl)h*E&&i9(ud%v|_gATAb>k-S+E^flE zrR}Zd9HW|ESZoiSC=4dW9xlH>_GrQ{JFiaI%x5)Pr}-`2-vtH{DMz@ISL&T~k!+ir z+Joy*6!qCnbif&Q?CGjn;EJ9zCe`-@ThR*FNsGy>hV8l1{3U^(S%&XrvdVJ*62p;Z z9W9;C>!|X}H69MS0f>zlu9(`rnW+tyW6ZZMTj-&{KY>=qCagNn`IP zZva>sd}o@(G?Z;{O*o%>>ncSbR+lSKfgybhyn&V8fY+YrkUnQr=;A?~33K?fBKK^T zG?wLk4Gf#Yx1XE&OQ%h0KdzaEmZmIeZ?86V(h_<>Ep6Q}8v0rKki__Xpt|2SOE?Kn)yIA$2RhR>R5#H+mBEbSEU)ahy1P)>9M z5^#&np*uYeV$Xra1cDm6gXE+^{QdJe$$e6Da)G#(%*4PPONP@$wv!Q5gvK_iylfwI z$_Gn|I|+(tE2r3N6_&;_Q(0%q^t!6e;37T+@6IGmjZ$%(w$!RGJ3J(~k%DyVjwZj*qP zxXI2uza=O8JxtEKp`(FW+I#yU?gsN>lWKoWH$P;*{_WL$RrNp054U)SK;; zUCPb#%od)X&!|tr6u`}j_wQU05d@b6UlyPi6%{1odueHFZR7q>OjI;MnnvWZ0QjHX zTRhb_g~-q(R~smL^}ss`cW5q)fNwp%M|(w37}QL{0eD2zleN6QDSv$Om7}t&ub*|o z+i>TjXN%|itVGT)XDIJ5YWZ&;?*$@>fM|K5_M#f%GN<#Mo77 zuLIt7WEWLFgyHMykNlRRrrDlvzU6wjF#~h(<(+{~`ZFEiyh;ODAi0n}_1!g2LcizPC7@ zr50CxQl<&@c|7xxZI-mxDu2W(b3&CB1h){-WTzqf`25k$Y}JR}R@dHqlSz4|pb4N1 zypVnpgrtdI8%dY(>TKuFB=`YbYq|LL$wO80w)q=0wlvwj!U;wNjLTlmGa+aR^M?A* zuUu#jpBWL#UAQ&r$4*)-A`EG7hxe_$D6(zZ9{81!aw(!V;D*uq*T%iGS^_B50O6Va z;2ksBw|JCz;W$wK53Evg9Gui#aQ@ z7?|{*xMv{d{i_otU7zxuSbz9GM4J!B&6)9_lg0XR%lx(S#@)83LNRxxq2;gRx_2axdjEIFoC;<|lHW7+ zF?z}JUB3wm=#Rh_zRYG}JZfFNy7E`dP6V#U^@T)Y{_V?+_}rJHLb!&Y#v%g+&Sfpn zLbgYM`&@hJmEzO_c(7GYB8F~x2gc=ltFX?nUv!Cagk@~QZN^lsq@o9YhsjYsDd_ng zFq(Hb$xB(Ajc-w!x*CVgMPGd^{VB#U(!jA4$u?1h)Rb}O~xQ#m3M1A2SyVl!AH^F_tX^~P#wpuQ~p$p zE2n8Y+?-Q;!iv=^)|3qT1r}Pi*Hd6Jv}zF16}x>e4qiIT9j)+pu|oQqiPe00FPMTK=9cae1nAzW~{$8O(>MSF?1PvblS*MAH*S14uz?-rH|n7@79CpVT3x8Q>6_vAF@E)QD|IE&GZ zO#G}~ca^}WT@UQEkp{Q6tg><~Vn|McdP^r;pm};NqM9bdeo~9igR~3k$n5fdytFJX zpbx@|b59xWbI{4cqN4n>l*qcBc_-kT?Lkh6GfU70>_5<{`GVrgZ{`?RZPmfJ_v zWuu+))d=||j4gijtuGC+E`9HjNXJLL;-7v@v_NvawvgML7EDt)YGz*?jGB&rG0;(G z$62FT%O#k0YUj&y#JMs~hzliOE(_{6C7|b~Ydg|BXiRiw-^Mo=?!V{?zLrz-1-$&C z{*K|BFyyF>Z(wv(0c)*QG4?dpFW;Yf&8Yu{7NZnaZ`stjznIVcjhu|V(btQuGF43V zZwaV@`Xxolh~-@ft^eM!zoopz9ENc_#sh2$=AU^aWTIc>UA|-wH0#8*W3XOV`| zPg~5AUgw;o5uX&72S2@_bQ0Vy%XEUEn11AMH*PQN0Ut%g^dA|(?7}|~ z3a7Hk0T@D!^#M9e+IRQV&oPCUM|^memBcizd5%>GKI;Ms_yXZJ?vDQDJn?d?QlPG4 z_H_`1!oQDOa@r!>+@%Jth+$Rf05xf3c>ODveU>!{vf+ockWN^g+8N&I-1%{`Q~Phb zjqL|cf;I4_Q9iYfPderc9~xqXMZtF&>|8(}p-dgEYNMPo(-v024wfKiH_)oG+`kw9 zRhs`j7my5X4LprGYwCNm+JOR^;1EiGNu$5h1%x#Au7P)Ku@321&yc5>!d73Cy!%2! zB{uOSm6>>9gLUZb|6C~fuX0SpCfe)vm;5OEi=pm6FY`0FfST2GrH;I6;Rd6HVkmo; zz>~}ul>g{ixzqq~RYCD-3+OCseWg?5nMn|K9mimIslnwgqm$r}0P#|W7f8pbz!1|v zOKg@-Y-V<$Kw{=M0=5Y)MtgGwjCRFCz>U-*3pmB_hyg+dB+d~4vnWD|B- zP|QV_r`obsr3`VTrmgL;Xjg zCSKTJsH-V|!t%xzmRGkIn*t$yQvmngkBqp0t!N7R3Li=w9`uE&W$I&9QKy49VsJi3zT=-bqMBdbL*tX*$b zyuFQw^gq8`_})7i)$q6~>=2PrC(gRx!=nM}Eg*4hS`rV_jcTMwd-G&Ve^k&rP<)H~ zHZ?=f4QPsNY?6(UGypCC9Ut)b8P=K9lrzRS1r^HZ30=?zKq(1{$)!Imom9% zfhqfrdY=iMlwPZ{ApV`f=T5S2R_IGmr3a;wW5n3^5?1>WKRx7GfRABj;KcQqaNeg+ z>AtFO^d@m9Sc+^qvUuIZfYE2&QJeT|{vs(9-?Yk^L~p)f8U2s(DD!YDj)GX{iu}6Y z2OHi_8Aa%d6u@zM#3czzRmMY`<<4fQnbYa^WlD2?N0(+okM`98`M}5+Wm(&O8cV9L z+P4aIcJ#pSHAf4_uqo+J>`5RVqGy33RFc6nFRv4D7RS ze=L{YeT-7Kck3?{A^E`3PaVd0AR1ZbVkhBB2EM*q#$A8?qn=5^UUKrWvsirNnfS7F zw3lJ!`@jmo(puykrva%B9+yqs_^01y7jp_Rc@tVDe3bQmI|@O1K{QUg?&L zp~zp!?0A*h=l8ybOis!lE$OE<`*fqfI8=R`f@%YzSPSZG$pOZDOzhi6`Ea}O8}j<6 zTNg?+E4IBn;P3oqj5lU^ya#prDN~r!ygS%E&Fj68kM>&-+O=q_%!tn7ZqeFP)9d<} zD|u`y={h$dh!M*D8TNR#t=?Y5*Febnb3K-PyaOxL!(i&Kp_T7-@w%FvouLPkF(-C8 zfM|Hpt{;!(7g5~zQ$DF)9_v2!z2wJyQzma%9`u-m%^Y=q=%L^}%CcOBKdVeeY}G8HPd{Fg0~)Twv^T3gj56vz2@zBgrH9S<9I&$_$T(*zRDjxKv1h$ zb$q}gp7;5|m1V=QuxIb$X!D*Dx7-oRp6A69k8LcsE!j^uCz<3v6el$Igto$+SUXHr ztFx^ZpA7!yw6i86N3|D2HQ(uG;$W%Gt!F}qj>wS>XyeX8O6lLzKM%6dF`E0&N2Py1 zHsc0;*=eyX`xe}J(gC`2Jk$rP1~T!hHr6i3Z!6jB4X)*+yLao_WeOq{Q}qiN#Ne`j zKZ`U;#dxi1+tHB)Y|=w5t7RU zu9q9u_|26OCwxa+DbheQc8pN4;YPE21v0#aRQxs~i`3&@^pbS*L8ismkoKkaweyfB%Qz8fQTbS?61Q{?D=_u;HL;dtIMe znKs_#fJ%)Te)5Y7Brp*0jlins!6c;ds5fGhL;yJUkw zmbjq$_S)rTm?^|Sf*1oRxezuG@Sv-n*0*`tViiAil3?& zMp;!)io$k^=quCPMuJ@T!y}#_I3qyP^51IxIr^o#rCt^Kz`a5==hqzR@tnacGMe2UVltjG z*Tv)*EuLr}Gk*0Cj$Tb?Syn8tmGJq-gjTtwbn>L3S56LSs#vc45pfjo9!p2r_B{*n z(L@m|k!yI8`2DL%hT^$hrD^=M-}NKKe`zbDp6G#ueBbdt8hn;zFE7u5GM>TG=q(Fu z{^jc1D3#(EhYQ!j2liMVk2PhgDTalv8_`Q2njA&hDIDXKsCZt{=pG|?*n)7UKL@dB9r5R%kLjgp3v(*LX$uk~ewbO9;F#4a zZ%oyPjpG7C_c#llKBs!r_VmZgE1sYv5;6USkPyfQiQ(M!0IfKW9&c#IM%)AY@(Mqj z2c2K~Jaz~x?2LRP?g^>Sj&2|r@9_tD)xmu$mR&$2v6rVUm=l|sv9DrAc@_eIs8U=0 zF{^>s9RhZ4kykf^GTyZ9YHM=IN$to7GFPsftI5sPlC&ECLoasU3^|C;yuiZ`rY)$C zGGA6s7#}zAKNp*TO%_aYWJj2vIR?tShAKKZIF$`fzsbGhIn@2s!k?LvcnecVv#r>D z%m3bjeA*)VD6o5+RpSxzP?#Wv80Z=EbOahwQFJ%cn#*^qqT@K!9TUtCckj6Z4sVn2_sbrSUPYgd+Oc`PC1BHyi;+-nLZd9asd}n2zRgj&cl?^pIaQ zLoi-S4j-DXvz$?HIah*>&p4Z99fH~mBxAuKgd$`hEzn_N4GBy;(?nj^+j4>EINZrN z&jK7lRRjNz#Sy;`foC&l0%zQBMm^jgdL95OF<1Xb7qU8Su~{5F*v+qeF7arCC^5+jTG(ex`oLIS&1bTz zvh1Zv`OBqaVPdY7P>blI<#7rI>fhwr&a2)5B?u_omO z?928fE1y>T$W0Q75rkV;aKKf=9VfHL4+eAlY{Zf{CrV>uYSF+m4$FHS&z`i|1sq6x z4vCm%tCT2wH#BVATIi_eHXnieBPKx7_i$n5_pPx(Hp4k$6*?IUSScBNR5gr7KQP`Y zhTPACtAF7!%09V;cPRC>HiEmf&4l0Z z>^0&vyvqdcryg0gXE2w2;fP1!SC6K82La`qH*AzX^ zreKjDHD;vev!%r~pzhK7n?*Br*m`XdaH6x>+V;&d@cVQ12fO4EJ3p>5PtsSCX-p71 znhat}IIsx7|5_h*#U)QIfHPR+(#0!z45yv19J_WtQl4cKtf}cZn9AjG(KEyg{IsKR zvg`8gVpAy2t>ya561bP^Ge{&yszeMXM>4iLX7a~w^i@OgzG_ymvTS-Vw zurF+bG$yOKMFh$0B?&sD2z^w(h2qL+U zK$QB7j&Y@r^2a`!_$m>G*0enNvB8bvU(@C`UN>G5NdG&MOBvlL&WxPi{VU^Y6Ms;T z5vW~L_h&+bRM2{ys@D-wf=J^?m0-lMv@KGjA|I_gX=&o+h8eLBK38nnqxH~j#faGzyIsG@u=qBU#;a@k@Pz(WUcH)tBAj(67elZ5nHhGn!HZ*7Byu%Q~K~@ zur7GD=(y~7l>H+VG3&GGD!DAK{bKZmEQha}n&wnDzZN#r15_y}&ao+2Twi-JsLj20 z;-GfxeLl%M5Mgko)#&eUmc9=YI?RG>YUlvgRr=iAjSjcVgH%>cB@waqE4R!cuU0c| z)axFtvVYhYjr5OyzQ-iBdjeLxL2$oD*C>yfR#|kti_~ddJf_fZ4A7FSP0Y?f>V^!^ z3r?zyRuv8m@-EcjwoMvU-zrwQ1l=o3)}TdV^KptH1t!;h@4H9lt%%rNn0cB8@V~I- z+vJD=gaQix#8~cY_91swFctDKU+?w%Obz+FMwT- z+wSu&n&I!J>+^m?8b`6u8Avw2B33tY&VEUK$9n1P_#r41O)(&8@#VbM`nE&~OVkj9 z8_R!JF%ka}->L*fN_4q^G_6zM;7?93xD(J;KaMD&H0ht&Ki(SJWEHyZRMtUBDK=44 z4+&jItWUS&LnYdGc88u@PvGN^pxdt=5tr-XKNK^otm`qxv#j}+=Tv6EKqzGO{hcfc zm4Jc%$u+t*1#USEF$>}yjYYPpdf5`}9a#=}VtRlp3$RNfPJ%?-@dr}rpS**jS;^7G zg<=GUsa#nv7)1A!u525&%=*ABu494qfmhrwuoV%!5V4E^KTY$p+>-ptxH@y~~BXs4eWdNtC*cRit>jr5!d22Xs7b^$$&WW^C|e#vck zcJfPd+gW45NDJt#EU$X_48zlH?0v$hT6U?Et-saYNsUJ+c_dx?9kBl%5cb=Py}&^&^$ug69NA(t_NO3n)lvQ z;=I3e|E2c7szm_5sCRjn^rCNRUf0ob#|hQDaRf))~>K|f0bVYi-Pu|@V%VYpy#>1OSz zTZUxi{Y_ST$)LQYWUY`}w}q7pM(v?5Y`VGvZbR&89Ndvp=tqwBYeMux6M$n31yz z$_+@74XXZ+B+~ej0=#Af!pM?hAgRHIcB~MmEP?3?W&_Ndb#wd31P4xeH+Xd}=ZX&1 z!PQ3$|Aw&hy?K$Nc|Lnu1*6vIvnNcFo#Y-%Wf?aT^Kf?v; zPD9U(g2{cKhuw9Rs*rc_BngukF?6)NCQ5ljb{F{7Le z6ZQ&TXcKQBUsCsWov`J$0_U znPz*_S0(AB>P!2d;4@2TMVC(+wGB13Oe(u>-HK)mlCDO+hrVQx}0?B?-p7@dU~9o zyFGP@-H)O5hEZX% z;wvz8hQ)yS8k%s6NCvvjwHZVHPNBPVY50M5B_JjKZ=%TAx*r1^{>b!0>E3zt z)UiCB`OKEH;R4>LEAqr<9|R~{tpLUOXVU=e8#R#vhi*mZcPxZb9Y{zF-0-J6hZHTc z6Ef1Lcj3tV!Tv1gLZswAOR;i3kbA9jmzyOP8_@((B0?KZ4!Q)xq494*M4vzCw?=EV zp0VxkvgSITrNurOs#kxbMN|MHklrUnvcBA|gawC$lxDVZ3eZTMN@J{Sz6DT{`TVD1 zQJkI4@=0Lpu-vPyQ7DlMg6^^d6ydX^5G?#9n`}HW^uiBf#=Wu~i6$~6$jPb3h7Af1 zPdea-mz_m6Y#)-L*I&H|MRQQM{I}sPX50GI4glErpuVhJQROT=S^c}ZLM3&3^Sgqc zOiiZeBT*YMFW$|^_RDr(ep=ojV`SF&5=hu|5S26y_#eCHizlA=( ztiKCZ*~KzHo%~$3N=)a-d_8d;L_m4U_Q^nWlJY{N&aiAWcyX}?jwCdc^~735Gr5Zd zpKLO4MDU{<=9s?i&VJ*o86=-9v+n^$!F{UyGA&=uY{Z->y%41d&?}Faxvf3~?Lwqt z@Ao5$>6Lv8)~?-fHuxSl7?h*bS&`>)KV%zKVD@PC^<3nP+rzW^82PgkZq0DBQx-pq znUQ`pv%WwZvz34<9lR^Va#xVsb=$8q!XW6);H1dFU~~D8& zjLT7^hj#*SzQZ$|_wMH1C{ed`8lQ*9HG4;{JqBR*)eO>w85q~1HbfZXk}lbPGg8xR zH)Ac5?$<;aCVU^~-OBx57dO#LAT_8e*)Ug~9E$loYWsm==~2JQx^g&kX#~Ly&T1Aj z{L$ulfZ+}r} zKHTo=(Jd+>g9I|3W+o*;rLAkW*5E(K567XnhXGqjN^7g^gsP!y+27uAn;IoXpe}AX z@TY>e&Vg)U?|LozUDmnHbk=3{Q98q=d_v5U=%(=;rgyD zCG6UGfr%m+hW$)zdV%lvP8U_@YWSb{zS~$B^eAugJ;AhJJq5*iCuWJQJ&( z-yC6<`(IjXpW2{DC|$6U2jyQ$Q$?Y`sT}8@;TnfHH3u)F_wMON6F0A(kpZm0>XsM7hWLuQC<|b(rPFF+$&*lJJC2drNz8zd~woJ4J`U``Xiqez=!XP zt3y7cI;MG}Cw#eGXgmWf+(9XwbmQADscml$X^*2Lq#vog;KQpZfVUjq(OCv{!lsed;Z zxY4N)_h>4I=>}E`86S(k7+2As^-2?-5pcdD5Ch+s?%VnY?du9=Bi<7wFl?p`)c>OK zjFE#Sp4I#rj83z4oQMZ0IvZaW|#~QQ@>Ch zB7`4Azb?gilLixa(=-hlbCXrNbHx+=6_11A#)Z+n{qb&4VUJH_z%yb+0hYxlMt2>C z@~XZ#T?+k^`Kjst-P)!lH9<__+9srszyu-bt|oOQSyZXVGDnz1fWfTedH?gGugb+q zi^E~!Z6hM^HVhnt`>7k)QWzS!zgN6PC^R7Mu}Q>DUM{5Q6Mg-i4n_fE{?=XLXd_`@ z;9g*RmYfd?lpMNv!#t+%fi`ePhlXj8N;-`SdAxH;xiqQ3+jzN8&0{${= zi8Fk6vg|z>$2@FtEP$8wc*~@9{xG^)?NP}KV21rEpaoycUU%cmuosG@-b50OLC{PJ ziMGru<|DrD{s#xLLJosIgBJX5Lh}gca}#e1gd1~*NrjXQPE_e+sby=zD3m|t717kQ z^GTT~YHf8efw-Gpm`N^2H8%nE^OKWSL zgt$&?N0}qHT3g3PWN2?QR91ev{Y71jp(!loLOE?;VXTKFL=Mx2AU_U;a^%(<9JG>mR}1^ic6G#dJuM2i5z zA_*P6%o(dBh)sF(A?Nd&p`yuqRcJ{ba>&&sE|J=M=zAac##D7!qS&G%KSKBu5F|MH zQ1!km8x;i9PAaGzcOZkb^Tz0K4jP2_Xcb@ZpCHMk<6AlOfAVBwlWivR5QPT)s1J;d z4a) zU1>XubpGx3Q#8}RIvVv4ZYf5RW>Vq8DY3Xx8T$0ERIG{V?xLwu!%cPkC5&QjJR}xd zNa(t(othD_9F;E-_f=}|1OXm|n-K+=1nJ-H`&kknG@>ML5~9T6ocQG(2i(Of@8+k4 zc}GCpL>$-4-^{9CXcAA*AF1wJ87H$8!nfUKU4fj4UjF%au&t6CtOwcmXH;*xc3S?} zxS#!VGLJh1`9BeYjQO3Gv}Ro2TfnR`tV?inBOvLB44gXmQx)ILnK3OlXB`iuEi+qu z7^z|RKS37*0>{}Uoh!~|6~o-{ElOAuIXaO3V@QeTbr@FpCivTrr-hLk@wN3QAA4^- z*&b*D`+i;xb}(GMj0U}p$~g4`XPxmw6ASuT;lIznH(_y;@cU!3d(f|@w=}x_{#X?5 z^Z&VwN~w7TPEin4qH@$pmtt6x$DpNeA^t0+GC*A>$D8Ol-5lr^A{Vth^ir;)l!pVL z|L(nVQJ1mcN#38&w#~SIfl^w-Xej0mqI9h&EGsl$`_s4&lWEVru^kix*| z&lWTs`#I?AA~9T2Ynp-S=W}s#vL@5k<(F4MHWTz698E3KqBY5jLv~29$%c$b4hca? zOZvq9#{D#7iMoPVTQ;I-j++9&jsei(??(m-J4*Vt+jxeB4?6mq(sd|Q^@H8{UPed2 z+*kDKBg^!_*4)2qESn|M7Cr_};xp(HDvLi!9N1rHJO(IgoxhKpOK59F zB<$IBizi@+@4_KE_Bwf(DUiou1X-D`vBo);SCK#4qA}cOppko zKX_--t~y~DM`{osKoXPhE3hB`E?uvm*^WCK+qHz0^4tKw=%bX(OGc2m$>o1m)$^w$ zItYazjx~FIF@EV6eJTJ+B4|zl>oGc>O4#||(MAh)KAnYoToA{8GYL12mCG%4c(^-` zJ|p2MY-e9(|7Ik{{(Dj#J%@XopFN#1b|rMK&mPSr!ly{S!$wm;urDTCRdlvd`#+T@ zsRy)vss8-kcZJhbvNtiBCOO_3{FMKN@;$>kKwKsn(z4_xHf{i+-JZLmr33fBUgrNe zprHOKqH5nsUg6_{f!#J=z-Ed@;2pQajKwP};&}C)iDv?uvoVg05)|z(k5<&6^crXF z{Yc@rf@P|dY^C=206h3gtL?NYUONf8$95Kg-Y|;8Hx~#`YiC}hybONsZj|MTG7f0tTBs^kCLBkL0hl}`ARcd;J-)TF@TwgfA;eDk4`!vG ziY4eo1d7rDp<0e_P3v6j8*>yWz3{Owf2G`%YO{}vXDs7M6iHmabHz_n}%z_WQCIK2!eaVM#A*pWKaviaXa>HgANl4f0> zwT2@kR4!-V^rv#dY-FvBvtua?a`Q&7f7*8K8V7z@mXQgL1{ZyRD<&#nzyyjI{LXg?M(d@){){vpv@W zo=D!|jmXmhUkuCOv5m|>l~D2DD`yLv^k``dI(A`JQ*JP~5d`k%#xX^SyZ!B}z#aM4 z5+{5&opM3zd@Ho=x z9b0S9DliY#$>l#ZV0}|bNT{x2Ydw@Yd%7Wo@ikCOC15pnPf6<6qf=~XQ+LEu*?USD z*8N&O@jNQr2{)SYPr9EK0B=CNKb~ha-%jIom=_oSy~OK~!kJCrV2L&mawsRYHfR1L zk)boU&*=;MJNu)+Joop(8J0GMrU(MBYsBvtV}xoA+o-2mYNhidgbBO;@rK8)YE}>L zLlWEXzJH`Yd0>e38O6jnFl^{y0?i(|m-}1n%8O`16(wlxUdz0aTa1KRhfx#M3=1-z4Fw+?ecenXJ2$;LvscuM zeTzVwT3^FV9JM4-yGKEmuydIxOZzWDFLYRXoun$QAg`yDr^rs%61&vn56ZwBHVM8z zw|Bn!=ur>f;c$lo{v}j@lKoM33NgM}MS^i*Ay$48^PPT?UonXI9to3>-1Fk`WDhk= zPD<|7ENjAr-Et*M{1p1{HAB$9VTYn8MIe<|M{K%_F=f%m&c ztxOgmHHnd3F-inWzI-En9`oMZ4G)}`@B}h0eJ85Nj#0o9C{0-b>p|UQ)Tb28^tIB?*hJaJo zBm#-zm1qE<=x|$0V+FlRrnbF3961Pl&LYXx2*J#b$n8pFeT#AD*%Jt^jc+ebOmfm} zU2DYKqG3;J?D&!%jIy14_5my z77X{T<#w1nSg+4GHI7S`5blW*W=dwgCFaVyq4^HZit2y&80DKjxZTQAClsHQj!?R=1h}?X%jy-MqR(8S1Y^)Q9QI7rzRu`oW{%_ z{s{+u+`_dmVe$jH^kh?jHZ4QES$k#?-GkZXrVXkeBqPzPTYTv-HuBR0`EI#zyF96r zOH8s!#K5f_0%rI(28l5rm#W}6twF+X_aPlSf(9i@CUA0HS0Oq-KLk^fl0JF*$uP)E zkCm{;rFDQWRdvi!v&`9^4dubT2=^M+4izw8fr=P+%lApv7Lwc}m1@oCDYMADwfV7W zp2=#D&sO4FsTi7fyFBn%Y%jp|I!vgv?RbeX?|xoT#sF5|LrK(rN=|@d+^BKCxw3@ zH#aL0;?7JMw%)~qF8^1b@>-Hoz6dDBT^NQdK{THj^p&(1@^>fLEULc*a1hON?u3WQ z!|pg`DP0!!vJPfj=jPbyJB5<+8i(jg(IBwc7ft1tm=Le0u;MCsP+>1 z4e_Y7$MWGKu)dEZQsHasNzj2TQe__Y#YP2 z^Db(9N2e%iqWwIndU820M%$F9hi+`6DTILPk#zP5?pLT_W~N}_ZJsVL(OD!_XffTK zfkiM>)&ufV`^f3Pyd{ecxXOq*sI1KtZ3y`c+&np2Wb)D^q6{cQgkBs7y>Gy-<5i6| z0v~;qdSVg|^_wPqzpV3&m5`)u2BuYb69WEMjFF|L{_i~m+#I=pAMa;&m_;3~{cO63uSNrK_a04DsZbPLS_U(2A)Xu5|lvF|@{wtHb zKD;k*OY%I@5xM2PN`B4M(P=rV>e$e1KuY0b>kz6WGtsSI)2d_V6-IV?O4vdvz+zMtthwSdv@yosHD)0?F+mj4u_kH3s0^L#t^o{65xJ z?x%Gc)u`p1ayrbzIoQ%AEG3l*)V}ZC^NVh69sOxSgH{88<%wwAnV;mhkdLiv+3>$v zK*g-oql=ITP0GA?og#0yB;$?8x1Wzm6V`Zl;Zuk3hr=5ePT5>0IC7cpR*p2QOq@gy zpRJO7w0`6@!-|ET$TIK#d>qf>t#+I(DK-7--_ETJUfj6lNU#}Xi>^98bhHG^8SQPr zV^WNFT&Y&8MWC;kff4fo;ba ziy^M+UV`=&h3U9_3$1r(v(xIkJ&78aJ`UTP-ww6E=!vFeLTa!rFJUKNmyuBm6-L7eGY;*gfC>b+D`WtDSYolHK7K6!kA-9A!>4JQY@%y{ zJ=9;2fC|O!#Cyge+!?&;B+w_8_o*ZxaLOl2zt}k?#qLD?U(jzByxgDKYR7pZj&7nVwA(v$oA{tfP z6!q&DLaobB>nlL4(NYzsT|%X1sg?zpqZ2S!G{ChOGtn~?-L@Ma85`{8U;wb0hBuAT z?s$7Mgy}-a3g=7omq#@>;i#=hCnx15%m@0PKkm zm$3bpbjLGk`EPHEU?-aC`FRscjou<4v7`@y!8|bDgzCqAs8m*ELgGS`iJ4YxPf{6| z&hpo%8^3lnUeT1%23`_1zW}8!-}00Q)l}g#nmO*|M8*=BSpL;^VR7N}fW$rXK{BIWLhOdl#KZ)~n*5ArLsssuVG(0UCp`t5 zUc;D>^{bCrIQUlvW_r`|$$EJx%<$HS0nuDmTu7$~bQE8$2|xZ}O-`2?_Vs&UGD6|V znOx7ylq~y6Zsk{rJ2uR@(G$!QH!thD4W)^V@BT#@g>1_M2rt2`hGB{?fR&Uu;qS-c z(kaSRb!{@LleG1#93=`@%g^&VCeNmCiX<>*IQ}!a(i=K!!SH*Nh+=^kYXGpz22`iL zGOn7SP~9u%rf<||&@?2HnMUBA%;9!)G+!k*vi`mG6oPqV%`g8Kq70gAh^%j!d~3`q ziNCEA;lWK??z72RTiAci3b-$~IjoZpIqC!=np8@;D!}IaL#51YDa>m2@Vl_|SDSBL z4}^~PXwOK9D|K-LxE=M9K7mFI=y5;+dlOw{m_|rP^ml}7lGQ2TBpo>C8l-NOXskAi zkf;Zag(}j8FNu2tfjKo+XqmXt1Z^Q2@5M2v9H|oYu_Ssc-?r8QOrQ`*Hhto9S2EOr z^lKb=+Fib_iaREJD7BP5^W1DeTpQr^#`B{)@3-gIsrZ`$rC9m`>m&u2}Pw91(e^CW~RO}zj$f|d?l{JepeiyE? zrlv-Z(eWe%-CY#}NSyi3nq=kFlh_W>XyMxH$_|{1Gi3+mg1LLJ?U^09_QeB_M8G%_ zK=H_gWB3UYXDcVeg7wW&8@Bm<#y9#KZ`Q!eL9-awP{V`Igo!R1B;JklO@a= zR@1dATo_#+*p@RC@B1&WsueCj^H2LcmMLn@|Bg%nOT7@DjgLFfon>@di7a#whibwN z*gs7H0y48R;7t#eyix3Nb?n_7Qv>jRIr#aKPBBB-wo|=DY&dXux1tEj&9(d>dJ-(} zX~wK~UI}sd4P|-A`GHWA{+PnXB1GijBvm#{cUS>qX-9qk32sZr+_S42C5b-z&u=>O zZ|k!)P*HlzTHQ2k6RbO@rJttuBV?lC?6C-t(&fR1nWTUzC2>MMKXpBAU)oF)({KcV zJL)k6A(Y1TJ_T%yQ(caWtJaWZk3pX3awbL15 zkPK8Yu@mLqFQ7SV=SG|NRjbRHy+t{YGJBYK{9Qn$@9|rpQbFBjakLSs5T6roZ6X@r zGSRV-LNqC(fn|>(?wBR#bv>mCUd1Qz%k4d0^sG>jp`2C9?d~wXBLw9cxg4q28S%l~ z7r)?r=|Ue?xL5Ac1^w6+EU9#&3ft+P_YG<6ZS&yTE2o;Y`ZrDBb99v_wr*@oWna*4 zWR|!#x0z0CX2~Ab_7{>w24GW9&h;@UT?Yh7k=_f*W^tn4|2dh zZ#5_A>h}EnOLyS+?S^_7WsM3~6LUa~Soptcr09*qbjZid-8gr}`MlYX~G6{X&xG@(JTGTuSM;jUDqt15!qSqHm zv)7%+O);=QQE$J3ZK}w??sq6jE32q!W!@T`BjjDEedIC_Q&#Mt)k+79z6$nQ3*mWk zE;DFO(|K@jKWwB$^A%SR21Y5pRjeb%vozdt`EhaF0RdgQ0q7ob!W7o#0A zu+{h5!;JU+9Z|vJdD(b?Q+jx780GNKeQwFF8&z|^0jb%c!5;!+vRRiu3KhT0jS!&C z!L$P)4zzl~)X$opJcAjYPD7dChhrJ2L?M+bg^)&|=&V_#7k_KpT4d;Azxi}?`)Fp!2ca(ybUt?9+V-?I41tqGzBe6< zEZmKrv@N$d&~w&!HeZNc?7MjJXICh*qE1|{?GdMw$18=#QBBgiChn3V zT2ZSt4>TC-%}C0hcr~f&wl^{Mqs@9#m>yD<7(pC&Q)iWE;_UV0YWx+fhTkanKc=NA z5KX7Q zmPX?VR}*;no_8Oh{T{d2+%iXW zU0)nTb#6aX78>QgLcr}2YPp<4DGlx3ek<4fW4onnmR$~tM!1Mq30*Fbn~HrGNncdi z+6#2&Bu$>-$+lz@NX3AcO_&lRY)k%#UKbJG?XH0ya676j5ThGWdt%#>xu+{Decz5V ziR>KwYo@7bHS?vJWd0Zy8zrnODe0=FmcX$1!94=Qis34aTe2$Wc$#lpZsC!rFvfk> zDNXA%+lWsQnHrN$aW#1QuXc4F9C8*_Oj@OQ_u*G@?CKH>O7vXg+;<8UnH2`VtC#fwwjn8 zDh=)siUoHId9fk~W_J9c7W^X5jYq1sV>i<=3UkVN|MPO^S!pcaVmOXB?enC?lkNwf zQk$7FwhYV!Z4NEKWb}!rS&eJS~ovsn5bccX;wSc=gV>2Kb$#Z;*vQIv*}zIiKGGo zjMa5btK`9Owy0(+`rxDaT1DPMneOf$qQnSALH1qLdXAt#ZI%2DMMU-M4o`iL6j|dm zjbFL#5e8oapfZR70Z!elARw)lVx+Y%)XGt<{$t45-ZwYqNl4Sz=+J6Hm@CDMV9J&xc|00V;ec!kllzMmNC}-JrPSK18hR1ZJjbH=s|sNNc^grZt$V zmbTHj;0s(jB7OGZq;dZp!)j#kx9}sM6tH7htgmOa-pq1F6h2$kW73gWUK3A zPa#^(+E>M%f57=Sm31-|!A~sgbIU?0JGgnYS*g~U3oFsTN6l{JFkqYRytMh3K`mHj@E{VTW5*CLTX9Iq z7V=oC{u;9c2ZhdE)gr^`nWtff_0yP4;w;6XxW+T`(j9XW*mQ(~pi-`t2*mTJN2a)7^IJX4@m0X`55>7srQ}z9H5k;M5x1z6IaJLsIN> zi9sNLfB(24E-L8y*H1!jg~P3;Ii2C>@IvDXU9;gT?dqt5>7Q4_A8EUe1FunFkaN6& z!jG+htkprqZ|1SOq~M;Wx-C|*|JZ7gUazv%;d!&=R@nb?v+0FPBvYX=TgxSD<}8Z} zJN@3-c^N?H7bXv`TN7bIQnmQghN(>#-_KQ$OQV)5HGB8GHXP)azj8AUSl0sX?Bl@? zGIdhZHy7P1f^=lv2iQvktG(oa_rY``ET$V!&_eBY)JS^W);Ofe&CMNmUWQF&!UKxW z^W)#o?>D4;&koCeOEPd+U^W$2S3t~hp-!xOviOEf2P3<6*GI7IU+%S~-r(yd8Y8$) zyPe|;`Nz-EZE!6LEE7$p60#taN>tk|BD{UyuD#dg*<5@0uQ@qizIr|gJL|O z)!qz+;{(}cA0C%e(63{ivN1}*84Sjm$+1R=J6VDQ(Gr3x^DV2swKeRz+W$s@95>-g zc3u}2(X^w+d}1n5;nOaRxESSQN68`3s^o0UyGDVH*A-1V5&9r=MU_nF;7Lc^Du)2M zq-9_zmCSptm#5(3pe$#gLri7T9FhZ?f0iV|wAo$}gLeEB^5k7oNX5XzpKE*T(VG5q z?xE1?n-@9Q*LM)c#%0HO7s6qpl^#9d0hNu8o^(y3UsTnu^-M;S6p#q5T}W|hH!KX+ zvSUUrL_|Ra5p8h$02f7NQF9~-D-1`He9T3=E>>-gxT(qZ)>UdjLs>rD?!>@#(d?6` zveWGS*5Lgvov58STLL*`6z!)(^b_ymZLIBFk97fQPw1q-8JXU@-2Ll-Vi;ciO*BD^ zghwo)0D015dKKHW!TnsR*K$)T3r7r3#n~Iaq*Ba}PCiuPSz1kB5+o9J|tXx76=GAgF$#5Q$hIit|gLX-^S zPA{k7ZVj}Kq`avXmO1CFZJK6|UzH!M&8@VpH7;2$P_pWYJlk)JDIh>ti|Ka`G(SIf z(&fL)uU{oi$f<*dCcZFk|Hqh4*{=1&N35`y1X@g_T6+0A^=1^82io1LuB2!~_H#ZzlCTWp&!)9qUna{gS^3Lw-7Qq~ zRjuwrq~;JHNO@?5^b%G6DCaBaO{f2HV=sbTW4uzfVgH0dDOb5|I|8Z*RdF0?mY&EZ zPNUFhQS1sEPC4&JOU*K#pwR1L`NU0JdOD0C@Luf>f^RTzPY669T7Tys9B)lD#-LMP zt(3uVfBS1Ee^W0n8Yyi+F+X4U&TW{0lq$Wzw-WPPwmgleo1Nq&k zYm3l6JIBfB_VuZ*_3n?(GJGIf^QRy52R6^TC@$fbj8&^g##xy32+Y&aF{!&$e!&<0 zgug#QIA5_*n+n(?r;MLNTrz8orQhzN`DMEp5)(FLB4}wMu6i=v3 z3CTGB{I%JrO2Ig)E_rjqUip(;M{04W16y-Rp^Qp$?F3_%^F)%E3j#5RjW?0iNgP+t zeK{aDgb?078zTGzbG})1p0?hWwR^W{>$IOU54voi(F4}IG2F-?Ncjm?T?hF97l>*- zOV}jMY0LuY_95AtR70AQ7GpfC$0?hGa}OWGY$EM9RhH6>>GA?A7E!HH)t?+pY1+35MLk=4ut|g+BJ?7@$fUf63`SyDGyTfL z!OjCx<`uQS(kjBoZ=W%Wi^(pfTo#B`E8+KyWQgL;7&@VS-CwjHmFugfZ$wHm#n4C0 zWUzvG{?+nkPGF#9=!YfhK4H^lVXcA-OXwHA0vG2PB)*g!d|nZ0yF6fFA2sdp4P&BE z$%Bev2%3g5r>S#m^!&%&GJuieqxh(=F9L=(+?+{FrP(%}xbz?j(j`S0xNvN66 z|87OqFQ$xkx=r7F3Ua-Q-jYTW1=t)YQ=Q6j!@|(_h*oc1D`{cZM+;RcoyV$x>8oYP zF+ot{Ei1n*MO?c(VOMpCA72R+QtTbaH)l~07Z8&aa5&Gvd0yaG<}pmx7>1XfK2BGB zhdpO4cpxsdu-Z;mIcBjj3XV~IaY`T<`_Lhyh5REF+URbxNU1{3VeB+~=%gXXJ|)Qy zs}Rg$^02Ni1C!dfa1*;Yqfh}@%(+}fAVelK2Xc(%wN%`8mjRct_AlBnku{XSMZJ*U zHI9~bFKDH}_Z!@y1rt{i5d&h0Ub_FjF}n23kgGt@)_=S2Swtk%|P-X0#{ z#|;VA`Yk)VaN%E5&U;tNAWP~u%rO)cbW4!B_*+4gs-)=am&Gd}3F zN}>G))=(XiKjrF8Xb_M2-cu+^NtG%D$z`|6H}Wyp7;?(QSv@r`4)yTnZO0&Pe1`cWxxESrSq5*pOpU`eC>aW zW}oST9JX*-$d!69y)rxNA+Kz*;Qfu82&CZEvxgQb+$&M`&Qjmj?bQLfGBh`zl=5;@ z`6%VdtV?;;fEVP_q*G_qZY!97x$^X2NL`Mzw|xWAAG-nfEtWwH@g-{GikdS1L^-M)eQ1x;NuT9Ru8L0Q@y&5@RcSQpO z_iD$JBf4=c%c3nXxqi|eK(^mCBh;?Dnw2t(%R_<6rH2qY1`as~gT1(7Mz4!K=H1jn z6x!5Pa{s>d%8{jSp4yvXGsx0w+CRdJD&}K{NBx8Zne(nT3z`j|bup5hp@zTw+f_P9 ze`PinMuH*!kOVL$1}Jci?krJ_t+mb0d12&?2viT_Etz`S@l0sT5-!mhNag*hAi=t4 zIt_3!x(HQ;r6F!>mD1i;rC#Y&^+sCc2^--x8dA^5nc$w)hlAs@zB`VFEYxdqTv@bq zTL?rf;(ttul2cNG)hvlv)_;irD-%$D_7Y!I5J~de=)dGqrE11+eB-BZ?s*u~&|r}D z!!!lTgY9T2&+5PEMlsZrp7em*lBREhN<9L1`lps z%|DY-gj-tSULpYUqMT&j`3gRih&R5L`t$Vr!SpRi_$%K=@Q@qB9HK!@Nol8U%^>|< zkrFt^^x_zC_ncMAGVdJCj8b>69qY^Q(A}h}H+hQL>eCyLF4Q;F%HX3Yx5Rp?!%sjp zAsRIVo6etI)56{>l(n$t>tJSB!mtzu$R;Id`<-~pQN`MN!yIqe&6`-h4TsDPbV#(G zo~&Pt(X1V|VpSEdEf(&JY!&Ju1`*GXNQRb=>^YzI2{fY&*p2>5%wLM~Nh_D!?`u0r z<^iBg;RcU%{a>yggW0qACb9HwJZXSG%vhZSi*eiV6MUCu)^Um$0~F?2-$L{{UMm0` z99BLO&5>_I{yin*Z9j2fDomR}VIe2&!2(>;a6zOMt(NrOJTR-mxesBM^RMl*uYE~3 zd&GsD!b9~n4>4VaHL@^e$dWHX`A&d{(oLC8!A0HN{vS6O_C83he}jka4B!_c_>_wS znppp6-#=oNYm}k`f2c`63_QLQ{1wvT!D4$27RRNT!qjN}_~qSSfr=48+Fo}&iag@O zO0v{S&;KLst)rrhp2uMor6feU1*98k2}$Yh6zP^`mv|H;SEO?ZX_l6TrIhY&7L@Mp z{H^-=);aHg?{l7Wo^y8ZooAl8_s-0nnL88v__)HZMcu(7jLm*^E6l-rFc)_%HoT8P zdK7g0H82pxA^d7)w$MiXKy9O&yi}fQkZY6bV_!Lj;^|6LuX6#A$NHU%8dc8^d*#!8 zPK!)95z%Mi1N3iQxjS}~E3gnRWVCWACKlM6;&D`{L}*C$bztwBO<_(K6pPG;fqQ^8!>B@0m-TAf`A za6m1(dXa0UskqSP1dE+|%IGP(3(%7cVIle)n;#t&cG)TRk;LY!9%f~aNT1~Ulhc&> zBW+SN?V`1xKs&Pbdm|h!oY*Uu)p@JS6bAca1RHm;?#&f|#%wQjqz0X{*ER!__R*24 zHtj_i&!gq_rLvEWx!)u@locaHiuR7!&WVgl4xH!|$1XI2+jQHv=C9pij9udhA3JuZ4D^VM&T)_I{{$c9PU zojO8vlE&EtI5MC-Qd#TJ;CqlQNsr*!;9q%I#^hlu(F%@RWqlVp$c#pAITEegqAo^v zJdM|48G-pc;&y>YJgS>Qdj^6B*h2DvYduWbs&Dc9>D^|dRgW~@(YdLvOc&sVlI@?& z9bXl;5Kz$vF@fO9EP0F)GY(A3HWgTssKThcu2a|mRO6ZVfNTWWNV-p>`lP!mRfd1U z*>Kbp9}cxv8KuDId}bBK@OOX#ZM%C4_4x_~Gk%AU5B0h?Isa4*wkxTFGzY4Jg)3a}XLP3-Bg3@TuNuQg z%H@av_PJ@8mUC9=ZKx~Q0^HNYO@}e49k?HvU&<0n4AFkCeh-bZJlh#&)2A8YNaO~E z2*1TQt3>y!OsQ}p(0SA1KBef$Wv@_VJI^?nJ;(|fXAs$cIL z%!Xxf{isD}-ww|yl_^t$3f9weAG5(`0DxS8elFucL5lb$j*WXOkQg>tx9 z_=%a2Dl$1=jF&xHYfx_7S^n$Uy{Nt~km zMdzxVeE@+8KYm}Z+n;Q*Qy%NS*&Jh3qb2XWwh+e&Cb6l>qG@;JfaOz zbJN2cH7sx-cPP>lmBPHm<*#ZZq!$v@fo$244y&%ARG6t}`C@^3p)z|WXXilbrgB`C zIHlUD`gc^M=yF>-IQfxY#G>@>-V}V~efn|5ylcy${lW^jLnQb@<5L=vneZ5sm(s~q zRNE!v-oAslh`nZrRK+$42)EQPidyM}N9!{<6KRp*x}l!=tAvSAxEGVqJBN$|j+yT7 z2I9!Fzpp%Q^azIXXC8}>b|Q1^!8DBTEvHLS&FJ?c9aolzq0u=Z_Dl(R<+nHMPKa9^K`Vv9DB7;S1cSjpN^+MgmEF^n3*xMYL@B25m zKl8WWs5RZs?yD}MeA78eiT!4&tJguWfud)X-8x0vNqBBrl+V;R&tj* ztQ`*}cmRb5#AU~@!NK<46&0sJ`I|~LVb;-js=6XcKYJ8Rk*peJp>FPCwBExv z%paobHFA%By~6eR(L;`j-~$Dn86>kvto~*M$I_@qpDA8SxU=5BKNXV;LD1GB%o~G* zf0*VeQT6I<)}%L@uj!U#FYaQMhHMQ~Pn~+Ai3n1D(8XqGJlG@Z&;yPwq9}{yF?^?^ zQPkMM3cu;YFfim(XoY#$hV0>bpETN@ul#1E`Ms|3_!|@y&yrgdk{;qDDS!0FoSgO?>i;3xgYX4I;_Z|K2E))Gx7Ngv&I&BqpkXMy6=u4IA z6d>;VDr!w9R{!Gh0t%pNViV*PPbHGA%el$zwShoeSH~`KtQ|FH2VG-7atX;AZCZd9 zv!Fe+R>reafqP06_LQg>higXYw0to7{ys?d^~oOnC;M&l7?1Pj*`h=tANdYKR;`~! z!YVk+V-56)wxO*MyUkCH)CDszV%3^5<}z;|ZC8)GR@~BKl_>xji9}_W&#MFoShMt$Y^ z%aFnD{1vzJ_l(eqqthb@H=l}Wal({G_rX)6fDOnB$p*(5_2`%o(>Js315x5tq=O; z6E&ap1QVzF?lI%J$pJlAyR}?oKUh|%s~2rN&oVg!^WbSfh7I-l6}OD{X6+=ic!2o% zh~&|wZPeKjq7}$h^E4~YiS3MLOrYiTZW!@7ayu7lW%U&ph7H>LkfG29Od;d!-ZT}fa_Hpo85r;r@ELP43`B6ntZxs}5o=o(M1C`CoWN5U zTCp^rRUTrt!IUFOv zsLr4Y^bVP?Owi01zagr&uT1(p++rDke?Dp3VMu;cACksZCrMWzfOEj?y$y%;U{ z-uRa7w}W6L8Q+!w{X6?c*UiDOM12MTd!hjo$ml-gRIGjv=9s~IxVyeoim2>*m$#fi|Hsvj^0WsyAfm;LIfG&SbbiS`~^+t1#M;qz%$fuVHrqb7( zXyzpi7wb#nmgu2Mu!n1DR)d!NH6H06RIa zQu5C9i2{@!SF(imq~ce5*z$l{lZJA-RZtq1J=Qk7+igMGWI_tgw9hIE^1W?r%F|`K zfKUWEI?I_P3XX*brH*M^t~_!3rs{Q7PN|kIR|br+CWcCRp2R?Qw3+ z1L}|b_*Q;j)cU>h#XPdfWPv)&G^UF}xJ!*~b>QZ=dVx?-`o`?GU4eV*2fT?Yo@@OR@~~W-j#SU()J7E3M;2=&hJ4u9tlVUdP>&8J6VE z-Yb~=CePXK&RSHj)>I2ga6B0?a&O|%v0=+lS|~~=_|_1L6Xiwh`+b(eW$2Yivfqv= zNk-M`Vs=U+zsA?fp6T5m*E@kR8(z8Rlai*`3gyJ!cSZh(*nJ%q!Z-0hXt0TwiujN$ zo=q&vwCO=y)c3gwW@~m?pyq|Kd2G0dUV}dw6T{r4)QCD4HRbi>r?7sPm2PAPhg-hL z^hR1n4-<|j8jrglSybNGzr-bk^~Ll0(d;_MM{@g+mBwzPH*LFR)N+NDP8L7> zVod6`GqLuRb_;Roo%*qKq&zulJy$`c0n^}dv5jkW9>EoVhK-mm4e;)yN!Tyzmxl@U z(uIqoj!Zh72gJ0EDU=5wbla(1FMe}`nhOtom+1mzse0?Ak|WOOkpTea6*QpJ(D2m{ zUKO*}aqICbrI1KAl^)1;5sUpTRyV8P`5ygc&DisJLXwc_q(aOOG%`%R{?92CxFy`( z+TQot$;z{i=mwek0f!i;pZAQS2SJD1BzG=9Q+OQ=+&49b-KTk9?1#&D+U;>{ojl*) zG3KyoT253->>eFAJLIKRjW=BDg7IZil|=_%=Z@gvwktIeh{BJ(FzsV?RlQ&Bej?(Pg8 zkTyO(zV?;OVLQ;C@nhB2m`tZkwNOzjFK0!1l*buLh6PR2@OyMXDmH81!3GU0o|-o~ zYU6uU$-md|)jSMLp#Q5 z0|uF&#Bn;-NgsLexp|7AhZtJgf*tIfyc?c(_YXn2yfbfD_V$Xpk`@e(K0MO}mz};0 zHc16@RZg^5apq#yC3e;+#()jsQV1-$b-8>VE!8hyXb(;ctK_r-sk&9sd# z8WZAC=4SxP62lvE>9t(_Mg*C8xwuOc@*@WH#l@5M-#?|3I{FZ5st)B%B(rO&|16A3 zGv#(8I8hKMLa)H~Z6!^2G(suL!*5=>=ZUQ)injFqo%jn}K6*@THNUoj=l&ymc78;~ zkV9*qQDL@e->jb3%wj%}ZQ$I23mFpgyKaP}Wg7?hQBkXbYxcdcKc+Bn%uRF&$5v$U zI>0Vos#;ng<2MakRi1M(<;8qCE{9WZ0 z$hNHsC<|}IveG1Ae=XwufLm%xGiJ}V@n>C0as$q!--6fKiN)-PCzjQW*r_6AEx_VY z3phwStXFu`%4(;D>Vaf;$nm$#>}+$gq~-wgMcregP#24`6IGMb9@c*C%jl(9K=DvA zDt$BI>h>GOc$n%nW(c?cMr=idM9Zk;R#r3uP(KjzRlP7t_D6tj@$7`GlvZn`35=3y zWR7%ld}-toDdVqhU8!ldB-uY>ej$C8x5@|#w8Pa@rW%b6p&SJtqHH4Qs~{VqKV17i zGV|1adn%*B*XNU1A7oUKJ3{eL`<`lV_KCuAk?Ies2=qpMkq&c(v0}%2BKA5I+klZe zK;M@5Eut(ytt4{O613CJTm4JDwP_R-R4cNt}~k3sbCkX12#G#s0N?=t5`b^WRzqT-e)~Jythe`xnxHBWRjGB?(6Ho@Vn(NIuG6eh? zk^{Heuy!XaRYH?$?rb_q{@r$Y)Q>T zI_4!327Yoa?7uW%ZTj6sC*zAjl_O0RXAnuoI?K|O)r(9gx0NHkU_K&i%E+VARTpFv zTox~ii>o+-`AF{3|Ih2*`2u&bZDjFpHeBLYe8}?2&hPCoMMVC)hBChpf1<=|LKZ+v z(Rq#wt9e~_gP*)WyNPY4X*U`h@ey0bZ_e|BrV!uSbV*6`-7V9I3Zk77^(B{#26ay) z0qM+h+2-Qui(9o~6>;mA`SnC81cclHB!f(`!30w))+Y$D`dC5r7@57!fL4%&;hb|u zQ-4-PlkDm*1zp_Ig>MTJrQer38cG0TWBz-fzDTVpQcwhUaBl(I26ca7VwcDfT6)`2 zH@k5Dain_VNKZid27ZAl!;m^AqWnE|uGz^vT4t}`@Dr-6;LUxM{8deXA#o9$kecvK z^x(@?9y+M;hr|HaXnYQ)v6Pbpts;m(xpkGB=(_QUNZ&&}l=1f4$oIEpB6z^I$9+yt zFe%sL&u*#~n5&)~2N`ReH-W+jSPhvAAdNj}m_+#m%4|&&d)n^XROo1CyPt^~N=63} zTQ2EP-Y@G7o*@;r>~qhW2fy`y#RkftN%0O~ms9Q-tVwGObOpP*P|#;9xWx1~s&uNA zk>nd}GLKu5lnctskP*ry5KjSg`X+aJ{Lrw>>?oscp?$NPN2)6 zr6ZfSuF`_eU*vxIxVrp#EY-?Yb?|C$bY||iAR$JURxEV;*;4bxhvlq$Vl2L#3 z;ku;ATDm!J3OWfIaGh0V>XOYS+KHcdvDyWg-8|MVJbb|;#H>2xrS>x)z)5fGpz;V% zdhjaw6UQ!XE(sUI_k?q85^3AVPN8(HIlltJcPDTHhjeS+qH%*21DT8$4s2BEFz$)(0wa7O2s%RHVI_sM~ zStz@JSRb?_g=msQMH~IrT{wWfJvvrHqUhmFnb2{?TEZ1Zi-4i6o?t=hkfAM(Vg0m5 zyXaP)MJi7^{*%6#r^QlXZ8vw1%sLWH{*&sN`(LVOK7N7!E`QD=`08)va6-OU0{^FS zI5(F7*WcXFz;0SuLS^H5tq|?tC%RvchbOA5J>)2Gw1Wx@3t{g|yv(>r9tW4bIVdH> z|FpsR>CSm{bNj{rZBk;*lBSYmCi3f82kS1570e6FJ~TDeLZaX zF`VTog?0Rt~^NPr%jFY4q|`ZX1p6wZuXe|iISou)j0s>=VLt2IM1ycEA8 zHyPV-bNDf#6-QdX17l4$|kmx+T+G@Az!&2K?xdV`g2;>H1fte zu6U8Cu1`G0+hZ5(@24=1_ma8!71#2IQuE{Mk9?vFSiRL>`+7ewxEjz}4biy(f+!3L zgq&VdncOy{XV_a+LR2QkGaSdpd|!wEI^uB}*LUtR?)m*S!(I?lv}~MsdZsmvTYGDg zwb|ySy=Unp-Z|u>7gz z+Ty%jScu!1{cRSZRFo@@M6c`V9N0fAS!yMPUS@GBv#`h4d}>VCIw>EdSp+G7)HLnxp3~zh z8xklRuG`<1&O8ggQh0lQSs33`-~|DVQl2UW6Y#@xaT>7LNO}Uk9ugiu2dLNf^Ifj% zMAY|P6HEN%Bg6AW7~U4Hr-b4+TH#7U zM|qp#wJ}?s;Gh*$vluH&^OoWAz*>3h(w~uIABu1C1L9!mL;RI}KbK9GNGKbN{c_g* zqA+p7h6%pDHpH0Qt>XmM$FO)Qss>f>4pW>?)v0aeu1#k(Q&g4$pgu&KpUxGYY{fV8 zo7~2B+yE`+xdEk!+Iau|Lw1Qm&4+Y)@!(g=_v(Hea+_%P6IO&nD9$9hwN3PLFx)SF zviqL(^2Q7qxEh^cvAKRLxS;H3ns+crP2@?H(>b4qv98A$at`_Rv{`*i8TuMIY;_9i z$SHbx9%dMrmRP z%Mh-^`p>3qn3g(cYrD;DXf@h1XGe8=B)BRo%N#}^{G9fIHcm~^497J!E1lEjpcu`l zicQ=3JqV_YeLZmP*VDJ#+^q4tOEuj5rSM)H=4mN#jL!`cllu90Fi6hJk`nbwCV~oT z6}$8&w>U?r-*y~sUM-#Ib*YUCgUJ+rSHJ%SLNF({IsaH zM|l54C%*smVYAD4Q_Jwg(uRBgw<%rs7$fnCnc)0g&bA5mQ{S58Yp47xyE^S^d>AIn z9iU)vT2-1u1l5d}cJ@JHXpRl<^GFq>Sa=$vM2%5AVKg;BRSF^1hLMeTgwwjiPaJrr*A#PBj<|{&f~l5L<=8g|COTFTjK4@#n60R zAN&hi-apj*>V;>p9QvOVik(bZTO11Z3XpM(Nw+dal&a)QBe0C$~@J z9zJ;WgV^bXfp@Kt0JECf_<6{*$Ir&=4apXj4Ekfuh&5YF$LQ}zy0Sn#AJEC_c<#5j zlNFoVc3YdEweo#*$apIMqm?VP=kpqTfd-Q71Tekt!oaj8k|yZ6L>BC6*r@Sh ziJ(q|Mb6Z$7iAcaK%KXbuLayzON2&~b6=TmsBR-`>`{gKZim;Hu<`6)V8|cJi-r&l zj5Wfx71V3DzSe9FH84*;?b0Xk$iACGw@grW<684TRBf5eDr~JSK4ESP@=vzPCV+TV z$7S{E0O|$?h8D#)KlG}U>kaDA&hN-Y)NB(7{7gf7>DI~NAsf0sGb10%gGjIQ$a404 zLIkng`!Z2*=>qc^B4j0`@iy=I9n;EA;a1z``*phVnz^5rkvA=|e@R+W#TPoMr+{DzRwp;J=2T4TbBUnCu(b14JbF4yO%VoA)o8k}oNT1rx zZ7o7M-NL}nh}Vx{aI3HQ2CGDS6%(AB(KN)KoAWkWMG7~u3=Hu&u@f^5&7Lx4B&c5j zD<9)JPL$n-N1IrqGaM%&r@UW1_@l8)FY1WXJ@N?TlCP`)jnkU1h8VWY^9j$FtTkZZQ<>f~_nH=sTV@_vxFkK0 z4v~j-IEGJq-Du(XJb~r`kuT^=-=ZRbnM$Pymp-MF)rsyGSciT|umpH+N;_w*XMEMD zohRYil4nTQX`|ULm!a;?MjFr+y4Gdk>s$;e*qOyzD&kC(V`5 zd%RD=URXA%6(!{Fma$1*mChC~fxZRC*Uq1vy|65}S?#P|mVw&cch#xO4*^1v+c=H@Anr43McF4UHS42Uv$1Zmq2N$il zFg_(aLe(AH=@sc7xGTtq7uq4HBQ{?toa!aYF3HYfd(;j0^%fnx5vW!hUEN%A1#^j{ z9GYIs4eiVS#TY=MOe(_<&w>#rZVL{a(DaoWAw*_C3PVto5P^6vXI5Zg0rMCt=tG+G z{C-QyW24GMZsX$DV{!4ogo#`zb|j%6N!h13f3C=u^~6BIVfO&+t;<~x9&^- z1;hQ8hmOjR*m@7#7hG$uB#7^KMOM~Q&oX-a0aipd_)h&TFF5UX>hS_g(T%Et*CGVF z<>DX_IBo5`EtB)LvZxa+-a8~`${@Sn4~XN&C^xzkwl*JuOky)J(~ zIRyQ~J!o~q+wC<0v{BPODW^f(dxx`Yv{BMyr(47ej|}kak^Lj*WbHe&oa@i5cbBH3 zb%Zk)tj~ucu>!eS(3KaPVjAQgiR4@#1LshimV}V`)UmsnopS&;2mdiF#KiiV?^A6* z%RS1d-%rB(n=-2T_cw%L>u*u3V~%j?L)bqOHr?4v^hQ0_GrDK%V|@(E_+LoisS0B$R1_NnFGMuB%c ztX3C!i*9h`&RYp{ZRrW`PFG_cxA*^j1TZb$QhM%3WUBc5mkPBUwB#gPV#aFD=uW}< zCjRd@4OzF;D!h$qsIRXzu^v69tn9syawpQ|yLB166d98;Oy;wTsL$r`XLOs#2nSX`wy5={^WS zKAwt7qF*YQT3t_ytYnq;ZiQFeH6xaFV{tY*4(io9%BWg7y%6(Wd(GzLtLP~IJqwZL z-1M<9qVi+qD3C>b7X-veN0S!mp9?T**W}3}OTb;ADq%z^hqXt@$Fsvm9zJ-`{LuW7 zg*mN@xrU`%p5=oFANO069?T@k&8I#=B-xT8s|^_j#4$gt;Et{neR^g5f0`s|&7}Tq z;=@J%h9CJB2JM=hzi%n!vg{`6@XL^!N47~JqeOzau2cOuA3IC@M>i1#Oj1oS4^71T z#8!!5gSJ^WYMNeQ>@R^CUXO7oht(k@hA&x9YfVE< zJa_TuD5_m|Y>KSd+S)tc6V#{7NiT1of&u>0UNp4hng}%|@NmD>l>Qc8KL?WH>nBx( zCviv4b=;@!0=)3^sV`$Q!kgh)>h~{8@lBq<-iq$6^qfr}ZtUiNvP6$|;{S4BS^Tqm zcrik@FR0Taw#a3EM&Zj3roK3zKYO|L7aoR3uJqb_2`t4NwUctCUAZ!Jrw$g)Kq_U; zvk+Zc%4I~42dxi;VX_CM=~1a8J6Xc0bxflluNZ4BvT(N#m^gc>$)#?%k;;TUq<)~> zW~lMlV@>~c^=(}9SK?#PwKQf;t~Dnvn*<=$Up5qn_omT!4wJe(siuA~bA zs&Mo;D`+#pV%rjj2AOmRW!^CYVp^>>zIBNFNe2&Y0fbqHRf-xRjKz9oAG4v$wXQa^pPo46oi^c6Y^F$*!R+5J`E7t3^irmG3Kg>fu8O~KOL z*e6$EUh{I+L@TzU5iEX^m*-D4RK27iK0wb!I5}Ob?D#(>iWWCFW6Tx@^2y{tf&Iv!Oua#Ms`#y_0Xp zlUuIMmX)O+xuG6WJQtt7ccqEU6y)FTdZ8fw2&V(y&z+}Jo&pNC{9=0Y?EDiSo~u#E z@8U`*n3j`Hn&i{0V!G)jPw**mv6j)^`&)^*N+ zxh4vnpp{Xrqw>dM%7KQ}Viaf;$5^jkJB`30kTew_lT~oQHa!>lDLpM**y5`!i*c{F@E?A(d}T^_x8_(R~f?9y3)H8 zXrISc29qiJj|dXF-YS2Fj2Nc)^{n-rgUJ@1Nc9>{kK8>379zG8vkyZ$TN+r3SbG~p z0Y0TKisk3OBda!&_vigwt@2wA8CRNiCk4~$3*$yVjBd{5LTeOS5ZEPqw@;QoPi4xQ zR(Kyx8M$1Lo!rJ_by6o~Uk|b`1h$?1FVXkl!G|^6{7QyCUT_v8IBUK3$XP!xWQ9@p zEmN0NbEo@caQn}Fbp5;$d_Z&rU$iBW(<0d^#QfM}j6iWc>Dye=;B1oK1vbrp^%vN_ z+1Jk-s{EW5F0q-UHTa+Z+eH6>_zNMH(=u61qy0|4HYB;#*_FSU+#*?4^+a0ror=9w} z|6Ti;ZEPbf9eHbpf)~>l-Kh#qG`)rkd0pWb`pz)=};gbg+b%WTNk?KQM zR0r{c2PQ-n7mtu7Lf`cVs1TVVtF=G*qCecT^z^|4PKt)^KhLtK`o0ez{K}<)aQ+kN ztyLSj&p6MH5A#?~voz-?Ds^RPuAyG6*^SrTKFffHmz(Iwam2|D;;%HK1K;I?ducy# ze8^TIdUYB?%-^=16-vp-lmpB0=My4r)He!yoA_LrYRFHUhojwRzNb{L-hBDC{LZC| zZ_Bn&qXlB!1trkwivI5G`L+mu6ZH!7#aPFa^L5-(7pC&6B zY=x!cPaHq_r%`NNW^6ONO|Y-qE{uER7R;Hfm~$C8&6!6X@tCo|OtqWL)p`Hz{q47N zrSrD&`+X6W4YhU2r$#VxOAUfTb(6T;ohZBUF}2)gh0|7OwGW^llD-^lE;^^SSoTkB zM`yqC{)&{Vt75RLZ|~?GWh*(WCw`GCYqF&+2c66zstV9*VYm=9O?gGp5w{d@^Lqi_ zgqtip(R&}!5Dt9eBL)Yd!mfrs9o2dFsNNvh3Q5kq4X<_>*whAF+)tOl&SjGEk5pu? zH@PUS1(@>q$6{9%Sdo&Mhcv%Tyg`h2)3$h&Yv5~V!^HMX-Q$FKmS4nKiN-!A4%?q* z2ZG7fJGY#+W2~0ZG{2|0X1J%4+twb|L>P=gy67WLrH5c!mte%O-VsFh zN8wfT+?=boBFI3=GK+IaVyk9lRiSX6eZs*JsK5R2lMI2%?5LiRqP&}c8`zo^4Hn}v z9mIiViJL$aMI*Gyz8r&@)Nt^_&dT42#jfmbU?T;h%4eiN6!R?}xd^2_8{%N(+4oHY zO`g@nbRw5<`>AiHlT8cs-bs2WWB9l#Y--%YctY7rk2}5su`#2Yn;}dYFz(o6z6iKC zxmdgC0ItsjlV$@_?5hsa;D5Q4bJ)b<$^zF5K!Aa+m`sXB?V>vadz;*1)o2B6_6!Ayc#1*FOpbAYVEme)&*8 zgXjxgU})nSDcSxBHn`SiO-_CKhLFA}P*1+FZHv@Dkt_aVx&T_Awul`Bf}(QjDtH{H zsM*sNv&$=GPj{|v+D&)AwR<#OAMpD*e(HMl%%S{eI1|u#Co8I~O_u*Kn_W~{HwCdd zUy+y)64nU@T`37H@OduxP?tIxEfxc(=)T{}UUD|)AZ68vzT)h^1)m7dlt)qrNgTHT zaQHv*Vhw&qCU+wPjFMs$i^5(?UkN(HZM~*FNSb6@o zW&}5vc3a5&lN8cJQ-sOI-T#_zToy(VlKzn`$lH|Uf5DgfZ}9)e>~K-}k6%BR`OC12 zB>!@2^}j5d^B;>QWQs|4Q%-&QkE0JmYU=Z1|8aaAum=oLxWGAYOK0Et|m`+0E$_PuGLn0vFBk=BM+5Io@! zC+}^gItS&x9kWb)Nmi9sO-*Ux|27Y=?o`;~bT*bkb!HW}Ox%cb+y#>V_^LFvj2*=@ zYsgsvE+R+GQldSVcgd)@DME_j&1F)m)sE&Z9l%xm2NLqYoJNW*=fJr9zMSeSHvy~+ z363+QBtcjy1k9r`6aFHyoUFz48p0DY8v1<8qCnIAcxNR<0gLsBF48_t6)`*+OzK6Dsmfm%n`b;u7x;-%&uvpG&qwO~J~p)g&Hp zHSoI6OK$tN63njL#u)*jTYZBx5N8wz#_4SK`Mru1=`yU|^-N+cH%A}KncIYwl7E&@ ziH|6O_>J1&Xe_&rObG5d(3g4|%quklALb(BsXG%^OGkb?@l7djFnAt2r_5MplF4<@ z1iTHoY+P;LR-aPM9UcLVolL&SWrMosc^ohEQiPcH1^J81`N>3eWq4wWqMDMm=_J6s zTl%F*6LLP+1(m@2Z+SwLJxyJh7hZdpu& zQs+>W(Z*`PxbZ@}W>1*Oo zD~GYYHm#f!r6G4Y`e!5n633rC>=`=(P8a*dWYSTVM>a}M{JKM1w=OSRTK3;68pbnst`&~mf7+QR+ zlJOzFUM$RG0j1^m(ga=IIkB*8Vyg@i(s3@q;+fV_Ga6!zw&EfOm^!F*j$O-$^y35m z@clotopnFs5;Ig9V{F}Y-QT;A;+pxP_(}CV*MC#Fav(n=pI!#xzLfW9aF8lx4VEd zzMf^~#9mJv1^^x}_;rpup|Q2=^-CWVKq4on4UPiZCPa7BRq|-CZClT3j7Y~+q^pV< zHnelO?lv``LG4?le0~eC>`8YSzGjoXF`DJDaE02UzrU^;!*lmaUK?FgEb+`)cE~qr zkn)Nmy1$VY@U2OIfRC=-MvUq+ivvDC4SBrDn014HN=o3Nt)m;~!Fr&I)I2{C+U~vf zGR=>0{rvC`dlCdLoJsw&4DR|>gCXZv>^tZ7Bb+{2o-*zi#Hw1o9+ai%`|Gp%JmR-& zry?b1NY|EEOAsZo`KAaCMVIlExvsa?QF^H!W%#w(Es@{mt-%TO>$F2)Ecs>MkuqI; zcQzDfOq6MU<?ATe7!hLdAr$A4uW?b0`)aIYFu=?=z|YXpBSN>imAY3uQ7b!eHW}8CPxo zG#ehiUk&PadG^SWA4jT%+OMSGbD>J-HSh8oS$oSQli6aq6CyM7%QO&>N>9%1Vfa-) zH0A+-pE?!9(#+dAs8zsh>b^PaS8^p8RjMV22@j#i&d@0xf0KTG?Z3lk;>*T4^>p!+ zC@6LIow*~PZ#?Z01wg+Dk4C6;d^`Dp*|;Ar=`kSYl6Jr%H&KWtJLmDsJ6W(~5Qnnd zWJv4dJ{$eRylG7lzSahbq#XSjqag=pDOEh+`fEn7SwOAr6&gJ|oB|@dHPPh@v+Di9 z%@W}gytg78-6V4`aX>9N=wRFedZE*_2@8wZdyy!?qKoHSqfY(H_zCQ?KsUJ{NO#&m z;gM2wa}j@$H`T_wRrcB@z7u!55yE1Hrp^5O0x{woEmE&!Hc{*3Fa>te!6w-%<*_Ot zmi!lW6?*fV?Akc%O}M>2tbXAAoXE0GqJ+X$ny9#LQ|^%VM$f8Qq>O~JF~IVg3#WbNfY+U^#Q&sn5- zU7ghT$NoCH99Q0e>HM%Im(XEdy_-A3m#|yh7ELvyne1pzmrlR_RUQmo;Ax+wy$~=h zJ}KXlsUBVo-DoFQy_H#7q)dL6yoWY*z0jn#(b_bv_5R|k9A|^hSao~~z}v8GC*rms zpj~qMe09nD=cLB-cdjUHvv5HisKxFbk6eBJFx_)i_H>o5K5{<1RA)O)c~(av>e6Kn z4jhuFl;rtB1C>?icaAjFi>U+tx-!>RC9}27LOe8(UrtT2+hfb?1CS#2*P!|^fx#15 zRV8QLlbBtxB>w`k=KgDCR(y7KT}uxc{o4F&-$n0C;*q^wgU4f7epf!j0cwvA4nI#L z?b5%mOBX?Z7pxHQaq;~HwtG+Hw|kT;UHIkYMWp4{o@hT4Li%L9Wnv*LRe{gTi*d24Z>9w$KTfGSBZo0lbuOm@hcljl_*Fg39XLihaC`07>Rqg8Xk}_CX zw;1Qqg_-iV3XonUloCPL+kvvlkZHY$T+#6BJ`LZU1vnr#b8F=5(6|ddlotYwd(dl(Qe{H@F|tA;q&*LXUU09ufPyN?ZP68zT^CnTN+n1G#y z3Z>3aSJKEYo$v{RJt394673U}c-|ihv!zZ1`uuYPrF)-kARYBDTic)2AMMGQ@6gKR z2+vzmZ*6ON#JlGjiS1A&@a~-x1U0B+)Tww+Kvu!O;R{(&_^~PptbB26x6RaO6r5J2 zc4{zavrYJL_b@K($&{)p6z0?ZY9;iWKLL?HR$S* z-JQ5%=UQ*^{0Tnd`z-Um*Zd2m(PD>E>o2vL`JsMYs;gYK^Srl#F}T7e?sJeXQ7HlF z>@&_Ixh^l*`u%Zk$^>dGq*A!@=mau8gy?dXgxYFtoD z(d*(&qo=({kaL#hn39(^|Deopmm@Yef2}}L)w1b}S?lwh7|F#$mb3`}_i;{kV1Dqn zPXZ>~r;lZV9Nb%ZZPWo|8yQ5@XxnTE?Xf9n-o6wJtz7u?(dHQgwR0YY`JW&jVFEu_ zy6{Eg)8d=xPk5n4n$Pb*0&AKQER#(ag$|s#QDcUmDe}v}l~q%ipDD#Gbb2^Z^U2N* z8;z23p>gTe%#w%(FENoH9th1AjB!@kWs=yf3Z~wz`H~Zz8^CuSv7tz>qNZ?+{9w~j zr}Ya)B?5itSdWEG^CBMAfWCE2fy{gZm~Pt{SBD|Yzs6CVI0u|Ld~5$5)_$2&92&wm zf097cwBSsdkYK#Sx>{2g+tYT!9BPw~u=`N{`$xEX18f6EBv>jotq%F^UKhoGzW3J# zsev!zWej-mFAwALAaFU(n!4Hu?J29TBpN`D@CJE{86tQik>6sUYzF+`xo5UnjFepU z8OLBGqrOj5ng^yR?cw;+rh8+fexX<;Oqsr9<*I)dMDIDj@vK2NZ9P^qYvAk9qxmO> zcawhKjon?#t9Gd51TaKps1|)UB}H8KzeAHf&kUTtgy1hHQf3-*s%C6V0@YQAI;m@!UD(j~2~_Tf-vv>jez=%gw`=hzG`F zcACfVC0PB@b;yYE^4ZsCrJspIDPq*DYvNt6|bUVu>a$d>;6SKY(yV zRxLW9fcHHsEfE3TixA{d4mAlO=}!d|F`?2gqLWrOkNf-g1{cV`HtR1eo*&b|ulrvO z^$&`>i3}-4J^zE}25@jcv8fE@@4(P}Te(pOzMf^+{Wi}m8K1MprhcqdICXB^!9CN^ z;|C=QvtyAcS)h|Fj&-%oy7JDjA7d*k5~~$hyl3ky`hR4-byytD5-%JNPJrMRECiN7 zaECx}4YIfdcXyp6xVtSDJh(dx!QExCh2ZY)ca!(L=ic*u^Upj_Pgl>cYP)MormNFg zJA2#|!&N&wx5vGji9J2TAm`cM7Zq7KFN8SY?%)mP>LQ>J#u+VAp+V?o@|Ccra4W=k zI1NZO09lkzsVPe~WPSO)yBo>bM$NvFKDna{&ce~|yx7KbxpdIps`U<7vtl;Y{(q>UBbk(L~G zd^js9x>QrVZ7HIbbHdA9%UCw64(lB~J86kOrn-1rd)t`rUVkQD9j4Sw&qzi_Xi0;u z6dej%zbW$bjKY3%=(qiqyQA{+@YR01Vo3zE;KhSZNdf6HN1`g@8d7OoXfJG$qZ*i{ zake^GaDumc6wMQ+{j`}o5h0Ho^u!u%yfDuy+uUOe7u!BpNn?{jwX(Xn_PZh~4KEX| zRkrIS@-k<uv3iX&Q3NmxVvYt(y-K+DkM$@$q)#o-xU4WZn}aJW zn(Z$I;iN4=VGFlxntg-nF~$7)B|w~5dr?slZHh@ZEVm9qrqaA-zalHoPO*4EG|}JC zXL3c8?C29>@j~rtE~oSmB6uv3xp`jC+N2z}J|!otl@`a&Fuh*47CUgvxCd3;-=Zrp za=j`!H14PiP-UgEQ4#a6e!6v-LSfXQ;a56Sa^-ATWn0ZxA<< z6L;ItZs^^ov~}fWI$^aczpe5)J6D(-(#{-Iq2qiGCu`}Kz;cs*=^A@apH=uXZ7H>8 zL5zlmFwfswe4lv;j~xd)Q{+xf6~1M(p1jzOkP7EC1d;#@cl0>#L?A=v#kE8rzUG@5f7rf3 z^$r))-RZBy7Sw^(Pl)naoIsga6d0@?N-8PP6?6aR#K zKwDo>FCMk;E5lKuMdEdJD!FA2Q?o=Zt-Rh#%;0@1T@=R>{=GQVV3Cqv1dr29v44xz zMkDvRByCh%U9%b!;9S|hb8H!T$)hA|n8znV2Gm$G))S2Ux&^XJSH z?vo=kx}F9j>@`i-sh`=gv@klH(|`nJS5g#h&{@>JsN=YeJA3)|MnT%JIQh0F%E~T2 z+uQ)5bEzihkQa$(9xES~;Ns|hcSzeieuayg)N6Z&-j!=R)5$hOC98%ZF%bQo|Al_e z@FCz`+@R*8eNI&pH(T1iQ|GW@yrFLr%S#(C8+g7?zv-`q zFDlEKqDYey5W2j0yKHBY6a1XAXh7>dY)*a?y^(06sX{dO8f-OeHyuhK&{TY(H!ki< zp6jY&!R;APJQp?VczLs5d&p6Hq_NF#a|#&hE=g`_4T&~b&@Xy!bC)LjbQ-jS_(mzm zt*DspcYCL{Eo8XI*GZO)@^^eYelLX$HO*K0ZFSYe$r~CQ<4IgC8%S#tbApsk$nYE6 z`1rh2^ABG1T@4)zElONT8T&EYMHx`%EG1vBjCFMGw~{Ko$HdXwn~|z~8f!1+Pzrbg zbyy1yl+uf5jnuBL3uNp!lMbf>iy1pvx~Uabzs0=QnO_=-E5ylpE~_d^Q0vW-`qOX=oTj&qtT-3> zx3UV~fP6}Rk>;)9bu%VgW7G^hj z!Oi2oLYuyM0+-+O9X>P!mT32~vV^shlXavj1${=AzuvNJD$z-rnN@}zo=*1Tdee74 z+?_gizwi0EsdHVQg!+b$`LokcjI$H<-NPR@**l!uqn#CDSt8P^q`Jcxo-HuQWki=r zjrH{hB4T0aP4=yKwyS0zX)C#2P=k93_ddLtD8Sw!@Jw-$vx~F|DBZM|)s?u4-%wlf zl3pVo_q)1Gar29sqqJ-DwIiE+>)d-cl;XXT$1t9(eh(9Ts; zxNyq6@{}~K9n@@1OpPXMPpWz1j{(lhXH-l(O>2A@*%)SQ3NZI2(J^)Q1G};t+@9lD zFI0*PvR1txnbfWXd=wX6EqQ2!m3Ifw&?ZCmaCJn}B6!fFYe@wKE<>B!geUQlZ!azO z;ykK^&q69UIPL80D5&o;Zns=7R=E|^2(<6occNGY7vynwMmPItpKv&S1WO_{^Wmmx z0oE;Tnu^|b>c5#^L>!fPeAgxFEE&BZx&L{r^V!R015VcgAZ)Heo6iZ~QO#eV*?9l< zC!1JNZcTvM$89refkcvbcXwMiR*4-|^X3{wg7-SM^f@=J6d!;&HHYYC1=Wm{Hs?=GxP{BAGu*O#QcEo*v<1)ol)nkM|wwVy1V9tAdSgN z;IN_am7snH(#7K_QpNkNU3~B+0E}!3j~=&pHc60jc2#zq5XKW8r}%PiwP7AS=oD-K zIJV(!nm* z37%6$2Mx72ZNT?2SN5e;ptj&c8VXHQO$GhZmXJjo@1j_2qaWv?Nj+=>xYR$zGx$+l zRdw1q@%jE~LEZCO>Pn~KT9a(g>bcSsa`6_`VUud`b@;Z&jAiLIURrD(E&aFsVqK_a zpUZ4nb%BAa|EEv4FbJcMK+*SyhHs0#8Jg1{{^P&0 z{KtRg{P5q+d~Dpz|8C~v`k&2wEG!(XY%%4?w7?!zxALUNYa@V@%@vib=@I%qdsD0% zev<0cv6POEX((}+LiJdtIZak(A~;xW3StCfIfqoV$B~4-mcYnHrzTAPLh|Y8DvNwO#`;An^$P=JJq)?E9^EL7Mx}*7(OP;L_=#fjErm+~eOo=9>2Mx( zoYK>lADGV?;=AFZ`|M%TA(k4#TNno9E`0;EwRh9oRDv z8tps#n<0_$Q>PS|D9N!*Y9M|VSIYIeLa?=)2hkx68y!R^zh*j1{c0(wYfdt5ysGAk z5WgkibrmfmZ>nBiCW%X1iA^60HVs5Hh#DwkhvTVGhL@-}uNKD`!(XZ@Megoivs~3r zI*AW|6)`QN!V1E!n+jgv)t8c7eZL3p85`pYUZz$XX15~iK)!iTA&Q@>kr|R!r?s71o6L2oa;Ru!J2FwVRUT2+7U95Vw zjQpnkO~ObdbZ3BCSlR7Y8)VRnUG=oRH@Cd_*XzeQI>-Z59I_waKU#?MQcaCcKp`f( z*c&nW-@-5U&aTPy+~oL1qICH7L_i^_JYj8Yd6Oc!(?(19sE&Fdji{-o6@SG!z#4X( z`KC5p1>TTl@{y8l8nJ$^-q9^ISO~5ZT1{;5ZeT z>Q5D%R=6ps7Z};Buqx9fbVLhfM10)txPqRO#n>1hzH8y*m>vg@O4%Kyeus?bxJ!Q; zvdE|x0BozOx7Wm*Ex8uOJawDC(r*h?LG(MLot{m_Ym=&%|2AaIFZd7R)RYRdOX3#5 ziYaQ%PEJ^Fly_oU-HT+!38g&4*4moRK|VTElrx=+_4HZde)N75)>oC=>2q>OdMVAFowe&ICvHrYOD{F~=+SHUOI` z3HEzzho?Ob;+)fdbh!Na==)w6v`*>@Yr^oCbW4Jcr(7?1;r)=!XwM(DAOp-lT2}h~ zdhtmBzs;{Ve4va^*m^vP`>nIQcC--VX|t=!60`BI*vWT`9k$>3&jzzz!;hyaj#E6A zHz8{#gHq39Ry-S0p-mYG?J=p!rYYJ-B+1kqWy%O$WlW8FCTE3gK^m(=XXnqlEBWN& zaAzV2NpQuyFI+uggZB1ziV=YF`ovyhoRE5vlC#@mYn;*LN*73xYzG(AAdf?Hw~iSc z@g4f%#xA6ujFtx#UnyJcuxt*;%P!x~l(E)P@M9ID>5R}D3+{^~;iT`5|F6Q>&1RGA z6A=uLiA`6Jido#3t6DxwExx5TuAf%e>W^sl3rYdBW$1#Ma-b-2?9n=&Nd(!Fbt#oM zEXbSM?xlk=Sh+#9T8GZM=fv111lGgLDMHa*_mB%*C9LdlKIhusq|fTbeUKETPXlmj z6jFBw3hrdP5uDiN!mAnO~~|D(?YJsgdY44qWFHiv(_>{>RGS+ z*=++%SvvIb1{s()v<|%z*`btzO!m(F@X@Y;Z!`PT^kv}|22gE{Y`I%+cimoV^B*Nu zua6NbG>VOd;0HOsu~&$I2OCKoOn68uJ)76Yh*^%0^Ph`JSE@xd5M@jk#oaiy`otP< z)_{wVzE~)9?AocZXU<&;N~5($8O~B^ zcyRrme(vbo*MIbw7ecB{1aa@3J-2@84!Pp)+lBp}ejQti{gdCYj33jX5U{QNF#XC^ z^NeMwO3g=YcYpd#6V3A_kpYh3VyRKxPane?Z zjPx9D?)7H4qx)A1FKbjuCS z=3Mu3q04t(6=)%Gk-aPhX!=!+TI$R7C9W%@<|4US>QxofU!*vb7KtjIA~T>a`%&~i zB&@aU`X;OHv?>HO)NduhuXDN4Q)5Ph)3AyI?YrP8gt6GyZSWX^PyifpYd9)pf7EvM z{-Bw>fkP(Ba{9MJ)G1Hf;NjcF2*_> zw2zFlCZ}b@VIfJ-bL6o1?P_(N9^ck-Ob-S(Mb>vppN+Zhl-z~dG-nGe z_S>uZ#0?eC;_Gs?JRpts1=EGy#br!JB+?9hm{030^;=>&IK4jMC#2S>ATP>H&Kiw& zDY#7tEe()QxNQ}bg<6#dGfDG}`2DqW>XKWZt2cvNm{R8 z6+G3Y;5VNYrI@#05t8>!U3qUP3k=Ny>lV=;L~^&=dT;=;Ndd6r!d|3xl>`D`8wk&= zay-MO@w;;1HRSmTPwiGb-sao1tzb^0;l>Zz`}lJ;XII)Bcc=$Z3_m1n<{#FBGd@*+ z5_ok`D&jFhUfD5c<(hq%H?0P@!$Ke6Jbe+vFn>l-xqFL zOBRV3d!)NZgMJ~ATOJP4soI6lLje3I*CGYU_N^O8m4d!P!6yRWjV}XbFFrt)66UE6 zxY^rv=@Do7j&7HYoQIA0qUQXQ$};~E%%q9- z%#xHqWky%Q&xv=;XvZHRO9t$4Dl`98*Dn?xeH ztwS%hD`kaO_VoAP`t=ll1_~pmPnetam>r9pvJVE=yb54re%au3Hz@Eox5oC$UI{s7Day!|uL5BWPRFf*E%9+=*AR$AZt8c}`;RmSfP^Z@w zb`xe~ka$Kbn)J=8fmv_6GXGjR z&yU{OdSu0&-XPigI658249+KVPj#ducFpTKRO+X^;l2F}*XXwdLKabGvE;cYePm)3 z_)X;R2JQ)7xV;%XEQjnPK3w5H;Rc~n`OpZd`^i2Dsy+FR2o#R1QJ_`;1Z zdt@(OL6%Cr{-Vy=+{_`rLQB4>YQ_>=y+Km+>1nBdQ}f*Xg!F{#zRa@iJyY!lVq)m` zs1+6-kXjYF17+!J!MEnA8{gV?BLIWQfDyEor-<;n@uld+CI)+Zqx)8yNkQE!CdcwK zg`;BhB!2#U+WwaMNO4wcTD-b4@6?Ot!Obl1NlfbByzmFNl43 z|8xCb_=b4qLcHoJef_E*o)LL@w(adAhdK@?NH9af2R2+~1`idIttTK$_G{*TQi5T% zP7P*u&%b5}FWZOh9K7qO!qklF^x{mH96J`>*$-=g3RZ0GuMt1SH$w_x<@;%TnJCL? zJ$Oh)b66wPfl4>~e~tcE*a;R|g`HLX;U&!n7pfNuwHGfr;M!hPzpL4OFEEP;1&o35 zFilpi60P^F5)@yESMx9vkb^+%B^OZrS+>}%R}0ec?zsi>X+$N1u&=PGR||q=#+N^3 zIn4)c>+P!t-h4Aq{$9wvwtC~>+W{tmdBpLVwK|v=H@W^Ln{m82{Y&O;`2X;jB;+|a zg0`^tYLRa098fo5(UQ>0uzMe-BB~nSv9^48B3hVGd=of#LzTRr){J#HOVk$e2kL*3 zA|1$V+e{yIFZypf`=bQ)vzNq;_LZc~=^D`-if#+6pWpw=ZA`X#rj<=`+XGp;_|jl! z?%yBxE9V6TpWU*1?7{KuVGg!^cx0W-3UF;$<$kY?$E1Rgj!UBT=^|2{#HY&)_V$A| z$E*po1kg8-^0j1LiA@Z%ZjK3ZkThG#+WGGOmy4~tNw4`m(%i-y#G6*hUN!q~StH6f zY&1WWafuLKh85nxx!=qDf2YGESF?^42|jL5{x=h7(pm_SYr!5G&=hyjKiU2+fu zT;lCb&;#QypRbhs86o9zN@yUPd!WXst<4H-D7xihoO4HIHoF+LwJ)_o^!4aHQlArV zGD?@Wo?aY=Tg?iS$qr7xwwoSlb)Z3fTbsU&77D7%q(3-kF*%M*a{N9`#zme8_9#?P zqxW@aV_Ta!=`ml(Uw=!XU(NEwoW`~pLlMYeNXhPeqms!{^zQDy==3Ax{KBxoW32AQ zZ?bh2?LXLTOEIoSe>)ScuSxw_!&y6)2DUCta>U1~TBye1VO{KxTq?1rU8jhvIH$|NrwI^yZZiyW)F?N(SlnTUcn@T@vq3owUR`lIB9+ zin(aKM9*!iQCY$RsBPJ-us_!eN&F`BPURU@xY<+7=SuCCtCYpeA=esBv|4FDN+vu} zAaN?=Jq$Bu+-d2jK@ zr66b5MwDx}ppmPBnEFdc5G7=66~2*M`K3o1vp)g<#&yErzm=V<^!l{tJoenloXSN@ zVJ6s&q|**4)4%8txZZI)U%e1@FuY?}+bHkdq3+9y%Y4(2mfXPH;;kz083O+YfARrPedOvJ59@wKvy#2LOC`jE4yeStiK%bK60 zZdf)xljoOmY1es8grgufKiaHPXQM%P!mvJ;O@chV_5r-a@y)<|Jvi9NS2lW4yoz#= z@p~=cK5UQ*Z=-UX-lPnq9tkP8sM9RdyVEbM!LDT^HdYrfW4hn;r!dADcdA-U*GT%d z<&NV1#Y5_bCoYPn#FbJb2+Mn=bYr?Q?V>!0Jh^~o2GJ$dG>74x5i9IeG?&H=&nkY% zvMnpVe0qJ`l&1c2rPFG#jC1t9)l@wwLKrAy$04hC*YLGH?qyl+XTJ^DwEibr^86^U z^!CEBK75lj&lm{5f8!Z9Oci ze7MB}{h5<`+!i0dWSWS8Sjv8+C<^PkqRS3E&($kw@`(Wv>C~qwtKWAC=NC=jT@>*o=L~qafq(PIYfxvcIVrx5M|pg=BtV~4xAk3=@`>hz<*oe3A(?%}fRm9XuMz^qFBdyqzjg67es>M}=G#yC&-Jk`uVh+L%$ci}vZro1$+%JOB6 z-EDSbBC4f+o6JV(diTn+qsy+Qy*oiB6CSV-rlq`@E-gDyF^_9h%%#N(im(|RXfxW$ z7Xhz6 zj=(P_y6_^mD(VwK#7}U!gDgzNnM@BmeP`arHx8QSf>WnPU4M`;IWDa#TQ{ti(h;W; zh3Azia(@866niIBr?bBv+S$nooqViT3wURdS5t~ZGaE09G26(d0mgOSAKbXAl<#{IA3KI7~3ZJg7`rEe=joZ z=EAS@WARf*KYuKyY(3Io<^n2fTR9nYMywhSR6sO=lBSb$?0Nm5>uc%4AN{yz!=no} z$t4FoI%Ps(xHml-58KQ5v)q zfS>2y5nD)^;8IwAGhk$!06ACv04FTDJY3W=rTRExB&dYRAawmO>BEw=*>86m60c1ei`9INA3Di}|^CxH7PnU}cWl3NkO@91Ywe zgget@;`-&mQ@GuQ-4_?TgK)8nL;H9mknOBSz$;4SijscQUi5Bh_C{))LZjN+dTz(? zyh$7(ge1A8;EDrTzFSWGS+B3Bf6=^5yAjODLktv$-J$-06GL%uRa9dw8Fx&rk>OJCniG8(p)RTxP$Km?*BMp|q zK~G{oO)3!Awu|WbONlZ@H@-JfnkE(Z--bBd_`W|4Ydph$dc;uvZRls8&iSWdTnvh=QBC+&6q-v;_E2G~Ch1c)9oU0U>8MX!win38FHI+C%!8d=sAB~5ZZ z@IHEk^5_uFaV^0C3H7f%A_MG`9qGA1vi83cQ_EJ~rlAm>IkgEse%H(Ik_#SC8TFR8 z)V9#$YEAnmkJ0yUAX5xqCj4Z}nIpHMpYd<_(vXi++iB$-VSwyWSpWEIfILPRAQ##2 z8#%4`&a&}i6Xz1Mj~5l+&+Tgo9x@Ky79|Kvy4WpQ0Hu? zG+jAnB7!EBap@fl_`LLk;>s>toe4og5a0fKowE-sKk^_-oINMgENXC$ZOwrPKtD*% ze%Zg<%bQn&kZ<^JWK@vns8>fLa^9-TFw(k8KgycyPgt`IA|KHv+nx}p+fmxdQJfjK zgjElujiPlfS@*E+;_-b&>}>fm@M=+?j4>7W^TL$nF;CF3X(y!d|A|N55jrL4G)YuF zjS6uu+R*WL)B;>uz_O!_5YhLY>2IC<8ZP)FR2kaMd)*~KO5&jI2}d8%sy7<=_FP{9A0xHp+*qv&aaO{g1)R8 z@(Nr|(#AI)w~0(n4avlc7wSLCcVP2spbiryfKzd5xd2<8A#%q5S`igd@LLsj)?s~q zdb&^b+Tn+|7pX2S>%rJ$xtx+Ep(+eUl@R;Jq@h0gYdr)S@?u72iHDhO0_vk2N^dtZ z)LYbuRlT^A&^aeY18@=vNS5eMJ?HR73lRc%g8LR8kCNMLu{y`~LliDr`w#s$KX ziyKdu3$61uF?VIznva3!p^tb014b;wP2jL7WZHK z!#>q=GSP$ZFKej56QwqkrygY1_}KpN|P@Sh||Lh}OM^ zOY&TgnVF7vomLl>q zlPgsB$$Wz_6FT4I4aHkd?|MW@c;!nh<%O%~_IfH7C7fTl{?f zf!CHQGG@D_Xk=qg>zPQo6)Tcp@)xh~xtj ztYS#mT@?ngBv8Y#PbLrCh6*^z^!1Ck0r| z^?tWW2r;_2!)JIjGg*u~jx(ND@ZHdw6~pJ}kjlXq7(OVyz>{t*Tp8VC*^d$O6nwcs zIB2`+^yEWsBF)0b0R@*|_{OD%k)G7?-6JC^0>!WYY|eLD7_Rmr zNNANsmH<8^@*(@I5;ix<&bVdm&M+oF^Nw5_24~T>xI)C5H?D+^=hL|oa3@$K$ZmN3 zH^k*VnU{(8Pf^J2hUqBUt;^Up4%^dLUSL`0D>>Y)OVbQ$+c_?p zb~brbgWQL<*wYYe{G8mh_6p6$Rl2#{awPWxxlQ{5Y*XypS0+ICl?Fz%Fxa-{0!X<_;i}^QA$4&~poH!I#IaN!CumiheQR z*{}yHq#IP9VGUY&7hLH87qK2rUiX7g)ag{|w;MMS@G9)5_ebK@nj6dDsW3m9Ql*UY zmHxyj%?txmA1P$) zT|_v|C#i=yaCROAZ4iMK?G&&M2s$SRjBn*}lI2%KKXcG_E{$umSCXq`Ni(ITk0-v) z*dn_uYF5{YXl9t>&nddE~vnJcfyZb29BV zmS}|$=jiqxr9piALWKqJp=r6v4e!}*Y<*!RQX1Ibq`dvm0nbX*lr_&e=V{e+7@JPPg~~|oS~q;q8@3& zMPdOBY)!RewcTa3dF@HKV9fdqmah5!vf%kq!hohD6R*avqy|gi7v4+W7TeI2Xa)^a z@dZ!?;Z*qgjJbwv`xTGiaLu&X@~FsCF0b=RvDJV#T0BEx-0@3l&yu}MIt#)RoKbpR z`Ku3{eeVV{&!mdB<2FL=A;(H`Dn-z*sJO!vQ43h9 zb)Lv|zLmpYbi7Sl^n#Pij#GU-dT5bn;Ug(mmK;lXX5r)j(PZofb()DgpveJk0Q z^ncwkO6jAF8ZUqi6a|nLgIva0D1uI>* zY*AxkXJ*nS;GEbkE$cGdP<{&&QEh!b5qO zgE=F{Rm%xbTl^QqPLVy6vl+$UR_7rHjEzyioF_dfjg`0lopwqZR!6^zZLEs6l}SsEkCPp2K4SLeopbmOLyn>y$F$V!W*khqMad zK8zCw^kuMf!m1(foI+!(v0|@8UbN6Tj1hXdGKM)Q5?eOMV71UGo3LadQWzdZ^TMsd z6r8H=#2HZf%-MRGZ9uwTHG}rEW7?#Cf?8(2m^w~+50xwX+7cGu2JDBHcI-Oe#^Euc z_-{52@1L1qg+W(-Ub3gBk=7=IV{=adT&JN5VnOC0-q8g~cDXMUn!4^-jVl7E-?l>% zI6mdfIZCOD6jnkg!rI>;MQ~8?t0I<>m-QNEhzj>f_{93ovL_1T-rP>NU?DO8oADk<;A$G$L``)S_7>Wm@b(>WzBv-WyMR_p~drbR*mi$E$5_cm)|SU~2}K zId-nn7nkp7PyNEp?by_A?zq)iE6v1%L-br!2|FYu-o=|Win!h=@+1=sdt)@UoMarY zRM3#@B^^E|Iy(IN4kxU3e|GpMl7ir97l^nmV>C@DBSJ*H^0bj&oXa!XCQ z8S+b-lDY806DLaF!jr6`Qr;E7k3IUpvRJ^R6z_1jB>surnt#wSu9hjn*mEy6iE*V+ zoj+o1?8`>CFI*E+G|fB--&Ik9u*!d8l6WWGPr07%<)m75VJ#H!GTf~VeN3=+o9&O# zq?!1V*0M*1nTTO-gJoJs{6r^w2+662sC=V?XJ~{zN|t{%zXI*)1Qd#!?@Y;6HTWCZ zK!}Le`O@$0)|?HJni+`P0b>Y*+63xR%<-WududEC6vxuGa4s{6pnG)NHLF>N{|Q%? z7{0cr0e-E*9=9N)mwS^!hEZ=bg-dsjwogi+O4xV97x~*|Adm%KR}|5zGMxPrnwMFX zfP1!nozAR!EF$Ls@L3i)sUe^4tz-^RLZ{^!t#A0K@48}FNnBkGa@gQRw^wo7^_tC< z{lRi?#pJaLIr!t>E_5k_WzFP>NN6A`k?3XAW}+$K{3ksH`zhR`N#li#I)7C!h+l&# zoJ=8QF(6j<-gM#4a`4qWt>updtXWU0*cK1&OHzfgULXaZDG7tGX*R-kGGrr6;gp`* zVlC%16QroMPWZy@xY4caBD(pu?iFGk-C{Kqm6@!hD5H8-|i%&2% z+w8nUo=jJH=sHxo;loh|R4n%yW98Uk$`6Zd1`E)`8ecK|OAhyA*M)O$v5j<-Pc0oE zFZ&t&Q{x34qAG!; z=yEGd29rW|(cR<|SD2>~Z9E1n&bhgc8BkB_^rAd z_!@460G4aTYa5|r-vXV6yr$Opbfc)Xrk78vsxBsjd@vH|Cky|=nlh1$?3C&d zWmH#3(g?;|diJ#WO=fIm?oNF^@yT!Xxv?*Q5DE$X;uAp{Pp$eRrEM8UdA4{B`7JdH zK^^&i8VvQJqj5wm;w=WRR)KP9Y$>_Ui0j5at;l^2N$dmW4xrM=qtkOEU$SiUf;vx~ z$8t+I@T--I5@U!B52!G*v6rvVn^~95SL!~h`{&QdJdkpT#oc3Vq}>azC1E;~!QtF| z(WSJS{PfqG%^$E{uY5(uSBSWv1&;)5Jd5kCyR7FZFLEpX0g_RrCkW7jWQ=emtdj65 z?s-+edHC9%BL$qHTwO0chqwOhA;T_?T||2IJ!$f*(gHA*{{B^+H_vKx%7>-J&{25e zO98UtOGFKVUM#YDdWBe1?$H6M?AR(Xl#rcxVam z=FdNFS|#c>cO6CL;1>?|-+9#R_NctfOI0vn9~}880(yY%TL^O{UZ=xXZt^iHhw#R2 z?7cf3q5JUwQ0z8MP&=yo57V4mu}AprDK;?+X;b+kvKLqnT;r0GUCYru0*FuF@C)E# z)!1r%F5~pRK?_EMFWYuHg|PQ74Z`ne^4E$Sq>!OQP{H?q=5#v_`O6;*Hv)XLTsm1_ zvbxnrQGq~A9(gIFX}%Lg!9hl(TB8%?b&`V)sa$9&-l~m7*@e^v2qwML5fiYOl;tFH z&kH#huZn$Oy*De9OgxZ3t1>=1o4n=fLrb;bTKigayG{5YLIntTT(Zc~@2h1wK)c?04|z(c*3As{^ih44%&P0l=LiCf4cY7#ek<+lHk zaC5WTqk))ri~1NZIbUyFUDcwI!E zKLg@<+`Q7ZPX1&8^?~n7EAHip`_2#B1I7A=Yge|#swHwbUOE%~=8ik2zQs$A0~JEQ zlxkpF^x^ht+|m;`{#${=vPCm19U2r6`Y>{X1=G&8<_TnfH#&<#SFavCm2e`UUt{^c zByM{0OTt<#{bYJ%X`V|n_Pag$#&cyasvnn-lZGpl;3_k6C@rEwXGpx_F>HcHKzHTZ zkN+Wi_xvj8cXjbI4-AWBbkbA$Vi1(69~o%i*!Hac2tjJ7A-)d#ns$G(wxH7j`N8(D z#{2hv5w1K$#8;oxc-)Vve`OLSM$YK?Fd`RV!#IDt_sC}u7FQXMf?7D?kEloi>RnC9 z5ne`Qwll^y>BrIUAYWxDJx<^5O+i(epwFA@ZIyndC3Ml(Blwq5Q!C*>)9~@gkE1^B zx9?xng$GDyNn?`Vvp>!kIj=K_E7~`Qo?=|Cx5+;C5a@NSqcZU#Kqv9_lc)ZE{&8C( zM*VGzXWQ|G;sq>9Oi;k{5cVuQO2RP0{vBP+OI3tp_+9YN3qNsBpO|HWRfif@)zs<) zv34g_qWhRG0L^>r?R%oJO_rCuckGWxp&*(Hakv=q_d*n?qv&`SC%$z-o*zFGNlWi) zku*_T8#L(4q5)0)t$q61LEiob0xIe5DePIWdXg~ZO?YOUmWZ}9!JikpV4ZtrJ`adb zajGU8e}%U%`7AZ3sN`*>jJLYpRbxS;B9V59T`^!=Hm-}ql}i)Ff9_pEg{d>9rEWEc zv#3>9Zu;CqK&WWDPaS{C3KbQE(|Ye4w|d-9-@gck$Bk{0hFQeI=6vLpwE95GQ}&Pf)Qk^b45X)066l)#rTQMv;6S>#L>Z zt1O{ox@YxFy(ZZ#KJQw1-@tmwm0#6)p8aNK^9@kN0f=D3;$MjUo}|r6X&H?!l+bEJ z*%4!C97RjikyC&RO5Z>5EMIXhR2iiUb1g~lZI*KMl*8zpjstL?F_P!=`~QchD={=2 zj%PaE{I%^SsoRe2JgQmaheu&wG-;2k9-X!Ar`az6SPA_6LRPx$;BEpgI(y?c2WmQWX@c9i@O$9(_t^xVJ#DK4ee8@UN3OZ*&0*+DO!vquvOm=AJ6#-WL?y}(49izc2hybv?gyWJ zQgUK2|5Z@`-s|*MiD35B`kmZ>NDwqZ-qaBBWNj;)?rDEV@QL<&AxkwZ=SH-t zx_E%NUiGJ2iqN%LcAh+_P#U#C(BsKrnRcPpiU!+h4NI9w5!Xf^1!N`1gUI1Ic9Rdc z+KPs?VfE(|)2vAx33*IKl>|IT;QZMm63}~x*}h+j<@(Hh)gg@3I`Zn`x0_Nz8)jNA zs|j(!gIVD!_)_wiO8*kD#m3Y00e=Xvilxesu;j8;)8K3QZ_{bAKEs2p8^AN#Mu8e{{pG*e`B}mAp zXB9EB!~fFc7XODPM3=<|QS|V;ZR3a|F)E{I6;HmMmm=VOCD80lTRdtTwgW>zgY4h$ zBL6a=P|}D8{SnqxB0Igvhj#A86x?5#PuWXy#NtudBj$)qB;{S$N&-NI{iqGR2#M7> zJVMlh#_cESXJRSWUnZy~I7fL3yZaJmksl?G#2#VC<`{okB{QxAarn`7hCue{L*2zz zFfKl-kscCiI>ZodvaVS$W4&-vLgSTh>E9YQQoygUUxHBCR2*^dkP3z!PZIv& zOWN@hT4-m5!$Ky1de*+G1&a^Uy%0}4ujK(gTwm0q1<9DoS@aV_`bk@5MuMDAkh8C~ z30qW=Bp;@PD%OdqrYEmzX%abuc694T2 z5ztW^agc1xH8ZN~!ciHtmGHKg-$Y}L6{fJ&=2lUtWR;%c5`yZoO~S~(fj+C`p4#pu zX>544gg>jKF>*-EY3|=RcvpR~bWbN8TYaJPk{6y&7JzJ^K-({qaIigw4kE&4${$8a zMtu4mP9>JI-oX^CX*o`>K}Z(0wh9>W1511oW7E1PS-BQx{GlehQdSYsUsJowpgYbp zWVMrq=Jq!x&;&=l4-P_Y! zQ+L(fRqRu0Pg4snU~)#VG)b8^#jvIr!wPdOMbcZdqEu3pq$k09VV2+V8#A5mLOd=; zB!X5(L)B#ZalOm4TqW$K*Rjm9EhlXIQ7f~v28#F`fLm3)buzgGW&YzqW&=ic_bGRl z@N~%R81g6i>KfpUm@WD#cON%-gsA)?pWQ^}WfL0cUE_C?Ki|RPL$}@XPl8kK+xgYt z$3j7+xz$-z?w=|`ef7>Z8%2yPbKb`}5$-}vxJU95C5F`bf890WpDzV>|9Dq6!2VAs zfMmR^YvpTie{Y?ekY%PKiLqI@MPn1~i{TY~nb&;7ZA6(9T3GDpZtZ?{`tB^TUKz({(5AK!}0#lSX*60PGk@%Wl-BEGN--< zt^JwrzterIAfA)gT0(5CUkK3WXdI82RU@3usgobnJ~84-elskHLk&^ec_2x<>s3lO z-XW&XI|%A;4iQPA&s7yLGhtq#O{6Mx$TC=DwBD$S>HA1Vib+h!A{9p^RpGdoCKPcD zo@DP0_ig!F>M?^wKErbMHR{=)*1bs)$&*gP@s}1ULxtNaUbT)31Ay_SyN65oiXRb^ zmfX?C#JaZZG$(`Ff{v?lTm|>1agPAdaoMAVUM!J^dkrC&`0!`W8**p$>j_-ElDJR6 z3tu6=)~zTY1FsD9*Rtk~%MQ*2Hfx-7GbQPqrYPCn0f$gap_{C&m+<-!;L&W8t!e$%)RPzOokxmx`p=#*9Wb z$!yiNb@k1LYv<;G#Vs~R!96wR68^o!Kud($lXqw`?c8K>M)em2#*#P>HNEfwQIfVK z#u-yokx7uErtpH%(g2B|*}5#o91FGn9Acm-CE^3BvhGnqvg7u1w7B)D1+7wXgHD4T&KT z4A{fLdo7|Qnp=dRZ$btN3o1eZu@*tY`98gRy6Rh6%utLBKJH^)+uym$!KGN>O2IvM ziKgySOefl(?`yfr6+$3L6NCl#o-YOn=YfAa5jD36a?AI*Rrujhh7Bpq3~u6a>wlXV z_Vukab!Q89E28waoaZ#?@;7L_^S@QDA|Nk?;bzx}%HoeOP81m=jU*DLP`O zz(eIZ^MQ}F`a2MV@%d^^8ICXXCtgK;waPFJIu8IJ-&vI8-2XJfqan%h<=u()^ZgB& zZA;O?-g~*hcNX)%HM}FqsFOgg=jo#2etKHWcP1Xj|7rdIAq|}png7Y5(qQw092xAG z-1QG)1!qFhh9m3(&$%t>pTc(#_#bM%{=JSN#_&&dkH6LRk>88rgUK7benG5%_?~jW zHKp*pe8qVyC>_($Xe}^FcPcPcKY62?G1qN2!d-w+c{IJyMBO1xuvvKtc6~8p(aB7! z*Ba;Kwr8#uHwX*6(Z?*u;(?zzy`9A@iBThQQI4U_^N2k3Y(!SA0W0POEN?K7FZs>1 z8Y3E`%*TZYC4FK~@@%1ZDX4^IN8A9H90PHo$yC_s+(eT{v6P>zI+@1>8R-xa3C7(* z-gqj~6m}LB9}^S%l(1bj_H`~Wz%iYPadR~^5 z=>>Mql}pdEybAZ`&C$~IOew6L0vV=6UKgW}(-XH?i0#n1L3bm$d!gROW*loGBr!W| zR_1ZDvAxs`N27Fn+6~4+O<8AG6HL4Ms=j~enrNA|Y&)9hm0G*y<(jHaiGQc}eEq|1 z&s(&&bGb`E$|gzV_YQ8(>ZtY;OU%~^jm?|*H+7{fS_DhqSmmjtR|E`gE&iC;!tyQc z(ToM=!Z>{l8yQ$+Q@eXzkr9biIMhEQZ*xnn#;M@q+K}MVWkrwRTHo;%b*cPH|LHZq zf8?R*@^8QE+m;-Aagf8CuY8dUGYyiIrJ4Y*0amI@X>oyln&!pcgh?DZgKEF?R^=|w z)zp_1T9>m9KHVI*XKY)zKKXxKM&}axjCGCduqL>ABkUI0n4ixGlM25DQF#N4cw*wDhbB1bgUr2!s#Qf*L7c-=*~>B3@OV zb1`b+PztpjCSN@T*YEhCwukpsLQHkfQ+z&LZyhdzlZvYwM16 z&kWLynGh`0G$zUq__OwMy|1EMw@|d=ZH+kJNVHK^3v0phd||OEUzueK0dG2$pKYFw zdt>F5rje*31s>hOgP`Cxb;~=8xIL1)`#KLnj_ab!KO=!2m|2pyh*k6PbhOj}hud*jLQ&7pI$=GZjuLcpLv_q$d@xt{S3&rGL zU&0aY-M2SFsyilN1)2h%eQD=R73(2ncH3exrg*OxssGy9Fw4tq;RV{yIo`rDLp>;b zUg3|Z0f(Z63y$R+J$)rQ-IUqBpQaYBnLn?nMB@|`?s}m}3{KDw#`w65@QUiA^-^l} zn-hISvZ}gdd}jP9qR`qjwQfQ6t=vFV^&+V`E8k0AtF4((;JY>s4ozkncSyVMiJ5O? zS{odv!>$UYyfrS3z3gF~Fu3h5$4vWpp4r)M(=C7um$wdClx;r8(y1H9=2?f-PS)d2 zj3S4huw76AW| zIy^g+c&`(q-)tu(<9(=aQnWR-cU>352pp=mH^K_OpJ#&s$+7*g*WFx^H9M16rop{~ zB*QK@7cw|mdtg*Uco^FWi z`7{o=#t>e;i_CioyG*%e2@0yK+;3$-DQ3UEODg zj-v`4{67vZKc}ttbElCg7|=9GTUo|47jrAnW>JjdTGwzHU|e;HDMmmitIN(iTo92i z$u3?CvZDG>gK| z*q~pm0Xny$9_)X_T$`kXElL>U2hUG_u#GF%Hl|OAW+}cHQ3+wJ+%qN5?fp<>TX`01oonT- zt4Bb2VAxQoPP|w$XR3gHrGh%+8If8;-2vVwE8@ zm(>!z?*PSZXUbAH89s;)A6h`ABSl_CKHT;pU7w25TE)tUxD^8GUr{F@>1{6r{O++* z^3G}Y5ocr?=1+<@d$L-+A50JHW~pTp*gFBFi9szTYTj-q&yy!o0fQGj2QC7+o$)~W zs&vnq)H*m6$B(M?r;5`JCy)vag^&369ye3!;RBfMhux%q>h7*5J)rOem;zCc}P!fjQYuLw&8wq^i4?8V%&fBCuBPPPP|&@e@!a2;E)|uU=H8C(sXT=?B)eh8d$-yuPW)M zw>Y?nSR4e=B4{)jcqx2$2M3fNJ}?9bs0pN6=tu?bS}4QSTF|bigd&+lr^_~DmBZHv zd8j#2d_=N~|BS4~fs+xI)g|kIDAm-)Xg7_)v|=z8v@@grfsvT8?Q#SXM9kEkwh^)< zaI7iNjx_+r(j24EI&l4t-FVC^v-ot$2*2RW%PT*tN=Rl&PgzAqbkIU-xt6VWLcnB9~+oDt=Rj~RolBAZ~V z$ggz|gU#@U`ELrATg4L98dSlC=P`-ZThQfM^iD&Vvpn)&#~|Z>1DEx@n~XqPA$|s~l0mjMHw(01SX# zRRTPm;+;c@Uk|*I;}Li!%BfURo(TeL5o+Fs4fdMxCQ2!2$sQc-tQUt=xYf_jszTH2 z(AIx!4V&M41;>WHwqaZ5CM~t1Kqh=Up#fg%LwIenSt|qS(T6@-1()KLMXg$VjEJ(t zEb2SU(*WmaSpP@nVM}Jc91cIB{<&sU+aR~eRnnzQ3hu>z1+Q>yk}UU`v=N#eX?LEz z3u%3lUqKd4ol-`;E#JB2V^yU0U9^;QuPtK)_m0@TW6e$QXmmXS8z*bktTO*&MzBSp ztC&U>6QQF9J5pJGWT>RjwmX1TIx@jyp!9;NHQ7^r>mFfP-a9DQN zC>QgBQy!>A{;b$C$i^$Gy;Y<|s5im_Eann5+Gu!Ka&bgBF~U(@YAp8{)uD#fVm#)u zccio4Uf?*dl2^vXbg$}lX-{3DeWuFa^By&;LSC#DXt7;--U*%8t_*X>Gg)8*FnGRU zZwM>oB)^Jv@#!Jp2EYxG8vYho?Y{Spu`vU$e6ik02E0^MnTG#1UDWA-#iSGIxcGs$ ziR?dQ8S~6(#wwHrr)^LRVX^7Lue}EFFQM`5SjNns4kgN!p%>|w|6pNN`i^xu30py( zuX${hxO+9=;Levp(K6~H5ugxNb3Id%`CR#2!YQwcY_y&*?cNKMMs zHNy_a)XPNve&doz{UPAEZ*uGAr*-R3wD}C3oFS>`)u0Jkh5`L?jHRp8fwb(A%q^R< z$~}(SM_$BSScCM{^RgY$gRvtEJnFXng^>15>7S)QYMIW+)E`0DPR+ia=W*eADkr4x zFVx?0Zt8A#@)p!$9%E@~gM0x({EwyJKSwk;&Xj*4zQOnsZ0g9rSiW*^6k5*oAH=P& za5d*o&GFZe050};d>=>fkKF(ZMC@OiJqRF!O$>i;jOzG3Vf-(c|0ZNdV$Rmsv=xttL2ZH zDo?x7+C?Y>;HYnxQ`FeB#UF)!xs(NNz=+$frI@F-MTHm4CsiX!d7GJ53Cf>CjY?{H z;xY~sCaa~3$WfTPCUss92w7(li73>?@eh9awoNU#&8{~jR9ODAF$x%pNuX&ysBF5e ztk%>l;C<-X=yrl)6^=!*bN*)&q!&(A4QEu&f9;zbS`@VmUG>-u>YY4HU%@@S5T#Lx z<5@aBd=9UMK$L^thSHmu4M_cGusw3Rg{eDM94;Bxj$Zy)!fAmoEkFxogm2R^y5mBN*nFm0Wt zlOWi*e-T#O{U5ZQ)@|~kV`xxEr<%|QLuXtL%=Ea{G>eIyvS={=&^LbTF*$+~{3RXU zcyefg`WyMPmp)M{-Ggg>FtGgF^4l@L2mG|qMt62MRMP0nd&*sW)Ax?4`BNX3vrnZB z=N67nJaY(04n(}&!4!3=IwLum>A(9FBxWcw@UeLdOv``bYum=Q(3mN>*DU!c{fo7U z^0C%-zo-78k#+`UVd1iY^~IHx5HL+N-NRxvl}~nI+X#4j>p2jqR_c-A%(2J8{0EIw zWWbDFP&6JD79OtlnJJkz88D6S_x;%Y`(Skc332kxjlRz?jloFK^a3ZUQe!QdF_$Jx z%`28#Dt4;mmi4LXCa{^cCQ$N@HJRrM%OepAD_t>nGuV(8~xa+zEb6GqFz^fC8 zWE7n)`~$|1!C<^1CxPf(aMJR(HRV(j4+>t{T@^{S`q*BfZ*CwbDrqK`p8&y|tHCbL z5gaz!Mb5g<$-#jY)j0{>OYW3*@^snrDT$oY6+vy@%(baxKDEUuF7yndNN#E zaGN_#raS2_?4eX6Z9sGvKQ0EB1Tcj4_&(6jq3UX}VgWWSa;Z-H`L{z1 zH1DmlW)MePYvP0Vv6p+$Y}kj%*yma4;a|(KTv0Zjx-~=h)kv$}yJ;cBuGg57BZrw@ zh7@!{dkj>Db;*3xB@eEE2Zecx(0>_vf2D+s@f7rk9p3}gHS?mj70MY$jIO+;9zO@g z1yV0uc!uiN76exF#BxGr!kW}&3WDEVq#M)G$WU@C&de(%GW;_%$r5v)YmH9()|y{! zh4cRn!ejn`@X+!4d6HezS#8fz8JT=x-NPKPOAtZk1htvmT znbXQ_(nb(|bMWj&5!bo}KV~C(<(3?2(wv+;6@`0-ZV11mpu2)O4-@<|&wqtj2kVOn z_;fw={ZA-x&ctM35>f39Sd67jA|`^BmzG*!(2gmx)F)HltoL%Mx84ci2WB6) zKkL1?s{yeuw{169^yog9^T4&;>+xQ@Zxq>0Tt$0X>&?y5u{&@R;8tt2`gF)5{=oA3 z0=VaX@;J(PReMutn{#-+@doGVq}lFQ+{?PUN!~+q#fxpiS=sAd^^_yf{?JeAeRHe9 zeNqCvGVpRktdHf+iagWItvo-z-oHL=$LYO3oxN;Fx83L+ncqmJf`UcvwoBm?&^ES6 zf02Mz&I<2sE-zSo`$AWNS4rT9g)(04+g%-&G9_FIQOmX}et+0e`GU_7dq%eV?W z|AR-(i^townHskj`XS)zI<0h|zWsttW(3Uj-C4?NwlD(cuRNMUR3m+^0DfA$?!H>e zXZSwf0y%il9?zpZYZJb=M}VIEJKsyvHRh?cyVmw+N#QQDw?}xZ-d88}YnY)~ud6KP zN<)upj}K|H=^JSxk9T)azL$~pH9V_j&FU6o*EDP8h!0O|Er8xz`P>TNrOcB43Xe34 zG`Q_KuzuD33Q2^}-S~lrk=UCfhr-)CKxg&VLOz`La#x*0Jm>n)jD9#rVuX0csqRQy zV;CENo+etuN_vi~V7Edzn!J`2@yvR@z2T{GLob7XaC=(@ZtUF7qjF;HrCa1>ZtZ!V z-tu`DJhi~Xo^{77-0QvBlZDiU#%>ZY%s=b)as?QPyzCQYf&YF)e!Q>Q%xHh$9e+8@ z;3**y@KT=^e#Nt9j(OcQTYH^+l-%%t`4*V%)~0@2UX`A6i>ng)q^Kz0{>&#Fcdz+y z(SI=B_B`4S-tFfJV$O*p(p=S-3q5cD@!VC9;Mdz(3G2;-k2O#b%T_h~nNrWY;9Tm3BKNoL zx7^WMb}viqFLI5iwU zfN;&H*Vp@|cD%A30Lkb*?z#c#PoR)2->d3WP(B(eLTq})>LWYLK1bH`h}nXO?u6R{ z-=G)cmb&jJUoXgt*xNNggupc{s|x=*u-&^|@H|*=ZuM?+zU{66)O*(Ua4;WcDUFpM zjK&i3be)z8O1WKl=lehsu6FjF{YC~D8OnORM?7-D%DunLQY`GuQJx3s?g$ zL!Zg&&a-)uJ4(67m8^Jec;8;wle4h?+a0o($Fs^owRn^E^*oEj3*op*`J2eIn%so_ z_4cd1wLA8s(AsgIt$vsB5mPd~C;6!`^0Gf)1alat)ic3f_-=i+L_wTB9PFLDci@?c z+3y#5+K2`oEZ?t)yxYbhz%CWO8^hDoxVtF4dFLz6_}k<9=|r< z+GA|;OY4P1ZQ*A1St~vA@zH4^;s>qI+G@0bmM02AW_g3 zTD#JC+JFL};XIsmxzo(zQ%}pk+3x*|poEG~#OHNf^MjrTiv{-elKPtdJD-;{(#ojk zX|&ZxTdrZx8=Z@VqsX(&(@H%baaq#fZDWo$p5kHVuP|9N=lTzwfVyz^-p3)agN>mh z>%FJzSvc_sdEbXUJ99hl$HJDT?SAXc0-v;{gX!D0zM&`Y&!(ngjBP#}Yq{I)bI$MA^SS0Vv-V5-s|*&>OW#wXiehus3ju)8_l{^R z_;n-Zq0#2)`=_U1;8lLw_myR9jWcHVX;j2I8tLIIJnm&T>zU<6UTE(prpToTgYT{I z(tk;9~r{=1C9$%5WN){#0hHL&EzTv0UGxPSX1kl}{ z$g`nM0nf`yT}}4w4&{uJ9m zc=p|iZHic!&E zAp|XJ4n54IxjqOWlDr0@9M!i!se@lM>j;fhpKGDAc-O!ZuKl%zsFW6b)gJQoTH*DY zFk2e85S=g?d_@p%?P0Ed3{f>i1^i$6_$%6>WzgEcF>QJOzcFq9t6J!hYW)AoH8%LzLCBjZ0N>-gq2`#gTEvEqwRY_ucyNOIf;R*lz^Us z`o{QAADnDSlTw&iP^`R3Y=P)>z=@`f-7+`k%c&kYHr!_wtjs#C36-MV<}B^$uoj5m+5Y`%>Xgi9L(aiP3z9+aMBX8Lnt$us-*kgBG=5Rc~7 zJH=Bo=AGaLGk4~8rm+FK#8fkFE9nzZ=6;A);)0C;G<@a_@t#fO+~>Xqtkl0%^n(I3 zic^bMrW!1HGHfri54BPULjBJL+*PKRYscI;3EgVoE6S4BCc9l!=WCu!YlDOq%Z{CA zQ<;j{HJ+U>_|h4#@t@i+m-oX1oXqfO+S6GDAPeQEX!Vs2aU#j1-8{|6bJGx?z=Dwb5GzCJZNQeblwTl8REB z%OdF$zTr=LftaMwI93OhJ)yL4qJnA%;k`<)n(&X(1tE6bngZTJ^5h2(;U|ZDz+2^q zI=h;Sc%x~JGpmk50?j82sd=-FqFv@!;i_bV`i3&7r32QwK%j4mOirb+MIpqvT!&;p ztm)<)0;y&*&qo{vn3DM_`;jd5hH9vV_EYi-ztL@eo8BtjoWA z5tHm%t7q7XuD_n)@vvEAZZb9NfForsj|r87=B?cuVX^1F0#tIk8%pbD-zx}|g%#He zAUs=LA1)7(dez`5``;(qDI$-W22h}Ww9Tc+j%)f%J-{c8Y4r4SNrsEtC9=C~+!X&& zY;9d|UB7GZ7KH@vO9)M;346fshLK_kdWs&G02X@&tZJGyg_6uibVmvV0yA3sgDK|h zReL5D#M*#)MBuR$@++fR+(Zm73qbPdPhE(YhT7Psqg1nrd?I@AaWTGbWh?$ZE7SL; zXvMFbOo%^THjy@kXXTS1BPT!4La_mwp7gBx?@nl2-%yTWoz!h@?EUE7i63m9@bJGW zPA9o}Ed{U1u#rbn!o3u0}H!&`hfU%zTG(0)V} z>!DbM41vsD6IpF9`9kff2sPPW|IH3U?@_75E%E!42SJ5o>mX8zXs-7xNF~^xp47|h z9R$GT5vZ%Uqc$B$$UOLN=(XgSrg&3e3-@N>r;+rclQ0sG8XxuEN&alRElXCmCM>qE zm#o`eaoW_u4C_d@oKmlWla(DqeU9=oo6CjWj;EG-rjo-Z;=-YNF{`ZV0C{w)&YTn_v1hraqC%5dNt z-_Xshq?-9Wr{YGpFc!fBi+WLqX^-?+n$F3BDpTvkfwIMLowl`u1OL%&x6XAuw`U&U zb&iVt<$lgJZ8W?UhgIEXsQ(B7?xc^2nRZ?rd8LK6>RoXYBy!4%=t3LJP($&k)zZit z0$9i=pIZDgo)kv8uZ*$fgWC>-1D^r+cypaNzP%fJCxmC1D~&$r&eA5th+hlNbn2$+ zNC(K@{Fc^<+)bbb?luZ17z|LZQCp=Bb%=)ga)}lvN?PYDGahp;5b6DUn$hKTCgvM^ zZ}ZIu-k~MzsMzgy*q7DIe6-gQR`2)`}5+EN#G;j<+|JD2z(y!R&ot-V(+$|6&{PC|;rsF_uzn?0Fus8huIr+97i2NH%paWSi8wCXn zYlN^joX6f7*~LX$K#Z>t>OS7bo7$+(EG#P`45p9{kr#-O<(}@pN(3Zl5(Xg-HZ&_Y zUmPShEl{Q<BS0OLRkVKc{JtJhGN5hO zD)N+EG~0;Iehv($G1FZFSC^(P2hb*E@o)V|Gu)b>4X%tJ! zlq?54WkVv36FfR{yNmM2bX9m0tiN6#4o~W5e6sM~NU6@BHskJ0*x9LfjelBI6;E^( zp979`GlmyPBV0_E%YJZ_kWSd1EyKu~+xy=z5iB2{v@niNqSt6RZ1I#G+2YeGXScVF z?hlTy>BPju+a8afu}JNsh~F!aoa?BqDH@+|)TYg;3B*=m+E^V4TItvP7+cD7*b3v9 zsY9Dth+$*x=618Czhhl$8xcMZr-BfFRCLD1>%I3HqR-3%)dt(vfGw-eTFJc%_FtifpS{iKmQ6X-XTR z)Czyz%_|TI zBDJNXhi^Z__LdAvuPC#eC|g~^UqHj7V5?LPpne*gRhjcz4CY*_=iCNd+7>yfOico^ zM_kRf3f%0x(i*aR0$548Prkpn)6N}tN8VTkHjtJUnWYmjqHLTUg+4t$9A|MbPB+k0 ziXqn+Q>*DV33Lk+I5wAbHba+`a-2OJCl!@Dbn-2BQT{}Kvmc%kvQl^V#+qEwZuO*& zs>K5^h)lyLHy+@X`|JSt1wCEh-PWBW6OYA*wt5LT?$J>nKYnpP>ns*U`o^jFGo=XS zh(PR3Aj~nT%zJvjsZMNV32#`=jwEd+C_*vDZAZk1TV&&(5RMo28AQ5SCgEx@r6hgVH zds=>FMJ~AT+@sdj9PxsF5jt)EPEs1DR7cTkjFk-kUJ_-{xp}`FcJy>CiILxE>uOtm5bpZyI#w~!TerD0!7ri~k_ zCgb-GR~{||8PzmF7%P+*4Q#bEL70!17)?<2G(i|Dlp6Jz0c=NmORTI%q5G&ae`=M{ zK<{B4n2#|V@bA{&#=yAuOo};d90^I?rO0O5ujYADnrh5n(q7&p6Ll-S z<+>oYdG|zQiD4IOJs9^@ipTy`O-!4Ex-bNlOs=U9D8_l_N{nx7ecIoj2@jgR)<>#L zXcl)89n{}Ai{0o`ksWTIT6CeWFF>v3w$XAe2HxA zbeICx6l>V;BlG2YsNJ5R)p`c@u=^YgXpQnMbqw?g2^0J-w`wPJjK46>YQQb2u2yqv zN(_KIj%Fcb~FnjEMGahvNxh< z_ft~mSnQA5wo+YVl2pE@S}i?aeOxpj@xXta&tNOojq0Na^)cB`NqUD80nY3e3yfY( z@}fe$+NjSr_worbuYJjw+?Px;ee5&tI5d2y>Zpd?AJlhLGJsyL|NRGya|}qs)VAU zZk=F3<6j{iKe+PJDD}5|Cm~J4e+-p2@ddccvMv}2BE3eZxq(i`uO3^plBzP2C5EID zy5-Zhe&I1XWd}PEN9LmE6bi$98IYL6#|rq!3(qU*el$MG%t^agE@|XGkO&wLjUE(0 zd@8Zz4Bf3k|B^`c(|Jpx-XmW+K_C$2_$0g>9?0PFc!!b_99N8_ti4aDCOKR_*x#_& z-!C4uwXs>H%pc|hzqw8TQ`Po1G7d(MkLag@ln=MGf%Z=haf)3lLVi;@f6+_%gYtZy z1Nn7HZ#ipSziS6?;=#?GJLH3mx_DMh0x zzr$8A4Mw$b4I-BujYtZ~LV^KrfpX(8V22wXdjRFz+%2OL6g z9E?3V+{a*<;OENSRwm2B4Ehz*FHBCdO7&D_wFg#mC&c5!61%;)2%MY*yke4h=d_zC zx=YTU$n@!btl&k_uBd2=W zeLcc*@$a;uzkD#ted_^8w=TzqV1~&qI0x^gw^Zk-+L5G~AC-%0B)!GA9Skeh^uHli zKh@4d4({~bJyTqI%UFdN#fu?o`oZvP4)Fx-B~b)vB`GNP2N}vH`)S#6FY^PT!bF-@ zZHcf5nR|Jc#%tOBZce_^JU`-DZ2@`UVjOW;w5O5G-Td_C1qD1{o`2Y4tPpGFiGBHI z-{v(on(=U~RG^e6{&34E)Jv0R8In>F^j% zqQ#x*Y&2Sk{0z;L^|K1yV|Xg{pzd@)_($CV1G=m)5Rsr$K-!^Wlb0A189i1~`cZf5 z(=`w4r#YYcfh3(_5A#ul`}eSL77un`emwU6s8OCic>7hC@|WP}fN5Rjh`lFotx+055g|CRA z!`N;fYh0{$BY35shx4X);z>nAU!?b~`B8cjJ7D*p7!aDix`-;FVf(m<8uM>%8aNrG z3kEv9JODf7Z{6;Bjd?g(w#PLfz7T?3*wPGj1kLpcdT^TL2Ppfh_lsWMX;8%)yb`XP zzE?;8M%)&}u?Mn)^g9Beooj3<5KU~2otzy_43eY+FcFj3qcE{y*f_XY|K>XfG;|cU zc(Hx<)Q#8l^YI@aIHp>#X^|Ps7r80RI8%cYaqDt8SA5N3PqNmI`sf_2ezUvRvOIoF zpW*9o6u$kUXMUMHv3(e#rXIV9@p97-yk&dJpk|zm`2>+8?)d6$ObUr5W|dGWi={Yd zoh(TFd08*K;~k}p(uT&xhK2#d^(b%|3H$(vKPMDNX!yu z!RL-28N5R)H*5vWr7gem5y!i=UZ~iyr)PN&1EPKLY_U?RopYo^mm4;@OH6CVQ8yfJ zx3P-ME8XBsh_*04(TTCQzEv?sK%^U&!kBvxE~$^IRZkD3?UYI!9Tpq_?^()4cv$!& z)5>oPylSV9b(5yco6UCoFr^vFIag*IR%@Wt%8L2i>F^4@gB0j z*W0bkS4JwVm4G{F#E+Ee&y0 zmKxb;OX7A4)yMY~>;ak(+|%v8xq}cuw>Wxc%J!q>u2Wa&I-%rNUbtrakbN{hM#LDp z6jrxR(5-@U9uwnjw2f^a=j7*pGP4eNtS+-cW6l)Y{xWV*Vt{Wyz!BAHWYxVD51)@E zL7>F=NY{@QghjV3%ouht@jF>Y={j=4R{Ko5MRq0c;0I~yXGXl~ot*Tk(KI*okctVh zMW*iruz@F0EL(li6}N1%%7)3hALvfo`aCDOi>5;Ib7Cx|A%>$R!<2oyC@OoAW)5|G z*58ClL9SnA*1p2W06E7s`bwWZ#NVsX~-9YuVRKUR^b?% zq8{FRvEL2D&Hr!_Nqsfh0SO8xO;F{JTOpyXuA3|~fbivYc=P0P@>=}M;Y;X@;MZT8 zR8f}R!N0`GDk4UW%+9#E71QzklKcAd$!5-9rxtj9Vdv4i7XU`==_d%I@DGO(qm(OV z))?*#Mpy1`gxbi;X4WKhk82CAMA`r!AzY82?zheUr%`yLP0_xuMJ!5c9VkIMB*s>L z<(*`R0=9J+DdR6MSA<3l6!(@^ekK}Z4OE!EW3#1NIJ{XIW27X(agN#|KJ*pt*zGoJ z-?05!t=O1J^nf9cZBCW~e|+iYfCXu2wju8UF>FyRHU`>!_M{QjIO0l-C;}TpR%q28 z{2dM+H58B90JRxEi;R2nR5a48;J98ZhHw=HmJf3sIOt_CRY^Fx=^K-U%2=V6moa5* z4Gm{>gd;z;^Foz48RHWdA;rOTZw5k=gSH$D|9W~t65wns2P0qx2PL}3mvA@MzLz^1 zuex!1E-x8bl#l<^W^5rwj~>B(S3RlU51z;VEZmTr_kDndup%m1Rss3Xna)s_s?lF@LM3l>^pr{E1?2is6sx{Q?Ut~6ty?GWy4Pd zzFT6=Jp-yI4MTc!%VA#%2rJFmpp|AIlHF&&x1{m#d-!2TqsOM;*XTFH6?y;u0S`%( zBRfo+S4ZCE=aqMr=sM#%e_O-7N z@iAyge{F?H)`^%nN&N3I8Gu%;CC4ppOrKkIdp%|46ZpQj>uQ!IeOS@AvBoV%`L6Y` zf)f-})j)dnSg2j`)-IO z4qfT@ZAPtv$?llNAgY$T8|`MH`jKpOuZ?LVW+^nFv=p@ zumtb8gEtbXKh@%uS0Q`_B!4LTGx8z)?6O}Kgjso4!m?E;=RXE`BYp{cvl$=MV3zg5 z0VR!~7$FNK%{TQ@>8bejm`=cz%|Drn9Bxii)yo#g!~lx)M&@$cy%*yd7fQ*M%8lb= z7v-8>f=PmKKmcYAlHwOKiq%iBtX$BKei@$c`Urkh!bff(G2(jl>I=YTNArf>&#l~R1!T2Bxh4>-JuM>LWp^XI61kpi)266{q zla$af3QKXJ#DVZgI)YUQ>J8$Y)wtk0vfoh{EXbnKSZGmb8h|ju#e3}COOGBe0c(X8 z^5f~AG>96?RrG6%O*x3eP@W#|RCg?W*B+v;Ah$DfexC;=w6h7&7$gD`rYOa!-PulL z(WrMPU&ixSgmF2W_LxO_x@FqR#KV+}+yp7Y2KC=5OQnqt-JwK3)AByW4JiOwql2Z% zDqKrzjV2~Lroc-Ejs+iFQGG3u`H0R|Vlt=I5aKAFbYJ!GGF7by9LM>)!K0}%-4C#6 zENgHJNv^b-i|u-KCc=p($pY2Cc?Mlj(+na;tJE3`oYzu`M7*s`;%Ade7ZxCeWvYit z-)=p0`2Yve0gh~Ft@ z@Y4KOf(!sjXPR1_`dzR9uNAD zmI@tRpBh`hpapBLgno&uR&QVQo67-3iCxqawryIU^~!o1$iRrTo%w1xu-VsE)wUj; z;V7w*d(WO$@Kh%a68Hh*9bn}&5SK5~T(QJS#su)Uu9|u9&oTOc#OyyAt|RnT8D!pI zpY|u&>In>slj1|5Ha3U4f^b@&dvEng;bVnwqXqA}l5nWS`}mwqzPc2Mn(9&XYZLiM zO@<9Lr^Ag##=X?hp&}5 zgJb{$S*wpZrC7m$iUrXUihH}Dr;n(g*jf4##O2%x8+UV;%Ef{U&l&a)8*w& z|I%`jg#aG@=$*mpL)aWl#Qqa<{hIkoS7_D1f^pyU179x%eR+Iensw_Tc949Pf>NT7W>qDO?sMyIwTTc}go0ZU(nz5eBy( zX(?)JWNDY7H5O(qJs#j%;3o_g*6#jkwjR(J9rq|b)x7OiPp>{HtLt%It%e|;N#`IhXN@xv z4gge{;<~$F3op(ydqYQsq_8IkBFb^UMj+>)BdStTu^B+YHITzt%@949}pH;_|JD z@QJ(;Z5Ktk0U0zy=id?gB!|Q8K+EIx1%UCx2zFiY^G;JIk7c}3H=RQvDhoMDM^~g# zRNodUFvRd&%?nKp^`?guS3q8vys%z}_5`SmnPtL?()XLN%&w2NpQ=CPTp64qEd9c% z1xJyH;3BQJ1L=Caz7}2tH8Ba6tx%RU)+>L`(?=@c=Qw452wjXcs^M?fx$I9JlR&hcej~v=O z3ra5T)$RoGdDt#x4_pH0=GZ&-?jr)~Hk}4*%^Be7k$S+`@k*NCuJ2zFqQ{o>7Dr!P zej#JoC5c}1GYkxm8frL1MkBMq0J7)qz{u##(I7`iF6R@Rz-Ad(5QUHmZf1Bt|6x;e zp?aeR3+`LOw+go25LX0r`l1FamLShbK;c9uW|HvzC`^s`NkGbvNr4k6rmYY-K`ds% zp@+NsJ56JECA7Z+tr_} zmgc2JD8CSwUcxr--gOT@QENP- zcY3F-$5`XtEUOxKq_6PcAizWv|JfHLug0%LXxp8eZ%89yTn5B=tfsapvdrev*rA}a zq+gJn;H2%zC-zJYB3C6xg3q(B6DoZ*4Y9@F2PCulio}um^3QoRdZZtR%N@Ws0MOMK zsVP!Sht5Wat`)t3?2rL8N)u{Mb8RX0;}4FYJ!WTC@#BPVf%RoWhZVD(oBeV-{`b(H zGDy#g+x|%Vck_VY+4#qb#Zm8cXgWn_>WEqM-^Q)S3<-k^T7%J6J?!4Nd{(Bvj)-&td5C_>-csIw)` z*pU;)qc@t>iyz6=bPZsYP)+7=jm^gElI8s0mGkGF?u7JmCCQ>&bE*~DU8{km8I&;a z%Hfx?kXBexq&o|834AexQepTPO(d~IWEEu*GYqc5!0h0Q@D#gI9>dMjHrHt}sf%m_ z)wGpo{b~PA7C(p&k_9dqHonyrTSt!GDE74+;K~TZWFGcMx&G(JP_uBVRO%V(mMomQ zH6n_EXof)LD9sD#q=4Pie?Jii+kXOgX>=PH+-dPMsPN$IoNTRuzc4)W(l}7D(bF7# zQHWdVH!zk^!P(f@(uiY`sgSr>;234i>@8d^iJ95B|2xZ``cBcIb0UBG_YM#Nkv1MC zCRb`n$zeiCF#=)Ao0L>TO(Ct4cwO6Jo}c{8MZ_Mn_a3t`4hF48&sJ~vW@1JeB}`-4 zMUAs%JSq3|0wzZq`5SL=6o_PDKtF7ShmvmOCOy3e6K08GxiV4A$ks+p3oU!o$&Zny zO{)|*GMWGa>Dl)gv5h!UyRJ+FS;a*{$Ow3UrzKao2ErKxGf0aj@J8iBEweqLLG|Wf zAwVLrQ%Dggf1<9tWspI@lT?8?PLIVHvk{_hB15?Uq9j7?k)HOvD1#AS5t5umxfYa) ziIY}`L)L^m{wX_->FSi*ZvYcTD~3jgUv@6%m>&lKVevd5=7o_K#*EK0g6S94Q7nC(kp)aaXRhjWtyhj}nJp+pY@?#s-TK zm7s};>s+cZPO&vG$wxi^kKHCs~D^M2nW zGI|5FU%DI&w(sc}O1_lHZf5M57+$Io@fD}%Oe@V<94v0(UqS!IV%VX*TKB1f zghi(WP{hdO1QJ&Meu}OA=CB*9R1lR8L#0+mN>MN?%gL@&pnVec&0z%;)j;BJkOxTA z(1Pn%&dEgPR?giq977XxGSp|85V=;JM-eE{qgBuaI+?=C_85`^z9RF+7g+(J+I^8d zUzvH%uw3fk@_W{wf=KKJ<*-?;U>Ng;L9%}fh$%a@jT^pF#kMc+_|uLuCKtC4fPr-o zlP!E2`?|22jQE#`ZMafO{r6BN2&gUff-Lr50t=mfU%j=#?q0eZZeP7G=edOPpjKRU|P3jSDmYz2KBb{^Q2gIIYR13AmF%!P8q zF%nP<`EW%s@3zQ+aQq4H0D}gKs0#gTbLY<$xokN%aX7Mmn99J37ErWbv1JY zpU!js^`L0*{7UHMcdYNQ#IH%G&}rr{Pte@kqOj)2hL3v+c{pX{8as?BVQfhUZh!mZ zpCBqb16&hg?Pj%M{l^8s_EW(J;854PwJD&LLw|T7^maOo_VICT-|YS60_@S#&1Tzp zx4YYUp6{~hn6G+ty)p9d;o|SM-K=4l285(}xTxv^zHnDK=DfKO!@Ge~^D=G^whx!5 zaxM*RmP7(R9bfZT&~@HBbq4%|23-PI48X;Pv$g2G3ANU)ofiE=oVfLOgnN#2#${J7 zDKh+)vq)m$CcU^~Dfdo?^YStOPC~Qejav`70xYuKluM4UQU+;ddBOT-F)7^#C#$=R z>q}_rNDA@V5lsM8F19+IhGB(%;9e@mvq9tGL|VT%4%+wCz@1j_je-WsoR)BlLj$2Jl;KduS_&B2f9Y81`8dwIdl(StqH8tlxu5X}fABT1U-|@| z$(k~jg_+b6X`&kyXxOtETr!2q0(w3^&#-uyD-u+-I~q*Ir7Ed!T>UHn3_`OX$+F`) zUk$YD@&>C8aCLA3?>&X$=7FLJm>3(_bejaXf~1?am+!|D73R6J2n>IIqyos2Y5*_e z-4M;6Hto5}cI`4lDOYn6^{!c#o{pE zJPw<2)?a}?2q4qyBm;gSwhE<;v7C#?6L8-J#X&5BOMT<={6Hv_Q5j)r1R7LKDn zm$gy}Cg67uN;646v`2SgmdT#3zO*rOB3a8kSkr@5mCzOxUMYCrcQYKlEd&JC(_AK^ zeZCeq_}=2Lo_;%B5yZV~-pH(25vaqKEp14vvN!eGW;AcFNd=vB5oq+sZ zPG|$?Pi8m$sODZ5FaWsD{m;D`wQ*mq�$_v%|5?OKUxk(thg`zqas@>0-cxNWK1` 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