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" 53 #include "Teuchos_ScalarTraits.hpp" 54 #include "Teuchos_CommHelpers.hpp" 62 comm = p.get< Teuchos::RCP<const Teuchos::Comm<int> > >(
"Comm");
64 global_data = p.get<Teuchos::RCP<panzer::GlobalData> >(
"Global Data");
69 std::string names_string = p.get<std::string>(
"Names");
70 std::vector<std::string> names;
73 Teuchos::RCP<panzer::IntegrationRule> ir = p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR");
76 for (
typename std::vector<std::string>::const_iterator name = names.begin(); name != names.end(); ++name)
77 field_values.push_back(PHX::MDField<ScalarT,Cell,IP>(*name, ir->dl_scalar));
79 Teuchos::RCP<PHX::MDALayout<Cell> > cell_dl = Teuchos::rcp(
new PHX::MDALayout<Cell>(ir->dl_scalar->dimension(0)));
80 volumes = PHX::MDField<ScalarT,Cell>(
"Cell Volumes",cell_dl);
82 tmp = PHX::MDField<ScalarT,Cell>(
"GlobalStatistics:tmp:"+names_string,cell_dl);
83 ones = PHX::MDField<ScalarT,Cell,IP>(
"GlobalStatistics:ones:"+names_string,ir->dl_scalar);
85 this->addEvaluatedField(
volumes);
86 this->addEvaluatedField(
tmp);
87 this->addEvaluatedField(
ones);
90 this->addDependentField(*
field);
102 std::string n =
"GlobalStatistics: " + names_string;
109 this->utils.setFieldData(
volumes,fm);
110 this->utils.setFieldData(
tmp,fm);
111 this->utils.setFieldData(
ones,fm);
115 this->utils.setFieldData(*
field,fm);
119 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type cell = 0; cell <
ones.dimension(0); ++cell)
120 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type ip = 0; ip <
ones.dimension(1); ++ip)
127 if (workset.num_cells == 0)
130 Intrepid2::FunctionSpaceTools::integrate<ScalarT>(
volumes,
ones,
131 (this->wda(workset).int_rules[
ir_index])->weighted_measure,
132 Intrepid2::COMP_CPP);
134 for (index_t cell = 0; cell < workset.num_cells; ++cell)
137 typename std::vector<PHX::MDField<ScalarT,Cell,IP> >::size_type field_index = 0;
141 Intrepid2::FunctionSpaceTools::integrate<ScalarT>(
tmp, *
field,
142 (this->wda(workset).int_rules[
ir_index])->weighted_measure,
143 Intrepid2::COMP_CPP);
145 for (index_t cell = 0; cell < workset.num_cells; ++cell) {
148 for (
typename PHX::MDField<ScalarT,Cell,IP>::size_type ip = 0; ip < (
field->dimension(1)); ++ip) {
149 maxs[field_index] = std::max( (*
field)(cell,ip),
maxs[field_index]);
150 mins[field_index] = std::min( (*
field)(cell,ip),
mins[field_index]);
163 *
field = Teuchos::ScalarTraits<ScalarT>::zero();
166 *
field = Teuchos::ScalarTraits<ScalarT>::rmin();
169 *
field = Teuchos::ScalarTraits<ScalarT>::rmax();
179 template<
typename EvalT,
typename TRAITS>
183 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"SHOULD NEVER BE CALLED!");
195 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i)
198 if (
comm->getRank() == 0) {
202 std::size_t precision = 8;
203 os << std::scientific << std::showpoint << std::setprecision(precision) << std::left;
205 std::size_t name_width = 0;
206 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i)
207 name_width = std::max(name_width,
field_values[i].fieldTag().name().size());
209 std::size_t value_width = precision + 7;
211 os << std::setw(name_width) <<
"Field" 212 <<
" " << std::setw(value_width) <<
"Average" 213 <<
" " << std::setw(value_width) <<
"Maximum (@IP)" 214 <<
" " << std::setw(value_width) <<
"Minimum (@IP)" 217 for (std::vector<ScalarT>::size_type i = 0; i <
field_values.size(); ++i) {
218 os << std::setw(name_width) <<
field_values[i].fieldTag().name()
221 <<
" " << std::setw(value_width) <<
global_mins[i] << std::endl;
229 template<
typename EvalT,
typename TRAITS>
232 return tmp.fieldTag();
PHX::MDField< ScalarT, Cell, IP > ones
std::vector< ScalarT > averages
PHX::MDField< ScalarT, Cell > tmp
std::vector< PHX::MDField< ScalarT, Cell, IP > > field_values
std::vector< ScalarT > mins
PHX::MDField< ScalarT, Cell > volumes
std::vector< ScalarT > global_averages
PHX::MDField< ScalarT > vector
Teuchos::RCP< panzer::GlobalData > global_data
PHX_PRE_EVALUATE_FIELDS(GlobalStatistics, data)
std::vector< ScalarT > global_mins
ScalarT global_total_volume
PHX_EVALUATOR_CTOR(BasisValues_Evaluator, p)
PHX::MDField< const ScalarT, Cell, IP > field
PHX_POST_EVALUATE_FIELDS(GlobalStatistics, data)
PHX_EVALUATE_FIELDS(BasisValues_Evaluator, workset)
Teuchos::RCP< const Teuchos::Comm< int > > comm
std::vector< ScalarT > maxs
std::vector< std::string >::size_type getIntegrationRuleIndex(int ir_degree, panzer::Workset &workset, WorksetDetailsAccessor &wda)
const PHX::FieldTag & getRequiredFieldTag()
std::vector< ScalarT > global_maxs
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.
PHX_POST_REGISTRATION_SETUP(BasisValues_Evaluator, sd, fm)
void postprocess(std::ostream &os)