MODULE pallokoordinaatit IMPLICIT NONE INTEGER, PARAMETER :: prec = SELECTED_REAL_KIND(12, 50) CONTAINS SUBROUTINE pallo_xyz(r, theta, phi, x, y, z) ! Tämä aliohjelma muuttaa pallokoordinaatit ! r, theta, phi karteesisiksi koordinaateiksi x, y, z IMPLICIT NONE REAL(prec), INTENT(IN) :: r, theta, phi REAL(prec), INTENT(OUT) :: x, y, z x = r * SIN(theta) * COS(phi) y = r * SIN(theta) * SIN(phi) z = r * COS(theta) END SUBROUTINE pallo_xyz SUBROUTINE xyz_pallo(x, y, z, r, theta, phi) ! Tämä aliohjelma muuttaa karteesiset koordinaatit ! x, y, z pallokoordinaateiksi r, theta, phi IMPLICIT NONE REAL(prec), INTENT(IN) :: x, y, z REAL(prec), INTENT(OUT) :: r, theta, phi r = SQRT(x**2 + y**2 + z**2) theta = ATAN2(SQRT(x**2+y**2),z) IF (SQRT(x**2+y**2) < 1e-6) THEN phi = 0 ELSE phi = ATAN2(y,x) END IF END SUBROUTINE xyz_pallo END MODULE pallokoordinaatit