Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
dune-pdelab-tutorials
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
PDELab
dune-pdelab-tutorials
Commits
c6648876
Commit
c6648876
authored
9 years ago
by
Peter Bastian
Browse files
Options
Downloads
Patches
Plain Diff
use _i, _o instead of _s, _n
parent
e2ddaead
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tutorial02/src/nonlinearpoissonfv.hh
+69
-60
69 additions, 60 deletions
tutorial02/src/nonlinearpoissonfv.hh
with
69 additions
and
60 deletions
tutorial02/src/nonlinearpoissonfv.hh
+
69
−
60
View file @
c6648876
...
...
@@ -26,7 +26,7 @@ class NonlinearPoissonFV :
public
Dune
::
PDELab
::
FullSkeletonPattern
,
public
Dune
::
PDELab
::
LocalOperatorDefaultFlags
{
Param
param
;
// parameter functions
Param
&
param
;
// parameter functions
public:
// pattern assembly flags
...
...
@@ -52,27 +52,32 @@ public:
{
// center of reference element
auto
cellgeo
=
eg
.
geometry
();
auto
cellcenterlocal
=
Dune
::
PDELab
::
referenceElement
(
cellgeo
).
position
(
0
,
0
);
auto
cellcenterlocal
=
Dune
::
PDELab
::
referenceElement
(
cellgeo
).
position
(
0
,
0
);
// accumulate residual
r
.
accumulate
(
lfsv
,
0
,
-
param
.
f
(
eg
.
entity
(),
cellcenterlocal
)
*
cellgeo
.
volume
());
auto
f
=
param
.
f
(
eg
.
entity
(),
cellcenterlocal
);
r
.
accumulate
(
lfsv
,
0
,
-
f
*
cellgeo
.
volume
());
}
//! residual contribution of boundary integral (Neumann boundary condition)
template
<
typename
IG
,
typename
LFSV
,
typename
R
>
void
lambda_boundary
(
const
IG
&
ig
,
const
LFSV
&
lfsv_s
,
R
&
r_s
)
const
void
lambda_boundary
(
const
IG
&
ig
,
const
LFSV
&
lfsv_i
,
R
&
r_i
)
const
{
// face volume for integration
auto
facegeo
=
ig
.
geometry
();
auto
facecenterlocal
=
Dune
::
PDELab
::
referenceElement
(
facegeo
).
position
(
0
,
0
);
auto
facecenterlocal
=
Dune
::
PDELab
::
referenceElement
(
facegeo
).
position
(
0
,
0
);
// evaluate boundary condition and quit on Dirichlet
bool
isdirichlet
=
param
.
b
(
ig
.
intersection
(),
facecenterlocal
);
bool
isdirichlet
=
param
.
b
(
ig
.
intersection
(),
facecenterlocal
);
if
(
isdirichlet
)
{
// inside cell center
auto
insidecenterglobal
=
ig
.
inside
().
geometry
().
center
();
auto
insidecenterglobal
=
ig
.
inside
().
geometry
().
center
();
// face center in global coordinates
auto
facecenterglobal
=
facegeo
.
center
();
...
...
@@ -82,7 +87,7 @@ public:
auto
distance
=
insidecenterglobal
.
two_norm
();
// face center in local coordinates of the element
auto
facecenterinelement
=
ig
.
geometryInInside
().
center
();
auto
facecenterinelement
=
ig
.
geometryInInside
().
center
();
// evaluate Dirichlet condition
auto
g
=
param
.
g
(
ig
.
inside
(),
facecenterinelement
);
...
...
@@ -91,18 +96,21 @@ public:
auto
face_volume
=
facegeo
.
volume
();
// contribution to residual
r_
s
.
accumulate
(
lfsv_
s
,
0
,
-
g
/
distance
*
face_volume
);
r_
i
.
accumulate
(
lfsv_
i
,
0
,
-
g
/
distance
*
face_volume
);
}
else
{
// contribution to residual from Neumann boundary
r_s
.
accumulate
(
lfsv_s
,
0
,
param
.
j
(
ig
.
intersection
(),
facecenterlocal
)
*
facegeo
.
volume
());
auto
j
=
param
.
j
(
ig
.
intersection
(),
facecenterlocal
);
r_i
.
accumulate
(
lfsv_i
,
0
,
j
*
facegeo
.
volume
());
}
}
//! residual contribution of volume integral (reaction term)
template
<
typename
EG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
void
alpha_volume
(
const
EG
&
eg
,
const
LFSU
&
lfsu
,
const
X
&
x
,
const
LFSV
&
lfsv
,
R
&
r
)
const
template
<
typename
EG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
void
alpha_volume
(
const
EG
&
eg
,
const
LFSU
&
lfsu
,
const
X
&
x
,
const
LFSV
&
lfsv
,
R
&
r
)
const
{
// get cell value
auto
u
=
x
(
lfsu
,
0
);
...
...
@@ -115,31 +123,28 @@ public:
}
//! jacobian contribution of volume term (reaction term)
template
<
typename
EG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
void
jacobian_volume
(
const
EG
&
eg
,
const
LFSU
&
lfsu
,
const
X
&
x
,
const
LFSV
&
lfsv
,
M
&
mat
)
const
template
<
typename
EG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
void
jacobian_volume
(
const
EG
&
eg
,
const
LFSU
&
lfsu
,
const
X
&
x
,
const
LFSV
&
lfsv
,
M
&
mat
)
const
{
// get cell value
auto
u
=
x
(
lfsu
,
0
);
// evaluate derivative reaction term
auto
u
=
x
(
lfsu
,
0
);
auto
qprime
=
param
.
qprime
(
u
);
// and accumulate
mat
.
accumulate
(
lfsv
,
0
,
lfs
v
,
0
,
qprime
*
eg
.
geometry
().
volume
());
mat
.
accumulate
(
lfsv
,
0
,
lfs
u
,
0
,
qprime
*
eg
.
geometry
().
volume
());
}
//! apply local jacobian of the volume term
template
<
typename
EG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
void
jacobian_apply_volume
(
const
EG
&
eg
,
const
LFSU
&
lfsu
,
const
X
&
x
,
const
X
&
z
,
const
LFSV
&
lfsv
,
R
&
r
)
const
const
X
&
x
,
const
X
&
z
,
const
LFSV
&
lfsv
,
R
&
r
)
const
{
// get cell value
auto
u
=
x
(
lfsu
,
0
);
// evaluate derivative reaction term
auto
u
=
x
(
lfsu
,
0
);
auto
qprime
=
param
.
qprime
(
u
);
// and accumulate
...
...
@@ -147,11 +152,12 @@ public:
}
//! residual contribution from skeleton terms
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
void
alpha_skeleton
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
LFSV
&
lfsv_
s
,
const
LFSU
&
lfsu_
n
,
const
X
&
x_
n
,
const
LFSV
&
lfsv_
n
,
R
&
r_
s
,
R
&
r_
n
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
LFSV
&
lfsv_
i
,
const
LFSU
&
lfsu_
o
,
const
X
&
x_
o
,
const
LFSV
&
lfsv_
o
,
R
&
r_
i
,
R
&
r_
o
)
const
{
// inside and outside cells
auto
cell_inside
=
ig
.
inside
();
...
...
@@ -174,17 +180,19 @@ public:
auto
face_volume
=
facegeo
.
volume
();
// contribution to residual on inside and outside elements
r_s
.
accumulate
(
lfsv_s
,
0
,
-
(
x_n
(
lfsu_s
,
0
)
-
x_s
(
lfsu_n
,
0
))
/
distance
*
face_volume
);
r_n
.
accumulate
(
lfsv_n
,
0
,
+
(
x_n
(
lfsu_s
,
0
)
-
x_s
(
lfsu_n
,
0
))
/
distance
*
face_volume
);
auto
dudn
=
(
x_o
(
lfsu_i
,
0
)
-
x_i
(
lfsu_o
,
0
))
/
distance
;
r_i
.
accumulate
(
lfsv_i
,
0
,
-
dudn
*
face_volume
);
r_o
.
accumulate
(
lfsv_o
,
0
,
dudn
*
face_volume
);
}
//! Jacobian contribution from skeleton terms
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
void
jacobian_skeleton
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
LFSV
&
lfsv_
s
,
const
LFSU
&
lfsu_
n
,
const
X
&
x_
n
,
const
LFSV
&
lfsv_
n
,
M
&
mat_
ss
,
M
&
mat_
sn
,
M
&
mat_
ns
,
M
&
mat_
nn
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
LFSV
&
lfsv_
i
,
const
LFSU
&
lfsu_
o
,
const
X
&
x_
o
,
const
LFSV
&
lfsv_
o
,
M
&
mat_
ii
,
M
&
mat_
io
,
M
&
mat_
oi
,
M
&
mat_
oo
)
const
{
// inside and outside cells
auto
cell_inside
=
ig
.
inside
();
...
...
@@ -207,10 +215,10 @@ public:
auto
face_volume
=
facegeo
.
volume
();
// contribution to jacobian entries
mat_
ss
.
accumulate
(
lfsv_
s
,
0
,
lfsv_
s
,
0
,
face_volume
/
distance
);
mat_
ns
.
accumulate
(
lfsv_
n
,
0
,
lfsv_
s
,
0
,
-
face_volume
/
distance
);
mat_
sn
.
accumulate
(
lfsv_
s
,
0
,
lfsv_
n
,
0
,
-
face_volume
/
distance
);
mat_
nn
.
accumulate
(
lfsv_
n
,
0
,
lfsv_
n
,
0
,
face_volume
/
distance
);
mat_
ii
.
accumulate
(
lfsv_
i
,
0
,
lfsv_
i
,
0
,
face_volume
/
distance
);
mat_
io
.
accumulate
(
lfsv_
i
,
0
,
lfsv_
o
,
0
,
-
face_volume
/
distance
);
mat_
oi
.
accumulate
(
lfsv_
o
,
0
,
lfsv_
i
,
0
,
-
face_volume
/
distance
);
mat_
oo
.
accumulate
(
lfsv_
o
,
0
,
lfsv_
o
,
0
,
face_volume
/
distance
);
}
//! apply local jacobian of the skeleton term
...
...
@@ -218,26 +226,26 @@ public:
typename
Y
>
void
jacobian_apply_skeleton
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
X
&
z_
s
,
const
LFSV
&
lfsv_
s
,
const
LFSU
&
lfsu_
n
,
const
X
&
x_
n
,
const
X
&
z_
n
,
const
LFSV
&
lfsv_
n
,
Y
&
y_
s
,
Y
&
y_
n
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
X
&
z_
i
,
const
LFSV
&
lfsv_
i
,
const
LFSU
&
lfsu_
o
,
const
X
&
x_
o
,
const
X
&
z_
o
,
const
LFSV
&
lfsv_
o
,
Y
&
y_
i
,
Y
&
y_
o
)
const
{
// reuse alpha_boundary because it is linear
alpha_skeleton
(
ig
,
lfsu_
s
,
z_
s
,
lfsv_
s
,
lfsu_
n
,
z_
n
,
lfsv_
n
,
y_
s
,
y_
n
);
alpha_skeleton
(
ig
,
lfsu_
i
,
z_
i
,
lfsv_
i
,
lfsu_
o
,
z_
o
,
lfsv_
o
,
y_
i
,
y_
o
);
}
//! residual contribution of boundary integral (Dirichlet condition)
// We put the Dirchlet evaluation also in the alpha term to save some geometry evaluations
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
R
>
void
alpha_boundary
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
LFSV
&
lfsv_s
,
R
&
r_
s
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
LFSV
&
lfsv_i
,
R
&
r_
i
)
const
{
//
face volume for integra
tion
//
check for Dirichlet boundary condi
tion
auto
facegeo
=
ig
.
geometry
();
auto
facecenterlocal
=
Dune
::
PDELab
::
referenceElement
(
facegeo
).
position
(
0
,
0
);
// evaluate boundary condition and quit on NOT Dirichlet
auto
facecenterlocal
=
Dune
::
PDELab
::
referenceElement
(
facegeo
).
position
(
0
,
0
);
bool
isdirichlet
=
param
.
b
(
ig
.
intersection
(),
facecenterlocal
);
if
(
!
isdirichlet
)
return
;
...
...
@@ -255,14 +263,15 @@ public:
auto
face_volume
=
facegeo
.
volume
();
// contribution to residual
r_
s
.
accumulate
(
lfsv_
s
,
0
,
x_
s
(
lfsu_
s
,
0
)
/
distance
*
face_volume
);
r_
i
.
accumulate
(
lfsv_
i
,
0
,
x_
i
(
lfsu_
i
,
0
)
/
distance
*
face_volume
);
}
//! Jacobian contribution from boundary integral (Dirichlet condition)
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
M
>
void
jacobian_boundary
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
LFSV
&
lfsv_s
,
M
&
mat_
ss
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
LFSV
&
lfsv_i
,
M
&
mat_
ii
)
const
{
// face volume for integration
auto
facegeo
=
ig
.
geometry
();
...
...
@@ -286,18 +295,18 @@ public:
auto
face_volume
=
facegeo
.
volume
();
// contribution to matrix
mat_
ss
.
accumulate
(
lfsv_
s
,
0
,
lfsv_
s
,
0
,
face_volume
/
distance
);
mat_
ii
.
accumulate
(
lfsv_
i
,
0
,
lfsv_
i
,
0
,
face_volume
/
distance
);
}
//! apply local jacobian of the boundaryterm
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
Y
>
template
<
typename
IG
,
typename
LFSU
,
typename
X
,
typename
LFSV
,
typename
Y
>
void
jacobian_apply_boundary
(
const
IG
&
ig
,
const
LFSU
&
lfsu_
s
,
const
X
&
x_
s
,
const
X
&
z_
s
,
const
LFSV
&
lfsv_s
,
Y
&
y_
s
)
const
const
LFSU
&
lfsu_
i
,
const
X
&
x_
i
,
const
X
&
z_
i
,
const
LFSV
&
lfsv_i
,
Y
&
y_
i
)
const
{
// reuse alpha_boundary because it is linear
alpha_boundary
(
ig
,
lfsu_
s
,
z_
s
,
lfsv_
s
,
y_
s
);
alpha_boundary
(
ig
,
lfsu_
i
,
z_
i
,
lfsv_
i
,
y_
i
);
}
};
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment