43 #ifndef PANZER_GLOBAL_STATISTICS_IMPL_HPP
44 #define PANZER_GLOBAL_STATISTICS_IMPL_HPP
46 #include "Intrepid2_FunctionSpaceTools.hpp"
52 #include "Phalanx_DataLayout_MDALayout.hpp"
54 #include "Teuchos_CommHelpers.hpp"
60 template<
typename EvalT,
typename Traits>
72 std::string names_string = p.
get<std::string>(
"Names");
73 std::vector<std::string> names;
79 for (
typename std::vector<std::string>::const_iterator name = names.begin(); name != names.end(); ++name)
80 field_values.push_back(PHX::MDField<const ScalarT,Cell,IP>(*name, ir->
dl_scalar));
83 volumes = PHX::MDField<ScalarT,Cell>(
"Cell Volumes",cell_dl);
85 tmp = PHX::MDField<ScalarT,Cell>(
"GlobalStatistics:tmp:"+names_string,cell_dl);
86 ones = PHX::MDField<ScalarT,Cell,IP>(
"GlobalStatistics:ones:"+names_string,ir->
dl_scalar);
88 this->addEvaluatedField(volumes);
89 this->addEvaluatedField(tmp);
90 this->addEvaluatedField(ones);
91 for (
typename std::vector<PHX::MDField<const ScalarT,Cell,IP> >::const_iterator
field = field_values.begin();
93 this->addDependentField(*
field);
96 averages.resize(field_values.size());
97 maxs.resize(field_values.size());
98 mins.resize(field_values.size());
99 global_maxs.resize(field_values.size());
100 global_mins.resize(field_values.size());
101 global_averages.resize(field_values.size());
105 std::string n =
"GlobalStatistics: " + names_string;
110 template<
typename EvalT,
typename Traits>
118 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type cell = 0; cell < ones.extent(0); ++cell)
119 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type ip = 0; ip < ones.extent(1); ++ip)
124 template<
typename EvalT,
typename Traits>
133 Intrepid2::FunctionSpaceTools<PHX::Device::execution_space>::integrate(volumes.get_view(),
135 (this->wda(workset).int_rules[ir_index])->weighted_measure.get_view());
137 for (index_t cell = 0; cell < workset.
num_cells; ++cell)
138 total_volume += volumes(cell);
140 typename std::vector<PHX::MDField<ScalarT,Cell,IP> >::size_type field_index = 0;
141 for (
typename std::vector<PHX::MDField<const ScalarT,Cell,IP> >::iterator
field = field_values.begin();
142 field != field_values.end(); ++
field,++field_index) {
144 Intrepid2::FunctionSpaceTools<PHX::Device::execution_space>::integrate(tmp.get_view(),
146 (this->wda(workset).int_rules[ir_index])->weighted_measure.get_view());
148 for (index_t cell = 0; cell < workset.
num_cells; ++cell) {
149 averages[field_index] += tmp(cell);
151 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type ip = 0; ip < (
field->extent(1)); ++ip) {
152 maxs[field_index] = std::max( (*
field)(cell,ip), maxs[field_index]);
153 mins[field_index] = std::min( (*
field)(cell,ip), mins[field_index]);
161 template<
typename EvalT,
typename Traits>
169 for (
typename std::vector<ScalarT>::iterator
field = averages.begin();
field != averages.end(); ++
field)
172 for (
typename std::vector<ScalarT>::iterator
field = maxs.begin();
field != maxs.end(); ++
field)
175 for (
typename std::vector<ScalarT>::iterator
field = mins.begin();
field != mins.end(); ++
field)
180 template<
typename EvalT,
typename Traits>
186 this->postprocess(*(global_data->os));
190 template<
typename EvalT,
typename TRAITS>
201 Teuchos::reduceAll(*comm,
Teuchos::REDUCE_SUM, static_cast<int>(1), &total_volume, &global_total_volume);
202 Teuchos::reduceAll(*comm,
Teuchos::REDUCE_SUM, static_cast<int>(averages.size()), &averages[0], &global_averages[0]);
203 Teuchos::reduceAll(*comm,
Teuchos::REDUCE_MAX, static_cast<int>(maxs.size()), &maxs[0], &global_maxs[0]);
204 Teuchos::reduceAll(*comm,
Teuchos::REDUCE_MIN, static_cast<int>(mins.size()), &mins[0], &global_mins[0]);
206 for (std::vector<ScalarT>::size_type i = 0; i < field_values.size(); ++i)
207 global_averages[i] /= global_total_volume;
209 if (comm->getRank() == 0) {
213 std::size_t precision = 8;
214 os << std::scientific << std::showpoint << std::setprecision(precision) << std::left;
216 std::size_t name_width = 0;
217 for (std::vector<ScalarT>::size_type i = 0; i < field_values.size(); ++i)
218 name_width = std::max(name_width,field_values[i].fieldTag().name().size());
220 std::size_t value_width = precision + 7;
222 os << std::setw(name_width) <<
"Field"
223 <<
" " << std::setw(value_width) <<
"Average"
224 <<
" " << std::setw(value_width) <<
"Maximum (@IP)"
225 <<
" " << std::setw(value_width) <<
"Minimum (@IP)"
228 for (std::vector<ScalarT>::size_type i = 0; i < field_values.size(); ++i) {
229 os << std::setw(name_width) << field_values[i].fieldTag().name()
230 <<
" " << std::setw(value_width) << global_averages[i]
231 <<
" " << std::setw(value_width) << global_maxs[i]
232 <<
" " << std::setw(value_width) << global_mins[i] << std::endl;
240 template<
typename EvalT,
typename TRAITS>
243 return tmp.fieldTag();
const PHX::FieldTag & getRequiredFieldTag()
void evaluateFields(typename Traits::EvalData d)
void postprocess(std::ostream &os)
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::vector< std::string >::size_type getIntegrationRuleIndex(int ir_degree, const panzer::Workset &workset, WorksetDetailsAccessor &wda)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
GlobalStatistics(const Teuchos::ParameterList &p)
Teuchos::RCP< PHX::DataLayout > dl_scalar
Data layout for scalar fields.
void preEvaluate(typename Traits::PreEvalData d)
void postEvaluate(typename Traits::PostEvalData d)
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
PHX::MDField< ScalarT, panzer::Cell, panzer::BASIS > field
A field to which we'll contribute, or in which we'll store, the result of computing this integral...
void StringTokenizer(std::vector< std::string > &tokens, const std::string &str, const std::string delimiters, bool trim)
Tokenize a string, put tokens in a vector.
Teuchos::RCP< const std::vector< panzer::Workset > > worksets_