everything you always wanted to know about 1oomph-lib but ......everything you always wanted to know...

Post on 06-Aug-2020

11 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Everything you always wanted to know aboutoomph-lib but were afraid to ask

Matthias Heil, Andrew L. Hazel

Jonathan Boyle, Andy Gait, Richard Muddle, Cedric Ody, Floraine Cordier, ...

School of Mathematics, University of Manchester

http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Theory

I Implementation

I Application

I How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Why did we write it?I What is it?

I Theory

I Implementation

I Application

I How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Why did we write it?I What is it?

I TheoryI The mathematical framework

I Implementation

I Application

I How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Why did we write it?I What is it?

I TheoryI The mathematical framework

I ImplementationI What is object-orientation and why is it good for you?

I Application

I How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Why did we write it?I What is it?

I TheoryI The mathematical framework

I ImplementationI What is object-orientation and why is it good for you?

I ApplicationI An example: Cedric Ody’s micro-fluidics problem.

I How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

OverviewI Background

I Why did we write it?I What is it?

I TheoryI The mathematical framework

I ImplementationI What is object-orientation and why is it good for you?

I ApplicationI An example: Cedric Ody’s micro-fluidics problem.

I How to get startedI Documentation and webpages.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: What we [used to] do...E.g.: Biologically-motivated, fluid-structure interaction problems

Steady flow in a collapsible tube. Surface-tension-driven airway collapse

I Code development is typically driven by the demands of aspecific physical/physiological problem ⇒ custom-made codeswith little systematic code reuse.

I No common codebase ⇒ lots of wasted timere-writing/adapting (and debugging!) code.

I Develop an object-oriented library (C++) to solve general,multi-physics problems: oomph-lib.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: What we [used to] do...E.g.: Biologically-motivated, fluid-structure interaction problems

Steady flow in a collapsible tube. Surface-tension-driven airway collapse

I Code development is typically driven by the demands of aspecific physical/physiological problem ⇒ custom-made codeswith little systematic code reuse.

I No common codebase ⇒ lots of wasted timere-writing/adapting (and debugging!) code.

I Develop an object-oriented library (C++) to solve general,multi-physics problems: oomph-lib.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: [Multi-physics] challengesI Interaction between field equations in the same domain.

I Interaction between field equations in different domains.

I “Non-standard” problems.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: [Multi-physics] challengesI Interaction between field equations in the same domain.

I Examples: Thermo-elasticity, thermal convection,reaction-diffusion, ...

I Source terms/coefficients in one system of PDEs depend onthe solution of another system of PDEs and vice versa.

I Interaction between field equations in different domains.

I “Non-standard” problems.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: [Multi-physics] challengesI Interaction between field equations in the same domain.

I Examples: Thermo-elasticity, thermal convection,reaction-diffusion, ...

I Source terms/coefficients in one system of PDEs depend onthe solution of another system of PDEs and vice versa.

I Interaction between field equations in different domains.I Examples: Fluid-structure interaction, free-surface

Navier-Stokes, ....I Deformation of an elastic structure affects the geometry of the

fluid domain; fluid flow affects the deformation of the elasticstructure.

I “Non-standard” problems.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: [Multi-physics] challengesI Interaction between field equations in the same domain.

I Examples: Thermo-elasticity, thermal convection,reaction-diffusion, ...

I Source terms/coefficients in one system of PDEs depend onthe solution of another system of PDEs and vice versa.

I Interaction between field equations in different domains.I Examples: Fluid-structure interaction, free-surface

Navier-Stokes, ....I Deformation of an elastic structure affects the geometry of the

fluid domain; fluid flow affects the deformation of the elasticstructure.

I “Non-standard” problems.I Examples: Coupling asymptotic approximations to the

“full” equationsI Outflow boundary conditions for Navier-Stokes, based on

long-wave approximation for flow downstream.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Background: [Multi-physics] challengesI Interaction between field equations in the same domain.

I Interaction between field equations in different domains.

I “Non-standard” problems.

Want to provide a framework that faciliates the formulation of suchproblems within a modern scientific computing environment, offering

I spatial and temporal adaptivity

I capability to deal with free-boundary problems

I parallelisation

I sophisticated solvers

I ...

while allowing maximum code-reuse.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib: What is it?oomph-lib is:

I an object-oriented, open-source finite-element library for thesimulation of multi-physics problems.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib: What is it?oomph-lib is:

I an object-oriented, open-source finite-element library for thesimulation of multi-physics problems.

oomph-lib is not:

I a GUI-based, mouse-driven ”package”.

I You must write your own C++ driver codes to specify yourproblem, using oomph-lib’s high-level objects.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib: What is it?oomph-lib is:

I an object-oriented, open-source finite-element library for thesimulation of multi-physics problems.

oomph-lib is not:

I a GUI-based, mouse-driven ”package”.

I You must write your own C++ driver codes to specify yourproblem, using oomph-lib’s high-level objects.

oomph-lib provides the infrastructure for the problem formulationand solution.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib: What is it?oomph-lib is:

I an object-oriented, open-source finite-element library for thesimulation of multi-physics problems.

oomph-lib is not:

I a GUI-based, mouse-driven ”package”.

I You must write your own C++ driver codes to specify yourproblem, using oomph-lib’s high-level objects.

oomph-lib provides the infrastructure for the problem formulationand solution.

The library contains a large number of elements, meshes, timestep-pers, solvers, etc. which can be combined to solve “any” problem.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI Robustness

I Generality

I Simple top-level “user” interfaces

I Efficiency

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI Robustness

I “Robust algorithms are better than fast-but-flaky ones”I Extensive optional self-tests (via PARANOID flags)I Installation based on GNU autotools

I Generality

I Simple top-level “user” interfaces

I Efficiency

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI RobustnessI Generality

I Easy to formulate “exotic” problemsI Easy to combine single-physics capabilities in multi-physics

problems

I Simple top-level “user” interfaces

I Efficiency

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI Robustness

I Generality

I Simple top-level “user” interfacesint main()

{// Create problem

MyReallyHardProblem problem;

// Solve

problem.newton solve();

// Post process

problem.doc solution();

}I Efficiency

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI Robustness

I Generality

I Simple top-level “user” interfacesI Efficiency

I “Raw speed” is less important than robustness. However, thisis not an excuse for inefficiency!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

General Approach/Design PhilosophyI Robustness

I Generality

I Simple top-level “user” interfacesI Efficiency

I =⇒ Spatial and temporal adaptivity are essential and must beimplemented in “user-friendly” fashion:int main()

{[...]

// Solve the problem, allowing for up to

// 4 rounds of spatial adaptation

unsigned max adapt=4;

problem.newton solve(max adapt);

[...]

}

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework

I Spatial/[implicit] temporal discretisation of “any” problemleads to a system of (non)linear algebraic equations.

I All problems are treated “monolithically” and are assumed tobe nonlinear.

I Use Newton’s method as default solver.

unew = uold + δu, where J · δu = −R

and J is the Jacobian matrix Jij ≡∂Ri

∂uj.

I Solves linear problems in one step.I Quadratic convergence for non-linear problems.I =⇒ Robust if used together with continuation or timestepping.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework

I Spatial/[implicit] temporal discretisation of “any” problemleads to a system of (non)linear algebraic equations.

I All problems are treated “monolithically” and are assumed tobe nonlinear.

I Use Newton’s method as default solver.

unew = uold + δu, where J · δu = −R

and J is the Jacobian matrix Jij ≡∂Ri

∂uj.

I Solves linear problems in one step.I Quadratic convergence for non-linear problems.I =⇒ Robust if used together with continuation or timestepping.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework

I Spatial/[implicit] temporal discretisation of “any” problemleads to a system of (non)linear algebraic equations.

I All problems are treated “monolithically” and are assumed tobe nonlinear.

