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
Preview:
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