Preview:
MODULE Pin_mod
    IMPLICIT NONE
    TYPE :: Pin_type
        INTEGER :: id
        INTEGER :: n_ring
        REAL, ALLOCATABLE :: radius(:)
    END TYPE Pin_type

CONTAINS

    SUBROUTINE init_pin(p, id, n_ring, rad)
        TYPE(Pin_type), INTENT(OUT) :: p
        INTEGER, INTENT(IN) :: id, n_ring
        REAL, INTENT(IN) :: rad(:)

        p%id = id
        p%n_ring = n_ring
        ALLOCATE(p%radius(n_ring))
        p%radius = rad(1:n_ring)
    END SUBROUTINE init_pin

    FUNCTION calc_total_area(p) RESULT(area)
        TYPE(Pin_type), INTENT(IN) :: p
        REAL :: area
        INTEGER :: i

        area = 0.0
        DO i = 1, p%n_ring
            area = area + 3.14159265 * p%radius(i)**2
        END DO
    END FUNCTION calc_total_area

    FUNCTION calc_total_volume(p) RESULT(volume)
        TYPE(Pin_type), INTENT(IN) :: p
        REAL :: volume
        INTEGER :: i

        volume = 0.0
        DO i = 1, p%n_ring
            volume = volume + (4.0 / 3.0) * 3.14159265 * p%radius(i)**3
        END DO
    END FUNCTION calc_total_volume

    SUBROUTINE print_pin(p)
        TYPE(Pin_type), INTENT(IN) :: p
        PRINT *, 'Pin ID: ', p%id, ', Rings: ', p%n_ring
        PRINT *, 'Total Area: ', calc_total_area(p)
        PRINT *, 'Total Volume: ', calc_total_volume(p)
    END SUBROUTINE print_pin

    SUBROUTINE free_pin(p)
        TYPE(Pin_type), INTENT(INOUT) :: p
        DEALLOCATE(p%radius)
    END SUBROUTINE free_pin

END MODULE Pin_mod

PROGRAM main
    USE Pin_mod
    TYPE(Pin_type) :: p
    REAL :: rad(2) = [1.0, 2.0]

    CALL init_pin(p, 1, 2, rad)
    CALL print_pin(p)
    CALL free_pin(p)
END PROGRAM main
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter