-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathOdeEuler.f95
59 lines (54 loc) · 1.29 KB
/
OdeEuler.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
! adapode, Copyright (C) 2013 Michael Reed
MODULE OdeEuler
USE Functions
USE Constants
IMPLICIT NONE
CONTAINS
PURE FUNCTION ExplEuler(F,x,h)
IMPLICIT NONE
REAL(dbl),INTENT(IN)::h
REAL(dbl),DIMENSION(:),INTENT(IN)::x
REAL(dbl),DIMENSION(SIZE(x))::ExplEuler
INTERFACE
PURE FUNCTION F(x)
USE Constants
IMPLICIT NONE
REAL(dbl),INTENT(IN),DIMENSION(:)::x
REAL(dbl),DIMENSION(SIZE(x))::F
END FUNCTION
END INTERFACE
ExplEuler = x + h*F(x)
END FUNCTION ExplEuler
PURE FUNCTION ImplEuler(F,x,h)
IMPLICIT NONE
REAL(dbl),INTENT(IN)::h
REAL(dbl),DIMENSION(:),INTENT(IN)::x
REAL(dbl),DIMENSION(SIZE(x))::ImplEuler
INTERFACE
PURE FUNCTION F(x)
USE Constants
IMPLICIT NONE
REAL(dbl),INTENT(IN),DIMENSION(:)::x
REAL(dbl),DIMENSION(SIZE(x))::F
END FUNCTION
END INTERFACE
! to be implemented
ImplEuler = x + h*F( x + h*F(x) )
END FUNCTION ImplEuler
PURE FUNCTION ImprovedHeun(F,x,h)
IMPLICIT NONE
REAL(dbl),INTENT(IN)::h
REAL(dbl),DIMENSION(:),INTENT(IN)::x
REAL(dbl),DIMENSION(SIZE(x))::ImprovedHeun,Fx
INTERFACE
PURE FUNCTION F(x)
USE Constants
IMPLICIT NONE
REAL(dbl),INTENT(IN),DIMENSION(:)::x
REAL(dbl),DIMENSION(SIZE(x))::F
END FUNCTION
END INTERFACE
Fx = F(x)
ImprovedHeun = x + 0.5d0*h*( Fx + F( x + h*Fx ) )
END FUNCTION ImprovedHeun
END MODULE OdeEuler