Line data Source code
1 : // Copyright (C) 2015 Technische Universitaet Muenchen
2 : // This file is part of the Mamico project. For conditions of distribution
3 : // and use, please see the copyright notice in Mamico's main folder, or at
4 : // www5.in.tum.de/mamico
5 : #include "coupling/configurations/ParticleInsertionConfiguration.h"
6 :
7 : const std::string coupling::configurations::ParticleInsertionConfiguration::INSERT_DELETE_MASS_EVERY_TIMESTEP("insert-every-timestep");
8 : const std::string coupling::configurations::ParticleInsertionConfiguration::RSIGMA_COEFF("r_sigma");
9 : const std::string coupling::configurations::ParticleInsertionConfiguration::MEAN_POTENTIAL_ENERGY_FACTOR("u_0-factor");
10 : const std::string coupling::configurations::ParticleInsertionConfiguration::UOVERLAP_COEFF("u_ovlp");
11 : const std::string coupling::configurations::ParticleInsertionConfiguration::STEPREF_COEFF("reference-stepsize");
12 : const std::string coupling::configurations::ParticleInsertionConfiguration::ITER_MAX("maximum-number-of-iterations");
13 : const std::string coupling::configurations::ParticleInsertionConfiguration::RESTART_MAX("maximum-number-of-restarts");
14 : const std::string coupling::configurations::ParticleInsertionConfiguration::TOLERANCE("tolerance");
15 : const std::string coupling::configurations::ParticleInsertionConfiguration::OFFSET_FROM_OUTER_BOUNDARY("offset-from-outer-boundary");
16 :
17 4 : void coupling::configurations::ParticleInsertionConfiguration::parseSubtag(tinyxml2::XMLElement* node) {
18 4 : int buf = -1;
19 :
20 : // specify the type of insertion
21 4 : std::string thisType;
22 4 : tarch::configuration::ParseConfiguration::readStringMandatory(thisType, node, "type");
23 : // in this case, no insertion should be carried out, no more parameters need to be parsed -> thus: return
24 4 : if (thisType == "none") {
25 4 : _particleInsertionType = NO_INSERTION;
26 4 : return;
27 0 : } else if (thisType == "usher") {
28 0 : _particleInsertionType = USHER;
29 : } else {
30 0 : std::cout << "ERROR "
31 : "coupling::configurations::ParticleInsertionConfiguration::"
32 0 : "parseSubtag(): 'type' not specified!"
33 0 : << std::endl;
34 0 : exit(EXIT_FAILURE);
35 : }
36 :
37 0 : buf = 1;
38 0 : tarch::configuration::ParseConfiguration::readIntOptional(buf, node, INSERT_DELETE_MASS_EVERY_TIMESTEP);
39 0 : if (buf <= 0) {
40 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
41 0 : std::cout << "parseSubtag(): " << INSERT_DELETE_MASS_EVERY_TIMESTEP << " smaller than or equal zero!" << std::endl;
42 0 : exit(EXIT_FAILURE);
43 : } else {
44 0 : _insertDeleteMassEveryTimestep = (unsigned int)buf;
45 : }
46 :
47 0 : _rSigmaCoeff = 0.9;
48 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_rSigmaCoeff, node, RSIGMA_COEFF);
49 0 : if (_rSigmaCoeff <= 0.0) {
50 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
51 0 : std::cout << "parseSubtag(): " << RSIGMA_COEFF << " smaller than or equal zero!" << std::endl;
52 0 : exit(EXIT_FAILURE);
53 : }
54 :
55 0 : _meanPotentialEnergyFactor = 1.0;
56 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_meanPotentialEnergyFactor, node, MEAN_POTENTIAL_ENERGY_FACTOR);
57 0 : if (_meanPotentialEnergyFactor <= 0.0) {
58 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
59 0 : std::cout << "parseSubtag(): " << MEAN_POTENTIAL_ENERGY_FACTOR << " smaller than or equal zero!" << std::endl;
60 0 : exit(EXIT_FAILURE);
61 : }
62 :
63 : // default setting of last commit
64 0 : _tolerance = _meanPotentialEnergyFactor * 2.0;
65 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_tolerance, node, TOLERANCE);
66 0 : if (_tolerance <= 0.0) {
67 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::parseSubtag(): " << TOLERANCE << " is smaller than or equal zero!"
68 0 : << std::endl;
69 0 : exit(EXIT_FAILURE);
70 : }
71 :
72 0 : _uOverlapCoeff = 10000.0;
73 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_uOverlapCoeff, node, UOVERLAP_COEFF);
74 0 : if (_uOverlapCoeff <= 0.0) {
75 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
76 0 : std::cout << "parseSubtag(): " << UOVERLAP_COEFF << " smaller than or equal zero!" << std::endl;
77 0 : exit(EXIT_FAILURE);
78 : }
79 :
80 : // if not defined, choose optimal ref. step strategy (see usher-paper)
81 0 : _stepRefCoeff = -1.0;
82 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_stepRefCoeff, node, STEPREF_COEFF);
83 0 : if ((_stepRefCoeff != -1.0) && (_stepRefCoeff <= 0.0)) {
84 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
85 0 : std::cout << "parseSubtag(): " << STEPREF_COEFF << " smaller than or equal zero!" << std::endl;
86 0 : exit(EXIT_FAILURE);
87 : }
88 :
89 : // if not defined, set offset for particle insertions from outer boundary to
90 : // 0.0; may yield instabilities for dense fluids
91 0 : _offsetFromOuterBoundary = 0.0;
92 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_offsetFromOuterBoundary, node, OFFSET_FROM_OUTER_BOUNDARY);
93 0 : if (_offsetFromOuterBoundary < 0.0) {
94 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
95 0 : std::cout << "parseSubtag(): " << OFFSET_FROM_OUTER_BOUNDARY << " smaller than zero!" << std::endl;
96 0 : exit(EXIT_FAILURE);
97 : }
98 :
99 0 : tarch::configuration::ParseConfiguration::readIntMandatory(buf, node, ITER_MAX);
100 0 : if (buf <= 0) {
101 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
102 0 : std::cout << "parseSubtag(): " << ITER_MAX << " smaller than or equal zero!" << std::endl;
103 0 : exit(EXIT_FAILURE);
104 : } else {
105 0 : _iterMax = (unsigned int)buf;
106 : }
107 :
108 0 : tarch::configuration::ParseConfiguration::readIntMandatory(buf, node, RESTART_MAX);
109 0 : if (buf <= 0) {
110 0 : std::cout << "ERROR coupling::configurations::ParticleInsertionConfiguration::";
111 0 : std::cout << "parseSubtag(): " << RESTART_MAX << " smaller or equal zero!" << std::endl;
112 0 : exit(EXIT_FAILURE);
113 : } else {
114 0 : _restartMax = (unsigned int)buf;
115 : }
116 4 : }
117 :
118 24 : std::string coupling::configurations::ParticleInsertionConfiguration::getTag() const { return "particle-insertion"; }
119 :
120 4 : bool coupling::configurations::ParticleInsertionConfiguration::isValid() const { return true; }
|