83 IteratorT::isFlexible_ =
false;
87 flexibleParams_.clear();
88 for (
int i = 0; i < np; i++) {
89 flexibleParams_.append(
false);
98 AmIterTmplT::readMixingParameters(in);
101 const int nMonomer = system().mixture().nMonomer();
102 interaction_.setNMonomer(nMonomer);
109 template <
int D,
class T>
113 out <<
"Iterator times contributions:\n";
120 template <
int D,
class T>
124 interaction_.update(system().interaction());
132 template <
int D,
class T>
133 int AmIteratorBasis<D,T>::nElements()
135 const int nMonomer = system().mixture().nMonomer();
136 const int nBasis = system().domain().basis().nBasis();
138 int nEle = nMonomer*nBasis;
139 if (IteratorT::isFlexible_) {
140 nEle += IteratorT::nFlexibleParams();
148 template <
int D,
class T>
149 bool AmIteratorBasis<D,T>::hasInitialGuess()
150 {
return system().w().hasData(); }
155 template <
int D,
class T>
156 void AmIteratorBasis<D,T>::getCurrent(VectorT& state)
158 const int nMonomer = system().mixture().nMonomer();
159 const int nBasis = system().domain().basis().nBasis();
160 const int nEle = nElements();
165 for (
int i = 0; i < nMonomer; i++) {
168 for (
int k = 0; k < nBasis; k++) {
169 state[begin + k] = field[k];
174 if (IteratorT::isFlexible_) {
176 UnitCell<D> const & unitCell = system().domain().unitCell();
178 const int nParam = unitCell.nParameter();
179 begin = nMonomer*nBasis;
181 for (
int i = 0; i < nParam; i++) {
182 if (flexibleParams_[i]) {
183 state[begin + counter] = scaleStress_ * parameters[i];
187 UTIL_CHECK(counter == IteratorT::nFlexibleParams());
195 template <
int D,
class T>
196 void AmIteratorBasis<D,T>::evaluate()
197 { system().compute(IteratorT::isFlexible_); }
202 template <
int D,
class T>
203 void AmIteratorBasis<D,T>::getResidual(VectorT& resid)
205 const int nMonomer = system().mixture().nMonomer();
206 const int nBasis = system().domain().basis().nBasis();
207 const int n = nElements();
215 for (i = 0 ; i < n; ++i) {
220 for (i = 0; i < nMonomer; ++i) {
222 for (j = 0; j < nMonomer; ++j) {
223 chi = interaction_.chi(i,j);
224 p = interaction_.p(i,j);
227 if (system().h().hasData()) {
229 for (k = 0; k < nBasis; ++k) {
230 resid[begin + k] += chi*c[k] + p*(h[k] - w[k]);
233 for (k = 0; k < nBasis; ++k) {
234 resid[begin + k] += chi*c[k] - p*w[k];
241 double shift = -1.0 / interaction_.sumChiInverse();
242 if (system().mask().hasData()) {
244 for (i = 0; i < nMonomer; ++i) {
246 for (k = 0; k < nBasis; ++k) {
247 resid[begin + k] += shift*mask[k];
251 for (i = 0; i < nMonomer; ++i) {
252 resid[i*nBasis] += shift;
257 if (system().mixture().isCanonical()) {
258 for (i = 0; i < nMonomer; ++i) {
259 resid[i*nBasis] = 0.0;
264 if (IteratorT::isFlexible_) {
275 double coeff = -1.0 * scaleStress_;
276 const int nParam = system().domain().unitCell().nParameter();
277 begin = nMonomer*nBasis;
279 for (i = 0; i < nParam ; i++) {
280 if (flexibleParams_[i]) {
281 resid[begin + counter] = coeff * IteratorT::stress(i);
285 UTIL_CHECK(counter == IteratorT::nFlexibleParams());
293 template <
int D,
class T>
294 void AmIteratorBasis<D,T>::update(VectorT& newState)
297 const int nMonomer = system().mixture().nMonomer();
298 const int nBasis = system().domain().basis().nBasis();
303 for (
int i = 0; i < nMonomer; i++) {
309 for (
int i = 0; i < nMonomer; i++) {
311 for (
int k = 0; k < nBasis; k++) {
312 wFields[i][k] = newState[begin + k];
317 if (system().mixture().isCanonical()) {
320 for (
int i = 0; i < nMonomer; ++i) {
325 double chi, wAve, cAve;
326 for (
int i = 0; i < nMonomer; ++i) {
328 for (
int j = 0; j < nMonomer; ++j) {
329 chi = interaction_.chi(i,j);
330 cAve = system().c().basis(j)[0];
333 wFields[i][0] = wAve;
337 if (system().h().hasData()) {
338 for (
int i = 0; i < nMonomer; ++i) {
339 wFields[i][0] += system().h().basis(i)[0];
345 system().w().setBasis(wFields);
348 if (IteratorT::isFlexible_) {
352 parameters = system().domain().unitCell().parameters();
355 const int nParam = system().domain().unitCell().nParameter();
356 const int begin = nMonomer*nBasis;
357 const double scale = 1.0 / scaleStress_;
359 for (
int i = 0; i < nParam; i++) {
360 if (flexibleParams_[i]) {
361 parameters[i] = scale * newState[begin + counter];
365 UTIL_CHECK(counter == IteratorT::nFlexibleParams());
368 system().setUnitCell(parameters);
375 template <
int D,
class T>
376 void AmIteratorBasis<D,T>::outputToLog()
378 if (IteratorT::isFlexible_ && AmIterTmplT::verbose() > 1) {
380 UnitCell<D> const & unitCell = system().domain().unitCell();
382 const int nMonomer = system().mixture().nMonomer();
383 const int nBasis = system().domain().basis().nBasis();
384 const int begin = nMonomer*nBasis;
388 for (
int i = 0; i < nParam; i++) {
389 if (flexibleParams_[i]) {
390 res = AmIterTmplT::residual()[begin + counter];
391 str = -1.0 * res / scaleStress_;
393 <<
" Cell Param " << i <<
" = "
394 <<
Dbl(unitCell.parameters()[i], 15)