Page MenuHomec4science

compute_combine.cc
No OneTemporary

File Metadata

Created
Sun, Aug 4, 17:06

compute_combine.cc

/**
* @file compute_combine.cc
*
* @author Guillaume Anciaux <guillaume.anciaux@epfl.ch>
*
* @date Mon Oct 28 19:23:14 2013
*
* @brief This is a compute made from other computes and a provided operator
*
* @section LICENSE
*
* Copyright (©) 2010-2011 EPFL (Ecole Polytechnique Fédérale de Lausanne)
* Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
*
* LibMultiScale is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* LibMultiScale is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with LibMultiScale. If not, see <http://www.gnu.org/licenses/>.
*
*/
/* -------------------------------------------------------------------------- */
#include "lm_common.hh"
#include "lib_md.hh"
#include "lib_dd.hh"
#include "lib_continuum.hh"
#include "compute_combine.hh"
#include "factory_multiscale.hh"
#include "math_tools.hh"
/* -------------------------------------------------------------------------- */
__BEGIN_LIBMULTISCALE__
template <typename Cont>
void ComputeCombine<Cont>::build(Cont & cont){
const UInt Dim = cont.getDim();
this->empty();
this->name_computed.clear();
for (UInt i = 0; i < list_columns.size(); ++i) {
if (list_columns[i] >= Dim) {
DUMP("wrong column number " << list_columns[i]
<< " columns can range from 0 to " << Dim
<< " and are ",DBG_MESSAGE);
for (UInt k = 0; k < Dim; ++k)
DUMP("col(" << k << ") => " << cont.name_computed[k] << " ",DBG_MESSAGE);
LM_FATAL("exit");
}
}
switch (op){
case OP_MAX :
this->makeName<OP_MAX>(cont);
this->combine<MathTools::MaxOperator<Real> >(cont);break;
case OP_MIN :
this->makeName<OP_MIN>(cont);
this->combine<MathTools::MinOperator<Real> >(cont);break;
case OP_SUM :
this->makeName<OP_SUM>(cont);
this->combine<MathTools::SumOperator<Real> >(cont);break;
case OP_AVERAGE :
this->makeName<OP_AVERAGE>(cont);
this->combine<MathTools::AverageOperator<Real> >(cont);break;
default: LM_FATAL("Operator " << op << " not handled");
}
this->setDim(this->name_computed.size());
}
/* -------------------------------------------------------------------------- */
template <typename Cont>
template <typename Op>
void ComputeCombine<Cont>::combine(Cont & cont){
const UInt Dim = cont.getDim();
UInt nb_lines = cont.nbElem()/Dim;
UInt n_col = list_columns.size();
UInt * cols = &list_columns[0];
for (UInt i = 0; i < nb_lines; ++i) {
Op op;
op.init();
for (UInt j = 0; j < n_col; ++j) {
UInt col = cols[j];
op.account(cont[i*Dim+col]);
}
this->add(op.result());
}
}
/* -------------------------------------------------------------------------- */
template <typename Cont>
template <Operator op>
void ComputeCombine<Cont>::makeName(Cont & cont){
if (this->name_col != ""){
this->name_computed.push_back(name_col);
return;
}
UInt n_col = list_columns.size();
UInt * cols = &list_columns[0];
std::stringstream sstr_name_col;
sstr_name_col << op << "(";
for (UInt i = 0; i < n_col; ++i) {
sstr_name_col << cont.name_computed[cols[i]];
if (i < n_col -1) sstr_name_col << ",";
}
sstr_name_col << ")";
this->name_computed.push_back(sstr_name_col.str());
}
/* -------------------------------------------------------------------------- */
/* LMDESC COMBINE
This computes makes a compute providing a single column
as the result of an operator applied to a sequence of columns
from the input.
*/
/* LMEXAMPLE COMPUTE combine COMBINE INPUT ekin OPERATOR SUM COL 1 COL 2 */
template <typename _Input>
inline void ComputeCombine<_Input>::declareParams(){
/* LMKEYWORD OPERATOR
Provides an operator to be used when combining the columns
*/
this->parseKeyword("OPERATOR",op);
/* LMKEYWORD COL
provides the columns that are to be combined by the operator
*/
this->parseKeyword("COL",list_columns);
/* LMKEYWORD NAME
provides the columns name that is going to be computed
The default is a constructed information of the compute
*/
this->parseKeyword("NAME",name_col,"");
};
/* -------------------------------------------------------------------------- */
DECLARE_COMPUTE_REAL(ComputeCombine);
__END_LIBMULTISCALE__

Event Timeline