ProblemInstat.cc 5.9 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
#include "ProblemInstat.h"
#include "FileWriter.h"
#include "AdaptStationary.h"
#include "AdaptInstationary.h"
#include "Estimator.h"
#include "ProblemScal.h"
#include "StandardProblemIteration.h"

namespace AMDiS {

  ProblemInstat::~ProblemInstat()
12
  {}
13
14
15
16

  void ProblemInstat::initialize(Flag initFlag,
				 ProblemInstat *adoptProblem/* = NULL*/,
				 Flag adoptFlag /* = INIT_NOTHING*/) 
17
  {}
18
19
20
21

  void ProblemInstat::solveInitialProblem(AdaptInfo *adaptInfo)
  {
    AdaptStationary initialAdapt((name + "->initial->adapt").c_str(),
Thomas Witkowski's avatar
Thomas Witkowski committed
22
				 new StandardProblemIteration(initialProblem),
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
				 adaptInfo);

    initialAdapt.adapt();
  }

  void ProblemInstatScal::transferInitialSolution(AdaptInfo *adaptInfo)
  {
    TEST_EXIT(adaptInfo->getTime() == 
	      adaptInfo->getStartTime())
      ("after initial solution: time != start time\n");
    problemStat->writeFiles(adaptInfo, true);
  }

  void ProblemInstatVec::transferInitialSolution(AdaptInfo *adaptInfo)
  {
    TEST_EXIT(adaptInfo->getTime() == 
	      adaptInfo->getStartTime())
      ("after initial solution: time != start time\n");
    problemStat->writeFiles(adaptInfo, true);
  }


45
  ProblemInstatScal::ProblemInstatScal(std::string name_, 
46
				       ProblemScal *prob, ProblemStatBase *initialProb)
47
    : ProblemInstat(name_, initialProb), 
48
49
      problemStat(prob),
      oldSolution(NULL)
50
  {}
51

52
  ProblemInstatScal::ProblemInstatScal(std::string name_, ProblemScal& prob)
53
54
55
56
57
58
    : ProblemInstat(name_, NULL), 
      problemStat(&prob),
      oldSolution(NULL)
  {}

  ProblemInstatScal::ProblemInstatScal(std::string name_, 
59
				       ProblemScal& prob, ProblemStatBase& initialProb)
60
61
62
63
    : ProblemInstat(name_, &initialProb), 
      problemStat(&prob),
      oldSolution(NULL)
  {}
64
65
66

  ProblemInstatScal::~ProblemInstatScal()
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
67
    delete oldSolution;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  }

  void ProblemInstatScal::initialize(Flag initFlag,
				     ProblemInstat *adoptProblem/* = NULL*/,
				     Flag adoptFlag /* = INIT_NOTHING*/) 
  {
    FUNCNAME("ProblemInstat::initialize()");
  
    ProblemInstat::initialize(initFlag, adoptProblem, adoptFlag);

    // === create vector for old solution ===
    if (oldSolution) {
      WARNING("oldSolution already created\n");
    } else {
82
      if (initFlag.isSet(INIT_UH_OLD))
83
	createUhOld();
84
      
85
      if (adoptProblem && adoptFlag.isSet(INIT_UH_OLD)) {
86
87
88
89
	ProblemInstatScal* _adoptProblem 
	  = dynamic_cast<ProblemInstatScal*>(adoptProblem);
	TEST_EXIT(_adoptProblem)
	  ("can't adopt oldSolution from problem which is not instationary and scalar");
90
91
92
93
94
95
96
97
98
	TEST_EXIT(!oldSolution)("oldSolution already created");
	oldSolution = _adoptProblem->getOldSolution();
      }
    }

    if (!oldSolution) 
      WARNING("no oldSolution created\n");
  }

Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
99
100
  void ProblemInstatScal::createUhOld() 
  {
101
102
103
104
    if (oldSolution) {
      WARNING("oldSolution already created\n");
    } else {
      // create oldSolution
Thomas Witkowski's avatar
Thomas Witkowski committed
105
      oldSolution = new DOFVector<double>(problemStat->getFESpace(), name + "->uOld");
106
      oldSolution->setCoarsenOperation(COARSE_INTERPOL);
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
107
      if (problemStat->getEstimator())
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
	dynamic_cast<Estimator*>(problemStat->getEstimator())
	  ->addUhOldToSystem(0, oldSolution);
    }
  }


  void ProblemInstatScal::closeTimestep(AdaptInfo *adaptInfo) 
  {
    bool force = (adaptInfo->getTime() >= adaptInfo->getEndTime());
    problemStat->writeFiles(adaptInfo, force);
  }

  void ProblemInstatVec::closeTimestep(AdaptInfo *adaptInfo) 
  {
    bool force = (adaptInfo->getTime() >= adaptInfo->getEndTime());
    problemStat->writeFiles(adaptInfo, force);
  }

