source: src/builder.cpp@ ae21cbd

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 Candidate_v1.7.0 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
Last change on this file since ae21cbd was ae21cbd, checked in by Frederik Heber <heber@…>, 15 years ago

MEMFIX: new function AddStaticEntitiestoIgnoreList() for putting static variables on ignore list.

  • static classes still may have dynamically allocated contents in their constructors. Hence, we have to put their contents - which will get deleted - into the Memory::ignore map to avoid their admonishing.
  • Property mode set to 100755
File size: 8.9 KB
RevLine 
[bcf653]1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8 /** \file builder.cpp
[a8bcea6]9 *
[a356f2]10 * date: Jan 1, 2007
11 * author: heber
[a8bcea6]12 *
[14de469]13 */
14
[bcf653]15/*! \page Copyright notice
16 *
17 * MoleCuilder - to create and alter molecular systems
[490038]18 * Copyright (C) 2010 University Bonn. All rights reserved.
[bcf653]19 *
20 */
21
[a356f2]22/*! \mainpage MoleCuilder - a molecular set builder
[a8bcea6]23 *
[a356f2]24 * This introductory shall briefly make acquainted with the program, helping in installing and a first run.
[a8bcea6]25 *
[14de469]26 * \section about About the Program
[a8bcea6]27 *
[a356f2]28 * MoleCuilder is a program, written entirely in C++, that enables the construction of a coordinate set for the
29 * atoms making up an molecule. It allows for both building of simple molecules by adding atom-wise giving bond
30 * angles and distances or absolute coordinates, but also using them as templates. Regions can be specified and
31 * ordered to be filled with a molecule in a certain manner. Greater conglomerations of molecules can be tesselated
32 * and recognized as a region themselves to be subsequently surrounded by other (surface solvated) molecules.
33 * In the end, MoleCuilder allows the construction of arbitrary nano structures, whether they be crystalline or
34 * amorphic in nature.
[a8bcea6]35 *
36 *
[14de469]37 * \section install Installation
[a8bcea6]38 *
[042f82]39 * Installation should without problems succeed as follows:
40 * -# ./configure (or: mkdir build;mkdir run;cd build; ../configure --bindir=../run)
41 * -# make
42 * -# make install
[a8bcea6]43 *
[042f82]44 * Further useful commands are
45 * -# make clean uninstall: deletes .o-files and removes executable from the given binary directory\n
46 * -# make doxygen-doc: Creates these html pages out of the documented source
[a356f2]47 * -# make check: Runs an extensive set of unit tests and a testsuite which also gives a good overview on the set of
48 * functions.
[a8bcea6]49 *
[14de469]50 * \section run Running
[a8bcea6]51 *
[042f82]52 * The program can be executed by running: ./molecuilder
[a8bcea6]53 *
[a356f2]54 * MoleCuilder has three interfaces at your disposal:
55 * -# Textmenu: A simple interactive console-based menu, where awaits your choices and inputs in order to set atoms
56 * as you like
57 * -# CommandLineUI: Every command can also be chained up as a sequence of actions on the command line to be executed
58 * with any user interaction.
59 * -# GraphicalUI: A graphical user interface that also display the molecular structure being built and lots of other
60 * informations to ease the construction of bigger geometries.
[a8bcea6]61 *
[a356f2]62 * The supported output formats right now are:
63 * -# mpqc: Configuration files of the Massively Parallel Quantum Chemistry package (Sandia labs)
64 * -# pcp: Configuration files of the Parallel Car-Parrinello program (Institute for Numerical Simulation)
65 * -# tremolo: Configuration files of TREMOLO (Institute for Numerical Simulation)
66 * -# xyz: the most basic format for the 3d arrangement of atoms consisting of a list of element and 3 coordinates.
[a8bcea6]67 *
[14de469]68 */
69
[bf3817]70// include config.h
71#ifdef HAVE_CONFIG_H
72#include <config.h>
73#endif
74
[112b09]75#include "Helpers/MemDebug.hpp"
[14de469]76
[b70721]77#include "bondgraph.hpp"
[f66195]78#include "config.hpp"
[952f38]79#include "Helpers/Log.hpp"
[cee0b57]80#include "molecule.hpp"
[f66195]81#include "periodentafel.hpp"
[bfd839]82#include "tesselationhelpers.hpp"
[cc04b7]83#include "UIElements/UIFactory.hpp"
[5f5a7b]84#include "UIElements/TextUI/TextUIFactory.hpp"
85#include "UIElements/CommandLineUI/CommandLineUIFactory.hpp"
[e4afb4]86#include "UIElements/CommandLineUI/CommandLineParser.hpp"
[82b71a]87#ifdef USE_GUI_QT
[4cf323d]88#include "UIElements/Qt4/QtUIFactory.hpp"
[82b71a]89#endif
[cc04b7]90#include "UIElements/MainWindow.hpp"
[45f5d6]91#include "UIElements/Dialog.hpp"
[b59da6]92//#include "Menu/ActionMenuItem.hpp"
[952f38]93#include "Helpers/Verbose.hpp"
[a356f2]94#include "World.hpp"
95
[12b845]96#include "Actions/ActionRegistry.hpp"
[d56640]97#include "Actions/ActionHistory.hpp"
[042f82]98
[a356f2]99#include "Parser/ChangeTracker.hpp"
100#include "Parser/FormatParserStorage.hpp"
[1907a7]101
[a356f2]102#include "UIElements/UIFactory.hpp"
103#include "UIElements/TextUI/TextUIFactory.hpp"
104#include "UIElements/CommandLineUI/CommandLineUIFactory.hpp"
105#include "UIElements/MainWindow.hpp"
106#include "UIElements/Dialog.hpp"
[1f1b23]107
[a356f2]108#include "version.h"
[1f1b23]109
[ca2b83]110
111/********************************************** Main routine **************************************/
[14de469]112
[ae21cbd]113/** In this function all dynamicly allocated member variables to static/global
114 * variables are added to the ignore list of Memory/MemDebug.
115 *
116 * Use this to prevent their listing in the Memory::getState() at the end of the
117 * program. Check with valgrind that truely no memory leak occurs!
118 */
119void AddStaticEntitiestoIgnoreList()
120{
121 // zeroVec and unitVec are global variables (on the stack) but vectorContent
122 // within is situated on the heap and has to be ignored
123 Memory::ignore(zeroVec.get());
124 Memory::ignore(unitVec[0].get());
125 Memory::ignore(unitVec[1].get());
126 Memory::ignore(unitVec[2].get());
127}
128
129/** Cleans all singleton instances in an orderly fashion.
130 * C++ does not guarantee any specific sequence of removal of single instances
131 * which have static/global variables. Some singletons depend on others hence we
132 * acertain a specific ordering here, which is is used via the atexit() hook.
133 */
[148d8f0]134void cleanUp(){
[35b698]135 FormatParserStorage::purgeInstance();
[a1e929]136 ChangeTracker::purgeInstance();
[23b547]137 World::purgeInstance();
[97ebf8]138 UIFactory::purgeInstance();
[e4afb4]139 ValueStorage::purgeInstance();
[c6efc1]140 CommandLineParser::purgeInstance();
[e73a8a2]141 ActionRegistry::purgeInstance();
[76cec6]142 OptionRegistry::purgeInstance();
[632bc3]143 ActionHistory::purgeInstance();
[41449c]144 // we have to remove these two static as otherwise their boost::shared_ptrs are still present
145 Action::removeStaticStateEntities();
[ae21cbd]146 // put some static variables' dynamic contents on the Memory::ignore map to avoid their
147 // admonishing lateron
148 AddStaticEntitiestoIgnoreList();
[052afe]149 logger::purgeInstance();
150 errorLogger::purgeInstance();
[cd5047]151#ifdef LOG_OBSERVER
152 cout << observerLog().getLog();
153#endif
[68f03d]154 Memory::getState();
[354859]155}
156
[097902]157void dumpMemory(){
158 ofstream ost("molecuilder.memdump");
159 Memory::dumpMemory(ost);
160}
161
[ca2b83]162int main(int argc, char **argv)
163{
[a356f2]164 // while we are non interactive, we want to abort from asserts
[097902]165 ASSERT_DO(Assert::Abort);
166 ASSERT_HOOK(dumpMemory);
[a356f2]167 string line;
168 char **Arguments = NULL;
169 int ArgcSize = 0;
170 int ExitFlag = 0;
171 bool ArgumentsCopied = false;
172 std::string BondGraphFileName("\n");
173
[bcf653]174 // print version check and copyright notice
[5f8660a]175 cout << MOLECUILDERVERSION << endl;
[bcf653]176 cout << "MoleCuilder comes with ABSOLUTELY NO WARRANTY; for details type" << endl;
[7230be]177 cout << "`molecuilder --warranty'." << endl;
[490038]178 cout << "`MoleCuilder - to create and alter molecular systems." << endl;
179 cout << "Copyright (C) 2010 University Bonn. All rights reserved." << endl;
[a356f2]180
181 setVerbosity(0);
182 // need to init the history before any action is created
183 ActionHistory::init();
184
185 // from this moment on, we need to be sure to deeinitialize in the correct order
186 // this is handled by the cleanup function
187 atexit(cleanUp);
188
189 // Parse command line options and if present create respective UI
190 {
191 // construct bond graph
192 if (World::getInstance().getConfig()->BG == NULL) {
193 World::getInstance().getConfig()->BG = new BondGraph(World::getInstance().getConfig()->GetIsAngstroem());
194 if (World::getInstance().getConfig()->BG->LoadBondLengthTable(BondGraphFileName)) {
195 DoLog(0) && (Log() << Verbose(0) << "Bond length table loaded successfully." << endl);
[97ebf8]196 } else {
[a356f2]197 DoeLog(1) && (eLog()<< Verbose(1) << "Bond length table loading failed." << endl);
[97ebf8]198 }
[c6efc1]199 }
[a356f2]200 // handle remaining arguments by CommandLineParser
[326bbe]201 if (argc>1) {
[e4afb4]202 CommandLineParser::getInstance().InitializeCommandArguments();
203 CommandLineParser::getInstance().Run(argc,argv);
[a356f2]204 DoLog(0) && (Log() << Verbose(0) << "Setting UI to CommandLine." << endl);
205 UIFactory::registerFactory(new CommandLineUIFactory::description());
206 UIFactory::makeUserInterface("CommandLine");
207 } else {
[007839]208 // In the interactive mode, we can leave the user the choice in case of error
209 ASSERT_DO(Assert::Ask);
[04488a]210 #ifdef USE_GUI_QT
[4cf323d]211 DoLog(0) && (Log() << Verbose(0) << "Setting UI to Qt4." << endl);
212 UIFactory::registerFactory(new QtUIFactory::description());
213 UIFactory::makeUserInterface("Qt4");
[04488a]214 #else
215 DoLog(0) && (Log() << Verbose(0) << "Setting UI to Text." << endl);
[5f8660a]216 cout << MOLECUILDERVERSION << endl;
[04488a]217 UIFactory::registerFactory(new TextUIFactory::description());
218 UIFactory::makeUserInterface("Text");
219 #endif
[12b845]220 }
[a356f2]221 }
222
223 {
224 MainWindow *mainWindow = UIFactory::getInstance().makeMainWindow();
225 mainWindow->display();
226 delete mainWindow;
227 }
[6ac7ee]228
[a356f2]229 FormatParserStorage::getInstance().SaveAll();
230 ChangeTracker::getInstance().saveStatus();
[042f82]231
[97ebf8]232 // free the new argv
233 if (ArgumentsCopied) {
234 for (int i=0; i<ArgcSize;i++)
[920c70]235 delete[](Arguments[i]);
236 delete[](Arguments);
[97ebf8]237 }
[4f7f34e]238 //delete[](ConfigFileName);
[632bc3]239
[e4b5de]240 ExitFlag = World::getInstance().getExitFlag();
[99fcaf]241 return (ExitFlag == 1 ? 0 : ExitFlag);
[14de469]242}
243
244/********************************************** E N D **************************************************/
Note: See TracBrowser for help on using the repository browser.