source: src/Parser/unittests/ParserPsi3UnitTest.cpp@ 286a967

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 v1.3.3
Last change on this file since 286a967 was 94d5ac6, checked in by Frederik Heber <heber@…>, 12 years ago

FIX: As we use GSL internally, we are as of now required to use GPL v2 license.

  • GNU Scientific Library is used at every place in the code, especially the sub-package LinearAlgebra is based on it which in turn is used really everywhere in the remainder of MoleCuilder. Hence, we have to use the GPL license for the whole of MoleCuilder. In effect, GPL's COPYING was present all along and stated the terms of the GPL v2 license.
  • Hence, I added the default GPL v2 disclaimer to every source file and removed the note about a (actually missing) LICENSE file.
  • also, I added a help-redistribute action which again gives the disclaimer of the GPL v2.
  • also, I changed in the disclaimer that is printed at every program start in builder_init.cpp.
  • TEST: Added check on GPL statement present in every module to test CodeChecks project-disclaimer.
  • Property mode set to 100644
File size: 15.3 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * ParserPsi3UnitTest.cpp
25 *
26 * Created on: Mar 3, 2010
27 * Author: metzler
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "ParserPsi3UnitTest.hpp"
36
37#include <cppunit/CompilerOutputter.h>
38#include <cppunit/extensions/TestFactoryRegistry.h>
39#include <cppunit/ui/text/TestRunner.h>
40
41#include <boost/any.hpp>
42
43#include "Atom/atom.hpp"
44#include "Atom/AtomObserver.hpp"
45#include "Element/element.hpp"
46#include "Element/periodentafel.hpp"
47#include "CodePatterns/Assert.hpp"
48#include "Descriptors/AtomTypeDescriptor.hpp"
49#include "Parser/ChangeTracker.hpp"
50#include "Parser/Psi3Parser.hpp"
51#include "World.hpp"
52
53#ifdef HAVE_TESTRUNNER
54#include "UnitTestMain.hpp"
55#endif /*HAVE_TESTRUNNER*/
56
57using namespace std;
58
59// Registers the fixture into the 'registry'
60CPPUNIT_TEST_SUITE_REGISTRATION( ParserPsi3UnitTest );
61
62static string hydrogenPsi3_RHF ="% Created by MoleCuilder\n\
63psi: (\n\
64\tlabel = \"cc-pVTZ SCF H2\"\n\
65\tjobtype = sp\n\
66\twfn = scf\n\
67\tmaxiter = 80\n\
68\treference = rhf\n\
69\tbasis = \"cc-pVTZ\"\n\
70\tfreeze_core = no\n\
71\tunits = angstrom\n\
72\tgeometry = (\n\
73\t( H\t0\t0\t-0.37 )\n\
74\t( H\t0\t0\t0.37 )\n\
75\t)\n\
76\torigin = (0.0\t0.0\t0.0)\n\
77)\n"; // tested with ???
78
79static string hydrogenPsi3_ROHF ="% Created by MoleCuilder\n\
80psi: (\n\
81\tlabel = \"cc-pVTZ SCF H2\"\n\
82\tjobtype = sp\n\
83\twfn = scf\n\
84\tmaxiter = 80\n\
85\treference = rohf\n\
86\tbasis = \"cc-pVTZ\"\n\
87\tfreeze_core = no\n\
88\tunits = angstrom\n\
89\tgeometry = (\n\
90\t( H\t0\t0\t-0.37 )\n\
91\t( H\t0\t0\t0.37 )\n\
92\t)\n\
93\torigin = (0.0\t0.0\t0.0)\n\
94)\n"; // tested with ???
95
96static string hydrogenPsi3_UHF ="% Created by MoleCuilder\n\
97psi: (\n\
98\tlabel = \"cc-pVTZ SCF H2\"\n\
99\tjobtype = sp\n\
100\twfn = scf\n\
101\tmaxiter = 80\n\
102\treference = uhf\n\
103\tbasis = \"cc-pVTZ\"\n\
104\tmultp = 2\n\
105\tcharge = 2\n\
106\tfreeze_core = no\n\
107\tunits = angstrom\n\
108\tgeometry = (\n\
109\t( H\t0\t0\t-0.37 )\n\
110\t( H\t0\t0\t0.37 )\n\
111\t)\n\
112\torigin = (0.0\t0.0\t0.0)\n\
113)\n"; // tested with ???
114
115static string hydrogenPsi3_TWOCON ="% Created by MoleCuilder\n\
116psi: (\n\
117\tlabel = \"cc-pVTZ SCF H2\"\n\
118\tjobtype = sp\n\
119\twfn = scf\n\
120\tmaxiter = 80\n\
121\treference = twocon\n\
122\tbasis = \"cc-pVTZ\"\n\
123\tmultp = 1\n\
124\tcharge = 2\n\
125\tsocc = ( 1 1 0 0 0 0 0 0 )\n\
126\tdocc = ( 0 0 0 0 0 0 0 0 )\n\
127\tsubgroup = c2v\n\
128\tunique_axis = x\n\
129\tfreeze_core = no\n\
130\tunits = angstrom\n\
131\tgeometry = (\n\
132\t( H\t0\t0\t-0.37 )\n\
133\t( H\t0\t0\t0.37 )\n\
134\t)\n\
135\torigin = (0.0\t0.0\t0.0)\n\
136)\n"; // tested with ???
137
138void ParserPsi3UnitTest::setUp()
139{
140 // failing asserts should be thrown
141 ASSERT_DO(Assert::Throw);
142
143 parser = new FormatParser<psi3>();
144
145 params = &parser->getParams();
146
147 World::getInstance();
148
149 setVerbosity(2);
150
151 // we need hydrogens and oxygens in the following tests
152 CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(1) != NULL);
153}
154
155void ParserPsi3UnitTest::tearDown()
156{
157 params = NULL;
158 delete parser;
159 ChangeTracker::purgeInstance();
160 AtomObserver::purgeInstance();
161 World::purgeInstance();
162}
163
164/************************************ tests ***********************************/
165
166void ParserPsi3UnitTest::ParameterDefaultTest() {
167 // check default values
168 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::labelParam) == std::string("unknown job"));
169 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::SP]);
170 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::wavefunctionParam) == params->ValidWavefunction[Psi3Parser_Parameters::SCF]);
171 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::maxiterParam) == std::string("80"));
172 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::referenceParam) == params->ValidReference[Psi3Parser_Parameters::RHF]);
173 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::basisParam) == std::string("cc-pVTZ"));
174 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::freeze_coreParam) == params->ValidFreezeCore[Psi3Parser_Parameters::YES]);
175 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::unitsParam) == params->ValidUnits[Psi3Parser_Parameters::angstrom]);
176 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::dertypeParam) == params->ValidDerivativeType[Psi3Parser_Parameters::NONE]);
177 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::originParam) == std::string("(0.0\t0.0\t0.0)"));
178 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::multiplicityParam) == std::string("1"));
179 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::chargeParam) == std::string("0"));
180 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::soccParam) == std::string("()"));
181 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::doccParam) == std::string("()"));
182 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::subgroupParam) == std::string(""));
183 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::unique_axisParam) == params->ValidUniqueAxis[Psi3Parser_Parameters::X]);
184}
185
186void ParserPsi3UnitTest::ParameterCloneTest() {
187 FormatParser_Parameters *clone = params->clone();
188 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::SP]);
189 std::stringstream setvalue(params->ParamNames[Psi3Parser_Parameters::jobtypeParam]+"="+params->ValidJobtypes[Psi3Parser_Parameters::OPT]);
190 setvalue >> *params;
191 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::OPT]);
192 params->makeClone(*clone);
193 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::SP]);
194}
195
196void ParserPsi3UnitTest::ParameterSetterTest() {
197 // test a jobtype
198 {
199 std::stringstream setvalue(
200 params->ParamNames[Psi3Parser_Parameters::jobtypeParam]
201 +" = "+params->ValidJobtypes[Psi3Parser_Parameters::OPT]
202 );
203 setvalue >> *params;
204 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::OPT]);
205 }
206 // test a wavefunction
207 {
208 std::stringstream setvalue(
209 params->ParamNames[Psi3Parser_Parameters::wavefunctionParam]
210 +" = "+params->ValidWavefunction[Psi3Parser_Parameters::MP2]
211 );
212 setvalue >> *params;
213 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::wavefunctionParam) == params->ValidWavefunction[Psi3Parser_Parameters::MP2]);
214 }
215 // test a reference
216 {
217 std::stringstream setvalue(
218 params->ParamNames[Psi3Parser_Parameters::referenceParam]
219 +" = "+params->ValidReference[Psi3Parser_Parameters::ROHF]
220 );
221 setvalue >> *params;
222 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::referenceParam) == params->ValidReference[Psi3Parser_Parameters::ROHF]);
223 }
224 // test a unique_axis
225 {
226 std::stringstream setvalue(
227 params->ParamNames[Psi3Parser_Parameters::unique_axisParam]
228 +" = "+params->ValidUniqueAxis[Psi3Parser_Parameters::Y]
229 );
230 setvalue >> *params;
231 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::unique_axisParam) == params->ValidUniqueAxis[Psi3Parser_Parameters::Y]);
232 }
233 // test a units
234 {
235 std::stringstream setvalue(
236 params->ParamNames[Psi3Parser_Parameters::unitsParam]
237 +" = "+params->ValidUnits[Psi3Parser_Parameters::bohr]
238 );
239 setvalue >> *params;
240 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::unitsParam) == params->ValidUnits[Psi3Parser_Parameters::bohr]);
241 }
242 // test a dertype
243 {
244 std::stringstream setvalue(
245 params->ParamNames[Psi3Parser_Parameters::dertypeParam]
246 +" = "+params->ValidDerivativeType[Psi3Parser_Parameters::NONE]
247 );
248 setvalue >> *params;
249 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::dertypeParam) == params->ValidDerivativeType[Psi3Parser_Parameters::NONE]);
250 }
251 // test a freeze_core
252 {
253 std::stringstream setvalue(
254 params->ParamNames[Psi3Parser_Parameters::freeze_coreParam]
255 +" = "+params->ValidFreezeCore[Psi3Parser_Parameters::LARGE]
256 );
257 setvalue >> *params;
258 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::freeze_coreParam) == params->ValidFreezeCore[Psi3Parser_Parameters::LARGE]);
259 }
260 // test int
261 {
262 std::stringstream setvalue(
263 params->ParamNames[Psi3Parser_Parameters::maxiterParam]
264 +" = 500"
265 );
266 setvalue >> *params;
267// std::cout << "maxiter is "
268// << params->getString(Psi3Parser_Parameters::maxiterParam) << std::endl;
269 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::maxiterParam) == std::string("500"));
270 }
271 // test whether unknown key fails
272 std::cout << "The following Assertion warning is desired and does not indicate a failure of the test." << std::endl;
273 {
274 std::stringstream setvalue("sd = no");
275#ifndef NDEBUG
276 ASSERT_DO(Assert::Throw);
277 CPPUNIT_ASSERT_THROW(setvalue >> *params, Assert::AssertionFailure);
278#else
279 setvalue >> *params;
280#endif
281// std::cout << "Hessian is still "
282// << params->getString(Psi3Parser_Parameters::hessianParam) << std::endl;
283 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::OPT]);
284 }
285}
286
287void ParserPsi3UnitTest::readPsi3Test() {
288 stringstream input(hydrogenPsi3_RHF);
289 // set some other parameter for jobtype
290 params->setParameter(
291 Psi3Parser_Parameters::jobtypeParam,
292 params->ValidJobtypes[Psi3Parser_Parameters::OPT]
293 );
294 parser->load(&input);
295
296 // check for jobtype from file
297 CPPUNIT_ASSERT(params->getParameter(Psi3Parser_Parameters::jobtypeParam) == params->ValidJobtypes[Psi3Parser_Parameters::SP]);
298 // check for 2 hydrogens
299 CPPUNIT_ASSERT_EQUAL(2, World::getInstance().numAtoms());
300 // check that positions are right
301 Vector PositionSum;
302 std::vector<atom *> atoms = World::getInstance().getAllAtoms();
303 for (std::vector<atom *>::const_iterator iter = atoms.begin();
304 iter != atoms.end();
305 ++iter)
306 PositionSum += (*iter)->getPosition();
307 CPPUNIT_ASSERT_EQUAL( PositionSum, Vector(0.,0.,0.) );
308}
309
310void ParserPsi3UnitTest::writePsi3Test() {
311 // build up hydrogen molecule
312 string first;
313 string second;
314 atom *Walker = NULL;
315 Walker = World::getInstance().createAtom();
316 Walker->setType(1);
317 Walker->setPosition(Vector(0.,0.,0.));
318 Walker = World::getInstance().createAtom();
319 Walker->setType(1);
320 Walker->setPosition(Vector(0.,0,0.74));
321 CPPUNIT_ASSERT_EQUAL(2, World::getInstance().numAtoms());
322
323 // set general parameters: label and freeze_core
324 params->setParameter(
325 Psi3Parser_Parameters::labelParam,
326 "cc-pVTZ SCF H2"
327 );
328 params->setParameter(
329 Psi3Parser_Parameters::freeze_coreParam,
330 params->ValidFreezeCore[Psi3Parser_Parameters::NO]
331 );
332 params->setParameter(
333 Psi3Parser_Parameters::unitsParam,
334 params->ValidUnits[Psi3Parser_Parameters::angstrom]
335 );
336
337 // create two stringstreams, one stored, one created
338 std::vector<atom *> atoms = World::getInstance().getAllAtoms();
339 {
340 // compare both configs for RHF
341 stringstream output;
342 params->setParameter(
343 Psi3Parser_Parameters::referenceParam,
344 params->ValidReference[Psi3Parser_Parameters::RHF]
345 );
346 parser->save(&output, atoms);
347 stringstream input(hydrogenPsi3_RHF);
348 // check for non-empty streams
349 input.peek();
350 output.peek();
351 CPPUNIT_ASSERT(input.good() && output.good());
352 // check equality of streams per line (for debugging)
353 for (; std::getline(input, first) && std::getline(output, second); ) {
354 //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
355 CPPUNIT_ASSERT(first == second);
356 }
357 }
358 {
359 // compare both configs for ROHF
360 stringstream output;
361 params->setParameter(
362 Psi3Parser_Parameters::referenceParam,
363 params->ValidReference[Psi3Parser_Parameters::ROHF]
364 );
365 parser->save(&output, atoms);
366 stringstream input(hydrogenPsi3_ROHF);
367 // check for non-empty streams
368 input.peek();
369 output.peek();
370 CPPUNIT_ASSERT(input.good() && output.good());
371 // check equality of streams per line (for debugging)
372 for (; std::getline(input, first) && std::getline(output, second); ) {
373 //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
374 CPPUNIT_ASSERT(first == second);
375 }
376 }
377 {
378 params->setParameter(Psi3Parser_Parameters::multiplicityParam, "2");
379 params->setParameter(Psi3Parser_Parameters::chargeParam, "2");
380 // compare both configs for UHF
381 stringstream output;
382 params->setParameter(
383 Psi3Parser_Parameters::referenceParam,
384 params->ValidReference[Psi3Parser_Parameters::UHF]
385 );
386 parser->save(&output, atoms);
387 params->setParameter(Psi3Parser_Parameters::chargeParam, "0");
388 params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
389 stringstream input(hydrogenPsi3_UHF);
390 // check for non-empty streams
391 input.peek();
392 output.peek();
393 CPPUNIT_ASSERT(input.good() && output.good());
394 // check equality of streams per line (for debugging)
395 for (; std::getline(input, first) && std::getline(output, second); ) {
396 //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
397 CPPUNIT_ASSERT(first == second);
398 }
399 }
400 {
401 params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
402 params->setParameter(Psi3Parser_Parameters::chargeParam, "2");
403 params->setParameter(Psi3Parser_Parameters::soccParam, "( 1 1 0 0 0 0 0 0 )");
404 params->setParameter(Psi3Parser_Parameters::doccParam, "( 0 0 0 0 0 0 0 0 )");
405 params->setParameter(Psi3Parser_Parameters::subgroupParam, "c2v");
406 params->setParameter(Psi3Parser_Parameters::unique_axisParam, "x");
407 // compare both configs for TWOCON
408 stringstream output;
409 params->setParameter(
410 Psi3Parser_Parameters::referenceParam,
411 params->ValidReference[Psi3Parser_Parameters::TWOCON]
412 );
413 parser->save(&output, atoms);
414 params->setParameter(Psi3Parser_Parameters::multiplicityParam, "1");
415 params->setParameter(Psi3Parser_Parameters::chargeParam, "0");
416 stringstream input(hydrogenPsi3_TWOCON);
417 // check for non-empty streams
418 input.peek();
419 output.peek();
420 CPPUNIT_ASSERT(input.good() && output.good());
421 // check equality of streams per line (for debugging)
422 for (; std::getline(input, first) && std::getline(output, second); ) {
423 //std::cout << "Comparing '" << first << "' to '" << second << "'" << std::endl;
424 CPPUNIT_ASSERT(first == second);
425 }
426 }
427}
Note: See TracBrowser for help on using the repository browser.