Changeset b38b64
- Timestamp:
- Jul 23, 2009, 9:14:18 AM (16 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 631dcb
- Parents:
- b77416 (diff), 72744a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/analyzer.cpp
rb77416 rb38b64 25 25 periodentafel *periode = NULL; // and a period table of all elements 26 26 EnergyMatrix Energy; 27 EnergyMatrix EnergyFragments; 28 ForceMatrix Force; 29 ForceMatrix ForceFragments; 30 HessianMatrix Hessian; 31 HessianMatrix HessianFragments; 27 32 EnergyMatrix Hcorrection; 28 ForceMatrix Force;33 EnergyMatrix HcorrectionFragments; 29 34 ForceMatrix Shielding; 30 35 ForceMatrix ShieldingPAS; … … 32 37 ForceMatrix ChiPAS; 33 38 EnergyMatrix Time; 34 EnergyMatrix EnergyFragments;35 EnergyMatrix HcorrectionFragments;36 ForceMatrix ForceFragments;37 39 ForceMatrix ShieldingFragments; 38 40 ForceMatrix ShieldingPASFragments; … … 53 55 stringstream yrange; 54 56 char *dir = NULL; 55 bool Hcorrected = true; 57 bool NoHCorrection = false; 58 bool NoHessian = false; 59 bool NoTime = false; 56 60 double norm; 57 61 int counter; … … 88 92 // ------------- Parse through all Fragment subdirs -------- 89 93 if (!Energy.ParseFragmentMatrix(argv[1], dir, EnergySuffix,0,0)) return 1; 90 Hcorrected = Hcorrection.ParseFragmentMatrix(argv[1], "", HCORRECTIONSUFFIX,0,0); 94 if (!Hcorrection.ParseFragmentMatrix(argv[1], "", HCORRECTIONSUFFIX,0,0)) { 95 NoHCorrection = true; 96 cout << "No HCorrection file found, skipping these." << endl; 97 } 98 91 99 if (!Force.ParseFragmentMatrix(argv[1], dir, ForcesSuffix,0,0)) return 1; 92 if (!Time.ParseFragmentMatrix(argv[1], dir, TimeSuffix, 10,1)) return 1; 100 if (!Hessian.ParseFragmentMatrix(argv[1], dir, HessianSuffix,0,0)) { 101 NoHessian = true; 102 cout << "No Hessian file found, skipping these." << endl; 103 } 104 if (!Time.ParseFragmentMatrix(argv[1], dir, TimeSuffix, 10,1)) { 105 NoTime = true; 106 cout << "No speed file found, skipping these." << endl; 107 } 93 108 if (periode != NULL) { // also look for PAS values 94 109 if (!Shielding.ParseFragmentMatrix(argv[1], dir, ShieldingSuffix, 1, 0)) return 1; … … 99 114 100 115 // ---------- Parse the TE Factors into an array ----------------- 101 if (!Energy.ParseIndices()) return 1; 102 if (Hcorrected) Hcorrection.ParseIndices(); 116 if (!Energy.InitialiseIndices()) return 1; 117 if (!NoHCorrection) 118 Hcorrection.InitialiseIndices(); 103 119 104 120 // ---------- Parse the Force indices into an array --------------- 105 121 if (!Force.ParseIndices(argv[1])) return 1; 106 122 if (!ForceFragments.AllocateMatrix(Force.Header, Force.MatrixCounter, Force.RowCounter, Force.ColumnCounter)) return 1; 107 if (!ForceFragments.ParseIndices(argv[1])) return 1; 123 if (!ForceFragments.InitialiseIndices((class MatrixContainer *)&Force)) return 1; 124 125 // ---------- Parse hessian indices into an array ----------------- 126 if (!NoHessian) { 127 if (!Hessian.InitialiseIndices((class MatrixContainer *)&Force)) return 1; 128 if (!HessianFragments.AllocateMatrix(Hessian.Header, Hessian.MatrixCounter, Hessian.RowCounter, Hessian.ColumnCounter)) return 1; 129 if (!HessianFragments.InitialiseIndices((class MatrixContainer *)&Force)) return 1; 130 } 108 131 109 132 // ---------- Parse the shielding indices into an array --------------- … … 129 152 // ---------- Parse fragment files created by 'joiner' into an array ------------- 130 153 if (!EnergyFragments.ParseFragmentMatrix(argv[1], dir, EnergyFragmentSuffix,0,0)) return 1; 131 if (Hcorrected) HcorrectionFragments.ParseFragmentMatrix(argv[1], dir, HcorrectionFragmentSuffix,0,0); 154 if (!NoHCorrection) 155 HcorrectionFragments.ParseFragmentMatrix(argv[1], dir, HcorrectionFragmentSuffix,0,0); 132 156 if (!ForceFragments.ParseFragmentMatrix(argv[1], dir, ForceFragmentSuffix,0,0)) return 1; 157 if (!NoHessian) 158 if (!HessianFragments.ParseFragmentMatrix(argv[1], dir, HessianFragmentSuffix,0,0)) return 1; 133 159 if (periode != NULL) { // also look for PAS values 134 160 if (!ShieldingFragments.ParseFragmentMatrix(argv[1], dir, ShieldingFragmentSuffix, 1, 0)) return 1; … … 144 170 filename << argv[3] << "/" << "energy-forces.all"; 145 171 output.open(filename.str().c_str(), ios::out); 146 output << endl << "Total Energy" << endl << "==============" << endl << Energy.Header << endl;172 output << endl << "Total Energy" << endl << "==============" << endl << Energy.Header[Energy.MatrixCounter] << endl; 147 173 for(int j=0;j<Energy.RowCounter[Energy.MatrixCounter];j++) { 148 for(int k=0;k<Energy.ColumnCounter ;k++)174 for(int k=0;k<Energy.ColumnCounter[Energy.MatrixCounter];k++) 149 175 output << scientific << Energy.Matrix[ Energy.MatrixCounter ][j][k] << "\t"; 150 176 output << endl; … … 152 178 output << endl; 153 179 154 output << endl << "Total Forces" << endl << "===============" << endl << Force.Header << endl;180 output << endl << "Total Forces" << endl << "===============" << endl << Force.Header[Force.MatrixCounter] << endl; 155 181 for(int j=0;j<Force.RowCounter[Force.MatrixCounter];j++) { 156 for(int k=0;k<Force.ColumnCounter ;k++)182 for(int k=0;k<Force.ColumnCounter[Force.MatrixCounter];k++) 157 183 output << scientific << Force.Matrix[ Force.MatrixCounter ][j][k] << "\t"; 158 184 output << endl; … … 160 186 output << endl; 161 187 188 if (!NoHessian) { 189 output << endl << "Total Hessian" << endl << "===============" << endl << Hessian.Header[Hessian.MatrixCounter] << endl; 190 for(int j=0;j<Hessian.RowCounter[Hessian.MatrixCounter];j++) { 191 for(int k=0;k<Hessian.ColumnCounter[Hessian.MatrixCounter];k++) 192 output << scientific << Hessian.Matrix[ Hessian.MatrixCounter ][j][k] << "\t"; 193 output << endl; 194 } 195 output << endl; 196 } 197 162 198 if (periode != NULL) { // also look for PAS values 163 output << endl << "Total Shieldings" << endl << "===============" << endl << Shielding.Header << endl;199 output << endl << "Total Shieldings" << endl << "===============" << endl << Shielding.Header[Hessian.MatrixCounter] << endl; 164 200 for(int j=0;j<Shielding.RowCounter[Shielding.MatrixCounter];j++) { 165 for(int k=0;k<Shielding.ColumnCounter ;k++)201 for(int k=0;k<Shielding.ColumnCounter[Shielding.MatrixCounter];k++) 166 202 output << scientific << Shielding.Matrix[ Shielding.MatrixCounter ][j][k] << "\t"; 167 203 output << endl; … … 169 205 output << endl; 170 206 171 output << endl << "Total Shieldings PAS" << endl << "===============" << endl << ShieldingPAS.Header << endl;207 output << endl << "Total Shieldings PAS" << endl << "===============" << endl << ShieldingPAS.Header[ShieldingPAS.MatrixCounter] << endl; 172 208 for(int j=0;j<ShieldingPAS.RowCounter[ShieldingPAS.MatrixCounter];j++) { 173 for(int k=0;k<ShieldingPAS.ColumnCounter ;k++)209 for(int k=0;k<ShieldingPAS.ColumnCounter[ShieldingPAS.MatrixCounter];k++) 174 210 output << scientific << ShieldingPAS.Matrix[ ShieldingPAS.MatrixCounter ][j][k] << "\t"; 175 211 output << endl; … … 194 230 } 195 231 196 output << endl << "Total Times" << endl << "===============" << endl << Time.Header << endl; 197 for(int j=0;j<Time.RowCounter[Time.MatrixCounter];j++) { 198 for(int k=0;k<Time.ColumnCounter;k++) { 199 output << scientific << Time.Matrix[ Time.MatrixCounter ][j][k] << "\t"; 200 } 201 output << endl; 202 } 203 output << endl; 232 if (!NoTime) { 233 output << endl << "Total Times" << endl << "===============" << endl << Time.Header[Time.MatrixCounter] << endl; 234 for(int j=0;j<Time.RowCounter[Time.MatrixCounter];j++) { 235 for(int k=0;k<Time.ColumnCounter[Time.MatrixCounter];k++) { 236 output << scientific << Time.Matrix[ Time.MatrixCounter ][j][k] << "\t"; 237 } 238 output << endl; 239 } 240 output << endl; 241 } 204 242 output.close(); 205 for(int k=0;k<Time.ColumnCounter;k++) 206 Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k] = Time.Matrix[ Time.MatrixCounter ][Time.RowCounter[Time.MatrixCounter]-1][k]; 243 if (!NoTime) 244 for(int k=0;k<Time.ColumnCounter[Time.MatrixCounter];k++) 245 Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k] = Time.Matrix[ Time.MatrixCounter ][Time.RowCounter[Time.MatrixCounter]-1][k]; 207 246 208 247 // +++++++++++++++ ANALYZING ++++++++++++++++++++++++++++++ … … 214 253 // +++++++++++++++++++++++++++++++++++++++ Plotting Simtime vs Bond Order 215 254 // +++++++++++++++++++++++++++++++++++++++ Plotting Delta Simtime vs Bond Order 216 if (!OpenOutputFile(output, argv[3], "SimTime-Order.dat" )) return false; 217 if (!OpenOutputFile(output2, argv[3], "DeltaSimTime-Order.dat" )) return false; 218 for(int j=Time.RowCounter[Time.MatrixCounter];j--;) 219 for(int k=Time.ColumnCounter;k--;) { 220 Time.Matrix[ Time.MatrixCounter ][j][k] = 0.; 221 } 222 counter = 0; 223 output << "#Order\tFrag.No.\t" << Time.Header << endl; 224 output2 << "#Order\tFrag.No.\t" << Time.Header << endl; 225 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 226 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) 227 for(int j=Time.RowCounter[Time.MatrixCounter];j--;) 228 for(int k=Time.ColumnCounter;k--;) { 229 Time.Matrix[ Time.MatrixCounter ][j][k] += Time.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 230 } 231 counter += KeySet.FragmentsPerOrder[BondOrder]; 232 output << BondOrder+1 << "\t" << counter; 233 output2 << BondOrder+1 << "\t" << counter; 234 for(int k=0;k<Time.ColumnCounter;k++) { 235 output << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k]; 236 if (fabs(Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k]) > MYEPSILON) 237 output2 << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k] / Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k]; 238 else 239 output2 << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k]; 240 } 241 output << endl; 242 output2 << endl; 243 } 244 output.close(); 245 output2.close(); 255 if (!NoTime) { 256 if (!OpenOutputFile(output, argv[3], "SimTime-Order.dat" )) return false; 257 if (!OpenOutputFile(output2, argv[3], "DeltaSimTime-Order.dat" )) return false; 258 for(int j=Time.RowCounter[Time.MatrixCounter];j--;) 259 for(int k=Time.ColumnCounter[Time.MatrixCounter];k--;) { 260 Time.Matrix[ Time.MatrixCounter ][j][k] = 0.; 261 } 262 counter = 0; 263 output << "#Order\tFrag.No.\t" << Time.Header[Time.MatrixCounter] << endl; 264 output2 << "#Order\tFrag.No.\t" << Time.Header[Time.MatrixCounter] << endl; 265 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 266 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) 267 for(int j=Time.RowCounter[Time.MatrixCounter];j--;) 268 for(int k=Time.ColumnCounter[Time.MatrixCounter];k--;) { 269 Time.Matrix[ Time.MatrixCounter ][j][k] += Time.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 270 } 271 counter += KeySet.FragmentsPerOrder[BondOrder]; 272 output << BondOrder+1 << "\t" << counter; 273 output2 << BondOrder+1 << "\t" << counter; 274 for(int k=0;k<Time.ColumnCounter[Time.MatrixCounter];k++) { 275 output << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k]; 276 if (fabs(Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k]) > MYEPSILON) 277 output2 << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k] / Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter] ][k]; 278 else 279 output2 << "\t" << scientific << Time.Matrix[ Time.MatrixCounter ][ Time.RowCounter[Time.MatrixCounter]-1 ][k]; 280 } 281 output << endl; 282 output2 << endl; 283 } 284 output.close(); 285 output2.close(); 286 } 287 288 if (!NoHessian) { 289 // +++++++++++++++++++++++++++++++++++++++ Plotting deviation in hessian to full QM 290 if (!CreateDataDeltaHessianOrderPerAtom(Hessian, HessianFragments, KeySet, argv[3], "DeltaHessian_xx-Order", "Plot of error between approximated hessian and full hessian versus the Bond Order", datum)) return 1; 291 292 if (!CreateDataDeltaFrobeniusOrderPerAtom(Hessian, HessianFragments, KeySet, argv[3], "DeltaFrobeniusHessian_xx-Order", "Plot of error between approximated hessian and full hessian in the frobenius norm versus the Bond Order", datum)) return 1; 293 294 // ++++++++++++++++++++++++++++++++++++++Plotting Hessian vs. Order 295 if (!CreateDataHessianOrderPerAtom(HessianFragments, KeySet, argv[3], "Hessian_xx-Order", "Plot of approximated hessian versus the Bond Order", datum)) return 1; 296 if (!AppendOutputFile(output, argv[3], "Hessian_xx-Order.dat" )) return false; 297 output << endl << "# Full" << endl; 298 for(int j=0;j<Hessian.RowCounter[Hessian.MatrixCounter];j++) { 299 output << j << "\t"; 300 for(int k=0;k<Hessian.ColumnCounter[Force.MatrixCounter];k++) 301 output << scientific << Hessian.Matrix[ Hessian.MatrixCounter ][j][k] << "\t"; 302 output << endl; 303 } 304 output.close(); 305 } 246 306 247 307 // +++++++++++++++++++++++++++++++++++++++ Plotting shieldings … … 254 314 for(int j=0;j<ShieldingPAS.RowCounter[ShieldingPAS.MatrixCounter];j++) { 255 315 output << j << "\t"; 256 for(int k=0;k<ShieldingPAS.ColumnCounter ;k++)316 for(int k=0;k<ShieldingPAS.ColumnCounter[ShieldingPAS.MatrixCounter];k++) 257 317 output << scientific << ShieldingPAS.Matrix[ ShieldingPAS.MatrixCounter ][j][k] << "\t"; //*(((k>1) && (k<6))? 1.e6 : 1.) << "\t"; 258 318 output << endl; … … 297 357 for(int j=0;j<Force.RowCounter[Force.MatrixCounter];j++) { 298 358 output << j << "\t"; 299 for(int k=0;k<Force.ColumnCounter ;k++)359 for(int k=0;k<Force.ColumnCounter[Force.MatrixCounter];k++) 300 360 output << scientific << Force.Matrix[ Force.MatrixCounter ][j][k] << "\t"; 301 361 output << endl; … … 346 406 yrange.str("[1e-8:1e+1]"); 347 407 348 // +++++++++++++++++++++++++++++++++++++++ Plotting Simtime vs Bond Order 349 if (!CreatePlotOrder(Time, KeySet, argv[3], "SimTime-Order", 1, "below", "y", "", 1, 1, "bond order k", "Evaluation time [s]", Orderxrange.str().c_str(), "", "1" , "with linespoints", EnergyPlotLine)) return 1; 408 if (!NoTime) { 409 // +++++++++++++++++++++++++++++++++++++++ Plotting Simtime vs Bond Order 410 if (!CreatePlotOrder(Time, KeySet, argv[3], "SimTime-Order", 1, "below", "y", "", 1, 1, "bond order k", "Evaluation time [s]", Orderxrange.str().c_str(), "", "1" , "with linespoints", EnergyPlotLine)) return 1; 411 } 350 412 351 413 // +++++++++++++++++++++++++++++++++++++++ Plotting deviation in energy to full QM -
src/datacreator.cpp
rb77416 rb38b64 63 63 cout << msg << endl; 64 64 output << "# " << msg << ", created on " << datum; 65 output << "#Order\tFrag.No.\t" << Fragments.Header << endl;65 output << "#Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 66 66 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 67 67 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 68 68 for(int j=Fragments.RowCounter[ KeySet.OrderSet[BondOrder][i] ];j--;) 69 for(int k=Fragments.ColumnCounter ;k--;)69 for(int k=Fragments.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];k--;) 70 70 Fragments.Matrix[Fragments.MatrixCounter][j][k] += Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 71 71 } 72 72 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 73 for (int l=0;l<Fragments.ColumnCounter ;l++)73 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 74 74 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter]-1 ][l]; 75 75 output << endl; … … 96 96 cout << msg << endl; 97 97 output << "# " << msg << ", created on " << datum; 98 output << "#Order\tFrag.No.\t" << Fragments.Header << endl;98 output << "#Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 99 99 Fragments.SetLastMatrix(Energy.Matrix[Energy.MatrixCounter],0); 100 100 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 101 101 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 102 102 for(int j=Fragments.RowCounter[ KeySet.OrderSet[BondOrder][i] ];j--;) 103 for(int k=Fragments.ColumnCounter ;k--;)103 for(int k=Fragments.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];k--;) 104 104 Fragments.Matrix[Fragments.MatrixCounter][j][k] -= Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 105 105 } 106 106 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 107 for (int l=0;l<Fragments.ColumnCounter ;l++)107 for (int l=0;l<Fragments.ColumnCounter[Energy.MatrixCounter];l++) 108 108 if (fabs(Energy.Matrix[Energy.MatrixCounter][ Energy.RowCounter[Energy.MatrixCounter]-1 ][l]) < MYEPSILON) 109 109 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter]-1 ][l]; … … 133 133 cout << msg << endl; 134 134 output << "# " << msg << ", created on " << datum; 135 output << "# Order\tFrag.No.\t" << Fragments.Header << endl;135 output << "# Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 136 136 Fragments.SetLastMatrix(0.,0); 137 137 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { … … 139 139 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 140 140 CreateForce(Fragments, Fragments.MatrixCounter); 141 for (int l=0;l<Fragments.ColumnCounter ;l++)141 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 142 142 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter] ][l]; 143 143 output << endl; … … 165 165 cout << msg << endl; 166 166 output << "# " << msg << ", created on " << datum; 167 output << "# Order\tFrag.No.\t" << Fragments.Header << endl;167 output << "# Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 168 168 Fragments.SetLastMatrix(Force.Matrix[Force.MatrixCounter],0); 169 169 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { … … 171 171 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 172 172 CreateForce(Fragments, Fragments.MatrixCounter); 173 for (int l=0;l<Fragments.ColumnCounter ;l++)173 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 174 174 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter] ][l]; 175 175 output << endl; … … 198 198 cout << msg << endl; 199 199 output << "# " << msg << ", created on " << datum; 200 output << "# AtomNo\t" << Fragments.Header << endl;200 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 201 201 Fragments.SetLastMatrix(Force.Matrix[Force.MatrixCounter], 0); 202 202 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { … … 207 207 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 208 208 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 209 for (int l=0;l<Fragments.ColumnCounter ;l++) {209 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 210 210 if (((l+1) % 3) == 0) { 211 211 norm = 0.; … … 244 244 cout << msg << endl; 245 245 output << "# " << msg << ", created on " << datum; 246 output << "# AtomNo\t" << Fragments.Header << endl;246 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 247 247 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 248 248 //cout << "Current order is " << BondOrder << "." << endl; … … 252 252 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 253 253 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 254 for (int l=0;l<Fragments.ColumnCounter ;l++)254 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) 255 255 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 256 256 output << endl; … … 262 262 }; 263 263 264 265 /** Plot hessian error vs. vs atom vs. order. 266 * \param &Hessian HessianMatrix containing reference values (in MatrixCounter matrix) 267 * \param &Fragments HessianMatrix class containing matrix values 268 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 269 * \param *prefix prefix in filename (without ending) 270 * \param *msg message to be place in first line as a comment 271 * \param *datum current date and time 272 * \return true if file was written successfully 273 */ 274 bool CreateDataDeltaHessianOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 275 { 276 stringstream filename; 277 ofstream output; 278 double norm = 0.; 279 280 filename << prefix << ".dat"; 281 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 282 cout << msg << endl; 283 output << "# " << msg << ", created on " << datum; 284 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 285 Fragments.SetLastMatrix(Hessian.Matrix[Hessian.MatrixCounter], 0); 286 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 287 //cout << "Current order is " << BondOrder << "." << endl; 288 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, -1.); 289 // errors per atom 290 output << endl << "#Order\t" << BondOrder+1 << endl; 291 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 292 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 293 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 294 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 295 } 296 output << endl; 297 } 298 output << endl; 299 } 300 output.close(); 301 return true; 302 }; 303 304 /** Plot hessian error vs. vs atom vs. order in the frobenius norm. 305 * \param &Hessian HessianMatrix containing reference values (in MatrixCounter matrix) 306 * \param &Fragments HessianMatrix class containing matrix values 307 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 308 * \param *prefix prefix in filename (without ending) 309 * \param *msg message to be place in first line as a comment 310 * \param *datum current date and time 311 * \return true if file was written successfully 312 */ 313 bool CreateDataDeltaFrobeniusOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 314 { 315 stringstream filename; 316 ofstream output; 317 double norm = 0; 318 double tmp; 319 320 filename << prefix << ".dat"; 321 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 322 cout << msg << endl; 323 output << "# " << msg << ", created on " << datum; 324 output << "# AtomNo\t"; 325 Fragments.SetLastMatrix(Hessian.Matrix[Hessian.MatrixCounter], 0); 326 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 327 output << "Order" << BondOrder+1 << "\t"; 328 } 329 output << endl; 330 output << Fragments.RowCounter[ Fragments.MatrixCounter ] << "\t"; 331 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 332 //cout << "Current order is " << BondOrder << "." << endl; 333 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, -1.); 334 // frobenius norm of errors per atom 335 norm = 0.; 336 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 337 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 338 tmp = Fragments.Matrix[Fragments.MatrixCounter][ j ][l]; 339 norm += tmp*tmp; 340 } 341 } 342 output << scientific << sqrt(norm)/(Fragments.RowCounter[ Fragments.MatrixCounter ]*Fragments.ColumnCounter[ Fragments.MatrixCounter] ) << "\t"; 343 } 344 output << endl; 345 output.close(); 346 return true; 347 }; 348 349 /** Plot hessian error vs. vs atom vs. order. 350 * \param &Fragments HessianMatrix class containing matrix values 351 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 352 * \param *prefix prefix in filename (without ending) 353 * \param *msg message to be place in first line as a comment 354 * \param *datum current date and time 355 * \return true if file was written successfully 356 */ 357 bool CreateDataHessianOrderPerAtom(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 358 { 359 stringstream filename; 360 ofstream output; 361 362 filename << prefix << ".dat"; 363 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 364 cout << msg << endl; 365 output << "# " << msg << ", created on " << datum; 366 output << "# AtomNo\t" << Fragments.Header[ Fragments.MatrixCounter ] << endl; 367 Fragments.SetLastMatrix(0., 0); 368 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 369 //cout << "Current order is " << BondOrder << "." << endl; 370 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, 1.); 371 // errors per atom 372 output << endl << "#Order\t" << BondOrder+1 << endl; 373 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 374 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 375 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) 376 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 377 output << endl; 378 } 379 output << endl; 380 } 381 output.close(); 382 return true; 383 }; 384 264 385 /** Plot matrix vs. fragment. 265 386 */ … … 273 394 cout << msg << endl; 274 395 output << "# " << msg << ", created on " << datum << endl; 275 output << "#Order\tFrag.No.\t" << Fragment.Header << endl;396 output << "#Order\tFrag.No.\t" << Fragment.Header[ Fragment.MatrixCounter ] << endl; 276 397 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 277 398 for(int i=0;i<KeySet.FragmentsPerOrder[BondOrder];i++) { 278 399 output << BondOrder+1 << "\t" << KeySet.OrderSet[BondOrder][i]+1; 279 400 CreateFragment(Fragment, KeySet.OrderSet[BondOrder][i]); 280 for (int l=0;l<Fragment.ColumnCounter ;l++)401 for (int l=0;l<Fragment.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];l++) 281 402 output << scientific << "\t" << Fragment.Matrix[ KeySet.OrderSet[BondOrder][i] ][ Fragment.RowCounter[ KeySet.OrderSet[BondOrder][i] ] ][l]; 282 403 output << endl; … … 297 418 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 298 419 if (fabs(Fragments.Matrix[ Fragments.MatrixCounter ][j][1]) < fabs(Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][1])) { 299 for (int k=Fragments.ColumnCounter ;k--;)420 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 300 421 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 301 422 } … … 314 435 int i=0; 315 436 do { // first get a minimum value unequal to 0 316 for (int k=Fragments.ColumnCounter ;k--;)437 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 317 438 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 318 439 i++; … … 320 441 for(;i<KeySet.FragmentsPerOrder[BondOrder];i++) { // then find lowest 321 442 if (fabs(Fragments.Matrix[ Fragments.MatrixCounter ][j][1]) > fabs(Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][1])) { 322 for (int k=Fragments.ColumnCounter ;k--;)443 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 323 444 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 324 445 } … … 338 459 cout << msg << endl; 339 460 output << "# " << msg << ", created on " << datum; 340 output << "#Order\tFrag.No.\t" << Fragment.Header << endl;461 output << "#Order\tFrag.No.\t" << Fragment.Header[ Fragment.MatrixCounter ] << endl; 341 462 // max 342 463 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { … … 344 465 CreateFragmentOrder(Fragment, KeySet, BondOrder); 345 466 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 346 for (int l=0;l<Fragment.ColumnCounter ;l++)467 for (int l=0;l<Fragment.ColumnCounter[ Fragment.MatrixCounter ];l++) 347 468 output << scientific << "\t" << Fragment.Matrix[ Fragment.MatrixCounter ][ Fragment.RowCounter[ Fragment.MatrixCounter ]-1 ][l]; 348 469 output << endl; … … 358 479 void CreateEnergy(class MatrixContainer &Energy, int MatrixNumber) 359 480 { 360 for(int k=0;k<Energy.ColumnCounter ;k++)481 for(int k=0;k<Energy.ColumnCounter[MatrixNumber];k++) 361 482 Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber] ] [k] = Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber]-1 ] [k]; 362 483 }; … … 369 490 void CreateMinimumForce(class MatrixContainer &Force, int MatrixNumber) 370 491 { 371 for (int l=Force.ColumnCounter ;l--;)492 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 372 493 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 373 for (int l=5;l<Force.ColumnCounter ;l+=3) {494 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 374 495 double stored = 0; 375 496 int k=0; … … 404 525 { 405 526 int divisor = 0; 406 for (int l=Force.ColumnCounter ;l--;)527 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 407 528 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 408 for (int l=5;l<Force.ColumnCounter ;l+=3) {529 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 409 530 double tmp = 0; 410 531 for (int k=Force.RowCounter[MatrixNumber];k--;) { … … 428 549 void CreateMaximumForce(class MatrixContainer &Force, int MatrixNumber) 429 550 { 430 for (int l=5;l<Force.ColumnCounter ;l+=3) {551 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 431 552 double stored = 0; 432 553 for (int k=Force.RowCounter[MatrixNumber];k--;) { … … 460 581 void CreateVectorSumForce(class MatrixContainer &Force, int MatrixNumber) 461 582 { 462 for (int l=Force.ColumnCounter ;l--;)583 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 463 584 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 464 for (int l=0;l<Force.ColumnCounter ;l++) {585 for (int l=0;l<Force.ColumnCounter[MatrixNumber];l++) { 465 586 for (int k=Force.RowCounter[MatrixNumber];k--;) 466 587 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] += Force.Matrix[MatrixNumber][k][l]; … … 538 659 void AbsEnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses) 539 660 { 540 stringstream line(Energy.Header );661 stringstream line(Energy.Header[ Energy.MatrixCounter ]); 541 662 string token; 542 663 543 664 getline(line, token, '\t'); 544 for (int i=2; i<= Energy.ColumnCounter ;i++) {665 for (int i=2; i<= Energy.ColumnCounter[Energy.MatrixCounter];i++) { 545 666 getline(line, token, '\t'); 546 667 while (token[0] == ' ') // remove leading white spaces 547 668 token.erase(0,1); 548 669 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(abs($" << i+2 << ")) " << uses; 549 if (i != (Energy.ColumnCounter ))670 if (i != (Energy.ColumnCounter[Energy.MatrixCounter])) 550 671 output << ", \\"; 551 672 output << endl; … … 562 683 void EnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses) 563 684 { 564 stringstream line(Energy.Header );685 stringstream line(Energy.Header[Energy.MatrixCounter]); 565 686 string token; 566 687 567 688 getline(line, token, '\t'); 568 for (int i=1; i<= Energy.ColumnCounter ;i++) {689 for (int i=1; i<= Energy.ColumnCounter[Energy.MatrixCounter];i++) { 569 690 getline(line, token, '\t'); 570 691 while (token[0] == ' ') // remove leading white spaces 571 692 token.erase(0,1); 572 693 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":" << i+2 << " " << uses; 573 if (i != (Energy.ColumnCounter ))694 if (i != (Energy.ColumnCounter[Energy.MatrixCounter])) 574 695 output << ", \\"; 575 696 output << endl; … … 586 707 void ForceMagnitudePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 587 708 { 588 stringstream line(Force.Header );709 stringstream line(Force.Header[Force.MatrixCounter]); 589 710 string token; 590 711 … … 594 715 getline(line, token, '\t'); 595 716 getline(line, token, '\t'); 596 for (int i=7; i< Force.ColumnCounter ;i+=NDIM) {717 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 597 718 getline(line, token, '\t'); 598 719 while (token[0] == ' ') // remove leading white spaces … … 600 721 token.erase(token.length(), 1); // kill residual index char (the '0') 601 722 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(sqrt($" << i+1 << "*$" << i+1 << "+$" << i+2 << "*$" << i+2 << "+$" << i+3 << "*$" << i+3 << ")) " << uses; 602 if (i != (Force.ColumnCounter -1))723 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 603 724 output << ", \\"; 604 725 output << endl; … … 617 738 void AbsFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 618 739 { 619 stringstream line(Force.Header );740 stringstream line(Force.Header[Force.MatrixCounter]); 620 741 string token; 621 742 … … 625 746 getline(line, token, '\t'); 626 747 getline(line, token, '\t'); 627 for (int i=7; i< Force.ColumnCounter ;i+=NDIM) {748 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 628 749 getline(line, token, '\t'); 629 750 while (token[0] == ' ') // remove leading white spaces … … 631 752 token.erase(token.length(), 1); // kill residual index char (the '0') 632 753 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(abs($" << i+1 << ")) " << uses; 633 if (i != (Force.ColumnCounter -1))754 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 634 755 output << ", \\"; 635 756 output << endl; … … 648 769 void BoxesForcePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 649 770 { 650 stringstream line(Force.Header );771 stringstream line(Force.Header[Force.MatrixCounter]); 651 772 char *fillcolor[5] = {"black", "red", "blue", "green", "cyan"}; 652 773 string token; … … 657 778 getline(line, token, '\t'); 658 779 getline(line, token, '\t'); 659 for (int i=7; i< Force.ColumnCounter ;i+=NDIM) {780 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 660 781 getline(line, token, '\t'); 661 782 while (token[0] == ' ') // remove leading white spaces … … 663 784 token.erase(token.length(), 1); // kill residual index char (the '0') 664 785 output << "'" << prefix << ".dat' title '" << token << "' using ($" << xargument << "+" << fixed << setprecision(1) << (double)((i-7)/3)*0.2 << "):(sqrt($" << i+1 << "*$" << i+1 << "+$" << i+2 << "*$" << i+2 << "+$" << i+3 << "*$" << i+3 << ")) " << uses << " " << fillcolor[(i-7)/3]; 665 if (i != (Force.ColumnCounter -1))786 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 666 787 output << ", \\"; 667 788 output << endl; … … 680 801 void BoxesFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 681 802 { 682 stringstream line(Force.Header );803 stringstream line(Force.Header[Force.MatrixCounter]); 683 804 char *fillcolor[5] = {"black", "red", "blue", "green", "cyan"}; 684 805 string token; … … 689 810 getline(line, token, '\t'); 690 811 getline(line, token, '\t'); 691 for (int i=7; i< Force.ColumnCounter ;i+=NDIM) {812 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 692 813 getline(line, token, '\t'); 693 814 while (token[0] == ' ') // remove leading white spaces … … 695 816 token.erase(token.length(), 1); // kill residual index char (the '0') 696 817 output << "'" << prefix << ".dat' title '" << token << "' using ($" << xargument << "+" << fixed << setprecision(1) << (double)((i-7)/3)*0.2 << "):" << i+1 << " " << uses << " " << fillcolor[(i-7)/3]; 697 if (i != (Force.ColumnCounter -1))818 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 698 819 output << ", \\"; 699 820 output << endl; -
src/datacreator.hpp
rb77416 rb38b64 26 26 bool CreateDataDeltaForcesOrder(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int)); 27 27 bool CreateDataDeltaForcesOrderPerAtom(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum); 28 bool CreateDataHessianOrderPerAtom(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum); 29 bool CreateDataDeltaHessianOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum); 30 bool CreateDataDeltaFrobeniusOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum); 28 31 bool CreateDataFragment(class MatrixContainer &ForceFragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int)); 29 32 bool CreateDataFragmentOrder(class MatrixContainer &Fragment, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateFragmentOrder)(class MatrixContainer &, class KeySetsContainer &, int)); -
src/joiner.cpp
rb77416 rb38b64 19 19 periodentafel *periode = NULL; // and a period table of all elements 20 20 EnergyMatrix Energy; 21 EnergyMatrix EnergyFragments; 22 21 23 EnergyMatrix Hcorrection; 24 EnergyMatrix HcorrectionFragments; 25 22 26 ForceMatrix Force; 23 EnergyMatrix EnergyFragments;24 EnergyMatrix HcorrectionFragments;25 27 ForceMatrix ForceFragments; 28 29 HessianMatrix Hessian; 30 HessianMatrix HessianFragments; 31 26 32 ForceMatrix Shielding; 27 33 ForceMatrix ShieldingPAS; … … 35 41 stringstream prefix; 36 42 char *dir = NULL; 37 bool Hcorrected = true; 43 bool NoHCorrection = false; 44 bool NoHessian = false; 38 45 39 46 cout << "Joiner" << endl; … … 65 72 // ------------- Parse through all Fragment subdirs -------- 66 73 if (!Energy.ParseFragmentMatrix(argv[1], dir, EnergySuffix, 0,0)) return 1; 67 Hcorrected = Hcorrection.ParseFragmentMatrix(argv[1], "", HCORRECTIONSUFFIX, 0,0); 74 if (!Hcorrection.ParseFragmentMatrix(argv[1], "", HCORRECTIONSUFFIX, 0,0)) { 75 NoHCorrection = true; 76 cout << "No HCorrection matrices found, skipping these." << endl; 77 } 68 78 if (!Force.ParseFragmentMatrix(argv[1], dir, ForcesSuffix, 0,0)) return 1; 79 if (!Hessian.ParseFragmentMatrix(argv[1], dir, HessianSuffix, 0,0)) { 80 NoHessian = true; 81 cout << "No hessian matrices found, skipping these." << endl; 82 } 69 83 if (periode != NULL) { // also look for PAS values 70 84 if (!Shielding.ParseFragmentMatrix(argv[1], dir, ShieldingSuffix, 1, 0)) return 1; … … 75 89 76 90 // ---------- Parse the TE Factors into an array ----------------- 77 if (!Energy.ParseIndices()) return 1; 78 if (Hcorrected) Hcorrection.ParseIndices(); 91 if (!Energy.InitialiseIndices()) return 1; 92 if (!NoHCorrection) 93 Hcorrection.InitialiseIndices(); 79 94 80 95 // ---------- Parse the Force indices into an array --------------- 81 96 if (!Force.ParseIndices(argv[1])) return 1; 97 98 // ---------- Parse the Hessian (=force) indices into an array --------------- 99 if (!NoHessian) 100 if (!Hessian.InitialiseIndices((class MatrixContainer *)&Force)) return 1; 82 101 83 102 // ---------- Parse the shielding indices into an array --------------- … … 94 113 95 114 if (!EnergyFragments.AllocateMatrix(Energy.Header, Energy.MatrixCounter, Energy.RowCounter, Energy.ColumnCounter)) return 1; 96 if (Hcorrected) HcorrectionFragments.AllocateMatrix(Hcorrection.Header, Hcorrection.MatrixCounter, Hcorrection.RowCounter, Hcorrection.ColumnCounter); 115 if (!NoHCorrection) 116 HcorrectionFragments.AllocateMatrix(Hcorrection.Header, Hcorrection.MatrixCounter, Hcorrection.RowCounter, Hcorrection.ColumnCounter); 97 117 if (!ForceFragments.AllocateMatrix(Force.Header, Force.MatrixCounter, Force.RowCounter, Force.ColumnCounter)) return 1; 118 if (!NoHessian) 119 if (!HessianFragments.AllocateMatrix(Hessian.Header, Hessian.MatrixCounter, Hessian.RowCounter, Hessian.ColumnCounter)) return 1; 98 120 if (periode != NULL) { // also look for PAS values 99 121 if (!ShieldingFragments.AllocateMatrix(Shielding.Header, Shielding.MatrixCounter, Shielding.RowCounter, Shielding.ColumnCounter)) return 1; … … 106 128 if(!Energy.SetLastMatrix(0., 0)) return 1; 107 129 if(!Force.SetLastMatrix(0., 2)) return 1; 130 if (!NoHessian) 131 if (!Hessian.SetLastMatrix(0., 0)) return 1; 108 132 if (periode != NULL) { // also look for PAS values 109 133 if(!Shielding.SetLastMatrix(0., 2)) return 1; … … 120 144 cout << "Summing energy of order " << BondOrder+1 << " ..." << endl; 121 145 if (!EnergyFragments.SumSubManyBodyTerms(Energy, KeySet, BondOrder)) return 1; 122 if ( Hcorrected) {146 if (!NoHCorrection) { 123 147 HcorrectionFragments.SumSubManyBodyTerms(Hcorrection, KeySet, BondOrder); 124 148 if (!Energy.SumSubEnergy(EnergyFragments, &HcorrectionFragments, KeySet, BondOrder, 1.)) return 1; 125 if (Hcorrected)Hcorrection.SumSubEnergy(HcorrectionFragments, NULL, KeySet, BondOrder, 1.);149 Hcorrection.SumSubEnergy(HcorrectionFragments, NULL, KeySet, BondOrder, 1.); 126 150 } else 127 151 if (!Energy.SumSubEnergy(EnergyFragments, NULL, KeySet, BondOrder, 1.)) return 1; … … 130 154 if (!ForceFragments.SumSubManyBodyTerms(Force, KeySet, BondOrder)) return 1; 131 155 if (!Force.SumSubForces(ForceFragments, KeySet, BondOrder, 1.)) return 1; 156 // --------- sum up Hessian -------------------- 157 if (!NoHessian) { 158 cout << "Summing Hessian of order " << BondOrder+1 << " ..." << endl; 159 if (!HessianFragments.SumSubManyBodyTerms(Hessian, KeySet, BondOrder)) return 1; 160 if (!Hessian.SumSubHessians(HessianFragments, KeySet, BondOrder, 1.)) return 1; 161 } 132 162 if (periode != NULL) { // also look for PAS values 133 163 cout << "Summing shieldings and susceptibilities of order " << BondOrder+1 << " ..." << endl; … … 150 180 // forces 151 181 if (!Force.WriteLastMatrix(argv[1], (prefix.str()).c_str(), ForcesSuffix)) return 1; 182 // hessian 183 if (!NoHessian) 184 if (!Hessian.WriteLastMatrix(argv[1], (prefix.str()).c_str(), HessianSuffix)) return 1; 152 185 // shieldings 153 186 if (periode != NULL) { // also look for PAS values … … 162 195 prefix << dir << EnergyFragmentSuffix; 163 196 if (!EnergyFragments.WriteTotalFragments(argv[1], (prefix.str()).c_str())) return 1; 164 if ( Hcorrected) {197 if (!NoHCorrection) { 165 198 prefix.str(" "); 166 199 prefix << dir << HcorrectionFragmentSuffix; … … 171 204 if (!ForceFragments.WriteTotalFragments(argv[1], (prefix.str()).c_str())) return 1; 172 205 if (!CreateDataFragment(EnergyFragments, KeySet, argv[1], FRAGMENTPREFIX ENERGYPERFRAGMENT, "fragment energy versus the Fragment No", "today", CreateEnergy)) return 1; 206 if (!NoHessian) { 207 prefix.str(" "); 208 prefix << dir << HessianFragmentSuffix; 209 if (!HessianFragments.WriteTotalFragments(argv[1], (prefix.str()).c_str())) return 1; 210 } 173 211 if (periode != NULL) { // also look for PAS values 174 212 prefix.str(" "); … … 188 226 // write last matrices as fragments into central dir (not subdir as above), for analyzer to know index bounds 189 227 if (!Energy.WriteLastMatrix(argv[1], dir, EnergyFragmentSuffix)) return 1; 190 if ( Hcorrected) Hcorrection.WriteLastMatrix(argv[1], dir, HcorrectionFragmentSuffix);228 if (!NoHCorrection) Hcorrection.WriteLastMatrix(argv[1], dir, HcorrectionFragmentSuffix); 191 229 if (!Force.WriteLastMatrix(argv[1], dir, ForceFragmentSuffix)) return 1; 230 if (!NoHessian) 231 if (!Hessian.WriteLastMatrix(argv[1], dir, HessianFragmentSuffix)) return 1; 192 232 if (periode != NULL) { // also look for PAS values 193 233 if (!Shielding.WriteLastMatrix(argv[1], dir, ShieldingFragmentSuffix)) return 1; -
src/parser.cpp
rb77416 rb38b64 56 56 MatrixContainer::MatrixContainer() { 57 57 Indices = NULL; 58 Header = (char * ) Malloc(sizeof(char)*1023, "MatrixContainer::MatrixContainer:*Header");58 Header = (char **) Malloc(sizeof(char)*1, "MatrixContainer::MatrixContainer: **Header"); 59 59 Matrix = (double ***) Malloc(sizeof(double **)*(1), "MatrixContainer::MatrixContainer: ***Matrix"); // one more each for the total molecule 60 60 RowCounter = (int *) Malloc(sizeof(int)*(1), "MatrixContainer::MatrixContainer: *RowCounter"); 61 ColumnCounter = (int *) Malloc(sizeof(int)*(1), "MatrixContainer::MatrixContainer: *ColumnCounter"); 62 Header[0] = NULL; 61 63 Matrix[0] = NULL; 62 64 RowCounter[0] = -1; 63 65 MatrixCounter = 0; 64 ColumnCounter = 0;66 ColumnCounter[0] = -1; 65 67 }; 66 68 … … 70 72 if (Matrix != NULL) { 71 73 for(int i=MatrixCounter;i--;) { 72 if ( RowCounter != NULL) {74 if ((ColumnCounter != NULL) && (RowCounter != NULL)) { 73 75 for(int j=RowCounter[i]+1;j--;) 74 76 Free((void **)&Matrix[i][j], "MatrixContainer::~MatrixContainer: *Matrix[][]"); … … 76 78 } 77 79 } 78 if (( RowCounter != NULL) && (Matrix[MatrixCounter] != NULL))80 if ((ColumnCounter != NULL) && (RowCounter != NULL) && (Matrix[MatrixCounter] != NULL)) 79 81 for(int j=RowCounter[MatrixCounter]+1;j--;) 80 82 Free((void **)&Matrix[MatrixCounter][j], "MatrixContainer::~MatrixContainer: *Matrix[MatrixCounter][]"); … … 89 91 Free((void **)&Indices, "MatrixContainer::~MatrixContainer: **Indices"); 90 92 91 Free((void **)&Header, "MatrixContainer::~MatrixContainer: *Header"); 93 if (Header != NULL) 94 for(int i=MatrixCounter+1;i--;) 95 Free((void **)&Header[i], "MatrixContainer::~MatrixContainer: *Header[]"); 96 Free((void **)&Header, "MatrixContainer::~MatrixContainer: **Header"); 92 97 Free((void **)&RowCounter, "MatrixContainer::~MatrixContainer: *RowCounter"); 93 }; 94 98 Free((void **)&ColumnCounter, "MatrixContainer::~MatrixContainer: *RowCounter"); 99 }; 100 101 /** Either copies index matrix from another MatrixContainer or initialises with trivial mapping if NULL. 102 * This either copies the index matrix or just maps 1 to 1, 2 to 2 and so on for all fragments. 103 * \param *Matrix pointer to other MatrixContainer 104 * \return true - copy/initialisation sucessful, false - dimension false for copying 105 */ 106 bool MatrixContainer::InitialiseIndices(class MatrixContainer *Matrix) 107 { 108 cout << "Initialising indices"; 109 if (Matrix == NULL) { 110 cout << " with trivial mapping." << endl; 111 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "MatrixContainer::InitialiseIndices: **Indices"); 112 for(int i=MatrixCounter+1;i--;) { 113 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "MatrixContainer::InitialiseIndices: *Indices[]"); 114 for(int j=RowCounter[i];j--;) 115 Indices[i][j] = j; 116 } 117 } else { 118 cout << " from other MatrixContainer." << endl; 119 if (MatrixCounter != Matrix->MatrixCounter) 120 return false; 121 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "MatrixContainer::InitialiseIndices: **Indices"); 122 for(int i=MatrixCounter+1;i--;) { 123 if (RowCounter[i] != Matrix->RowCounter[i]) 124 return false; 125 Indices[i] = (int *) Malloc(sizeof(int)*Matrix->RowCounter[i], "MatrixContainer::InitialiseIndices: *Indices[]"); 126 for(int j=Matrix->RowCounter[i];j--;) { 127 Indices[i][j] = Matrix->Indices[i][j]; 128 //cout << Indices[i][j] << "\t"; 129 } 130 //cout << endl; 131 } 132 } 133 return true; 134 }; 95 135 96 136 /** Parsing a number of matrices. … … 120 160 return false; 121 161 } 122 123 // skip some initial lines 162 163 // parse header 164 Header[MatrixNr] = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::ParseMatrix: *Header[]"); 124 165 for (int m=skiplines+1;m--;) 125 input.getline(Header , 1023);166 input.getline(Header[MatrixNr], 1023); 126 167 127 168 // scan header for number of columns 128 line.str(Header );169 line.str(Header[MatrixNr]); 129 170 for(int k=skipcolumns;k--;) 130 line >> Header ;171 line >> Header[MatrixNr]; 131 172 //cout << line.str() << endl; 132 ColumnCounter =0;173 ColumnCounter[MatrixNr]=0; 133 174 while ( getline(line,token, '\t') ) { 134 175 if (token.length() > 0) 135 ColumnCounter ++;176 ColumnCounter[MatrixNr]++; 136 177 } 137 178 //cout << line.str() << endl; 138 //cout << "ColumnCounter : " << ColumnCounter<< "." << endl;139 if (ColumnCounter == 0)140 cerr << "ColumnCounter : " << ColumnCounter<< " from file " << name << ", this is probably an error!" << endl;179 //cout << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl; 180 if (ColumnCounter[MatrixNr] == 0) 181 cerr << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; 141 182 142 183 // scan rest for number of rows/lines … … 155 196 156 197 // allocate matrix if it's not zero dimension in one direction 157 if ((ColumnCounter > 0) && (RowCounter[MatrixNr] > -1)) {158 Matrix[MatrixNr] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixNr]+1), "MatrixContainer::Parse FragmentMatrix: **Matrix[]");198 if ((ColumnCounter[MatrixNr] > 0) && (RowCounter[MatrixNr] > -1)) { 199 Matrix[MatrixNr] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixNr]+1), "MatrixContainer::ParseMatrix: **Matrix[]"); 159 200 160 201 // parse in each entry for this matrix … … 162 203 input.seekg(ios::beg); 163 204 for (int m=skiplines+1;m--;) 164 input.getline(Header , 1023); // skip header165 line.str(Header );205 input.getline(Header[MatrixNr], 1023); // skip header 206 line.str(Header[MatrixNr]); 166 207 for(int k=skipcolumns;k--;) // skip columns in header too 167 208 line >> filename; 168 strncpy(Header , line.str().c_str(), 1023);209 strncpy(Header[MatrixNr], line.str().c_str(), 1023); 169 210 for(int j=0;j<RowCounter[MatrixNr];j++) { 170 Matrix[MatrixNr][j] = (double *) Malloc(sizeof(double)*ColumnCounter , "MatrixContainer::ParseFragmentMatrix: *Matrix[][]");211 Matrix[MatrixNr][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[][]"); 171 212 input.getline(filename, 1023); 172 213 stringstream lines(filename); … … 174 215 for(int k=skipcolumns;k--;) 175 216 lines >> filename; 176 for(int k=0;(k<ColumnCounter ) && (!lines.eof());k++) {217 for(int k=0;(k<ColumnCounter[MatrixNr]) && (!lines.eof());k++) { 177 218 lines >> Matrix[MatrixNr][j][k]; 178 219 //cout << " " << setprecision(2) << Matrix[MatrixNr][j][k];; 179 220 } 180 221 //cout << endl; 181 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = (double *) Malloc(sizeof(double)*ColumnCounter , "MatrixContainer::ParseFragmentMatrix: *Matrix[RowCounter[MatrixNr]][]");182 for(int j=ColumnCounter ;j--;)222 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[RowCounter[MatrixNr]][]"); 223 for(int j=ColumnCounter[MatrixNr];j--;) 183 224 Matrix[MatrixNr][ RowCounter[MatrixNr] ][j] = 0.; 184 225 } 185 226 } else { 186 cerr << "ERROR: Matrix nr. " << MatrixNr << " has column and row count of (" << ColumnCounter << "," << RowCounter[MatrixNr] << "), could not allocate nor parse!" << endl;227 cerr << "ERROR: Matrix nr. " << MatrixNr << " has column and row count of (" << ColumnCounter[MatrixNr] << "," << RowCounter[MatrixNr] << "), could not allocate nor parse!" << endl; 187 228 } 188 229 input.close(); … … 233 274 234 275 cout << "Parsing through each fragment and retrieving " << prefix << suffix << "." << endl; 276 Header = (char **) ReAlloc(Header, sizeof(char *)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: **Header"); // one more each for the total molecule 235 277 Matrix = (double ***) ReAlloc(Matrix, sizeof(double **)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: ***Matrix"); // one more each for the total molecule 236 278 RowCounter = (int *) ReAlloc(RowCounter, sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *RowCounter"); 279 ColumnCounter = (int *) ReAlloc(ColumnCounter, sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *ColumnCounter"); 237 280 for(int i=MatrixCounter+1;i--;) { 238 281 Matrix[i] = NULL; 282 Header[i] = NULL; 239 283 RowCounter[i] = -1; 284 ColumnCounter[i] = -1; 240 285 } 241 286 for(int i=0; i < MatrixCounter;i++) { … … 252 297 253 298 /** Allocates and resets the memory for a number \a MCounter of matrices. 254 * \param * GivenHeader Header line299 * \param **GivenHeader Header line for each matrix 255 300 * \param MCounter number of matrices 256 301 * \param *RCounter number of rows for each matrix 257 * \param CCounter number of columns for all matrices302 * \param *CCounter number of columns for each matrix 258 303 * \return Allocation successful 259 304 */ 260 bool MatrixContainer::AllocateMatrix(char *GivenHeader, int MCounter, int *RCounter, int CCounter) 261 { 262 Header = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::ParseFragmentMatrix: *EnergyHeader"); 263 strncpy(Header, GivenHeader, 1023); 264 305 bool MatrixContainer::AllocateMatrix(char **GivenHeader, int MCounter, int *RCounter, int *CCounter) 306 { 265 307 MatrixCounter = MCounter; 266 ColumnCounter = CCounter; 267 Matrix = (double ***) Malloc(sizeof(double **)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: ***Matrix"); // one more each for the total molecule 268 RowCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *RowCounter"); 308 Header = (char **) Malloc(sizeof(char *)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *Header"); 309 Matrix = (double ***) Malloc(sizeof(double **)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: ***Matrix"); // one more each for the total molecule 310 RowCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *RowCounter"); 311 ColumnCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *ColumnCounter"); 269 312 for(int i=MatrixCounter+1;i--;) { 313 Header[i] = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::AllocateMatrix: *Header[i]"); 314 strncpy(Header[i], GivenHeader[i], 1023); 270 315 RowCounter[i] = RCounter[i]; 271 Matrix[i] = (double **) Malloc(sizeof(double *)*(RowCounter[i]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 316 ColumnCounter[i] = CCounter[i]; 317 Matrix[i] = (double **) Malloc(sizeof(double *)*(RowCounter[i]+1), "MatrixContainer::AllocateMatrix: **Matrix[]"); 272 318 for(int j=RowCounter[i]+1;j--;) { 273 Matrix[i][j] = (double *) Malloc(sizeof(double)*ColumnCounter , "MatrixContainer::ParseFragmentMatrix: *Matrix[][]");274 for(int k=ColumnCounter ;k--;)319 Matrix[i][j] = (double *) Malloc(sizeof(double)*ColumnCounter[i], "MatrixContainer::AllocateMatrix: *Matrix[][]"); 320 for(int k=ColumnCounter[i];k--;) 275 321 Matrix[i][j][k] = 0.; 276 322 } … … 286 332 for(int i=MatrixCounter+1;i--;) 287 333 for(int j=RowCounter[i]+1;j--;) 288 for(int k=ColumnCounter ;k--;)334 for(int k=ColumnCounter[i];k--;) 289 335 Matrix[i][j][k] = 0.; 290 336 return true; … … 299 345 for(int i=MatrixCounter+1;i--;) 300 346 for(int j=RowCounter[i]+1;j--;) 301 for(int k=ColumnCounter ;k--;)347 for(int k=ColumnCounter[i];k--;) 302 348 if (fabs(Matrix[i][j][k]) > max) 303 349 max = fabs(Matrix[i][j][k]); … … 315 361 for(int i=MatrixCounter+1;i--;) 316 362 for(int j=RowCounter[i]+1;j--;) 317 for(int k=ColumnCounter ;k--;)363 for(int k=ColumnCounter[i];k--;) 318 364 if (fabs(Matrix[i][j][k]) < min) 319 365 min = fabs(Matrix[i][j][k]); … … 331 377 { 332 378 for(int j=RowCounter[MatrixCounter]+1;j--;) 333 for(int k=skipcolumns;k<ColumnCounter ;k++)379 for(int k=skipcolumns;k<ColumnCounter[MatrixCounter];k++) 334 380 Matrix[MatrixCounter][j][k] = value; 335 381 return true; … … 344 390 { 345 391 for(int j=RowCounter[MatrixCounter]+1;j--;) 346 for(int k=skipcolumns;k<ColumnCounter ;k++)392 for(int k=skipcolumns;k<ColumnCounter[MatrixCounter];k++) 347 393 Matrix[MatrixCounter][j][k] = values[j][k]; 348 394 return true; 349 395 }; 350 396 351 /** Sums the en ergy with each factor and put into last element of \a ***Energies.397 /** Sums the entries with each factor and put into last element of \a ***Matrix. 352 398 * Sums over "E"-terms to create the "F"-terms 353 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.399 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 354 400 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 355 401 * \param Order bond order … … 384 430 } 385 431 if (Order == SubOrder) { // equal order is always copy from Energies 386 for(int l=ColumnCounter ;l--;) // then adds/subtract each column432 for(int l=ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l--;) // then adds/subtract each column 387 433 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][l] += MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 388 434 } else { 389 for(int l=ColumnCounter ;l--;)435 for(int l=ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l--;) 390 436 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][l] -= Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 391 437 } 392 438 } 393 //if ((ColumnCounter >1) && (RowCounter[0]-1 >= 1))439 //if ((ColumnCounter[ KeySet.OrderSet[SubOrder][j] ]>1) && (RowCounter[0]-1 >= 1)) 394 440 //cout << "Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << RowCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][RowCounter[0]-1][1] << endl; 395 441 } … … 426 472 return false; 427 473 } 428 output << Header << endl;474 output << Header[i] << endl; 429 475 for(int j=0;j<RowCounter[i];j++) { 430 for(int k=0;k<ColumnCounter ;k++)476 for(int k=0;k<ColumnCounter[i];k++) 431 477 output << scientific << Matrix[i][j][k] << "\t"; 432 478 output << endl; … … 455 501 return false; 456 502 } 457 output << Header << endl;503 output << Header[MatrixCounter] << endl; 458 504 for(int j=0;j<RowCounter[MatrixCounter];j++) { 459 for(int k=0;k<ColumnCounter ;k++)505 for(int k=0;k<ColumnCounter[MatrixCounter];k++) 460 506 output << scientific << Matrix[MatrixCounter][j][k] << "\t"; 461 507 output << endl; … … 467 513 // ======================================= CLASS EnergyMatrix ============================= 468 514 469 /** Create a trivial energy index mapping.470 * This just maps 1 to 1, 2 to 2 and so on for all fragments.471 * \return creation sucessful472 */473 bool EnergyMatrix::ParseIndices()474 {475 cout << "Parsing energy indices." << endl;476 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "EnergyMatrix::ParseIndices: **Indices");477 for(int i=MatrixCounter+1;i--;) {478 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "EnergyMatrix::ParseIndices: *Indices[]");479 for(int j=RowCounter[i];j--;)480 Indices[i][j] = j;481 }482 return true;483 };484 485 515 /** Sums the energy with each factor and put into last element of \a EnergyMatrix::Matrix. 486 516 * Sums over the "F"-terms in ANOVA decomposition. 487 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.517 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 488 518 * \param CorrectionFragments MatrixContainer with hydrogen saturation correction per fragments 489 519 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order … … 498 528 for(int i=KeySet.FragmentsPerOrder[Order];i--;) 499 529 for(int j=RowCounter[ KeySet.OrderSet[Order][i] ];j--;) 500 for(int k=ColumnCounter ;k--;)530 for(int k=ColumnCounter[ KeySet.OrderSet[Order][i] ];k--;) 501 531 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ KeySet.OrderSet[Order][i] ][j][k]; 502 532 else 503 533 for(int i=KeySet.FragmentsPerOrder[Order];i--;) 504 534 for(int j=RowCounter[ KeySet.OrderSet[Order][i] ];j--;) 505 for(int k=ColumnCounter ;k--;)535 for(int k=ColumnCounter[ KeySet.OrderSet[Order][i] ];k--;) 506 536 Matrix[MatrixCounter][j][k] += sign*(Fragments.Matrix[ KeySet.OrderSet[Order][i] ][j][k] + CorrectionFragments->Matrix[ KeySet.OrderSet[Order][i] ][j][k]); 507 537 return true; … … 524 554 // count maximum of columns 525 555 RowCounter[MatrixCounter] = 0; 526 for(int j=0; j < MatrixCounter;j++) // (energy matrix might be bigger than number of atoms in terms of rows) 556 ColumnCounter[MatrixCounter] = 0; 557 for(int j=0; j < MatrixCounter;j++) { // (energy matrix might be bigger than number of atoms in terms of rows) 527 558 if (RowCounter[j] > RowCounter[MatrixCounter]) 528 559 RowCounter[MatrixCounter] = RowCounter[j]; 560 if (ColumnCounter[j] > ColumnCounter[MatrixCounter]) // take maximum of all for last matrix 561 ColumnCounter[MatrixCounter] = ColumnCounter[j]; 562 } 529 563 // allocate last plus one matrix 530 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter << " columns." << endl;564 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 531 565 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 532 566 for(int j=0;j<=RowCounter[MatrixCounter];j++) 533 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter , "MatrixContainer::ParseFragmentMatrix: *Matrix[][]");567 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 534 568 535 569 // try independently to parse global energysuffix file if present … … 589 623 590 624 /** Sums the forces and puts into last element of \a ForceMatrix::Matrix. 591 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.625 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 592 626 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 593 627 * \param Order bond order … … 609 643 if (j != -1) { 610 644 //if (j == 0) cout << "Summing onto ion 0, type 0 from fragment " << FragmentNr << ", ion " << l << "." << endl; 611 for(int k=2;k<ColumnCounter ;k++)645 for(int k=2;k<ColumnCounter[MatrixCounter];k++) 612 646 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ FragmentNr ][l][k]; 613 647 } … … 655 689 RowCounter[MatrixCounter]++; // nr start at 0, count starts at 1 656 690 input.close(); 691 692 ColumnCounter[MatrixCounter] = 0; 693 for(int j=0; j < MatrixCounter;j++) { // (energy matrix might be bigger than number of atoms in terms of rows) 694 if (ColumnCounter[j] > ColumnCounter[MatrixCounter]) // take maximum of all for last matrix 695 ColumnCounter[MatrixCounter] = ColumnCounter[j]; 696 } 657 697 658 698 // allocate last plus one matrix 659 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter << " columns." << endl;699 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 660 700 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 661 701 for(int j=0;j<=RowCounter[MatrixCounter];j++) 662 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 702 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 703 704 // try independently to parse global forcesuffix file if present 705 strncpy(filename, name, 1023); 706 strncat(filename, prefix, 1023-strlen(filename)); 707 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 708 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 709 } 710 711 712 return status; 713 }; 714 715 // ======================================= CLASS HessianMatrix ============================= 716 717 /** Parsing force Indices of each fragment 718 * \param *name directory with \a ForcesFile 719 * \return parsing successful 720 */ 721 bool HessianMatrix::ParseIndices(char *name) 722 { 723 ifstream input; 724 char *FragmentNumber = NULL; 725 char filename[1023]; 726 stringstream line; 727 728 cout << "Parsing hessian indices for " << MatrixCounter << " matrices." << endl; 729 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "HessianMatrix::ParseIndices: **Indices"); 730 line << name << FRAGMENTPREFIX << FORCESFILE; 731 input.open(line.str().c_str(), ios::in); 732 //cout << "Opening " << line.str() << " ... " << input << endl; 733 if (input == NULL) { 734 cout << endl << "Unable to open " << line.str() << ", is the directory correct?" << endl; 735 return false; 736 } 737 for (int i=0;(i<MatrixCounter) && (!input.eof());i++) { 738 // get the number of atoms for this fragment 739 input.getline(filename, 1023); 740 line.str(filename); 741 // parse the values 742 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "HessianMatrix::ParseIndices: *Indices[]"); 743 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 744 //cout << FRAGMENTPREFIX << FragmentNumber << "[" << RowCounter[i] << "]:"; 745 Free((void **)&FragmentNumber, "HessianMatrix::ParseIndices: *FragmentNumber"); 746 for(int j=0;(j<RowCounter[i]) && (!line.eof());j++) { 747 line >> Indices[i][j]; 748 //cout << " " << Indices[i][j]; 749 } 750 //cout << endl; 751 } 752 Indices[MatrixCounter] = (int *) Malloc(sizeof(int)*RowCounter[MatrixCounter], "HessianMatrix::ParseIndices: *Indices[]"); 753 for(int j=RowCounter[MatrixCounter];j--;) { 754 Indices[MatrixCounter][j] = j; 755 } 756 input.close(); 757 return true; 758 }; 759 760 761 /** Sums the hessian entries and puts into last element of \a HessianMatrix::Matrix. 762 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 763 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 764 * \param Order bond order 765 * \param sign +1 or -1 766 * \return true if summing was successful 767 */ 768 bool HessianMatrix::SumSubHessians(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, int Order, double sign) 769 { 770 int FragmentNr; 771 // sum forces 772 for(int i=0;i<KeySet.FragmentsPerOrder[Order];i++) { 773 FragmentNr = KeySet.OrderSet[Order][i]; 774 for(int l=0;l<RowCounter[ FragmentNr ];l++) { 775 int j = Indices[ FragmentNr ][l]; 776 if (j > RowCounter[MatrixCounter]) { 777 cerr << "Current hessian index " << j << " is greater than " << RowCounter[MatrixCounter] << ", where i=" << i << ", Order=" << Order << ", l=" << l << " and FragmentNr=" << FragmentNr << "!" << endl; 778 return false; 779 } 780 if (j != -1) { 781 for(int m=0;m<ColumnCounter[ FragmentNr ];m++) { 782 int k = Indices[ FragmentNr ][m]; 783 if (k > ColumnCounter[MatrixCounter]) { 784 cerr << "Current hessian index " << k << " is greater than " << ColumnCounter[MatrixCounter] << ", where m=" << m << ", j=" << j << ", i=" << i << ", Order=" << Order << ", l=" << l << " and FragmentNr=" << FragmentNr << "!" << endl; 785 return false; 786 } 787 if (k != -1) { 788 //cout << "Adding " << sign*Fragments.Matrix[ FragmentNr ][l][m] << " from [" << l << "][" << m << "] onto [" << j << "][" << k << "]." << endl; 789 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ FragmentNr ][l][m]; 790 } 791 } 792 } 793 } 794 } 795 return true; 796 }; 797 798 /** Constructor for class HessianMatrix. 799 */ 800 HessianMatrix::HessianMatrix() : MatrixContainer() 801 { 802 IsSymmetric = true; 803 } 804 805 /** Sums the hessian entries with each factor and put into last element of \a ***Matrix. 806 * Sums over "E"-terms to create the "F"-terms 807 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 808 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 809 * \param Order bond order 810 * \return true if summing was successful 811 */ 812 bool HessianMatrix::SumSubManyBodyTerms(class MatrixContainer &MatrixValues, class KeySetsContainer &KeySet, int Order) 813 { 814 // go through each order 815 for (int CurrentFragment=0;CurrentFragment<KeySet.FragmentsPerOrder[Order];CurrentFragment++) { 816 //cout << "Current Fragment is " << CurrentFragment << "/" << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 817 // then go per order through each suborder and pick together all the terms that contain this fragment 818 for(int SubOrder=0;SubOrder<=Order;SubOrder++) { // go through all suborders up to the desired order 819 for (int j=0;j<KeySet.FragmentsPerOrder[SubOrder];j++) { // go through all possible fragments of size suborder 820 if (KeySet.Contains(KeySet.OrderSet[Order][CurrentFragment], KeySet.OrderSet[SubOrder][j])) { 821 //cout << "Current other fragment is " << j << "/" << KeySet.OrderSet[SubOrder][j] << "." << endl; 822 // if the fragment's indices are all in the current fragment 823 for(int k=0;k<RowCounter[ KeySet.OrderSet[SubOrder][j] ];k++) { // go through all atoms in this fragment 824 int m = MatrixValues.Indices[ KeySet.OrderSet[SubOrder][j] ][k]; 825 //cout << "Current row index is " << k << "/" << m << "." << endl; 826 if (m != -1) { // if it's not an added hydrogen 827 for (int l=0;l<RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ];l++) { // look for the corresponding index in the current fragment 828 //cout << "Comparing " << m << " with " << MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l] << "." << endl; 829 if (m == MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l]) { 830 m = l; 831 break; 832 } 833 } 834 //cout << "Corresponding row index for " << k << " in CurrentFragment is " << m << "." << endl; 835 if (m > RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ]) { 836 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment] << " current row index " << m << " is greater than " << RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl; 837 return false; 838 } 839 840 for(int l=0;l<ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l++) { 841 int n = MatrixValues.Indices[ KeySet.OrderSet[SubOrder][j] ][l]; 842 //cout << "Current column index is " << l << "/" << n << "." << endl; 843 if (n != -1) { // if it's not an added hydrogen 844 for (int p=0;p<ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ];p++) { // look for the corresponding index in the current fragment 845 //cout << "Comparing " << n << " with " << MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][p] << "." << endl; 846 if (n == MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][p]) { 847 n = p; 848 break; 849 } 850 } 851 //cout << "Corresponding column index for " << l << " in CurrentFragment is " << n << "." << endl; 852 if (n > ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ]) { 853 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment] << " current column index " << n << " is greater than " << ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl; 854 return false; 855 } 856 if (Order == SubOrder) { // equal order is always copy from Energies 857 //cout << "Adding " << MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l] << " from [" << k << "][" << l << "] onto [" << m << "][" << n << "]." << endl; 858 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][n] += MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 859 } else { 860 //cout << "Subtracting " << Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l] << " from [" << k << "][" << l << "] onto [" << m << "][" << n << "]." << endl; 861 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][n] -= Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 862 } 863 } 864 } 865 } 866 //if ((ColumnCounter[ KeySet.OrderSet[SubOrder][j] ]>1) && (RowCounter[0]-1 >= 1)) 867 //cout << "Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << RowCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][RowCounter[0]-1][1] << endl; 868 } 869 } else { 870 //cout << "Fragment " << KeySet.OrderSet[SubOrder][j] << " is not contained in fragment " << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 871 } 872 } 873 } 874 //cout << "Final Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << KeySet.AtomCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][KeySet.AtomCounter[0]-1][1] << endl; 875 } 876 877 return true; 878 }; 879 880 /** Calls MatrixContainer::ParseFragmentMatrix() and additionally allocates last plus one matrix. 881 * \param *name directory with files 882 * \param *prefix prefix of each matrix file 883 * \param *suffix suffix of each matrix file 884 * \param skiplines number of inital lines to skip 885 * \param skiplines number of inital columns to skip 886 * \return parsing successful 887 */ 888 bool HessianMatrix::ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns) 889 { 890 char filename[1023]; 891 ifstream input; 892 stringstream file; 893 int nr; 894 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 895 896 if (status) { 897 // count number of atoms for last plus one matrix 898 file << name << FRAGMENTPREFIX << KEYSETFILE; 899 input.open(file.str().c_str(), ios::in); 900 if (input == NULL) { 901 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 902 return false; 903 } 904 RowCounter[MatrixCounter] = 0; 905 ColumnCounter[MatrixCounter] = 0; 906 while (!input.eof()) { 907 input.getline(filename, 1023); 908 stringstream zeile(filename); 909 while (!zeile.eof()) { 910 zeile >> nr; 911 //cout << "Current index: " << nr << "." << endl; 912 if (nr > RowCounter[MatrixCounter]) { 913 RowCounter[MatrixCounter] = nr; 914 ColumnCounter[MatrixCounter] = nr; 915 } 916 } 917 } 918 RowCounter[MatrixCounter]++; // nr start at 0, count starts at 1 919 ColumnCounter[MatrixCounter]++; // nr start at 0, count starts at 1 920 input.close(); 921 922 // allocate last plus one matrix 923 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 924 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 925 for(int j=0;j<=RowCounter[MatrixCounter];j++) 926 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 663 927 664 928 // try independently to parse global forcesuffix file if present -
src/parser.hpp
rb77416 rb38b64 19 19 20 20 #define EnergySuffix ".energy.all" 21 #define EnergyFragmentSuffix ".energyfragment.all" 22 #define ForcesSuffix ".forces.all" 23 #define ForceFragmentSuffix ".forcefragment.all" 21 24 #define HcorrectionSuffix ".Hcorrection.all" 22 #define ForcesSuffix ".forces.all" 25 #define HcorrectionFragmentSuffix ".Hcorrectionfragment.all" 26 #define HessianSuffix ".hessian_xx.all" 27 #define HessianFragmentSuffix ".hessianfragment_xx.all" 28 #define OrderSuffix ".Order" 23 29 #define ShieldingSuffix ".sigma_all.csv" 24 30 #define ShieldingPASSuffix ".sigma_all_PAS.csv" … … 30 36 #define ChiPASFragmentSuffix ".chi_all_PAS_fragment.all" 31 37 #define TimeSuffix ".speed" 32 #define EnergyFragmentSuffix ".energyfragment.all"33 #define HcorrectionFragmentSuffix ".Hcorrectionfragment.all"34 #define ForceFragmentSuffix ".forcefragment.all"35 #define OrderSuffix ".Order"36 38 37 39 // ======================================= FUNCTIONS ========================================== … … 47 49 double ***Matrix; 48 50 int **Indices; 49 char * Header;51 char **Header; 50 52 int MatrixCounter; 51 53 int *RowCounter; 52 int ColumnCounter;54 int *ColumnCounter; 53 55 54 56 MatrixContainer(); 55 57 ~MatrixContainer(); 56 58 59 bool InitialiseIndices(class MatrixContainer *Matrix = NULL); 57 60 bool ParseMatrix(const char *name, int skiplines, int skipcolumns, int MatrixNr); 58 61 virtual bool ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns); 59 bool AllocateMatrix(char * GivenHeader, int MCounter, int *RCounter, intCCounter);62 bool AllocateMatrix(char **GivenHeader, int MCounter, int *RCounter, int *CCounter); 60 63 bool ResetMatrix(); 61 64 double FindMinValue(); … … 74 77 class EnergyMatrix : public MatrixContainer { 75 78 public: 76 bool ParseIndices();77 79 bool SumSubEnergy(class EnergyMatrix &Fragments, class EnergyMatrix *CorrectionFragments, class KeySetsContainer &KeySet, int Order, double sign); 78 80 bool ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns); … … 86 88 bool SumSubForces(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, int Order, double sign); 87 89 bool ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns); 90 }; 91 92 // ======================================= CLASS HessianMatrix ============================= 93 94 class HessianMatrix : public MatrixContainer { 95 public: 96 HessianMatrix(); 97 //~HessianMatrix(); 98 bool ParseIndices(char *name); 99 bool SumSubManyBodyTerms(class MatrixContainer &MatrixValues, class KeySetsContainer &KeySet, int Order); 100 bool SumSubHessians(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, int Order, double sign); 101 bool ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns); 102 private: 103 bool IsSymmetric; 88 104 }; 89 105
Note:
See TracChangeset
for help on using the changeset viewer.