Skip to content
Snippets Groups Projects
Commit 476b58b6 authored by Elias Pipping's avatar Elias Pipping
Browse files

[Extend] Allow normal stress to vary in space

parent 7015cfec
No related branches found
No related tags found
No related merge requests found
...@@ -3,19 +3,17 @@ ...@@ -3,19 +3,17 @@
#include <dune/common/parametertree.hh> #include <dune/common/parametertree.hh>
struct FrictionData { struct FrictionData {
FrictionData(Dune::ParameterTree const &parset, double normalStress) FrictionData(Dune::ParameterTree const &parset)
: L(parset.get<double>("L")), : L(parset.get<double>("L")),
V0(parset.get<double>("V0")), V0(parset.get<double>("V0")),
a(parset.get<double>("a")), a(parset.get<double>("a")),
b(parset.get<double>("b")), b(parset.get<double>("b")),
mu0(parset.get<double>("mu0")), mu0(parset.get<double>("mu0")) {}
normalStress(normalStress) {}
double const L; double const L;
double const V0; double const V0;
double const a; double const a;
double const b; double const b;
double const mu0; double const mu0;
double const normalStress;
}; };
#endif #endif
...@@ -28,15 +28,16 @@ class FrictionPotentialWrapper { ...@@ -28,15 +28,16 @@ class FrictionPotentialWrapper {
class FrictionPotential : public FrictionPotentialWrapper { class FrictionPotential : public FrictionPotentialWrapper {
public: public:
FrictionPotential(double coefficient, FrictionData const &_fd) FrictionPotential(double coefficient, double _normalStress,
: fd(_fd), weightTimesNormalStress(coefficient * (-fd.normalStress)) {} FrictionData const &_fd)
: fd(_fd), weight(coefficient), normalStress(_normalStress) {}
double differential(double V) const { double differential(double V) const {
assert(V >= 0.0); assert(V >= 0.0);
if (V <= V_cutoff) if (V <= V_cutoff)
return 0.0; return 0.0;
return weightTimesNormalStress * fd.a * (std::log(V) - logV_m); return weight * (-normalStress) * fd.a * (std::log(V) - logV_m);
} }
double second_deriv(double V) const { double second_deriv(double V) const {
...@@ -44,7 +45,7 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -44,7 +45,7 @@ class FrictionPotential : public FrictionPotentialWrapper {
if (V <= V_cutoff) if (V <= V_cutoff)
return 0; return 0;
return weightTimesNormalStress * fd.a / V; return weight * (-normalStress) * (fd.a / V);
} }
double regularity(double V) const { double regularity(double V) const {
...@@ -64,7 +65,8 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -64,7 +65,8 @@ class FrictionPotential : public FrictionPotentialWrapper {
private: private:
FrictionData const &fd; FrictionData const &fd;
double const weightTimesNormalStress; double const weight;
double const normalStress;
double logV_m; double logV_m;
double V_cutoff; // velocity at which mu falls short of mumin double V_cutoff; // velocity at which mu falls short of mumin
}; };
......
...@@ -23,7 +23,8 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<Matrix, Vector> { ...@@ -23,7 +23,8 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<Matrix, Vector> {
public: public:
GlobalRuinaNonlinearity(Dune::BitSetVector<1> const &frictionalNodes, GlobalRuinaNonlinearity(Dune::BitSetVector<1> const &frictionalNodes,
ScalarVector const &weights, FrictionData const &fd) ScalarVector const &weights, FrictionData const &fd,
ScalarVector const &normalStress)
: restrictions(frictionalNodes.size()) { : restrictions(frictionalNodes.size()) {
auto trivialNonlinearity = auto trivialNonlinearity =
std::make_shared<Friction>(std::make_shared<TrivialFunction>()); std::make_shared<Friction>(std::make_shared<TrivialFunction>());
...@@ -32,7 +33,8 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<Matrix, Vector> { ...@@ -32,7 +33,8 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<Matrix, Vector> {
restrictions[i] = trivialNonlinearity; restrictions[i] = trivialNonlinearity;
continue; continue;
} }
auto const fp = std::make_shared<FrictionPotential>(weights[i], fd); auto const fp =
std::make_shared<FrictionPotential>(weights[i], normalStress[i], fd);
restrictions[i] = std::make_shared<Friction>(fp); restrictions[i] = std::make_shared<Friction>(fp);
} }
} }
......
...@@ -92,7 +92,8 @@ void MyAssembler<GridView, dimension>::assembleNeumann( ...@@ -92,7 +92,8 @@ void MyAssembler<GridView, dimension>::assembleNeumann(
template <class GridView, int dimension> template <class GridView, int dimension>
auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity( auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity(
BoundaryPatch<GridView> const &frictionalBoundary, FrictionData const &fd) BoundaryPatch<GridView> const &frictionalBoundary, FrictionData const &fd,
ScalarVector const &normalStress)
-> std::shared_ptr<GlobalRuinaNonlinearity<Matrix, Vector>> { -> std::shared_ptr<GlobalRuinaNonlinearity<Matrix, Vector>> {
// Lump negative normal stress (kludge) // Lump negative normal stress (kludge)
ScalarVector weights; ScalarVector weights;
...@@ -110,7 +111,7 @@ auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity( ...@@ -110,7 +111,7 @@ auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity(
Dune::BitSetVector<1> frictionalNodes; Dune::BitSetVector<1> frictionalNodes;
frictionalBoundary.getVertices(frictionalNodes); frictionalBoundary.getVertices(frictionalNodes);
return std::make_shared<GlobalRuinaNonlinearity<Matrix, Vector>>( return std::make_shared<GlobalRuinaNonlinearity<Matrix, Vector>>(
frictionalNodes, weights, fd); frictionalNodes, weights, fd, normalStress);
} }
template <class GridView, int dimension> template <class GridView, int dimension>
......
...@@ -68,8 +68,8 @@ template <class GridView, int dimension> class MyAssembler { ...@@ -68,8 +68,8 @@ template <class GridView, int dimension> class MyAssembler {
std::shared_ptr<GlobalRuinaNonlinearity<Matrix, Vector>> std::shared_ptr<GlobalRuinaNonlinearity<Matrix, Vector>>
assembleFrictionNonlinearity( assembleFrictionNonlinearity(
BoundaryPatch<GridView> const &frictionalBoundary, BoundaryPatch<GridView> const &frictionalBoundary, FrictionData const &fd,
FrictionData const &fd); ScalarVector const &normalStress);
void assembleVonMisesStress(double youngModulus, double poissonRatio, void assembleVonMisesStress(double youngModulus, double poissonRatio,
Vector const &u, ScalarVector &stress); Vector const &u, ScalarVector &stress);
......
...@@ -188,18 +188,19 @@ int main(int argc, char *argv[]) { ...@@ -188,18 +188,19 @@ int main(int argc, char *argv[]) {
}; };
Vector ell(fineVertexCount); Vector ell(fineVertexCount);
computeExternalForces(0.0, ell); computeExternalForces(0.0, ell);
double normalStress = (myGeometry.A[1] - myGeometry.C[1]) *
parset.get<double>("gravity") * ScalarVector normalStress(fineVertexCount);
parset.get<double>("body.density"); normalStress = (myGeometry.A[1] - myGeometry.C[1]) *
FrictionData const frictionData(parset.sub("boundary.friction"), parset.get<double>("gravity") *
normalStress); parset.get<double>("body.density");
FrictionData const frictionData(parset.sub("boundary.friction"));
// {{{ Initial conditions // {{{ Initial conditions
ScalarVector alpha_initial(fineVertexCount); ScalarVector alpha_initial(fineVertexCount);
alpha_initial = alpha_initial =
std::log(parset.get<double>("boundary.friction.initialState")); std::log(parset.get<double>("boundary.friction.initialState"));
auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity( auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
frictionalBoundary, frictionData); frictionalBoundary, frictionData, normalStress);
myGlobalNonlinearity->updateLogState(alpha_initial); myGlobalNonlinearity->updateLogState(alpha_initial);
using LinearFactory = SolverFactory< using LinearFactory = SolverFactory<
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment