-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathOdePrograms.f95
147 lines (136 loc) · 3.53 KB
/
OdePrograms.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
! adapode, Copyright (C) 2013 Michael Reed
MODULE OdePrograms
USE Constants
USE OdeSolve
IMPLICIT NONE
CONTAINS
SUBROUTINE OdeGrid(F,filename)
IMPLICIT NONE
INTEGER::i,tol,mode
INTEGER,ALLOCATABLE::c(:)
CHARACTER::output,label
CHARACTER(LEN=*),INTENT(IN)::filename
REAL(dbl)::tmax,tmin
REAL(dbl),ALLOCATABLE::x0(:,:),xs(:),incr(:)
REAL(dbl),ALLOCATABLE::Q(:,:)
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
ALLOCATE(incr(4))
ALLOCATE(c(4))
PRINT*
PRINT*,'================================================================'
PRINT*,'Michael Reed, ODE Solver (Grid)'
PRINT*
OPEN(11,FILE=filename)
ALLOCATE(xs(4))
! Enter lower bound
READ (11,*) xs(1),xs(2),xs(3),xs(4)
! Enter upper bound
READ (11,*) incr(1),incr(2),incr(3),incr(4)
! Enter count
READ (11,*) c(1),c(2),c(3),c(4)
! Enter tmin tmax:
READ (11,*) tmin,tmax
! Enter decimal-place tolerance (e.g. 9):
READ (11,*) tol
! Enter method ID:
READ (11,*) mode
! Enter output data file name
READ (11,*) output
! Enter data file label
READ (11,*) label
CALL Generate3dGrid(x0,xs,incr,c)
CALL OdeSolveGrid(F,Q,x0,tmin,tmax,tol,mode)
CALL SaveData(Q,output,filename,label)
PRINT*,'Done with calculations. Data stored in "',output,'"'
PRINT*
PRINT*,'================================================================'
PRINT*,
END SUBROUTINE OdeGrid
SUBROUTINE OdeSystem(F,filename)
IMPLICIT NONE
INTEGER::i,tol,mode
CHARACTER::output,label
CHARACTER(LEN=*),INTENT(IN)::filename
REAL(dbl)::tmax,tmin
REAL(dbl),DIMENSION(4)::x0
REAL(dbl),ALLOCATABLE::Y(:,:)
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
PRINT*
PRINT*,'================================================================'
PRINT*,'Michael Reed, ODE Solver'
PRINT*
OPEN(11,FILE=filename)
! Enter initial:
READ (11,*) x0(1),x0(2),x0(3),x0(4)
! Enter tmin tmax:
READ (11,*) tmin,tmax
! Enter decimal-place tolerance (e.g. 9):
READ (11,*) tol
! Enter method ID:
READ (11,*) mode
! Enter output data file name
READ (11,*) output
! Enter data file label
READ (11,*) label
CALL OdeSolveSystem(F,Y,x0,tmin,tmax,tol,mode)
CALL SaveData(Y,output,filename,label)
PRINT*,'Done with calculations. Data stored in "',output,'"'
PRINT*
PRINT*,'================================================================'
PRINT*,
END SUBROUTINE OdeSystem
SUBROUTINE ShootingSystem(F,filename)
IMPLICIT NONE
INTEGER::i,tol,mode
CHARACTER::output,label
CHARACTER(LEN=*),INTENT(IN)::filename
REAL(dbl)::tmax,tmin
REAL(dbl),DIMENSION(4)::x0
REAL(dbl),ALLOCATABLE::Y(:,:)
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
PRINT*
PRINT*,'================================================================'
PRINT*,'Michael Reed, MA448, Project 1'
PRINT*
OPEN(11,FILE=filename)
! Enter initial:
READ (11,*) x0(1),x0(2),x0(3),x0(4)
! Enter tmin tmax:
READ (11,*) tmin,tmax
! Enter decimal-place tolerance (e.g. 9):
READ (11,*) tol
! Enter method ID:
READ (11,*) mode
! Enter data file output name
READ (11,*) output
! Enter data file label
READ (11,*) label
CALL OdeSolveSystem(F,Y,x0,tmin,tmax,tol,mode)
CALL SaveData(Y,output,filename,label)
PRINT*,'Done with calculations. Data stored in "',output,'"'
PRINT*
PRINT*,'================================================================'
PRINT*,
END SUBROUTINE ShootingSystem
END MODULE OdePrograms