-1

I have a function (Simpson) that calculates the integral of a function (f (x, y = 5)). I want to use this same function (Simpson) to make a double integration of the function f (x, y):

F(x) = \int dy f(x,y) I = \int dx F(x)

Could I call the same function twice (Simpson) in Fortran? How would I do this in the example that I put down? I think the main idea of my question has already been made here but I have not found the answer. fortran, how to make several copies of a program using module or interface?

I'm not interested in making a copy of the function Simpson: Simpson1 Simpson2 neither to use an external package.

Best

This is the outline of the code that I'm using:

MODULE INTEG
IMPLICIT NONE
CONTAINS
REAL FUNCTION SIMPSON(FUNC,A,B,TOL)
    REAL, INTENT(IN) :: A, B, TOL
    INTERFACE
      FUNCTION FUNC (X) RESULT(OUT)
            IMPLICIT NONE
            REAL, INTEN(IN) :: X
            REAL :: OUT
       END FUNCTION 
    END INTERFACE
........
END FUNCTION SIMPSON 
END MODULE INTEG

MODULE DOING
USE INTEG
REAL :: TEMP
IMPLICIT NONE
CONTAINS
REAL FUNCTION  FUNC (X,Y) 
    IMPLICIT NONE
    REAL, INTENT(IN) :: X, Y
    REAL :: OUT
    FUNC =  X*Y
END FUNCTION FUNC

FUNCTION F(Y) RESULT(OUT2)
    REAL, INTENT(IN) :: Y
    REAL :: A, B, TOL,OUT2
    TEMP = Y
    OUT2 = SIMPSON(I1, A, B, TOL)
    CONTAINS
    REAL FUNCTION I1(X) RESULT(OUT)
        REAL, INTENT(IN) :: X
        OUT = FUNC (X,TEMP) 
    END FUNCTION I1
END FUNCTION F

    REAL FUNCTION I2(A2, B2, TOL2)
        REAL, INTENT(IN) :: A2, B2, TOL2
        I2 = SIMPSON(F, A2, B2,TOL)
    END FUNCTION I2 
END MODULE DOING

PROGRAM EXAMPLE
USE DOING
IMIPLICIT NONE
REAL :: A2, B2, TOL2, OUT3
OUT3 =  I2(A2, B2, TOL2)
END PROGRAM EXAMPLE
Community
  • 1
  • 1

1 Answers1

0

Alexander you're right.I made a mistake at some point. The following code is working

MODULE INTEG 
    IMPLICIT NONE
    CONTAINS
    REAL FUNCTION Simpson(FUN, A, B, N)
        IMPLICIT NONE
        INTERFACE
            FUNCTION FUN (X) RESULT(RESUL)
               IMPLICIT NONE
               REAL, INTENT(IN) :: X
               REAL :: RESUL 
            END FUNCTION FUN
        END INTERFACE
        INTEGER, INTENT(IN) :: N
        REAL, INTENT(IN) :: A, B

        INTEGER :: N1, N2, I
        REAL :: STEP, H, SUMA1, SUMA2

        H = (B-A)/REAL(N)

        N1 = N/2 - 1
        N2 = N/2

        SUMA1 = 0.0
        DO I = 1, N1
            STEP = A + 2*I*H
            SUMA1 = SUMA1 + FUN(STEP)
        END DO
        SUMA2 = 0.0
        DO I = 1, N2
            STEP = A + (2*I-1)*H
            SUMA2 = SUMA2 + FUN(STEP)
        END DO
       Simpson = H*( FUN(A) + 2*SUMA1 + 4*SUMA2 + FUN(B) )/3.0
   END FUNCTION Simpson   
END MODULE INTEG

MODULE DOING
    USE INTEG
    IMPLICIT NONE
    REAL :: TEMP
    CONTAINS
    REAL FUNCTION  FUNC (X,Y) 
        IMPLICIT NONE
        REAL, INTENT(IN) :: X, Y
        REAL :: OUT
        FUNC =  X*Y
    END FUNCTION FUNC

    FUNCTION F(Y) RESULT(OUT2)
      REAL, INTENT(IN) :: Y
      REAL :: A, B, TOL,OUT2
      TEMP = Y
      A = 1
      B = 3
      OUT2 = Simpson(I1, A, B, 100)
      CONTAINS
      REAL FUNCTION I1(X) RESULT(OUT)
         REAL, INTENT(IN) :: X
         OUT = FUNC (X,TEMP) 
      END FUNCTION I1
   END FUNCTION F

  REAL FUNCTION I2(A2, B2, NN)
     REAL, INTENT(IN) :: A2, B2
     INTEGER, INTENT(IN) :: NN
     I2 = Simpson(F, A2, B2,100)
  END FUNCTION I2 
END MODULE DOING

PROGRAM EXAMPLE
  USE DOING
  IMPLICIT NONE
  REAL :: A2, B2, OUT3
  A2 = 1
  B2 = 3
  OUT3 =  I2(A2, B2, 100)
  WRITE(*,*)OUT3
END PROGRAM EXAMPLE