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
|
PROGRAM integrator
USE quadratures
USE functions
IMPLICIT none
real(kind=8) :: ibeg, iend, val
integer(kind=4) :: poly_order
procedure(integrate), pointer :: numerical_int
procedure(funint), pointer :: fun
procedure(analytical_integral), pointer :: analytical_int
character(100) :: arg
IF (command_argument_count() < 4) STOP "4 arguments required"
call get_command_argument(2, arg)
IF (arg == "exp") THEN
fun => my_exp
analytical_int => my_exp_int
ELSE IF (arg == "sin") THEN
fun => my_sin
analytical_int => my_sin_int
ELSE IF (arg == "poly") THEN
fun => my_poly
analytical_int => my_poly_int
ELSE
STOP "bad second argument (should be 'exp', 'sin' or 'poly')"
END IF
call get_command_argument(3, arg)
read (arg,*) ibeg
call get_command_argument(4, arg)
read (arg,*) iend
call get_command_argument(1, arg)
IF (arg == "gauss") THEN
numerical_int => gauss
ELSE IF (arg == "newton-cotes") THEN
numerical_int => newton_cotes
ELSE IF (arg == "analytical") THEN
IF (this_image() == 1) write (*,*) analytical_int(ibeg, iend)
STOP
ELSE
STOP "bad first argument (should be 'gauss', 'newton-cotes'" &
// " or 'analytical')"
END IF
IF (command_argument_count() < 5) &
STOP "5th argument (polynomial order) required" &
// " for numerical integration"
call get_command_argument(5, arg)
read (arg,*) poly_order
IF (command_argument_count() > 5) THEN
call get_command_argument(6, arg)
read (arg,*) subintervals
IF (subintervals < 1) STOP "subintervals number must be positive"
END IF
val = numerical_int(ibeg, iend, fun, poly_order)
IF (this_image() == 1) write (*,*) val
END PROGRAM integrator
|