Solving partial differential equations (PDEs)
Hans Fangohr
Engineering and the Environment University of Southampton
United Kingdom
May 3, 2012
Outline I
1 Introduction: what are PDEs?
2 Computing derivatives using finite differences 3 Diffusion equation
4 Recipe to solve 1d diffusion equation
5 Boundary conditions, numerics, performance 6 Finite elements
7 Summary
This lecture
tries to compress several years of material into 45 minutes has lecture notes and code available for download at
http://www.soton.ac.uk/∼fangohr/teaching/comp6024
What are partial differential equations (PDEs)
Ordinary Differential Equations (ODEs)
one independent variable, for exampletin
d2x
dt2 =−
k mx
often the indepent variable tis the time
solution is functionx(t)
important for dynamical systems, population growth, control, moving particles
Partial Differential Equations (ODEs)
multiple independent variables, for examplet,x andy in
∂u ∂t =D ∂2u ∂x2 + ∂2u ∂y2 solution is functionu(t, x, y)
important for fluid dynamics, chemistry,
electromagnetism, . . . , generally problems with spatial resolution
2d Diffusion equation
∂u ∂t =D ∂2u ∂x2 + ∂2u ∂y2u(t, x, y)is the concentration [mol/m3]
t is the time [s]
xis the x-coordinate [m]
y is the y-coordinate [m]
D is the diffusion coefficient [m2/s]
Also known as Fick’s second law. The heat equation has the
same structure (andu represents the temperature).
Example:
http://www.youtube.com/watch?v=WC6Kj5ySWkQ
Examples of PDEs
Cahn Hilliard Equation (phase separation)
Fluid dynamics (including ocean and atmospheric models, plasma physics, gas turbine and aircraft modelling) Structural mechanics and vibrations, superconductivity, micromagnetics, . . .
Computing derivatives
using finite differences
Overview
Motivation:
We need derivatives of functions for example for optimisation and root finding algorithms
Not always is the function analytically known (but we are usually able to compute the function numerically) The material presented here forms the basis of the finite-difference technique that is commonly used to solve ordinary and partial differential equations.
The following slides show
the forward difference technique
the backward difference technique and the central difference technique to approximate the derivative of a function.
We also derive the accuracy of each of these methods.
The 1st derivative
(Possible) Definition of the derivative (or “differential
operator” ddx)
f0(x)≡ df
dx(x) = limh→0
f(x+h)−f(x)
h
Use differenceoperator to approximate differential operator f0(x) = df dx(x) = limh→0 f(x+h)−f(x) h ≈ f(x+h)−f(x) h
⇒can now compute an approximation of f0(x)simply by
evaluating f (twice).
This is called theforward difference because we use f(x)
and f(x+h).
Important questions: How accurate is this approximation?
Accuracy of the forward difference
Formal derivation using the Taylor series of f aroundx
f(x+h) = ∞ X n=0 hnf (n)(x) n! = f(x) +hf0(x) +h2f 00(x) 2! +h 3f000(x) 3! +. . . Rearranging forf0(x) hf0(x) =f(x+h)−f(x)−h2f 00(x) 2! −h 3f000(x) 3! −. . . f0(x) = 1 h f(x+h)−f(x)−h2f 00(x) 2! −h 3f000(x) 3! −. . . = f(x+h)−f(x) h − h2f002!(x)−h3f0003!(x) h −. . . = f(x+h)−f(x) h −h f00(x) 2! −h 2f000(x) 3! −. . . 10 / 47
Accuracy of the forward difference (2)
f0(x) = f(x+h)−f(x) h −h f00(x) 2! −h 2f 000(x) 3! −. . . | {z } Eforw(h) f0(x) = f(x+h)−f(x) h +Eforw(h)Therefore, the error termEforw(h) is
Eforw(h) = −h
f00(x) 2! −h
2f000(x) 3! −. . . Can also be expressed as
f0(x) = f(x+h)−f(x)
h +O(h)
The 1st derivative using the backward difference
Another definition of the derivative (or “differential operator” ddx)
df
dx(x) = limh→0
f(x)−f(x−h)
h
Use difference operator to approximate differential operator df dx(x) = limh→0 f(x)−f(x−h) h ≈ f(x)−f(x−h) h
This is called thebackward difference because we use
f(x) and f(x−h).
How accurate is the backward difference?
Accuracy of the backward difference
Formal derivation using the Taylor Series off aroundx
f(x−h) = f(x)−hf0(x) +h2f 00(x) 2! −h 3f 000(x) 3! +. . . Rearranging forf0(x) hf0(x) =f(x)−f(x−h) +h2f 00(x) 2! −h 3f000(x) 3! −. . . f0(x) = 1 h f(x)−f(x−h) +h2f 00(x) 2! −h 3f000(x) 3! −. . . = f(x)−f(x−h) h + h2f002!(x)−h3f0003!(x) h −. . . = f(x)−f(x−h) h +h f00(x) 2! −h 2f000(x) 3! −. . . 13 / 47
Accuracy of the backward difference (2)
f0(x) = f(x)−f(x−h) h +h f00(x) 2! −h 2f 000(x) 3! −. . . | {z } Eback(h) f0(x) = f(x)−f(x−h) h +Eback(h) (1)Therefore, the error termEback(h) is
Eback(h) = h f00(x) 2! −h 2f 000(x) 3! −. . . Can also be expressed as
f0(x) = f(x)−f(x−h)
h +O(h)
Combining backward and forward differences (1)
The approximations are forward: f0(x) = f(x+h)−f(x) h +Eforw(h) (2) backward f0(x) = f(x)−f(x−h) h +Eback(h) (3) Eforw(h) = −h f00(x) 2! −h 2f000(x) 3! −h 3f0000(x) 4! −h 4f00000(x) 5! −. . . Eback(h) = h f00(x) 2! −h 2f000(x) 3! +h 3f0000(x) 4! −h 4f00000(x) 5! +. . .
⇒Add equations (2) and (3) together, then the error cancels
partly!
Combining backward and forward differences (2)
Add these lines together
f0(x) = f(x+h)−f(x) h +Eforw(h) f0(x) = f(x)−f(x−h) h +Eback(h) 2f0(x) = f(x+h)−f(x−h) h +Eforw(h) +Eback(h)
Adding the error terms:
Eforw(h) +Eback(h) =−2h2
f000(x) 3! −2h
4f00000(x) 5! −. . .
The combined (central) difference operator is
f0(x) = f(x+h)−f(x−h) 2h +Ecent(h) with Ecent(h) =−h2f 000(x) 3! −h 4f00000(x) 5! −. . . 16 / 47
Central difference
Can be derived (as on previous slides) by adding forward and backward difference
Can also be interpreted geometrically by defining the differential operator as
df
dx(x) = limh→0
f(x+h)−f(x−h) 2h
and taking the finite difference form df
dx(x)≈
f(x+h)−f(x−h) 2h
Error of the central difference is onlyO(h2), i.e. better than forward or backward difference
It is generally the case that symmetric differences are more accurate than asymmetric expressions.
Example (1)
Using forward difference to estimate the derivative of
f(x) = exp(x) f0(x)≈fforw0 = f(x+h)−f(x) h = exp(x+h)−exp(x) h Numerical example: h= 0.1, x= 1
f0(1) ≈fforw0 (1.0) = exp(1.1)0.−1exp(1) = 2.8588
Exact answers isf0(1.0) = exp(1) = 2.71828
(Central diff: fcent0 (1.0) = exp(1+0.1)0−.2exp(1−0.1)= 2.72281)
Example (2)
Comparison: forward difference, central difference and exact derivative off(x) = exp(x) 0 1 2 3 4 5 x 0 20 40 60 80 100 120 140 df/dx(x)
Approximations of df/dx for f(x)=exp(x)
forward h=1
central h=1
forward h=0.0001
exact
Summary
Can approximate derivatives off numerically using only
function evaluations of f
size of step hvery important
central differences has smallest error term
name formula error
forward f0(x) = f(x+hh)−f(x) O(h) backward f0(x) = f(x)−hf(x−h) O(h) central f0(x) = f(x+h)2−hf(x−h) O(h2)
Appendix: source to compute figure on page
19
I
EPS =1 # v e r y l a r g e E P S to p r o v o k e i n a c c u r a c y def f o r w a r d d i f f ( f , x , h = EPS ): # df / dx = ( f ( x + h ) - f ( x ) )/ h + O ( h ) r e t u r n ( f ( x + h ) - f ( x ) )/ h def b a c k w a r d d i f f ( f , x , h = EPS ): # df / dx = ( f ( x ) - f ( x - h ) )/ h + O ( h ) r e t u r n ( f ( x ) - f ( x - h ) )/ h def c e n t r a l d i f f ( f , x , h = EPS ): # df / dx = ( f ( x + h ) - f ( x - h ) ) / h + O ( h ^ 2 ) r e t u r n ( f ( x + h ) - f ( x - h ) ) / ( 2 * h ) if _ _ n a m e _ _ == " _ _ m a i n _ _ " : # c r e a t e e x a m p l e p l o t i m p o r t p y l a b i m p o r t n u m p y as np a =0 # l e f t a n d b =5 # r i g h t l i m i t s f o r x N =11 # s t e p s 21 / 47Appendix: source to compute figure on page
19
II
def f ( x ): " " " O u r t e s t f u n t i o n w i t h c o n v e n i e n t p r o p e r t y t h a t df / dx = f " " " r e t u r n np . exp ( x ) xs = np . l i n s p a c e ( a , b , N ) f o r w a r d = [] f o r w a r d _ s m a l l _ h = [] c e n t r a l = [] for x in xs : f o r w a r d . a p p e n d ( f o r w a r d d i f f ( f , x ) ) c e n t r a l . a p p e n d ( c e n t r a l d i f f ( f , x ) ) f o r w a r d _ s m a l l _ h . a p p e n d ( f o r w a r d d i f f ( f , x , h =1 e - 4 ) ) p y l a b . f i g u r e ( f i g s i z e =(6 ,4)) p y l a b . a x i s ([ a , b ,0 , np . exp ( b )]) p y l a b . p l o t ( xs , forward , ’ ^ ’ , l a b e l = ’ f o r w a r d h =% g ’ % EPS ) p y l a b . p l o t ( xs , central , ’ x ’ , l a b e l = ’ c e n t r a l h =% g ’ % EPS ) p y l a b . p l o t ( xs , f o r w a r d _ s m a l l _ h , ’ o ’ , l a b e l = ’ f o r w a r d h =% g ’ % 1 e -4) x s f i n e = np . l i n s p a c e ( a , b , N * 1 0 0 ) 22 / 47Appendix: source to compute figure on page
19
III
p y l a b . p l o t ( xsfine , f ( x s f i n e ) , ’ - ’ , l a b e l = ’ e x a c t ’ ) p y l a b . g r i d () p y l a b . l e g e n d ( loc = ’ u p p e r l e f t ’ ) p y l a b . x l a b e l ( " x " ) p y l a b . y l a b e l ( " df / dx ( x ) " ) p y l a b . t i t l e ( " A p p r o x i m a t i o n s of df / dx for f ( x )= exp ( x ) " ) p y l a b . p l o t ()p y l a b . s a v e f i g ( ’ central - and - forward - d i f f e r e n c e . pdf ’ ) p y l a b . s h o w ()
Note: Euler’s (integration) method — derivation
using finite difference operator
Use forward difference operator to approximate differential operator dy dx(x) = limh→0 y(x+h)−y(x) h ≈ y(x+h)−y(x) h
Change differential to difference operator in ddyx =f(x, y)
f(x, y) = dy dx ≈ y(x+h)−y(x) h hf(x, y) ≈ y(x+h)−y(x) =⇒yi+1 = yi+hf(xi, yi)
⇒Euler’s method (for ODEs) can be derived from the
forward difference operator.
Note: Newton’s (root finding) method —
derivation from Taylor series
We are looking for a root,i.e. we are looking for axso that f(x) = 0.
We have an initial guessx0which we refine in subsequent iterations: xi+1=xi−hi where hi= f(xi) f0(x i) . (4) .
This equation can be derived from the Taylor series off aroundx. Suppose we guess the root to be atxandx+his the actual location of the root (sohis unknown and f(x+h) = 0):
f(x+h) = f(x) +hf0(x) +. . . 0 = f(x) +hf0(x) +. . . =⇒0 ≈ f(x) +hf0(x) ⇐⇒h ≈ −f(x) f0(x). (5) 25 / 47
The diffusion equation
Diffusion equation
The 2d operator ∂x∂22 +
∂2
∂y2 is called the Laplace
operator ∆, so that we can also write
∂u ∂t =D ∂2 ∂x2 + ∂2 ∂y2 =D∆u
The diffusion equation (with constant diffusion
coefficient D) reads ∂u∂t =D∆u where the Laplace
operator depends on the number d of spatial dimensions
d= 1: ∆ = ∂x∂22 d= 2: ∆ = ∂x∂22 + ∂2 ∂y2 d= 3: ∆ = ∂x∂22 + ∂ 2 ∂y2 + ∂ 2 ∂z2 27 / 47
1d Diffusion equation
∂u∂t=
D
∂∂x2u2In one spatial dimension, the diffusion equation reads
∂u ∂t =D
∂2u
∂x2
This is the equation we will use as an example. Let’s assume an initial concentration
u(x, t0) = σ√12πexp
−(x−xmean)2
σ2
with xmean = 0 and
width σ = 0.5. 6 4 2 0 2 4 6 x 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 u(x,t_0) (x,t0) 28 / 47
1d Diffusion eqn
∂u∂t=
D
∂∂x2u2, time integration I
Let us assume that we have some way of computing
D∂∂x2u2 at time t0 and let’s call thisg(x, t0), i.e.
g(x, t0)≡D ∂2u(x, t0) ∂x2 We like to solve ∂u(x, t) ∂t =g(x, t0)
to computeu(x, t1) at some later time t1. Use finite difference time integration scheme:
Introduce a time step size h so that t1 =t0+h.
1d Diffusion eqn
∂u∂t=
D
∂∂x2u2, time integration II
Change differential operator to forward difference operator
g(x, t0) = ∂u(x, t) ∂t = hlim→0 u(x, t0+h)−u(x, t0) h (6) ≈ u(x, t0+h)−u(x, t0) h (7)
Rearrange to find u(x, t1)≡u(x, t0+h) gives
u(x, t1)≈u(x, t0) +hg(x, t0)
We can generalise this usingti =t0+ih to read
u(x, ti+1)≈u(x, ti) +hg(x, ti) (8)
→If we can find g(x, ti), we can computeu(x, ti+1)
1d Diffusion eqn
∂u∂t=
D
∂∂x2u2, spatial part I
∂u ∂t =D
∂2u
∂x2 =g(x, t)
Need to compute g(x, t) =D∂2∂xu(x,t2 ) for a given u(x, t).
Can ignore the time dependence here, and obtain
g(x) = D∂ 2u(x) ∂x2 . Recall that ∂2u ∂x2 = ∂ ∂x ∂u ∂x
and we that know how to compute ∂u∂x using central
differences.
Second order derivatives from finite differences I
Recall central difference equation for first order derivative
df
dx(x)≈
f(x+h)−f(x−h) 2h
will be more convenient to replaceh by 12h:
df dx(x)≈ f(x+12h)−f(x−1 2h) h 32 / 47
Second order derivatives from finite differences II
Apply the central difference equation twice to obtain dd2xf2:
d2f dx2(x) = d dx df dx(x) ≈ d dx f(x+1 2h)−f(x− 1 2h) h = 1 h d dxf x+1 2h − d dxf x− 1 2h ≈ 1 h f(x+h)−f(x) h − f(x)−f(x−h) h = f(x+h)−2f(x) +f(x−h) h2 (9) 33 / 47
Recipe to solve
∂u∂t=
D
∂∂x2u21 Discretise solutionu(x, t) into discrete values 2 uij ≡u(xj, ti)where
xj ≡x0+j∆x and
ti≡t0+i∆t.
3 Start with time iteration i= 0
4 Need to know configurationu(x, ti).
5 Then compute g(x, ti) =D∂
2u
∂x2 using finite differences
(9).
6 Then compute u(x, ti+1) based ong(x, ti) using (8)
7 increasei to i+ 1, then go back to 5.
A sample solution
∂u∂t=
D
∂∂x2u2,
I
i m p o r t n u m p y as np i m p o r t m a t p l o t l i b . p y p l o t as plt i m p o r t m a t p l o t l i b . a n i m a t i o n as a n i m a t i o n a , b = -5 ,5 # s i z e of b o x N = 51 # n u m b e r of s u b d i v i s i o n s x = np . l i n s p a c e ( a , b , N ) # p o s i t i o n s of s u b d i v i s i o n s h = x [1] - x [0] # d i s c r e t i s a t i o n s t e p s i z e in x - d i r e c t i o n def t o t a l ( u ): " " " C o m p u t e s t o t a l n u m b e r of m o l e s in u . " " " r e t u r n (( b - a )/ f l o a t ( N )* np . sum ( u ))def g a u s s d i s t r ( mean , sigma , x ):
" " " R e t u r n g a u s s d i s t r i b u t i o n f o r g i v e n n u m p y a r r a y x " " " r e t u r n 1 . / ( s i g m a * np . s q r t (2* np . pi ))* np . exp ( -0.5*( x - m e a n ) * * 2 / s i g m a * * 2 ) # s t a r t i n g c o n f i g u r a t i o n f o r u ( x , t0 ) u = g a u s s d i s t r ( m e a n =0. , s i g m a =0.5 , x = x ) 35 / 47
A sample solution
∂u∂t=
D
∂∂x2u2,
II
def c o m p u t e _ g ( u , D , h ): " " " g i v e n a u ( x , t ) in array , c o m p u t e g ( x , t )= D * d ^2 u / dx ^2 u s i n g c e n t r a l d i f f e r e n c e s w i t h s p a c i n g h , a n d r e t u r n g ( x , t ). " " " d 2 u _ d x 2 = np . z e r o s ( u . shape , np . f l o a t ) for i in r a n g e (1 , len ( u ) -1): d 2 u _ d x 2 [ i ] = ( u [ i +1] - 2* u [ i ]+ u [ i - 1 ] ) / h **2 # s p e c i a l c a s e s at b o u n d a r y : a s s u m e N e u m a n b o u n d a r y # c o n d i t i o n s , i . e . no c h a n g e of u o v e r b o u n d a r y # so t h a t u [0] - u [ - 1 ] = 0 a n d t h u s u [ -1]= u [ 0 ] i =0 d 2 u _ d x 2 [ i ] = ( u [ i +1] - 2* u [ i ]+ u [ i ])/ h **2 # s a m e at o t h e r e n d so t h a t u [ N -1] - u [ N ] = 0 # a n d t h u s u [ N ]= u [ N - 1 ] i = len ( u ) -1 d 2 u _ d x 2 [ i ] = ( u [ i ] - 2* u [ i ]+ u [ i - 1 ] ) / h **2 r e t u r n D * d 2 u _ d x 2 def a d v a n c e _ t i m e ( u , g , dt ): " " " G i v e n t h e a r r a y u , t h e r a t e of c h a n g e a r r a y g , a n d a t i m e s t e p dt , c o m p u t e t h e s o l u t i o n f o r u a f t e r t , u s i n g s i m p l e E u l e r m e t h o d . " " " u = u + dt * g 36 / 47A sample solution
∂u∂t=
D
∂∂x2u2,
III
r e t u r n u # s h o w e x a m p l e , q u i c k a n d d i r t l y , l o t s of g l o b a l v a r i a b l e s dt = 0 . 0 1 # s t e p s i z e or t i m e s t e p s b e f o r e u p d a t i n g g r a p h = 20 # p l o t t i n g is s l o w D = 1. # D i f f u s i o n c o e f f i c i e n t s t e p s d o n e = 0 # k e e p t r a c k of i t e r a t i o n s def d o _ s t e p s ( j , n s t e p s = s t e p s b e f o r e u p d a t i n g g r a p h ): " " " F u n c t i o n c a l l e d by F u n c A n i m a t i o n c l a s s . C o m p u t e s n s t e p s i t e r a t i o n s , i . e . c a r r i e s f o r w a r d s o l u t i o n f r o m u ( x , t _ i ) to u ( x , t_ { i + n s t e p s } ) . " " " g l o b a l u , s t e p s d o n e for i in r a n g e ( n s t e p s ): g = c o m p u t e _ g ( u , D , h ) u = a d v a n c e _ t i m e ( u , g , dt ) s t e p s d o n e += 1 t i m e _ p a s s e d = s t e p s d o n e * dt p r i n t( " s t e p s d o n e =%5 d , t i m e =%8 gs , t o t a l ( u ) = % 8 g " % ( s t e p s d o n e , t i m e _ p a s s e d , t o t a l ( u ))) l . s e t _ y d a t a ( u ) # u p d a t e d a t a in p l o t f i g 1 . c a n v a s . d r a w ()# r e d r a w t h e c a n v a s 37 / 47A sample solution
∂u∂t=
D
∂∂x2u2,
IV
r e t u r n l , f i g 1 = plt . f i g u r e () # s e t u p a n i m a t i o n l ,= plt . p l o t ( x , u , ’b - o ’ ) # p l o t i n i t i a l u ( x , t ) # t h e n c o m p u t e s o l u t i o n a n d a n i m a t e l i n e _ a n i = a n i m a t i o n . F u n c A n i m a t i o n ( fig1 , d o _ s t e p s , r a n g e ( 1 0 0 0 0 ) ) plt . s h o w () 38 / 47Boundary conditions I
For ordinary differential equations (ODEs), we need to
know the initial value(s)to be able to compute a solution.
For partial differential equations (PDEs), we need to know the initial values and extra information about the
behaviour of the solution u(x, t) at the boundary of the
spatial domain (i.e. at x=a and x=b in this example).
Commonly used boundary conditions are
Dirichlet boundary conditions: fixu(a) =cto some
constant.
Would correspond here to some mechanism that keeps
the concentrationu at positionx=a constant.
Boundary conditions II
Neuman boundary conditions: fix the change of uacross
the boundary, i.e.
∂u
∂x(a) =c.
For positive/negativec this corresponds to an imposed concentration gradient.
Forc= 0, this corresponds to conservation of the atoms in the solution: as the gradient across the boundary cannot change, no atoms can move out of the box. (Used in our program on slide 35)
Numerical issues
The time integration scheme we use isexplicit because we
have an explicit equation that tells us how to compute
u(x, ti+1) based onu(x, ti) (equation (8) on slide 30)
An implicit scheme would computeu(x, ti+1) based on
u(x, ti)and on u(x, ti+1).
The implicit scheme is more complicated as it requires solving an additional equation system just to find
u(x, ti+1) but allows larger step sizes∆t for the time. The explicit integration scheme becomes quickly unstable
if ∆t is too large. ∆t depends on the chose spatial
discretisation ∆x.
Performance issues
Our sample code is (nearly) as slow as possible
interpreted language explicit for loops
enforced small step size from explicit scheme
Solutions:
Refactor for-loops into matrix operations and use
(compiled) matrix library (numpy for small systems, use
scipy.sparsefor larger systems)
Use library function to carry out time integration (will use implicit method if required), for example
scipy.integrate.odeint.
Finite Elements
Another widely spread way of solving PDEs is using so-called finite elements.
Mathematically, the solution u(x)for a problem like
∂2u ∂x2 =f(x) is written as u(x) = N X i=1 uiφi(x) (10)
where each ui is a number (a coefficient), and each φi(x)
a known function of space.
Theφi are calledbasis or shape functions.
Eachφi is normally chosen to be zero for nearly all x, and
to be non-zero close to a particular node in the finite element mesh.
By substitution (10) into the PDE, a matrix system can
be obtained, which – if solved – provides the coefficients
ui, and thus the solution.
Finite Elements vs Finite differences
Finite differences
are mathematically much simpler and
for simple geometries (such as cuboids) easier to program
Finite elements
have greater flexibility in the shape of the domain, the specification and implementation of boundary conditions is easier
but the basic mathematics and code is more complicated.
Practical observation on time integration
Usually, we solve the spatial part of a PDE using some
discretisation scheme such as finite differences and finite elements).
This results in a set of coupled ordinary differential equations (where time is the independent variable). Can think of this as one ODE for every cube from our discretisation.
Thistemporal part is then solved using time integration schemes for (systems of) ordinary differential equations.
Summary
Partial differential equations important in many contexts If no analytical solution known, use numerics.
Discretise the problem through
finite differences (replace differential with difference operator, corresponds to chopping space and time in little cuboids)
finite elements (project solution on localised basis functions, often used with tetrahedral meshes) related methods (finite volumes, meshless methods).
Finite elements and finite difference calculations are standard tools in many areas of engineering, physics, chemistry, but increasingly in other fields.
changeset: 53:a22b7f13329e tag: tip
user: Hans Fangohr [MBP13] <[email protected]> date: Fri Dec 16 10:57:15 2011 +0000