00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "SundanceTransientStepProblem.hpp"
00032 #include "PlayaOut.hpp"
00033 #include "PlayaTabs.hpp"
00034
00035 namespace Sundance
00036 {
00037
00038 TransientStepProblem::TransientStepProblem(
00039 const NonlinearProblem& stepProb,
00040 const Expr& tPrev, const Expr& uPrev,
00041 const Expr& tNext, const Expr& uNext,
00042 const Expr& dt,
00043 int verbosity
00044 )
00045 : prob_(stepProb),
00046 tPrev_(tPrev),
00047 tNext_(tNext),
00048 uPrev_(uPrev),
00049 uNext_(uNext),
00050 dt_(dt),
00051 verb_(verbosity)
00052 {
00053 }
00054
00055 bool TransientStepProblem::step(
00056 double tCur, const Expr& uCur,
00057 double tNext, Expr uNext,
00058 const NonlinearSolver<double>& solver) const
00059 {
00060 Tabs tab;
00061
00062 PLAYA_MSG1(verb_, tab << "step from t=" << tCur << " to " << tNext);
00063 tPrev_.setParameterValue(tCur);
00064 tNext_.setParameterValue(tNext);
00065 dt_.setParameterValue(tNext-tCur);
00066
00067 PLAYA_MSG2(verb_, tab << "updating uPrev");
00068 updateDiscreteFunction(uCur, uPrev_);
00069
00070 PLAYA_MSG2(verb_, tab << "updating uNext");
00071 updateDiscreteFunction(uNext, uNext_);
00072
00073 PLAYA_MSG2(verb_, tab << "Solving NLP");
00074 SolverState<double> state = prob_.solve(solver);
00075
00076 PLAYA_MSG2(verb_, tab << "Updating solution");
00077 updateDiscreteFunction(uNext_, uNext);
00078
00079 return state.finalState() == SolveConverged;
00080 }
00081
00082 }