11#ifndef PANZER_GLOBAL_STATISTICS_IMPL_HPP
12#define PANZER_GLOBAL_STATISTICS_IMPL_HPP
14#include "Intrepid2_FunctionSpaceTools.hpp"
20#include "Phalanx_DataLayout_MDALayout.hpp"
21#include "Teuchos_ScalarTraits.hpp"
22#include "Teuchos_CommHelpers.hpp"
28template<
typename EvalT,
typename Traits>
31 const Teuchos::ParameterList& p)
33 comm = p.get< Teuchos::RCP<const Teuchos::Comm<int> > >(
"Comm");
35 global_data = p.get<Teuchos::RCP<panzer::GlobalData> >(
"Global Data");
40 std::string names_string = p.get<std::string>(
"Names");
41 std::vector<std::string> names;
44 Teuchos::RCP<panzer::IntegrationRule> ir = p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR");
47 for (
typename std::vector<std::string>::const_iterator name = names.begin(); name != names.end(); ++name)
48 field_values.push_back(PHX::MDField<const ScalarT,Cell,IP>(*name, ir->dl_scalar));
50 Teuchos::RCP<PHX::MDALayout<Cell> > cell_dl = Teuchos::rcp(
new PHX::MDALayout<Cell>(ir->dl_scalar->extent(0)));
51 volumes = PHX::MDField<ScalarT,Cell>(
"Cell Volumes",cell_dl);
53 tmp = PHX::MDField<ScalarT,Cell>(
"GlobalStatistics:tmp:"+names_string,cell_dl);
54 ones = PHX::MDField<ScalarT,Cell,IP>(
"GlobalStatistics:ones:"+names_string,ir->dl_scalar);
56 this->addEvaluatedField(
volumes);
57 this->addEvaluatedField(
tmp);
58 this->addEvaluatedField(
ones);
59 for (
typename std::vector<PHX::MDField<const ScalarT,Cell,IP> >::const_iterator field =
field_values.begin();
61 this->addDependentField(*field);
73 std::string n =
"GlobalStatistics: " + names_string;
78template<
typename EvalT,
typename Traits>
86 auto l_ones =
ones.get_static_view();
87 Kokkos::parallel_for(
"GlobalStatistics", l_ones.extent(0), KOKKOS_LAMBDA(
int cell) {
88 for (std::size_t ip = 0; ip < l_ones.extent(1); ++ip)
89 l_ones(cell,ip) = 1.0;
94template<
typename EvalT,
typename Traits>
103 Intrepid2::FunctionSpaceTools<PHX::Device>::integrate(
volumes.get_view(),
105 (this->wda(workset).int_rules[
ir_index])->weighted_measure.get_view());
106 auto volumes_h = Kokkos::create_mirror_view(as_view(
volumes));
107 Kokkos::deep_copy(volumes_h, as_view(
volumes));
109 for (index_t cell = 0; cell < workset.
num_cells; ++cell)
112 typename std::vector<PHX::MDField<ScalarT,Cell,IP> >
::size_type field_index = 0;
113 for (
typename std::vector<PHX::MDField<const ScalarT,Cell,IP> >::iterator field =
field_values.begin();
116 Intrepid2::FunctionSpaceTools<PHX::Device>::integrate(
tmp.get_view(),
118 (this->wda(workset).int_rules[
ir_index])->weighted_measure.get_view());
119 auto tmp_h = Kokkos::create_mirror_view(
tmp.get_static_view());
120 auto field_h = Kokkos::create_mirror_view( field->get_static_view());
121 Kokkos::deep_copy(tmp_h,
tmp.get_static_view());
122 Kokkos::deep_copy(field_h, field->get_static_view());
125 for (index_t cell = 0; cell < workset.
num_cells; ++cell) {
126 averages[field_index] += tmp_h(cell);
128 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type ip = 0; ip < (field->extent(1)); ++ip) {
129 maxs[field_index] = std::max( field_h(cell,ip),
maxs[field_index]);
130 mins[field_index] = std::min( field_h(cell,ip),
mins[field_index]);
138template<
typename EvalT,
typename Traits>
146 for (
typename std::vector<ScalarT>::iterator field =
averages.begin(); field !=
averages.end(); ++field)
147 *field = Teuchos::ScalarTraits<ScalarT>::zero();
149 for (
typename std::vector<ScalarT>::iterator field =
maxs.begin(); field !=
maxs.end(); ++field)
150 *field = Teuchos::ScalarTraits<ScalarT>::rmin();
152 for (
typename std::vector<ScalarT>::iterator field =
mins.begin(); field !=
mins.end(); ++field)
153 *field = Teuchos::ScalarTraits<ScalarT>::rmax();
157template<
typename EvalT,
typename Traits>
167template<
typename EvalT,
typename TRAITS>
171 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"SHOULD NEVER BE CALLED!");
183 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i)
186 if (
comm->getRank() == 0) {
190 std::size_t precision = 8;
191 os << std::scientific << std::showpoint << std::setprecision(precision) << std::left;
193 std::size_t name_width = 0;
194 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i)
195 name_width = std::max(name_width,
field_values[i].fieldTag().name().size());
197 std::size_t value_width = precision + 7;
199 os << std::setw(name_width) <<
"Field"
200 <<
" " << std::setw(value_width) <<
"Average"
201 <<
" " << std::setw(value_width) <<
"Maximum (@IP)"
202 <<
" " << std::setw(value_width) <<
"Minimum (@IP)"
205 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i) {
206 os << std::setw(name_width) <<
field_values[i].fieldTag().name()
209 <<
" " << std::setw(value_width) <<
global_mins[i] << std::endl;
217template<
typename EvalT,
typename TRAITS>
220 return tmp.fieldTag();
std::vector< ScalarT > maxs
std::vector< ScalarT > mins
GlobalStatistics(const Teuchos::ParameterList &p)
void postprocess(std::ostream &os)
std::vector< PHX::MDField< const ScalarT, Cell, IP > > field_values
void postEvaluate(typename Traits::PostEvalData d)
PHX::MDField< ScalarT, Cell, IP > ones
PHX::MDField< ScalarT, Cell > tmp
Teuchos::RCP< const Teuchos::Comm< int > > comm
std::vector< ScalarT > global_mins
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
Teuchos::RCP< panzer::GlobalData > global_data
ScalarT global_total_volume
std::vector< ScalarT > global_averages
PHX::MDField< ScalarT, Cell > volumes
std::vector< ScalarT > global_maxs
std::vector< ScalarT > averages
const PHX::FieldTag & getRequiredFieldTag()
void preEvaluate(typename Traits::PreEvalData d)
void evaluateFields(typename Traits::EvalData d)
int num_cells
DEPRECATED - use: numCells().
basic_ios_all_saver< char > ios_all_saver
basic_ios_all_saver for narrow-character streams.
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.
std::vector< int >::size_type getIntegrationRuleIndex(int ir_degree, const panzer::Workset &workset, WorksetDetailsAccessor &wda)
Teuchos::RCP< const std::vector< panzer::Workset > > worksets_
All worksets that will be evaluated over the lifetime of this evaluator.
const PED & PreEvalData
Data type passed to PHX::Evaluator::preEvaluate().
void * PostEvalData
Data type passed to PHX::Evaluator::postEvaluate(), called once after each residual/Jacobian fill....
const panzer::Workset & EvalData
Data type passed to PHX::Evaluator::evaluateFields(): a single workset holding the cell data for one ...
const SD & SetupData
Data type passed to PHX::Evaluator::postRegistrationSetup().