PSCF v1.4.0
LinearRamp.tpp
1#ifndef RP_LINEAR_RAMP_TPP
2#define RP_LINEAR_RAMP_TPP
3
4#include "LinearRamp.h"
5#include <util/global.h>
6
7namespace Pscf {
8namespace Rp {
9
10 using namespace Util;
11
12 /*
13 * Constructor.
14 */
15 template <int D, class T>
16 LinearRamp<D,T>::LinearRamp(typename T::Simulator& simulator)
17 : RampT(simulator)
18 { ParamComposite::setClassName("LinearRamp"); }
19
20 template <int D, class T>
21 void LinearRamp<D,T>::readParameters(std::istream& in)
22 {
23 // Read the number of ramp parameters, allocate parameters_ array
24 ParamComposite::read(in, "nParameter", nParameter_);
25 UTIL_CHECK(nParameter_ > 0);
26 parameters_.allocate(nParameter_);
27
28 // Read array of RampParameters, using << operator for each
29 ParamComposite::readDArray(in, "parameters", parameters_,
30 nParameter_);
31
32 // Verify net zero change in volume fractions, if these are swept
33 double sum = 0.0;
34 for (int i = 0; i < nParameter_; ++i) {
35 if (parameters_[i].type() == "phi_polymer" ||
36 parameters_[i].type() == "phi_solvent")
37 {
38 sum += parameters_[i].change();
39 }
40 }
41 UTIL_CHECK(sum > -0.0000001);
42 UTIL_CHECK(sum < 0.0000001);
43 }
44
45 template <int D, class T>
46 void LinearRamp<D,T>::setup(int nStep)
47 {
48 RampT::nStep_ = nStep;
49
50 // Set simulator pointer and initial value for each parameter object
51 for (int i = 0; i < nParameter_; ++i) {
52 parameters_[i].setSimulator(RampT::simulator());
53 parameters_[i].getInitial();
54 }
55 }
56
57 template <int D, class T>
59 {
60 // Compute a ramp parameter in the range [0,1]
61 double s = double(iStep)/double(RampT::nStep_);
62
63 // Update the system parameter values
64 double newVal;
65 for (int i = 0; i < nParameter_; ++i) {
66 newVal = parameters_[i].initial() + s*parameters_[i].change();
67 parameters_[i].update(newVal);
68
69 // Update chiEvals and chiEvecs if parameter is chi
70 if (parameters_[i].type() == "chi") {
71 RampT::simulator().analyzeChi();
72 }
74 }
75 }
76
77 template <int D, class T>
79 {
80 for (int i = 0; i < nParameter_; ++i) {
81 Log::file() << "Parameter type: "
82 << parameters_[i].type() << std::endl;
83 Log::file() << "Initial: "
84 << parameters_[i].initial() << " ";
85 Log::file()<< "Change: "
86 << parameters_[i].change() << std::endl;
87 }
88 }
89
90}
91}
92#endif
void output() override
Output information at the end of a simulation.
void setParameters(int iStep) override
Set new parameters values in associated System and Simulator.
void readParameters(std::istream &in) override
Read parameters from parameter file input stream.
void setup(int nStep) override
Set nStep and complete initialization.
LinearRamp(typename T::Simulator &simulator)
Constructor.
static std::ostream & file()
Get log ostream by reference.
Definition Log.cpp:59
DArrayParam< Type > & readDArray(std::istream &in, const char *label, DArray< Type > &array, int n)
Add and read a required DArray < Type > parameter.
ScalarParam< Type > & read(std::istream &in, const char *label, Type &value)
Add and read a new required ScalarParam < Type > object.
void setClassName(const char *className)
Set class name string.
File containing preprocessor macros for error handling.
#define UTIL_CHECK(condition)
Assertion macro suitable for serial or parallel production code.
Definition global.h:68
Class templates for real-valued periodic fields.
PSCF package top-level namespace.