I Use Newton’s method as default solver.

unew = uold + δu, where J · δu = −R

and J is the Jacobian matrix Jij ≡∂Ri

∂uj.

I Solves linear problems in one step.I Quadratic convergence for non-linear problems.I =⇒ Robust if used together with continuation or timestepping.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall frameworkI Finite-element-type framework, based on element-by-element

assembly of the discretised problem’s residual vector R andJacobian matrix J

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall frameworkI Finite-element-type framework, based on element-by-element

assembly of the discretised problem’s residual vector R andJacobian matrix J

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework“Solving the problem” requires:

1. “Assembly” of the Jacobian matrix and residual vector

2. Solution of the linear system(s)

3. Error estimation/problem adaptation.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework1. “Assembly” of the Jacobian matrix and residual vector

I This is oomph-lib’s main task.I Fully parallelised (MPI).

2. Solution of the linear system(s)

3. Error estimation/problem adaptation.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework1. “Assembly” of the Jacobian matrix and residual vector

I This is oomph-lib’s main task.I Fully parallelised (MPI).

2. Solution of the linear system(s)I oomph-lib provides LinearSolver objects – wrappers to

state-of-the-art linear system solvers (HSL frontal solvers;SuperLU serial and parallel sparse matrix solvers; Hypre andTrilinos iterative solvers, both with “black-box”preconditioning strategies).

3. Error estimation/problem adaptation.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework1. “Assembly” of the Jacobian matrix and residual vector

I This is oomph-lib’s main task.I Fully parallelised (MPI).

2. Solution of the linear system(s)I oomph-lib provides LinearSolver objects – wrappers to

state-of-the-art linear system solvers (HSL frontal solvers;SuperLU serial and parallel sparse matrix solvers; Hypre andTrilinos iterative solvers, both with “black-box”preconditioning strategies).

I oomph-lib has its own IterativeLinearSolvers andproblem-specific Preconditioner classes, e.g. for FSIproblems (Jonathan Boyle, Richard Muddle).

3. Error estimation/problem adaptation.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Theory: The overall framework1. “Assembly” of the Jacobian matrix and residual vector

I This is oomph-lib’s main task.I Fully parallelised (MPI).

2. Solution of the linear system(s)I oomph-lib provides LinearSolver objects – wrappers to

state-of-the-art linear system solvers (HSL frontal solvers;SuperLU serial and parallel sparse matrix solvers; Hypre andTrilinos iterative solvers, both with “black-box”preconditioning strategies).

I oomph-lib has its own IterativeLinearSolvers andproblem-specific Preconditioner classes, e.g. for FSIproblems (Jonathan Boyle, Richard Muddle).

3. Error estimation/problem adaptation.I Z2 error estimator available for a wide range of equations.I Fully automatic mesh adaptation, based on generalised

QuadTree and OcTree procedures (parallelisation in progress[Andy Gait]).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientationObservation:

I Huge code (≈ 280,000 lines of C++ code; this is notunusual).

I Multiple authors, simultaneously working on the same code.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientationObservation:

I Huge code (≈ 280,000 lines of C++ code; this is notunusual).

I Multiple authors, simultaneously working on the same code.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientationObservation:

I Huge code (≈ 280,000 lines of C++ code; this is notunusual).

I Multiple authors, simultaneously working on the same code.(if not, the project dies with each graduating PhD studentand has to be re-invented with/by the next one...)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientationObservation:

I Huge code (≈ 280,000 lines of C++ code; this is notunusual).

I Multiple authors, simultaneously working on the same code.(if not, the project dies with each graduating PhD studentand has to be re-invented with/by the next one...)

=⇒ The challenge:

1. Code complexity: How does one manage code of this size (i.e.“keep its structure in one’s head”).

2. Code maintenance: How can you work on (improve!) one partof the code without affecting everybody else?

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientationObservation:

I Huge code (≈ 280,000 lines of C++ code; this is notunusual).

I Multiple authors, simultaneously working on the same code.(if not, the project dies with each graduating PhD studentand has to be re-invented with/by the next one...)

=⇒ The challenge:

1. Code complexity: How does one manage code of this size (i.e.“keep its structure in one’s head”).

2. Code maintenance: How can you work on (improve!) one partof the code without affecting everybody else?

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientation=⇒ The challenge:

1. Code complexity: How does one manage code of this size (i.e.“keep its structure in one’s head”).

2. Code maintenance: How can you work on (improve!) one partof the code without affecting everybody else?

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientation=⇒ The challenge:

1. Code complexity: How does one manage code of this size (i.e.“keep its structure in one’s head”).

2. Code maintenance: How can you work on (improve!) one partof the code without affecting everybody else?

The solution: Object-orientation

I Encapsulation: Combine data into small logical units(objects) and allow the “user” to interact with these (only!)via clearly defined interfaces.

I Inheritance: Construct more complex objects by adding newfunctionality to already existing simpler ones, leading to ahierarchical data structure.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Implementation and object-orientation=⇒ The challenge:

1. Code complexity: How does one manage code of this size (i.e.“keep its structure in one’s head”).

2. Code maintenance: How can you work on (improve!) one partof the code without affecting everybody else?

The solution: Object-orientation

I Encapsulation: Combine data into small logical units(objects) and allow the “user” to interact with these (only!)via clearly defined interfaces.

I Inheritance: Construct more complex objects by adding newfunctionality to already existing simpler ones, leading to ahierarchical data structure.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Object-orientation: Astraightforward example

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureI The ultimate purpose of most scientific computations is to

compute a large set of (double precision) numbers.

I How do we “package” these up in a sensible way?

I Data as an example of straightforward inheritance.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureI The ultimate purpose of most scientific computations is to

compute a large set of (double precision) numbers.

I How do we “package” these up in a sensible way?

I Data as an example of straightforward inheritance.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureI The ultimate purpose of most scientific computations is to

compute a large set of (double precision) numbers.

I How do we “package” these up in a sensible way?

I Data as an example of straightforward inheritance.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Value (double precision number)

I Has associated (global) equation numbers

I Has associated “History values”

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Important:

I “User” interacts with objects only through the member functions.

I Internal implementation is irrelevant (and deliberately hidden!).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

NodeNodeNodeI Is Data.

I Has a Position

↑↑↑

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

NodeNodeNodeI Is Data.

I Has a Position

↑↑↑

DataDataDataI Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

NodeNodeNodeI Is Data.

I Has a Position

Some member functions:

Node::dim()Node::x(i)

↑↑↑DataDataData

I Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

SolidNodeSolidNodeSolidNodeI Is Node.

I Position represented by Data.

↑↑↑

NodeNodeNodeI Is Data.

I Has a Position

Some member functions:

Node::dim()Node::x(i)

↑↑↑DataDataData

I Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

SolidNodeSolidNodeSolidNodeI Is Node.

I Position represented by Data.

↑↑↑

NodeNodeNodeI Is Data.

I Has a Position

Some member functions:

Node::dim()Node::x(i)

↑↑↑DataDataData

I Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structure

SolidNodeSolidNodeSolidNodeI Is Node.

I Position represented by Data.

Some member functions:

SolidNode::x(i)SolidNode::pin position(i)

↑↑↑NodeNodeNode

I Is Data.

I Has a Position

Some member functions:

Node::dim()Node::x(i)

↑↑↑DataDataData

I Has Values (double precision numbers)

I Has associated (global) equation numbers

I Has associated “History values”

Some member functions:

Data::nvalue()Data::value(j)Data::eqn number(j)Data::pin(j)

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureImportant features:

I Hierarchical data structure.

I Implementation is hidden.

I Derived classes “inherit” existing functionality.

I Derived classes can “overload” existing functionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureImportant features:

I Hierarchical data structure.

I Implementation is hidden.

I Derived classes “inherit” existing functionality.

