92 void update(
const Scalar t, Scalar& dt, TransportSolutionType& updateVec)
94 if (iterFlag_ == noIter)
97 problem_.pressureModel().update();
100 problem_.transportModel().update(t, dt, updateVec,
true);
104 else if (iterFlag_ == iterToNumIter || iterFlag_ == iterToConverged)
106 bool converg =
false;
111 TransportSolutionType transValueOldIter;
112 problem_.transportModel().getTransportedQuantity(transValueOldIter);
113 TransportSolutionType updateOldIter(transValueOldIter);
115 TransportSolutionType transportedQuantity(transValueOldIter);
116 TransportSolutionType updateHelp(transValueOldIter);
117 TransportSolutionType updateDiff(transValueOldIter);
124 problem_.pressureModel().update();
127 problem_.transportModel().update(t, dt, updateVec,
true);
129 updateHelp = updateVec;
130 problem_.transportModel().getTransportedQuantity(transportedQuantity);
131 transportedQuantity += (updateHelp *= (dt * cFLFactor_));
132 transportedQuantity *= omega_;
133 transValueOldIter *= (1 - omega_);
134 transportedQuantity += transValueOldIter;
135 updateDiff = updateVec;
136 updateDiff -= updateOldIter;
137 transValueOldIter = transportedQuantity;
138 updateOldIter = updateVec;
139 Dune::dinfo <<
" defect = " << dt * updateDiff.two_norm() / transportedQuantity.two_norm();
141 if (iterFlag_ == iterToConverged && dt * updateDiff.two_norm() / transportedQuantity.two_norm() <= maxDefect_)
145 else if (iterFlag_ == iterToNumIter && iter > nIter_)
150 if (iterFlag_ == iterToConverged && transportedQuantity.infinity_norm() > (1 + maxDefect_))
154 if (!converg && iter > nIter_)
157 std::cout <<
"Nonlinear loop in IMPET.update exceeded nIter = " << nIter_ <<
" iterations."
159 std::cout << transportedQuantity.infinity_norm() << std::endl;
163 if (iterFlag_ == iterToConverged)
164 std::cout <<
"Iteration steps: " << iterTot << std::endl;
165 std::cout.setf(std::ios::scientific, std::ios::floatfield);
171 DUNE_THROW(Dune::NotImplemented,
"IMPET: Iterationtype not implemented!");
178 problem_.pressureModel().updateVelocity();
180 problem_.transportModel().update(t, dt, updateVec,
true);