Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • podlesny/dune-tectonic
  • agnumpde/dune-tectonic
2 results
Show changes
Showing
with 952 additions and 80 deletions
import numpy as np
def norm(x) :
size = x.shape
res = np.zeros(size[0], size[1])
for time_step in range(size[0]) :
for vertex in range(size[1]) :
res[time_step, vertex] = np.linalg.norm(x[time_step, vertex, :])
return res
import array as ar
def slip_beginnings(x):
# returns indicies i for which x[i-1]=0 and x[i]>0
starts = ar.array('i', (0 for i in range(len(x))))
prev = False
length = 0
for i in range(len(x)):
if (not prev and x[i]):
starts[length] = i
length += 1
prev = x[i]
return starts[:length]
File added
import numpy as np
def slip_beginnings(x) :
# returns indicies i for which x[i-1]=0 and x[i]>0
starts = []
prev = False
for i in range(len(x)) :
if (not prev and x[i]) :
starts.append(i)
prev = x[i]
return starts
import array as ar
def slip_endings(x):
# returns indicies i for which x[i-1]>0 and x[i]=0
ends = ar.array('i', (0 for i in range(len(x))))
prev = False
length = 0
for i in range(len(x)):
if (prev and not x[i]):
ends[length] = i
length += 1
prev = x[i]
return ends[:length]
File added
import numpy as np
def slip_endings(x) :
# returns indicies i for which x[i-1]>0 and x[i]=0
starts = np.array([])
prev = False
for i in range(len(x)) :
if (prev and not x[i]) :
starts.append(i)
prev = x[i]
return starts
\ No newline at end of file
# x: vector of domain values
# y: vector of function values f(x)
def trapezoidal(x, y) :
# returns integral of (x, y = f(x)) calculated with trapezoidal rule
res = 0.0
for i in range(1, len(x)) :
res += (x[i] - x[i - 1]) * (y[i] + y[i - 1]) / 2.0
return res
\ No newline at end of file
# x: vector of domain values
# y: vector of function values f(x)
def trapezoidal(x, y) :
# returns integral of (x, y = f(x)) calculated with trapezoidal rule
res = 0.0
for i in range(1, len(x)) :
res += (x[i] - x[i - 1]) * (y[i] + y[i - 1]) / 2.0
return res
\ No newline at end of file
writeContours <- function (contours, level, file) {
file.create(file)
for (cl in contours[sapply(contours, function(x) x$level) == level]) {
conn <- file(file, 'a')
write.table(cbind(cl$x, cl$y, level),
file = file, row.names = FALSE, col.names = FALSE,
append = TRUE)
writeLines("\n", conn)
close(conn)
}
}
% householder reflection
v0 = [1; 0];
v0 = v0./norm(v0);
v1 = [1; -1];
v1 = v1./norm(v1);
v = 1/2.*(v1-v0);
vnorm = norm(v);
H = eye(2) - 2/(vnorm^2).*(v*v')
A = [...
];
f = [...
0;
-4.33681e-19;
0;
1.0842e-19;
-2.66671e-06;
-4.94914e-07;
0;
-2.71051e-20;
-4.19923e-06;
-4.21374e-07;
-3.92235e-06;
-8.64817e-07;
0;
-5.42101e-20;
-4.96301e-06;
-4.13502e-06;
0;
0;
-7.03515e-06;
-5.84881e-06;
-4.93309e-06;
-2.37804e-06;
0;
0;
-2.90755e-06;
-1.23334e-06;
0;
0;
-2.2449e-06;
-8.21563e-07;
0;
0;
0;
0;
0;
0;
-7.24652e-06;
-8.25293e-07;
0;
2.4104e-06;
-8.19294e-06;
-1.18617e-06;
-5.58223e-06;
-1.69348e-06;
0;
1.88001e-06;
-1.03387e-05;
-8.22886e-06;
0;
0;
-1.07258e-05;
-8.62344e-06;
-9.76077e-06;
-4.93954e-06;
-9.10261e-06;
-7.35307e-06;
-4.01973e-06;
-2.38351e-06;
-5.92659e-06;
-4.23858e-07;
-7.9911e-06;
-4.04139e-06;
-3.80594e-06;
-3.06903e-06;
-3.92924e-06;
-2.71681e-06;
-5.12975e-06;
-1.37642e-06;
-4.79892e-06;
-1.14935e-06;
-7.19726e-06;
-3.54967e-06;
-6.62755e-06;
-6.1499e-07;
0;
1.28701e-05;
0;
0;
-1.09944e-05;
-1.92221e-06;
0;
1.17853e-05;
-1.21456e-05;
-2.20784e-06;
-8.3682e-06;
-2.01449e-06;
0;
0;
-1.43122e-05;
-1.00938e-05;
0;
0;
-1.48374e-05;
-1.03947e-05;
-1.3684e-05;
-6.31825e-06;
-1.35318e-05;
-9.3703e-06;
-5.76679e-06;
-1.88878e-06;
-9.18524e-06;
-1.51544e-06;
-1.16296e-05;
-5.64398e-06;
-5.20301e-06;
-2.13559e-06;
-5.55432e-06;
-2.017e-06;
-7.96841e-06;
-1.7895e-06;
-7.95375e-06;
-1.76175e-06;
-1.0596e-05;
-5.24553e-06;
-1.02345e-05;
-1.74422e-06;
-2.16064e-05;
-1.85059e-06;
-2.24752e-05;
-3.34957e-07;
-1.34774e-05;
-2.51353e-06;
-2.18312e-05;
-1.04202e-06;
-1.99898e-05;
-1.463e-06;
-1.94256e-05;
-2.11821e-06;
-5e-05;
5.03269e-07;
-2.00631e-05;
-2.41829e-06;
-2.11637e-05;
-1.12298e-06;
-1.61508e-05;
-1.11752e-05;
-1.7267e-05;
-6.9337e-06;
-1.43931e-05;
-6.46903e-06;
-1.70354e-05;
-2.45177e-06;
-5e-05;
-2.50465e-06;
-5e-05;
-1.21588e-05;
-2.01431e-05;
-1.19797e-05;
];
d = 0.00075745;
A2 = [...
];
f2 = [...
0;
0;
0;
0;
-3.01994e-06;
-1.76298e-07;
0;
0;
-4.78204e-06;
-2.0995e-07;
-5.01951e-06;
1.22653e-06;
0;
0;
-4.98476e-06;
-3.57931e-06;
0;
0;
-7.06572e-06;
-4.97786e-06;
-5.40025e-06;
-1.91591e-06;
0;
0;
-3.26344e-06;
-9.4196e-07;
0;
0;
-3.47107e-06;
1.69693e-06;
0;
0;
0;
0;
0;
0;
-8.36624e-06;
-3.21786e-07;
0;
0;
-9.19771e-06;
-4.8646e-07;
-9.46319e-06;
2.13218e-06;
0;
0;
-1.03261e-05;
-6.78209e-06;
0;
0;
-1.09634e-05;
-7.09926e-06;
-1.01615e-05;
-3.77678e-06;
-9.09151e-06;
-6.13484e-06;
-9.06507e-06;
4.28268e-06;
-6.83374e-06;
-2.4706e-07;
-8.51881e-06;
-3.22169e-06;
-7.83369e-06;
3.49294e-06;
-8.45665e-06;
3.90404e-06;
-7.913e-06;
1.91502e-06;
-7.13457e-06;
1.77604e-06;
-7.71821e-06;
-2.87949e-06;
-7.58455e-06;
-3.19117e-07;
0;
0;
0;
0;
-1.17905e-05;
-6.57623e-07;
0;
0;
-1.26738e-05;
-7.75536e-07;
-1.28663e-05;
2.59111e-06;
0;
0;
-1.33726e-05;
-8.23012e-06;
0;
0;
-1.40382e-05;
-8.4827e-06;
-1.3445e-05;
-4.60248e-06;
-1.21277e-05;
-7.7075e-06;
-1.20933e-05;
5.59837e-06;
-1.00511e-05;
-5.83173e-07;
-1.16989e-05;
-4.19969e-06;
-1.07938e-05;
5.03904e-06;
-1.14551e-05;
5.33497e-06;
-1.1057e-05;
2.39173e-06;
-1.01977e-05;
2.22842e-06;
-1.08385e-05;
-3.93909e-06;
-1.09119e-05;
-6.59537e-07;
-1.51572e-05;
6.80143e-06;
-1.97651e-05;
7.92292e-06;
-1.3582e-05;
-8.81729e-07;
-1.73372e-05;
7.52177e-06;
-1.63794e-05;
2.79237e-06;
-1.33659e-05;
2.38778e-06;
-5e-05;
7.93536e-06;
-1.92072e-05;
-9.96979e-07;
-1.93357e-05;
3.15138e-06;
-1.54595e-05;
-9.11795e-06;
-1.68142e-05;
-5.1397e-06;
-1.4113e-05;
-4.66534e-06;
-1.63265e-05;
-9.49749e-07;
-5e-05;
-1.0631e-06;
-5e-05;
-1.02021e-05;
-1.98778e-05;
-9.99727e-06;
];
d2 = 0;
sum(sum(abs(f-f2)>1e-14))
sum(sum(abs(A-A2)>1e-14))
alpha0 = 100;
V = 1e-5; %1e-20;
V0 = 5e-5;
L = 2.25e-5;
alpha = @(t) log(exp(alpha0 - V.*t./L ) - V0 * (exp(-t./L.*V)-1)./V);
x = [0:0.001:0.1];
alpha(x)
plot(x, alpha(x));
%abs(d-d2)
% x = [...
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% -1.2337e-10;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% -1.2337e-10;
% 0;
% -1.2337e-10;
% 0;
% 0;
% 0;
% ];
%
% ignore = [...
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 1;
% 1;
% 0;
% 0;
% 1;
% 1;
% 0;
% 0;
% 1;
% 1;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 1;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 0;
% 1;
% 0;
% 1;
% 0;
% 0;
% 0;
% ];
%
% newA = A;
% newf = f;
% for i=1:length(ignore)
% if (ignore(i)==1)
% for j=1:length(ignore)
% newA(i,j) = (i==j);
% end
% newf(i) = x(i);
% end
% end
% newA
% newf
% ignore = zeros(1, length(f));
% for i=1:length(ignore)
% if (A(i,i)==0)
% ignore(1, i) = 1;
% end
% end
%
% indices = [];
% for i=1:length(ignore)
% if (ignore(i)==0)
% indices = [indices i];
% end
% end
%
% len = length(indices);
% newA = zeros(len, len);
% newf = zeros(1, len);
% for i=1:len
% newf(i) = f(indices(i));
%
% for j=1:len
% newA(i,j) = A(indices(i), indices(j));
% end
% end
% newf;
% newA
%inv(A);
% sol = newA\newf
%
% tnnmgSol = [...
% -1.03349;
% -0.0502635;
% 0.0161336;
% -0.00852914;
% -0.0130659;
% 0.00660115;
% -0.434915;
% -0.0128241;
% -0.00893317;
% 0.00884256;
% -0.0110232;
% -0.10936;
% 1.14978;
% 0.0581132;
% 0.019598;
% 0.190758;
% 0.478393;
% -0.00433049;
% 0.0513446;
% 0.353218;
% -0.00482644;
% 0.11758;
% 0;
% 0;
% -0.013677;
% 0.0512563;
% 0;
% 0;
% -0.00514197;
% -0.117664;
% 0;
% 0;
% 0.130034;
% 0.574041;
% 0.0136965;
% 0.214953;
% 0.0335986;
% -0.00703477;
% 0.0438202;
% 0.346506;
% -0.000896805;
% 0.127837;
% 0.041946;
% 0.217409;
% -1.2337e-10;
% 0.112528;
% -0.00828618;
% 0.00453345;
% -0.00898709;
% 0.0781683;
% 0.092355;
% -0.556143;
% -0.00443686;
% -0.140953;
% 0.0424371;
% -0.250082;
% -0.00336878;
% 0.00105471;
% -1.2337e-10;
% 0.0188452;
% -1.2337e-10;
% -0.14111;
% 0.00298499;
% -0.190904;
% ];
%
% sol-tnnmgSol
\ No newline at end of file
......@@ -10,6 +10,6 @@ Name: @PACKAGE_NAME@
Version: @VERSION@
Description: dune-tectonic module
URL: http://dune-project.org/
Requires: dune-common dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
Requires: dune-common dune-contact dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
Libs: -L${libdir}
Cflags: -I${includedir}
......@@ -5,4 +5,4 @@
Module: dune-tectonic
Version: 2.5-1
Maintainer: elias.pipping@fu-berlin.de
Depends: dune-common dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
Depends: dune-common dune-contact dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
add_subdirectory("data-structures")
add_subdirectory("factories")
add_subdirectory("io")
add_subdirectory("multi-threading")
add_subdirectory("problem-data")
add_subdirectory("spatial-solving")
add_subdirectory("tests")
add_subdirectory("time-stepping")
add_subdirectory("utils")
add_custom_target(tectonic_dune SOURCES
assemblers.hh
assemblers.cc
explicitgrid.hh
explicitvectors.hh
gridselector.hh
)
#install headers
install(FILES
body.hh
frictiondata.hh
frictionpotential.hh
globalfrictiondata.hh
globalfriction.hh
globalratestatefriction.hh
gravity.hh
localfriction.hh
minimisation.hh
myblockproblem.hh
mydirectionalconvexfunction.hh
quadraticenergy.hh
tectonic.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic)
assemblers.hh
explicitgrid.hh
explicitvectors.hh
gridselector.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic)
......@@ -4,7 +4,8 @@
#include <dune/istl/scaledidmatrix.hh>
#include <dune/fufem/assemblers/localassemblers/boundarymassassembler.hh>
#include <dune/fufem/assemblers/localassemblers/massassembler.hh>
#include <dune/fufem/assemblers/boundaryoperatorassembler.hh>
#include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh>
#include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
#include <dune/fufem/assemblers/localassemblers/normalstressboundaryassembler.hh>
......@@ -12,41 +13,49 @@
#include <dune/fufem/assemblers/localassemblers/variablecoefficientviscosityassembler.hh>
#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
#include <dune/fufem/assemblers/localassemblers/weightedmassassembler.hh>
#include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/functions/basisgridfunction.hh>
#include <dune/fufem/functions/constantfunction.hh>
#include <dune/fufem/functiontools/p0p1interpolation.hh>
#include <dune/fufem/quadraturerules/quadraturerulecache.hh>
#include <dune/tectonic/frictionpotential.hh>
#include <dune/tectonic/globalratestatefriction.hh>
#include "data-structures/friction/frictionpotential.hh"
#include "data-structures/friction/globalratestatefriction.hh"
#include "assemblers.hh"
template <class GridView, int dimension>
MyAssembler<GridView, dimension>::MyAssembler(GridView const &_gridView)
: cellBasis(_gridView),
MyAssembler<GridView, dimension>::MyAssembler(GridView const &_gridView) :
cellBasis(_gridView),
vertexBasis(_gridView),
gridView(_gridView),
cellAssembler(cellBasis, cellBasis),
vertexAssembler(vertexBasis, vertexBasis) {}
template <class GridView, int dimension>
template <class LocalBoundaryFunctionalAssemblerType, class GlobalVectorType>
void MyAssembler<GridView, dimension>::assembleBoundaryFunctional(LocalBoundaryFunctionalAssemblerType& localAssembler,
GlobalVectorType& b,
const BoundaryPatch<GridView>& boundaryPatch,
bool initializeVector) const {
vertexAssembler.assembleBoundaryFunctional(localAssembler, b, boundaryPatch, initializeVector);
}
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleFrictionalBoundaryMass(
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarMatrix &frictionalBoundaryMass) const {
BoundaryMassAssembler<Grid, BoundaryPatch<GridView>, LocalVertexBasis,
LocalVertexBasis, Dune::FieldMatrix<double, 1, 1>> const
frictionalBoundaryMassAssembler(frictionalBoundary);
vertexAssembler.assembleOperator(frictionalBoundaryMassAssembler,
frictionalBoundaryMass);
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarMatrix &frictionalBoundaryMass) const {
MassAssembler<Grid, LocalVertexBasis, LocalVertexBasis> localMassAssembler;
const BoundaryOperatorAssembler<VertexBasis, VertexBasis> boundaryAssembler(vertexBasis, vertexBasis, frictionalBoundary);
boundaryAssembler.assemble(localMassAssembler, frictionalBoundaryMass);
}
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleMass(
Dune::VirtualFunction<LocalVector, LocalScalarVector> const &
densityFunction,
Matrix &M) const {
Dune::VirtualFunction<LocalVector, LocalScalarVector> const & densityFunction,
Matrix &M) const {
// NOTE: We treat the weight as a constant function
QuadratureRuleKey quadKey(dimension, 0);
......@@ -58,8 +67,11 @@ void MyAssembler<GridView, dimension>::assembleMass(
}
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleElasticity(double E, double nu,
Matrix &A) const {
void MyAssembler<GridView, dimension>::assembleElasticity(
double E,
double nu,
Matrix &A) const {
StVenantKirchhoffAssembler<Grid, LocalVertexBasis, LocalVertexBasis> const
localStiffness(E, nu);
vertexAssembler.assembleOperator(localStiffness, A);
......@@ -67,9 +79,10 @@ void MyAssembler<GridView, dimension>::assembleElasticity(double E, double nu,
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleViscosity(
Dune::VirtualFunction<LocalVector, LocalScalarVector> const &shearViscosity,
Dune::VirtualFunction<LocalVector, LocalScalarVector> const &bulkViscosity,
Matrix &C) const {
Dune::VirtualFunction<LocalVector, LocalScalarVector> const &shearViscosity,
Dune::VirtualFunction<LocalVector, LocalScalarVector> const &bulkViscosity,
Matrix &C) const {
// NOTE: We treat the weights as constant functions
QuadratureRuleKey shearViscosityKey(dimension, 0);
QuadratureRuleKey bulkViscosityKey(dimension, 0);
......@@ -83,8 +96,9 @@ void MyAssembler<GridView, dimension>::assembleViscosity(
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleBodyForce(
Dune::VirtualFunction<LocalVector, LocalVector> const &gravityField,
Vector &f) const {
Dune::VirtualFunction<LocalVector, LocalVector> const &gravityField,
Vector &f) const {
L2FunctionalAssembler<Grid, LocalVertexBasis, LocalVector>
gravityFunctionalAssembler(gravityField);
vertexAssembler.assembleFunctional(gravityFunctionalAssembler, f);
......@@ -92,11 +106,33 @@ void MyAssembler<GridView, dimension>::assembleBodyForce(
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleNeumann(
BoundaryPatch<GridView> const &neumannBoundary, Vector &f,
Dune::VirtualFunction<double, double> const &neumann,
double relativeTime) const {
const BoundaryPatch<GridView>& neumannBoundary,
const Dune::BitSetVector<dimension>& neumannNodes,
Vector& f,
const Dune::VirtualFunction<double, double>& neumann,
double relativeTime) const {
typename LocalVector::field_type val = 0;
neumann.evaluate(relativeTime, val);
size_t idx = 0;
bool neumannIdx = false;
for (; idx<neumannNodes.size() && !neumannIdx; idx++) {
for (size_t d=0; d<dimension; d++) {
if (neumannNodes[idx][d]) {
neumannIdx = true;
break;
}
}
}
idx--;
LocalVector localNeumann(0);
neumann.evaluate(relativeTime, localNeumann[0]);
for (size_t i=0; i<localNeumann.size(); i++) {
if (neumannNodes[idx][i])
localNeumann[i] = val;
}
NeumannBoundaryAssembler<Grid, LocalVector> neumannBoundaryAssembler(
std::make_shared<ConstantFunction<LocalVector, LocalVector>>(
localNeumann));
......@@ -106,9 +142,12 @@ void MyAssembler<GridView, dimension>::assembleNeumann(
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleWeightedNormalStress(
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarVector &weightedNormalStress, double youngModulus,
double poissonRatio, Vector const &displacement) const {
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarVector &weightedNormalStress,
ScalarVector &weights,
double youngModulus,
double poissonRatio,
Vector const &displacement) const {
BasisGridFunction<VertexBasis, Vector> displacementFunction(vertexBasis,
displacement);
......@@ -121,7 +160,6 @@ void MyAssembler<GridView, dimension>::assembleWeightedNormalStress(
auto const nodalTractionAverage =
interpolateP0ToP1(frictionalBoundary, traction);
ScalarVector weights;
{
NeumannBoundaryAssembler<Grid, typename ScalarVector::block_type>
frictionalBoundaryAssembler(
......@@ -130,47 +168,20 @@ void MyAssembler<GridView, dimension>::assembleWeightedNormalStress(
vertexAssembler.assembleBoundaryFunctional(frictionalBoundaryAssembler,
weights, frictionalBoundary);
}
auto const normals = frictionalBoundary.getNormals();
for (size_t i = 0; i < vertexBasis.size(); ++i)
weightedNormalStress[i] =
std::fmin(normals[i] * nodalTractionAverage[i], 0) * weights[i];
}
template <class GridView, int dimension>
auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity(
Config::FrictionModel frictionModel,
BoundaryPatch<GridView> const &frictionalBoundary,
GlobalFrictionData<dimension> const &frictionInfo,
ScalarVector const &weightedNormalStress) const
-> std::shared_ptr<GlobalFriction<Matrix, Vector>> {
// Lumping of the nonlinearity
ScalarVector weights;
{
NeumannBoundaryAssembler<Grid, typename ScalarVector::block_type>
frictionalBoundaryAssembler(std::make_shared<
ConstantFunction<LocalVector, typename ScalarVector::block_type>>(
1));
vertexAssembler.assembleBoundaryFunctional(frictionalBoundaryAssembler,
weights, frictionalBoundary);
}
switch (frictionModel) {
case Config::Truncated:
return std::make_shared<GlobalRateStateFriction<
Matrix, Vector, TruncatedRateState, GridView>>(
frictionalBoundary, frictionInfo, weights, weightedNormalStress);
case Config::Regularised:
return std::make_shared<GlobalRateStateFriction<
Matrix, Vector, RegularisedRateState, GridView>>(
frictionalBoundary, frictionInfo, weights, weightedNormalStress);
default:
assert(false);
}
}
template <class GridView, int dimension>
void MyAssembler<GridView, dimension>::assembleVonMisesStress(
double youngModulus, double poissonRatio, Vector const &u,
ScalarVector &stress) const {
double youngModulus,
double poissonRatio,
Vector const &u,
ScalarVector &stress) const {
auto const gridDisplacement =
std::make_shared<BasisGridFunction<VertexBasis, Vector> const>(
vertexBasis, u);
......
#ifndef SRC_ASSEMBLERS_HH
#define SRC_ASSEMBLERS_HH
#include <dune/common/bitsetvector.hh>
#include <dune/common/function.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/bvector.hh>
#include <dune/fufem/assemblers/assembler.hh>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wsign-compare"
#include <dune/fufem/functionspacebases/p0basis.hh>
#pragma clang diagnostic pop
#include <dune/fufem/functionspacebases/p1nodalbasis.hh>
#include <dune/fufem/boundarypatch.hh>
#include "data-structures/friction/globalfriction.hh"
#include "data-structures/friction/globalfrictiondata.hh"
#include "data-structures/enums.hh"
template <class GridView, int dimension>
class MyAssembler {
public:
using GV = GridView;
using ScalarMatrix = Dune::BCRSMatrix<Dune::FieldMatrix<double, 1, 1>>;
using Matrix =
Dune::BCRSMatrix<Dune::FieldMatrix<double, dimension, dimension>>;
using ScalarVector = Dune::BlockVector<Dune::FieldVector<double, 1>>;
using Vector = Dune::BlockVector<Dune::FieldVector<double, dimension>>;
using CellBasis = P0Basis<GridView, double>;
using VertexBasis = P1NodalBasis<GridView, double>;
CellBasis const cellBasis;
VertexBasis const vertexBasis;
GridView const &gridView;
private:
using Grid = typename GridView::Grid;
using LocalVector = typename Vector::block_type;
using LocalScalarVector = typename ScalarVector::block_type;
using LocalCellBasis = typename CellBasis::LocalFiniteElement;
using LocalVertexBasis = typename VertexBasis::LocalFiniteElement;
Assembler<CellBasis, CellBasis> cellAssembler;
Assembler<VertexBasis, VertexBasis> vertexAssembler;
public:
MyAssembler(GridView const &gridView);
template <class LocalBoundaryFunctionalAssemblerType, class GlobalVectorType>
void assembleBoundaryFunctional(LocalBoundaryFunctionalAssemblerType& localAssembler,
GlobalVectorType& b,
const BoundaryPatch<GridView>& boundaryPatch,
bool initializeVector=true) const;
void assembleFrictionalBoundaryMass(
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarMatrix &frictionalBoundaryMass) const;
void assembleMass(
Dune::VirtualFunction<
LocalVector, LocalScalarVector> const &densityFunction,
Matrix &M) const;
void assembleElasticity(
double E,
double nu,
Matrix &A) const;
void assembleViscosity(
Dune::VirtualFunction<LocalVector, LocalScalarVector> const & shearViscosity,
Dune::VirtualFunction<LocalVector, LocalScalarVector> const & bulkViscosity,
Matrix &C) const;
void assembleBodyForce(
Dune::VirtualFunction<LocalVector, LocalVector> const &gravityField,
Vector &f) const;
void assembleNeumann(
const BoundaryPatch<GridView>& neumannBoundary,
const Dune::BitSetVector<dimension>& neumannNodes,
Vector& f,
const Dune::VirtualFunction<double, double>& neumann,
double relativeTime) const;
void assembleWeightedNormalStress(
BoundaryPatch<GridView> const &frictionalBoundary,
ScalarVector &weightedNormalStress,
ScalarVector &weights,
double youngModulus,
double poissonRatio,
Vector const &displacement) const;
auto assembleFrictionNonlinearity(
Config::FrictionModel frictionModel,
BoundaryPatch<GridView> const &frictionalBoundary,
GlobalFrictionData<dimension> const &frictionInfo,
ScalarVector const &weightedNormalStress) const
-> std::shared_ptr<GlobalFriction<Matrix, Vector>>;
void assembleVonMisesStress(
double youngModulus,
double poissonRatio,
Vector const &u,
ScalarVector &stress) const;
};
#endif
#ifndef MY_DIM
#error MY_DIM unset
#endif
#include "explicitgrid.hh"
#include "explicitvectors.hh"
#include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
#include <dune/fufem/boundarypatch.hh>
#include "assemblers.hh"
template class MyAssembler<DefLeafGridView, MY_DIM>;
using MyNeumannBoundaryAssembler = NeumannBoundaryAssembler<DeformedGrid, typename ScalarVector::block_type>;
template void MyAssembler<DefLeafGridView, MY_DIM>::assembleBoundaryFunctional<MyNeumannBoundaryAssembler, ScalarVector>(
MyNeumannBoundaryAssembler& localAssembler,
ScalarVector& b,
const BoundaryPatch<DefLeafGridView>& boundaryPatch,
bool initializeVector) const;
#ifndef MY_DIM
#error MY_DIM unset
#endif
#include "../explicitgrid.hh"
template class ContactNetwork<Grid, MY_DIM>;
add_subdirectory("body")
add_subdirectory("friction")
add_subdirectory("network")
add_custom_target(tectonic_dune_data-structures SOURCES
enumparser.hh
enumparser.cc
enums.hh
matrices.hh
program_state.hh
)
#install headers
install(FILES
enumparser.hh
enums.hh
matrices.hh
program_state.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic)
add_custom_target(tectonic_dune_data-structures_body SOURCES
body.hh
body.cc
bodydata.hh
boundarycondition.hh
)
#install headers
install(FILES
body.hh
bodydata.hh
boundarycondition.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic)