Skip to content

Commit

Permalink
Panzer: update extreme value response for cuda
Browse files Browse the repository at this point in the history
  • Loading branch information
rppawlo committed Apr 16, 2024
1 parent af5c146 commit 8bbfbdc
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 21 deletions.
62 changes: 43 additions & 19 deletions packages/panzer/disc-fe/src/evaluators/Panzer_CellExtreme_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,26 +118,50 @@ void
CellExtreme<EvalT, Traits>::
evaluateFields(
typename Traits::EvalData workset)
{
for (index_t cell = 0; cell < workset.num_cells; ++cell) {

for (std::size_t qp = 0; qp < num_qp; ++qp) {
ScalarT current= multiplier * scalar(cell,qp);
for (typename std::vector<PHX::MDField<const ScalarT,Cell,IP> >::iterator field = field_multipliers.begin();
field != field_multipliers.end(); ++field)
current *= (*field)(cell,qp);

// take first quad point value
if(qp==0)
extreme(cell) = current;

// take largest value in the cell
if(use_max)
extreme(cell) = extreme(cell)<current ? current : extreme(cell);
else // use_min
extreme(cell) = extreme(cell)>current ? current : extreme(cell);
{
double mult = this->multiplier;
std::size_t num_pt = this->num_qp;
bool extreme_max = this->use_max;
auto scalar_view = scalar.get_view();
auto extreme_view = extreme.get_view();

// compute field weighted with multipliers
PHX::View<ScalarT**> mult_field("Multiplied Field", workset.num_cells, scalar.extent(1));

// initialize to scalar value
Kokkos::parallel_for("Initialize Muliplier Field", workset.num_cells, KOKKOS_LAMBDA( const int cell) {
for (std::size_t qp = 0; qp < num_pt; ++qp) {
mult_field(cell, qp) = mult * scalar_view(cell, qp);
}
});

// multiply by field values
for (std::size_t field_num = 0; field_num < field_multipliers.size(); ++field_num)
{
auto field = field_multipliers[field_num];
Kokkos::parallel_for("CellExtreme: Multiply Fields", workset.num_cells, KOKKOS_LAMBDA( const int cell) {
for (std::size_t qp = 0; qp < num_pt; ++qp) {
mult_field(cell, qp) *= field(cell, qp);
}
});
}
}

// take extreme over points in each cell
Kokkos::parallel_for ("CellExtreme", workset.num_cells, KOKKOS_LAMBDA( const int cell) {
for (std::size_t qp = 0; qp < num_pt; ++qp) {
auto current = mult_field(cell, qp);

// take first point
if (qp == 0)
extreme_view(cell) = current;

// take largest value in the cell
if(extreme_max)
extreme_view(cell) = extreme_view(cell)<current ? current : extreme_view(cell);
else // use_min
extreme_view(cell) = extreme_view(cell)>current ? current : extreme_view(cell);
}
});
}

//**********************************************************************
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,13 @@ template<typename EvalT, typename Traits>
void ResponseScatterEvaluator_ExtremeValue<EvalT,Traits>::
evaluateFields(typename Traits::EvalData d)
{
auto hostField = Kokkos::create_mirror_view(cellExtremeValue_.get_view());
Kokkos::deep_copy(hostField, cellExtremeValue_.get_view());
for(index_t i=0;i<d.num_cells;i++) {
if(useMax_)
responseObj_->value = (responseObj_->value < cellExtremeValue_(i)) ? cellExtremeValue_(i) : responseObj_->value;
responseObj_->value = (responseObj_->value < hostField(i)) ? hostField(i) : responseObj_->value;
else
responseObj_->value = (responseObj_->value > cellExtremeValue_(i)) ? cellExtremeValue_(i) : responseObj_->value;
responseObj_->value = (responseObj_->value > hostField(i)) ? hostField(i) : responseObj_->value;
}
}

Expand Down

0 comments on commit 8bbfbdc

Please sign in to comment.