I Derived classes can “overload” existing functionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureImportant features:

I Hierarchical data structure.

I Implementation is hidden.

I Derived classes “inherit” existing functionality.

I Derived classes can “overload” existing functionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example of oomph-lib’s object-oriented data structureImportant features:

I Hierarchical data structure.

I Implementation is hidden.

I Derived classes “inherit” existing functionality.

I Derived classes can “overload” existing functionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall datastructure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

oomph-lib’s overall data structure

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Object-orientation: A moresophisticated example

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)ElementsI (Virtual) base classes establish the required common

functionality and implement generic tasks.

I Specific implementations are delayed to derived classes whichoften use templating for dimension-independent formulation ofentire families of objects (elements).

Example:

I Every “element” must be able to compute its contribution tothe global residual vector and Jacobian matrix.

I Define the interfaces in the base class GeneralisedElement:

GeneralisedElement::get residual(...)GeneralisedElement::get jacobian(...)

...but delay their implementation to a specific derived element.

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.I “Drop” your own equations into the overall framework,

“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)ElementsI (Virtual) base classes establish the required common

functionality and implement generic tasks.

I Specific implementations are delayed to derived classes whichoften use templating for dimension-independent formulation ofentire families of objects (elements).

Example:

I Every “element” must be able to compute its contribution tothe global residual vector and Jacobian matrix.

I Define the interfaces in the base class GeneralisedElement:

GeneralisedElement::get residual(...)GeneralisedElement::get jacobian(...)

...but delay their implementation to a specific derived element.

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.I “Drop” your own equations into the overall framework,

“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)ElementsI (Virtual) base classes establish the required common

functionality and implement generic tasks.

I Specific implementations are delayed to derived classes whichoften use templating for dimension-independent formulation ofentire families of objects (elements).

Example:

I Every “element” must be able to compute its contribution tothe global residual vector and Jacobian matrix.

I Define the interfaces in the base class GeneralisedElement:

GeneralisedElement::get residual(...)GeneralisedElement::get jacobian(...)

...but delay their implementation to a specific derived element.

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.I “Drop” your own equations into the overall framework,

“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)ElementsI (Virtual) base classes establish the required common

functionality and implement generic tasks.

I Specific implementations are delayed to derived classes whichoften use templating for dimension-independent formulation ofentire families of objects (elements).

Example:

I Every “element” must be able to compute its contribution tothe global residual vector and Jacobian matrix.

I Define the interfaces in the base class GeneralisedElement:

GeneralisedElement::get residual(...)GeneralisedElement::get jacobian(...)

...but delay their implementation to a specific derived element.

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.I “Drop” your own equations into the overall framework,

“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)Elements

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.I “Drop” your own equations into the overall framework,

“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)Elements

I Geometry is isolated from equations.

I “Drop” new geometric elements into the overall framework,“recycling” existing equations.

I “Drop” your own equations into the overall framework,“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)Elements

I Geometry is isolated from equations.

I “Drop” new geometric elements into the overall framework,“recycling” existing equations.

I “Drop” your own equations into the overall framework,“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Virtual inheritance for (Finite)Elements

I Geometry is isolated from equations.I “Drop” new geometric elements into the overall framework,

“recycling” existing equations.

I “Drop” your own equations into the overall framework,“recycling” hundreds of (wo)man hours already invested intothe development and validation (!) of geometric elements,mesh generation, problem assembly, solution, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Equation classesI Some existing equation classes

I PoissonEquations<DIM>I UnsteadyHeatEquations<DIM>I LinearWaveEquations<DIM>I AdvectionDiffusionEquations<DIM>I NavierStokesEquations<DIM>I AxisymmetricNavierStokesEquationsI PVDEquations<DIM> (general displacement-based solid

mechanics; based on principle of virtual displacements)I KirchhoffLoveBeamEquationsI KirchhoffLoveShellEquationsI ...

I Clear instructions and numerous “worked examples” explainhow to formulate new equations.

