PROGRAM integrator USE quadratures USE functions USE iso_fortran_env, ONLY: error_unit 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, errmsg logical :: isok = .true. IF (command_argument_count() < 4) THEN errmsg = "at least 4 arguments required" isok = .false. GOTO 1 END IF 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 errmsg = "bad second argument (should be 'exp', 'sin' or 'poly')" isok = .false. GOTO 1 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) GOTO 1 ELSE errmsg = "bad first argument (should be 'gauss'," & // " 'newton-cotes' or 'analytical')" isok = .false. GOTO 1 END IF IF (command_argument_count() < 5) THEN errmsg = "5th argument (polynomial order) required" & // " for numerical integration" isok = .false. GOTO 1 END IF 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) THEN errmsg = "subintervals number must be positive" isok = .false. GOTO 1 END IF END IF val = numerical_int(ibeg, iend, fun, poly_order) if (this_image() == 1) write (*,*) val 1 if (this_image() == 1 .and. .not. isok) write(*,*) trim(errmsg) CONTAINS END PROGRAM integrator