Line data Source code
1 : // Copyright (C) 2023 Helmut Schmidt University
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
4 :
5 : #pragma once
6 :
7 : #include "tarch/configuration/Configuration.h"
8 : #include "tarch/configuration/ParseConfiguration.h"
9 : #include <iostream>
10 :
11 : namespace coupling {
12 : namespace configurations {
13 : class TimeIntegrationConfiguration;
14 : }
15 : } // namespace coupling
16 :
17 : /**
18 : * Reads time integration configuration. Use number-subdomains="1" to disable PinT.
19 : * Derived from tarch::configuration::Configuration
20 : * @brief reads time integration configuration
21 : * @author Piet Jarmatz
22 : */
23 : class coupling::configurations::TimeIntegrationConfiguration : public tarch::configuration::Configuration {
24 : public:
25 : /** Constructor, initializes the class */
26 816 : TimeIntegrationConfiguration() : _pint_domains(1), _pint_iterations(1), _auto_iteration(false), _visc_multiplier(1), _isValid(true) {}
27 :
28 : /** Destructor */
29 408 : virtual ~TimeIntegrationConfiguration() {}
30 :
31 0 : void parseSubtag(tinyxml2::XMLElement* node) {
32 0 : int buf;
33 0 : tarch::configuration::ParseConfiguration::readIntMandatory(buf, node, "number-subdomains");
34 0 : if (buf <= 0) {
35 0 : std::cout << "ERROR coupling::TimeIntegrationConfiguration: "
36 0 : "number-subdomains = "
37 0 : << buf << "!" << std::endl;
38 0 : _isValid = false;
39 0 : exit(EXIT_FAILURE);
40 : }
41 0 : _pint_domains = buf;
42 :
43 0 : if (isPintEnabled()) {
44 : #if (COUPLING_MD_PARALLEL != COUPLING_MD_YES)
45 : std::cout << "ERROR coupling::TimeIntegrationConfiguration: PinT is enabled but COUPLING_MD_PARALLEL disabled" << std::endl;
46 : std::cout << "Disable PinT in XML config, or enable BUILD_WITH_MPI in cmake." << std::endl;
47 : _isValid = false;
48 : exit(EXIT_FAILURE);
49 : #endif
50 :
51 0 : std::string value;
52 0 : tarch::configuration::ParseConfiguration::readStringMandatory(value, node, "number-iterations");
53 0 : if (value == "auto") {
54 0 : _auto_iteration = true;
55 0 : _pint_iterations = 0;
56 : } else {
57 0 : _auto_iteration = false;
58 0 : tarch::configuration::ParseConfiguration::readIntMandatory(buf, node, "number-iterations");
59 0 : if (buf <= 0) {
60 0 : std::cout << "ERROR TimeIntegrationConfiguration::number-iterations too small!" << std::endl;
61 0 : _isValid = false;
62 0 : exit(EXIT_FAILURE);
63 : }
64 0 : if (buf > _pint_domains) {
65 0 : std::cout << "ERROR TimeIntegrationConfiguration::number-iterations too large!" << std::endl;
66 0 : _isValid = false;
67 0 : exit(EXIT_FAILURE);
68 : }
69 0 : _pint_iterations = buf;
70 : }
71 :
72 0 : tarch::configuration::ParseConfiguration::readDoubleOptional(_visc_multiplier, node, "visc-multiplier");
73 0 : }
74 0 : }
75 :
76 : /** Returns name of xml tag that is associated to the configuration.
77 : * @return name of xml tag that is associated to the configuration
78 : */
79 4 : std::string getTag() const { return "time-integration"; }
80 :
81 : /** checks if the configuration is valid.
82 : * @return _isValid
83 : */
84 4 : bool isValid() const { return _isValid; }
85 :
86 : int getPintDomains() const { return _pint_domains; }
87 0 : bool isPintEnabled() const { return _pint_domains > 1; }
88 : int getPintIterations() const { return _pint_iterations; }
89 : bool isAutoIteration() const { return _auto_iteration; }
90 : double getViscMultiplier() const { return _visc_multiplier; }
91 :
92 : private:
93 : int _pint_domains;
94 : int _pint_iterations;
95 : bool _auto_iteration;
96 : double _visc_multiplier;
97 :
98 : bool _isValid;
99 : };
|