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
Comments