aboutsummaryrefslogtreecommitdiff
path: root/src/main.f90
blob: 8c7467aa5535a4d778daa48f84b6750c3185b965 (plain)
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