forked from gahansen/Albany
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlbany_StatelessObserverImpl.cpp
133 lines (120 loc) · 5.68 KB
/
Albany_StatelessObserverImpl.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//*****************************************************************//
// Albany 3.0: Copyright 2016 Sandia Corporation //
// This Software is released under the BSD license detailed //
// in the file "license.txt" in the top-level Albany directory //
//*****************************************************************//
#include "Albany_StatelessObserverImpl.hpp"
#include "Albany_AbstractDiscretization.hpp"
#include "Teuchos_TimeMonitor.hpp"
#include <string>
namespace Albany {
StatelessObserverImpl::
StatelessObserverImpl (const Teuchos::RCP<Application> &app)
: app_(app),
solOutTime_(Teuchos::TimeMonitor::getNewTimer("Albany: Observe Solution"))
{
force_write_solution_ = app->getForceWriteSolution();
}
RealType StatelessObserverImpl::
getTimeParamValueOrDefault (RealType defaultValue) const {
const std::string label("Time");
bool const
use_time_param = (app_->getParamLib()->isParameter(label) == true) &&
(app_->getSolutionMethod() != Transient);
double const
this_time = use_time_param == true ?
app_->getParamLib()->getRealValue<PHAL::AlbanyTraits::Residual>(label) :
defaultValue;
return this_time;
}
Teuchos::RCP<const Thyra_VectorSpace>
StatelessObserverImpl::getNonOverlappedVectorSpace () const {
return app_->getVectorSpace();
}
void StatelessObserverImpl::observeSolution (
double stamp,
const Thyra_Vector &nonOverlappedSolution,
const Teuchos::Ptr<const Thyra_MultiVector> &nonOverlappedSolution_dxdp,
const Teuchos::Ptr<const Thyra_Vector>& nonOverlappedSolutionDot)
{
Teuchos::TimeMonitor timer(*solOutTime_);
const Teuchos::RCP<const Thyra_Vector> overlappedSolution =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolution(nonOverlappedSolution);
Teuchos::RCP<Thyra_MultiVector> overlappedSolutionDxDp = Teuchos::null;
if (nonOverlappedSolution_dxdp != Teuchos::null) {
overlappedSolutionDxDp = app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDxDp(*nonOverlappedSolution_dxdp);
/*auto out_ = Teuchos::VerboseObjectBase::getDefaultOStream();
int num_param = overlappedSolutionDxDp->domain()->dim();
for (int np = 0; np < num_param; np++) {
*out_ << "\n*** StatelessObserverImpl::observeSolution overlappedSolutionDxDp" << np << " ***\n";
Teuchos::RCP<const Thyra::VectorBase<double>> solution_dxdp_np = overlappedSolutionDxDp->col(np);
Teuchos::Range1D range;
RTOpPack::ConstSubVectorView<double> dxdpv;
solution_dxdp_np->acquireDetachedView(range, &dxdpv);
auto dxdpa = dxdpv.values();
for (auto i = 0; i < dxdpa.size(); ++i) *out_ << dxdpa[i] << " ";
*out_ << "\n*** StatelessObserverImpl::observeSolution overlappedSolutionDxDp" << np << " ***\n";
}*/
}
if (nonOverlappedSolutionDot != Teuchos::null) {
const Teuchos::RCP<const Thyra_Vector> overlappedSolutionDot =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDot(*nonOverlappedSolutionDot);
app_->getDiscretization()->writeSolution(
*overlappedSolution, overlappedSolutionDxDp, *overlappedSolutionDot, stamp, true,
force_write_solution_);
}
else {
app_->getDiscretization()->writeSolution(*overlappedSolution, overlappedSolutionDxDp,
stamp, true, force_write_solution_);
}
}
void StatelessObserverImpl::observeSolution (
double stamp,
const Thyra_Vector &nonOverlappedSolution,
const Teuchos::Ptr<const Thyra_MultiVector> &nonOverlappedSolution_dxdp,
const Teuchos::Ptr<const Thyra_Vector>& nonOverlappedSolutionDot,
const Teuchos::Ptr<const Thyra_Vector>& nonOverlappedSolutionDotDot)
{
Teuchos::TimeMonitor timer(*solOutTime_);
const Teuchos::RCP<const Thyra_Vector> overlappedSolution =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolution(nonOverlappedSolution);
Teuchos::RCP<Thyra_MultiVector> overlappedSolutionDxDp = Teuchos::null;
if (nonOverlappedSolution_dxdp != Teuchos::null) {
overlappedSolutionDxDp = app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDxDp(*nonOverlappedSolution_dxdp);
}
if (nonOverlappedSolutionDot != Teuchos::null) {
const Teuchos::RCP<const Thyra_Vector> overlappedSolutionDot =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDot(*nonOverlappedSolutionDot);
if (nonOverlappedSolutionDotDot != Teuchos::null) {
const Teuchos::RCP<const Thyra_Vector> overlappedSolutionDotDot =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDotDot(*nonOverlappedSolutionDotDot);
app_->getDiscretization()->writeSolution(
*overlappedSolution, overlappedSolutionDxDp, *overlappedSolutionDot, *overlappedSolutionDotDot,
stamp, true, force_write_solution_);
}
else {
app_->getDiscretization()->writeSolution(
*overlappedSolution, overlappedSolutionDxDp, *overlappedSolutionDot,
stamp, true, force_write_solution_);
}
}
else {
app_->getDiscretization()->writeSolution(
*overlappedSolution, overlappedSolutionDxDp, stamp, true, force_write_solution_);
}
}
void StatelessObserverImpl::observeSolution (
double stamp, const Thyra_MultiVector &nonOverlappedSolution,
const Teuchos::Ptr<const Thyra_MultiVector> &nonOverlappedSolution_dxdp)
{
Teuchos::TimeMonitor timer(*solOutTime_);
const Teuchos::RCP<const Thyra_MultiVector> overlappedSolution =
app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionMV(nonOverlappedSolution);
Teuchos::RCP<Thyra_MultiVector> overlappedSolutionDxDp = Teuchos::null;
if (nonOverlappedSolution_dxdp != Teuchos::null) {
overlappedSolutionDxDp = app_->getAdaptSolMgr()->updateAndReturnOverlapSolutionDxDp(*nonOverlappedSolution_dxdp);
}
app_->getDiscretization()->writeSolutionMV(*overlappedSolution, overlappedSolutionDxDp,
stamp, true, force_write_solution_);
}
} // namespace Albany