126
  ProblemInstatVec::ProblemInstatVec(std::string name_, 
127
				     ProblemVec *prob, ProblemStatBase *initialProb)
128
    : ProblemInstat(name_, initialProb), 
129
130
      problemStat(prob),
      oldSolution(NULL)
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
131
  {}
132

133
134
135
136
137
138
139
140
141
142
143
144
145
  ProblemInstatVec::ProblemInstatVec(std::string name_, ProblemVec &prob)
    : ProblemInstat(name_, NULL), 
      problemStat(&prob),
      oldSolution(NULL)
  {}

  ProblemInstatVec::ProblemInstatVec(std::string name_, 
				     ProblemVec &prob, ProblemStatBase &initialProb)
    : ProblemInstat(name_, &initialProb), 
      problemStat(&prob),
      oldSolution(NULL)
  {}

146
147
  ProblemInstatVec::~ProblemInstatVec()
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
148
    delete oldSolution;
149
150
151
152
153
154
155
156
  }

  void ProblemInstatVec::initialize(Flag initFlag,
				    ProblemInstat *adoptProblem/* = NULL*/,
				    Flag adoptFlag /* = INIT_NOTHING*/) 
  {
    FUNCNAME("ProblemInstatVec::initialize()");
  
157
    ProblemInstat::initialize(initFlag, adoptProblem, adoptFlag);
158
159

    // === create vector for old solution ===
Thomas Witkowski's avatar
Thomas Witkowski committed
160
    if (oldSolution) {
161
162
      WARNING("oldSolution already created\n");
    } else {
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
163
      if (initFlag.isSet(INIT_UH_OLD))
164
	createUhOld();
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
165

Thomas Witkowski's avatar
Thomas Witkowski committed
166
167
      if (adoptProblem && adoptFlag.isSet(INIT_UH_OLD)) {
	ProblemInstatVec* _adoptProblem = dynamic_cast<ProblemInstatVec*>(adoptProblem);
168
169
	TEST_EXIT(_adoptProblem)
	  ("can't adopt oldSolution from problem which is not instationary and vectorial");
170
171
172
173
174
	TEST_EXIT(!oldSolution)("oldSolution already created");
	oldSolution = _adoptProblem->getOldSolution();
      }
    }

175
176
    if (!oldSolution) 
      WARNING("no oldSolution created\n");
177
178
  }

Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
179
180
  void ProblemInstatVec::createUhOld() 
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
181
182
183
    if (oldSolution) {
      WARNING("oldSolution already created\n");
    } else {
184
185
      int size = problemStat->getNumComponents();
      // create oldSolution
Thomas Witkowski's avatar
Thomas Witkowski committed
186
      oldSolution = new SystemVector("old solution",
187
188
				     problemStat->getFESpaces(), 
				     size);
Thomas Witkowski's avatar
Thomas Witkowski committed
189
      for (int i = 0; i < size; i++) {
Thomas Witkowski's avatar
Thomas Witkowski committed
190
	oldSolution->setDOFVector(i, new DOFVector<double>(problemStat->getFESpace(i), 
191
192
193
							   name + "->uOld"));
	oldSolution->getDOFVector(i)->setCoarsenOperation(COARSE_INTERPOL);
      
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
194
195
196
	if (problemStat->getEstimator(i))
	  problemStat->getEstimator(i)->
	    addUhOldToSystem(i, oldSolution->getDOFVector(i));
197
198
199
200
      }
    }
  }

Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
201
202
  void ProblemInstatScal::initTimestep(AdaptInfo *adaptInfo) 
  {
203
204
205
    oldSolution->copy(*(problemStat->getSolution())); 
  }

Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
206
207
  void ProblemInstatVec::initTimestep(AdaptInfo *adaptInfo) 
  {
208
209
    oldSolution->copy(*(problemStat->getSolution())); 
  }
Thomas Witkowski's avatar
nix.    
Thomas Witkowski committed
210

211
}