I All equations classes can be combined to multi-physicselements, e.g. “Navier-Stokes + Advection Diffusion” =“Boussinesq”, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Equation classesI Some existing equation classes

I PoissonEquations<DIM>I UnsteadyHeatEquations<DIM>I LinearWaveEquations<DIM>I AdvectionDiffusionEquations<DIM>I NavierStokesEquations<DIM>I AxisymmetricNavierStokesEquationsI PVDEquations<DIM> (general displacement-based solid

mechanics; based on principle of virtual displacements)I KirchhoffLoveBeamEquationsI KirchhoffLoveShellEquationsI ...

I Clear instructions and numerous “worked examples” explainhow to formulate new equations.

I All equations classes can be combined to multi-physicselements, e.g. “Navier-Stokes + Advection Diffusion” =“Boussinesq”, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Equation classesI Some existing equation classes

I PoissonEquations<DIM>I UnsteadyHeatEquations<DIM>I LinearWaveEquations<DIM>I AdvectionDiffusionEquations<DIM>I NavierStokesEquations<DIM>I AxisymmetricNavierStokesEquationsI PVDEquations<DIM> (general displacement-based solid

mechanics; based on principle of virtual displacements)I KirchhoffLoveBeamEquationsI KirchhoffLoveShellEquationsI ...

I Clear instructions and numerous “worked examples” explainhow to formulate new equations.

I All equations classes can be combined to multi-physicselements, e.g. “Navier-Stokes + Advection Diffusion” =“Boussinesq”, etc.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Applications: An exampleproblem

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationCedric Ody’s (micro-fluidics) problem:

I Liquid plug propagating through a micro-fluidics network:What happens at the junction?

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationCedric Ody’s (micro-fluidics) problem:

I Liquid plug propagating through a micro-fluidics network:What happens at the junction?

Rupture

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationCedric Ody’s (micro-fluidics) problem:

I Liquid plug propagating through a micro-fluidics network:What happens at the junction?

Splitting

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationCedric Ody’s (micro-fluidics) problem:

I Liquid plug propagating through a micro-fluidics network:What happens at the junction?

Blockage

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationCedric Ody’s (micro-fluidics) problem:

I What is the largest pressure that a static meniscus at theend of an arbitrarily shaped parent tube can withstand?

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equation

I What is the largest pressure that a static meniscus at theend of an arbitrarily shaped parent tube can withstand?

I Governing equation

∆p = κ = const.

(∆p on the capillary scale, κ mean curvature).

I Approach: Prescribe ∆p (and thus κ) and compute shape ofmeniscus.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Example: Rectangular channels

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

H(κ) is generally not single-valued .

Example: 90o contact angle at “side wall” =⇒ “Barrel-shaped”solution.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

H(κ) is generally not single-valued .

Example: 90o contact angle at “side wall” =⇒ “Barrel-shaped”solution.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

An example: The Young-Laplace equationI Governing equation

∆p = κ = const.

I Challenges:

H(κ) is generally not single-valued .

Example: 90o contact angle at “side wall” =⇒ “Barrel-shaped”solution.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage I: Poisson

I For small deflections from “flat” state

∆p = κ ≈ −∇2h(x , y) = const.

I =⇒ Solve∇2h(x , y) = −κ

for given constant κ (i.e. imposed pressure drop).

I =⇒ A Poisson problem; trivial with existing oomph-libfunctionality.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

I Highly nonlinear but (algorithmically) trivial modification toPoisson problem. Easy to implement in oomph-lib via new“equation class”.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage II: Cartesian Young-Laplace

I For finite deflections from “flat” state

∆p = κ = −∇ · ∇h√1 + |∇h|2

= const.

I =⇒ Solve

∇ · ∇h√1 + |∇h|2

= −κ

for given constant κ (i.e. imposed pressure drop).

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA︸ ︷︷ ︸

Variationin

surfaceenergy

=

∫∆pN · δR dA︸ ︷︷ ︸

Virtualwork

done bypressure

