Added: Initialization of member nsd in the IntegrandBase constructor.

Changed: Using sprintf instead of stringstream, since that is used elsewhere.
Changed: IntegrandBase::getNoSpaceDim does not need to be virtual.
Changed: Static function Ierror removed.
This commit is contained in:
Knut Morten Okstad
2015-12-22 14:45:00 +01:00
parent 6667e329ba
commit ab874af5f6
2 changed files with 31 additions and 40 deletions

View File

@@ -19,21 +19,9 @@
#include "Field.h"
#include "Fields.h"
#include <cstring>
#include <sstream>
#include <cstdio>
/*!
\brief Convenience function writing error message for non-implemented methods.
*/
static bool Ierror (const char* name)
{
std::cerr <<" *** IntegrandBase::"<< name <<" not implemented."<< std::endl;
return false;
}
/*!
The default implementation returns an ElmMats object with one left-hand-side
matrix (unless we are doing a boundary integral) and one right-hand-side
@@ -126,7 +114,7 @@ bool IntegrandBase::initElementBou (const std::vector<int>& MNPC,
const std::vector<size_t>& basis_sizes,
LocalIntegral& elmInt)
{
std::vector<int> MNPC1(MNPC.begin(), MNPC.begin()+elem_sizes.front());
std::vector<int> MNPC1(MNPC.begin(),MNPC.begin()+elem_sizes.front());
return this->initElementBou(MNPC1,elmInt);
}
@@ -134,7 +122,8 @@ bool IntegrandBase::initElementBou (const std::vector<int>& MNPC,
bool IntegrandBase::evalSol (Vector& s, const FiniteElement& fe,
const Vec3& X, const std::vector<int>& MNPC) const
{
return Ierror("evalSol(Vector&,const FiniteElement& fe,const Vec3&,...)");
std::cerr << __PRETTY_FUNCTION__ <<": Not implemented."<< std::endl;
return false;
}
@@ -143,26 +132,29 @@ bool IntegrandBase::evalSol (Vector& s, const MxFiniteElement& fe,
const std::vector<size_t>& elem_sizes,
const std::vector<size_t>& basis_sizes) const
{
std::vector<int> MNPC1(MNPC.begin(), MNPC.begin()+elem_sizes.front());
std::vector<int> MNPC1(MNPC.begin(),MNPC.begin()+elem_sizes.front());
return this->evalSol(s,fe,X,MNPC1);
}
bool IntegrandBase::evalSol (Vector& s, const TensorFunc& asol, const Vec3& X) const
bool IntegrandBase::evalSol (Vector& s, const TensorFunc& asol,
const Vec3& X) const
{
s = Vector(asol(X).ptr(),nsd*nsd);
return true;
}
bool IntegrandBase::evalSol (Vector& s, const STensorFunc& asol, const Vec3& X) const
bool IntegrandBase::evalSol (Vector& s, const STensorFunc& asol,
const Vec3& X) const
{
s = Vector(asol(X).ptr(),nsd*(nsd+1)/2);
return true;
}
bool IntegrandBase::evalSol (Vector& s, const VecFunc& asol, const Vec3& X) const
bool IntegrandBase::evalSol (Vector& s, const VecFunc& asol,
const Vec3& X) const
{
s = Vector(asol(X).ptr(),nsd);
return true;
@@ -200,22 +192,20 @@ Vector* IntegrandBase::getNamedVector (const std::string& name) const
return it == myFields.end() ? nullptr : it->second;
}
std::string IntegrandBase::getField1Name(size_t idx, const char* prefix) const
std::string IntegrandBase::getField1Name (size_t idx, const char* prefix) const
{
std::stringstream stream;
if(prefix)
stream << prefix << " ";
stream << "primary solution " << idx+1;
return stream.str();
char name[32];
sprintf(name,"primary solution %lu",1+idx);
return prefix ? prefix + std::string(" ") + name : name;
}
std::string IntegrandBase::getField2Name(size_t idx, const char* prefix) const
std::string IntegrandBase::getField2Name (size_t idx, const char* prefix) const
{
std::stringstream stream;
if(prefix)
stream << prefix << " ";
stream << "secondary solution " << idx+1;
return stream.str();
char name[32];
sprintf(name,"secondary solution %lu",1+idx);
return prefix ? prefix + std::string(" ") + name : name;
}

View File

@@ -41,7 +41,7 @@ class IntegrandBase : public Integrand
{
protected:
//! \brief The default constructor is protected to allow sub-classes only.
IntegrandBase() : npv(1), m_mode(SIM::INIT) {}
IntegrandBase(unsigned short int n = 0) : nsd(n), npv(1), m_mode(SIM::INIT) {}
public:
//! \brief Empty destructor.
@@ -87,6 +87,7 @@ public:
// Element-level initialization interface
// ======================================
using Integrand::getLocalIntegral;
//! \brief Returns a local integral contribution object for the given element.
//! \param[in] nen Number of nodes on element
//! \param[in] iEl Global element number (1-based)
@@ -217,19 +218,19 @@ public:
//! \brief Returns a pointer to an Integrand for nodal force evaluation.
virtual ForceBase* getForceIntegrand() const { return 0; }
//! \brief Returns number of spatial dimensions.
virtual size_t getNoSpaceDim() const { return nsd; }
//! \brief Returns the number of spatial dimensions.
size_t getNoSpaceDim() const { return nsd; }
//! \brief Returns the number of primary/secondary solution field components.
virtual size_t getNoFields(int = 2) const { return 0; }
//! \brief Returns the name of a primary solution field component.
//! \param[in] idx Identifier integer for multiple solutions
//! \param[in] prefix Field names will start with this string
virtual std::string getField1Name(size_t idx, const char* prefix = 0) const ;
//! \param[in] idx Field component index
//! \param[in] prefix Name prefix for all components
virtual std::string getField1Name(size_t idx, const char* prefix = 0) const;
//! \brief Returns the name of a secondary solution field component.
//! \param[in] idx Identifier integer for multiple solutions
//! \param[in] prefix Field names will start with this string
virtual std::string getField2Name(size_t idx, const char* prefix = 0) const ;
//! \param[in] idx Field component index
//! \param[in] prefix Name prefix for all components
virtual std::string getField2Name(size_t idx, const char* prefix = 0) const;
//! \brief Returns the number of solution vectors.
size_t getNoSolutions() const { return primsol.size(); }
@@ -268,9 +269,9 @@ private:
protected:
unsigned short int nsd; //!< Number of spatial dimensions (1,2 or, 3)
Vectors primsol; //!< Primary solution vectors for current patch
unsigned short int npv; //!< Number of primary solution variables per node
SIM::SolutionMode m_mode; //!< Current solution mode
Vectors primsol; //!< Primary solution vectors for current patch
};