changed: optimize ResidualOperators::Laplacian
and remove templating for the EqualOrder one
This commit is contained in:
parent
b02de8d87b
commit
c4ea583708
@ -183,11 +183,13 @@ void CompatibleOperators::Residual::Laplacian(Vectors& EV,
|
|||||||
double scale, bool stress)
|
double scale, bool stress)
|
||||||
{
|
{
|
||||||
size_t nsd = fe.grad(1).cols();
|
size_t nsd = fe.grad(1).cols();
|
||||||
for (size_t k = 1; k <= nsd; ++k)
|
auto dUdXT = dUdX;
|
||||||
for (size_t i = 1; i <= fe.basis(k).size(); ++i) {
|
dUdXT.transpose();
|
||||||
double diff = 0.0;
|
for (size_t k = 1; k <= nsd; ++k) {
|
||||||
for (size_t m = 1; m <= nsd; ++m)
|
Vector diff;
|
||||||
diff += fe.grad(k)(i,m)*dUdX(k,m);
|
fe.grad(k).multiply(Vector(dUdXT[k-1].ptr(), nsd), diff);
|
||||||
EV[k](i) += scale*diff*fe.detJxW;
|
if (stress)
|
||||||
}
|
fe.grad(k).multiply(Vector(dUdX[k-1].ptr(), nsd), diff, false, 1);
|
||||||
|
EV[k].add(diff, scale*fe.detJxW);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -302,3 +302,21 @@ void EqualOrderOperators::Residual::Laplacian (Vector& EV,
|
|||||||
size_t nsd = fe.grad(basis).cols();
|
size_t nsd = fe.grad(basis).cols();
|
||||||
fe.grad(basis).multiply(Vector(dUdX.ptr(),nsd),EV,scale*fe.detJxW,1.0);
|
fe.grad(basis).multiply(Vector(dUdX.ptr(),nsd),EV,scale*fe.detJxW,1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EqualOrderOperators::Residual::Laplacian (Vector& EV,
|
||||||
|
const FiniteElement& fe,
|
||||||
|
const Tensor& dUdX,
|
||||||
|
double scale,
|
||||||
|
bool stress, int basis)
|
||||||
|
{
|
||||||
|
size_t nsd = fe.grad(1).cols();
|
||||||
|
auto dUdXT = dUdX;
|
||||||
|
dUdXT.transpose();
|
||||||
|
for (size_t k = 1; k <= nsd; ++k) {
|
||||||
|
Vector diff;
|
||||||
|
fe.grad(basis).multiply(Vector(dUdXT[k-1].ptr(), nsd), diff);
|
||||||
|
if (stress)
|
||||||
|
fe.grad(basis).multiply(Vector(dUdX[k-1].ptr(), nsd), diff, false, 1);
|
||||||
|
EV.add(diff, scale*fe.detJxW, 0, 1, k-1, nsd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -191,8 +191,8 @@ public:
|
|||||||
//! \param[in] scale Scaling factor for contribution
|
//! \param[in] scale Scaling factor for contribution
|
||||||
//! \param[in] basis Basis to use
|
//! \param[in] basis Basis to use
|
||||||
static void Laplacian(Vector& EV, const FiniteElement& fe,
|
static void Laplacian(Vector& EV, const FiniteElement& fe,
|
||||||
const Vec3& dUdX, double scale=1.0,
|
const Vec3& dUdX, double scale = 1.0,
|
||||||
int basis=1);
|
int basis = 1);
|
||||||
|
|
||||||
//! \brief Compute a laplacian term in a residual vector.
|
//! \brief Compute a laplacian term in a residual vector.
|
||||||
//! \param EV The element vector to add contribution to
|
//! \param EV The element vector to add contribution to
|
||||||
@ -201,33 +201,9 @@ public:
|
|||||||
//! \param[in] scale Scaling factor for contribution
|
//! \param[in] scale Scaling factor for contribution
|
||||||
//! \param[in] stress Whether to add extra stress formulation terms
|
//! \param[in] stress Whether to add extra stress formulation terms
|
||||||
//! \param[in] basis Basis to use
|
//! \param[in] basis Basis to use
|
||||||
template<class T>
|
|
||||||
static void Laplacian(Vector& EV, const FiniteElement& fe,
|
static void Laplacian(Vector& EV, const FiniteElement& fe,
|
||||||
const T& dUdX, double scale=1.0,
|
const Tensor& dUdX, double scale = 1.0,
|
||||||
bool stress=false, int basis=1)
|
bool stress = false, int basis = 1);
|
||||||
{
|
|
||||||
size_t cmp = EV.size() / fe.basis(basis).size();
|
|
||||||
for (size_t i = 1;i <= fe.basis(basis).size();i++) {
|
|
||||||
for (size_t k = 1;k <= cmp;k++) {
|
|
||||||
double diff = 0.0;
|
|
||||||
for (size_t l = 1;l <= fe.grad(basis).cols();l++)
|
|
||||||
diff += dUdX(k,l)*fe.grad(basis)(i,l);
|
|
||||||
diff *= scale*fe.detJxW;
|
|
||||||
|
|
||||||
// Add residual to rhs of momentum equation
|
|
||||||
EV((i-1)*cmp + k) += diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use stress formulation
|
|
||||||
if (stress) {
|
|
||||||
for (size_t i = 1;i <= fe.basis(basis).size();i++)
|
|
||||||
for (size_t k = 1;k <= cmp;k++)
|
|
||||||
for (size_t l = 1;l <= cmp;l++)
|
|
||||||
// Diffusion
|
|
||||||
EV((i-1)*cmp + k) += scale*dUdX(l,k)*fe.grad(basis)(i,l)*fe.detJxW;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user