+

∮Tn · δR dS︸ ︷︷ ︸Virtualwork

done atmoving

contact line

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

I

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

IMatthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

IMatthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

IMatthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

IMatthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Stage III: Spine-based Young-Laplace

I For non-one-to-one solutions: Use intrinsic representation ofmeniscus

R(ζ1, ζ2)

I Shape governed by variational principle

δ

∫dA =

∫∆pN · δR dA +

∮Tn · δR dS .

I Surface parametrisation by “Method of Spines”:

R(ζ1, ζ2) = B(ζ1, ζ2) + h(ζ1, ζ2) S(ζ1, ζ2)

I Can’t do H(∆p) because of limit point. Treat ∆p as an unknownand prescribe height via an additional equation:

R(ζ1 = ζ[ctrl ]1 , ζ2 = ζ

[ctrl ]2 ) · ez = Hctrl

I Implement as GeneralisedElement.

IMatthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Meniscus in T-junction

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Meniscus in T-junction

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Meniscus in T-junction

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Meniscus in T-junction

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Meniscus in T-junction

I Note (automatic) mesh adaptation.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generation

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generation

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generation

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

unsigned max adapt=3;

for (unsigned i=0;i<max adapt;i++)

{problem.newton solve();

problem.doc solution();

problem.adapt();

}Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

unsigned max adapt=3;

for (unsigned i=0;i<max adapt;i++)

{problem.newton solve();

problem.doc solution();

problem.adapt();

}Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

unsigned max adapt=3;

for (unsigned i=0;i<max adapt;i++)

{problem.newton solve();

problem.doc solution();

problem.adapt();

}Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Mesh generationStrategy:

I Start with coarse mesh and refine it automatically

Example: Poisson equation in a fish-shaped domain

∇2u = 1 in Dfish

subject to

u = 0 on ∂Dfish

unsigned max adapt=3;

for (unsigned i=0;i<max adapt;i++)

{problem.newton solve();

problem.doc solution();

problem.adapt();

}Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Adaptive mesh refinement: Implementation

I Generic implementation of non-uniform refinement in two andthree dimensions

I High-level functions are part of RefineableMesh objects.

I Generalised QuadTree and OcTree data structures used forneighbour finding & determination of weights for hangingnode constraints.

I Z2 (flux recovery) is default error estimator.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

3D Navier-Stokes: Developing flow in a pipe

• Inlet flow: 1− r20

becomes parabolic

Poiseuille profile

1− r2

• Re = 200

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

3D Navier-Stokes: Developing flow in a pipe

• Inlet flow: 1− r20

becomes parabolic

Poiseuille profile

1− r2

• Re = 200

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

3D Navier-Stokes: Developing flow in a pipe

• Inlet flow: 1− r20

becomes parabolic

Poiseuille profile

1− r2

• Re = 200

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

3D Navier-Stokes: Developing flow in a pipe

• Inlet flow: 1− r20

becomes parabolic

Poiseuille profile

1− r2

• Re = 200

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

3D Navier-Stokes: Developing flow in a pipe

• Inlet flow: 1− r20

becomes parabolic

Poiseuille profile

1− r2

• Re = 200

Note how the mesh refinement picks up the curvilinear boundary!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Interfaces to third-party mesh generatorsI For most of “our own” problems, hand-coded meshes are easy

to write.

I For very complex geometries this is not feasible.I oomph-lib provides interfaces to (open-source) third-party

mesh generators:I J.R. Shewchuk’s TriangleI Hang Si’s TetGenI Barry Joe’s Geompack++

I Interfaces to other (commercial) mesh generators could easilybe developed.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Interfaces to third-party mesh generatorsI For most of “our own” problems, hand-coded meshes are easy

to write.

I For very complex geometries this is not feasible.

I oomph-lib provides interfaces to (open-source) third-partymesh generators:

I J.R. Shewchuk’s TriangleI Hang Si’s TetGenI Barry Joe’s Geompack++

