source: src/Parser/unittests/ParserPsi3UnitTest.cpp@ 610c11

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
Last change on this file since 610c11 was 7ace68, checked in by Frederik Heber <heber@…>, 12 years ago

Added multiplicity guesser for Psi3Parser's UHF.

  • TESTFIX: changed multp in testuhf.psi and testtwocon.psi of regression tests Parser/Psi3 due to multiplicity guesser.
  • TESTFIX: changed multp in the same way in ParserPsi3UnitTest.
  • 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 = 3\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 = 3\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.