I Interfaces to other (commercial) mesh generators could easilybe developed.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Interfaces to third-party mesh generatorsI For most of “our own” problems, hand-coded meshes are easy

to write.

I For very complex geometries this is not feasible.I oomph-lib provides interfaces to (open-source) third-party

mesh generators:I J.R. Shewchuk’s TriangleI Hang Si’s TetGenI Barry Joe’s Geompack++

I Interfaces to other (commercial) mesh generators could easilybe developed.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Interfaces to third-party mesh generatorsI For most of “our own” problems, hand-coded meshes are easy

to write.

I For very complex geometries this is not feasible.I oomph-lib provides interfaces to (open-source) third-party

mesh generators:I J.R. Shewchuk’s TriangleI Hang Si’s TetGenI Barry Joe’s Geompack++

I Interfaces to other (commercial) mesh generators could easilybe developed.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

1. Draw domain boundaries in xfig and save as hole.fig, say.

2. Run conversion script ./fig2poly hole.fig to convert intoinput file for Triangle.

3. Run Triangle.

4. Read Triangle mesh file from oomph-lib to create mesh:

5. Solve problem with oomph-lib:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

I Also works for more complicated geometries:

I Finite-Reynolds-number flow past the oomph-lib logo.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

I Also works for more complicated geometries:

I Finite-Reynolds-number flow past the oomph-lib logo.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: Triangle + xfigI During a rainy Sunday afternoon we developed an interface

between xfig and Triangle:

I Also works for more complicated geometries:

I Finite-Reynolds-number flow past the oomph-lib logo.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Third-party mesh generators: TetgenI Tetgen mesh for a cube containing another cube

I Flow field induced by rising inner cube:

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Post-processing

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) plotting package.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

However,

I oomph-lib’s default output is in ascii format and is easy tounderstand.

I Data can be displayed in gnuplot.

I Data can be converted to other (open source) plottingpackages: Angelo Simone (TU Delft) has developed aconversion script to paraview.

I Output can be customised!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

However,

I oomph-lib’s default output is in ascii format and is easy tounderstand.

I Data can be displayed in gnuplot.

I Data can be converted to other (open source) plottingpackages: Angelo Simone (TU Delft) has developed aconversion script to paraview.

I Output can be customised!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

However,

I oomph-lib’s default output is in ascii format and is easy tounderstand.

I Data can be displayed in gnuplot.

I Data can be converted to other (open source) plottingpackages: Angelo Simone (TU Delft) has developed aconversion script to paraview.

I Output can be customised!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Visualisation of results...and now for the embarrasing bit:

I By default oomph-lib outputs data in tecplot format.

I Tecplot is a (fantastic) commerical plotting package.

However,

I oomph-lib’s default output is in ascii format and is easy tounderstand.

I Data can be displayed in gnuplot.

I Data can be converted to other (open source) plottingpackages: Angelo Simone (TU Delft) has developed aconversion script to paraview.

I Output can be customised!

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

How to get started

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

How to get started

I Have a look around the oomph-lib webpage:

http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Navigating around http://www.oomph-lib.org

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

Acknowledgements/Current WorkSome current/recent projects:

I Jonathan Boyle: Self-excited oscillations in 3D collapsible tube flow; FSI.

I Alberto Lozar: 3D Bubble propagation in rectangular tubes

I Phil Haines: Self-similar vs. Navier-Stokes solutions in Jeffrey Hamel flow

I Richard Muddle: Block preconditioning, biharmonic equations

I Andy Gait: Parallel mesh adaptation

I Angelo Simone: Biofilms

I Rich Hewitt: Simulation of Long’s vortex

I Natasha Willoughby: Homogenisation

I Chris Glasman: Maxwell’s equations

Ongoing work ([nearly] complete but not yet documented)

I Eigenvalue problems

I Continuation and bifurcation tracking

I Hartree-Fock

I ...

Matthias Heil, Andrew L. Hazel Everything you always wanted to know about oomph-lib but were afraid to ask

top related