sotos_ubu έγραψε:Και εγώ στο πανεπιστήμιο διδάχθηκα στο πρώτο εξάμηνο Fortran και στο δεύτερο C. Θυμάμαι ότι ο καθηγητής στο μάθημα αλλά και οι διδακτορικοί φοιτητές στο εργαστήριο (στα πρώτα μαθήματα) μας εξήγησαν τι είναι και τι κάνουν ακριβώς αυτά (compiler, linker, IDE, πρότυπα της Fortran). Απλά το αναφέρω επειδή διαβάζοντας αυτό το θέμα, μου δημιουργήθηκε μια αίσθηση μηδενισμού κάποιων καταστάσεων..
Off topic:Φυσικά προσωπικές εμπειρίες περιγράφω. Απλά είμαι λιγάκι απογοητευμένος με την ελληνική εκπαίδευση. Τουλάχιστον προσπαθώ να τη διορθώση με τον τρόπο μου (δες στο link που έδωσα παραπάνω) Και λίγη εποικοδομητική κριτική δε βλάπτει. Και μιας και λέμε για εποικοδομητική ριξτε μια ματιά σ'αυτό όσοι ενδιαφέρονται για fortran: Στη fortran 90/95 υποστηρίζονται δομές ή νέοι τύποι δεδομένων και υπερφόρτωση τελεστών. Ας δούμε μια απλή εφαρμογή τους. Από quaternions πώς τα πάμε; Quaternions είναι η επέκταση των μιγαδικών στις 4 διαστάσεις (Σημείωση ότι δεν ορίζονται τριαδικοί αριθμοί όσο κι αν προσπάθησε ο καημένος ο Hamilton) Επίσης οι τετραδικοί αριθμοί δεν είναι αντιμεταθετικοί! Για περισσότερες λεπτομέρειες σχετικά με το πώς ορίζονται οι πράξεις μπορείτε να βρείτε εδώ
http://en.wikipedia.org/wiki/Quaternion Οι τετραδικοί αριθμοί όσο παράξενοι κι αν φαίνεται κάνουν τις περιστροφές στις 3 διαστάσεις πολύ πιο γρήγορα απ'ότι οι γωνίες Euler (logari81, αυτό ίσως είναι για σένα. Μια συνάδελφος τους εφάρμοσε στις περιστροφές του πλέγματός της.)
Επί της ουσίας. Ένα μικρό παράδειγμα που μας επιτρέπει να γράψουμε q = w + v, όπου όλοι είναι τετραδικοί. Το module που κάνει τη δουλειά:
- Κώδικας: Επιλογή όλων
module structure
implicit none
intrinsic :: conjg, abs
private
public :: quaternion_print
public :: operator(+), operator(-), operator(*)
public :: conjg, abs
!###########################################################################################################
type, public :: quaternion
real(8) :: t
real(8) :: x
real(8) :: y
real(8) :: z
end type quaternion
!###########################################################################################################
interface operator(+)
module procedure quat_add, quat_integer_add, quat_real_add, quat_real8_add
end interface
interface operator(-)
module procedure quat_subt
end interface
interface operator(*)
module procedure quat_integer_left_mult, quat_real_left_mult, quat_real8_left_mult, &
quat_integer_right_mult, quat_real_right_mult, quat_real8_right_mult, &
quat_mult
end interface
interface conjg
module procedure quat_conjg
end interface
interface abs
module procedure quat_abs
end interface
!###########################################################################################################
contains
!###########################################################################################################
subroutine quaternion_print(q)
type(quaternion), intent(in) :: q
real :: tp, xp, yp, zp
tp = q % t
xp = q % x
yp = q % y
zp = q % z
print "(a1, 4f32.12, a1)", "(", tp, xp, yp, zp, ")"
print *
end subroutine quaternion_print
!###########################################################################################################
type(quaternion) function quat_add(a,b) result (res)
type(quaternion), intent(in) :: a, b
!type(quaternion) :: res
res % t = a % t + b % t
res % x = a % x + b % x
res % y = a % y + b % y
res % z = a % z + b % z
end function quat_add
type(quaternion) function quat_integer_add(i,q) result (res)
integer, intent(in) :: i
type(quaternion), intent(in) :: q
!type(quaternion) :: res
res % t = q % t + i
res % x = q % x
res % y = q % y
res % z = q % z
end function quat_integer_add
type(quaternion) function quat_real_add(r,q) result (res)
real, intent(in) :: r
type(quaternion), intent(in) :: q
!type(quaternion) :: res
res % t = q % t + r
res % x = q % x
res % y = q % y
res % z = q % z
end function quat_real_add
type(quaternion) function quat_real8_add(r,q) result (res)
real(8), intent(in) :: r
type(quaternion), intent(in) :: q
!type(quaternion) :: res
res % t = q % t + r
res % x = q % x
res % y = q % y
res % z = q % z
end function quat_real8_add
!###########################################################################################################
type(quaternion) function quat_subt(a,b) result (res)
type(quaternion), intent(in) :: a, b
!type(quaternion) :: res
res % t = a % t - b % t
res % x = a % x - b % x
res % y = a % y - b % y
res % z = a % z - b % z
end function quat_subt
!###########################################################################################################
type(quaternion) function quat_integer_left_mult(r,a) result (res)
integer, intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_integer_left_mult
type(quaternion) function quat_real_left_mult(r,a) result (res)
real, intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_real_left_mult
type(quaternion) function quat_real8_left_mult(r,a) result (res)
real(8), intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_real8_left_mult
type(quaternion) function quat_integer_right_mult(a,r) result (res)
integer, intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_integer_right_mult
type(quaternion) function quat_real_right_mult(a,r) result (res)
real, intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_real_right_mult
type(quaternion) function quat_real8_right_mult(a,r) result (res)
real(8), intent(in) :: r
type(quaternion), intent(in) :: a
!type(quaternion) :: res
res % t = r * a % t
res % x = r * a % x
res % y = r * a % y
res % z = r * a % z
end function quat_real8_right_mult
type(quaternion) function quat_mult(u,v) result (res)
type(quaternion), intent(in) :: u, v
!type(quaternion) :: res
res % t = u % t * v % t - u % x * v % x - u % y * v % y - u % z * v % z
res % x = u % t * v % x + u % x * v % t + u % y * v % z - u % z * v % y
res % y = u % t * v % y + u % y * v % t + u % z * v % x - u % x * v % z
res % z = u % t * v % z + u % z * v % t + u % x * v % y - u % y * v % x
end function quat_mult
!###########################################################################################################
type(quaternion) function quat_conjg(u) result (res)
type(quaternion), intent(in) :: u
!type(quaternion) :: res
res % t = u % t
res % x = - (u % x)
res % y = - (u % y)
res % z = - (u % z)
end function quat_conjg
!###########################################################################################################
function quat_abs(u) result (res)
type(quaternion), intent(in) :: u
real(8) :: res
res = sqrt((u % t) **2 + (u % x) **2 + (u % y) **2 + (u % z) **2)
end function quat_abs
!###########################################################################################################
end module
και το πρόγραμμα που το χρησιμοποιεί:
- Κώδικας: Επιλογή όλων
program main
use structure
type (quaternion) :: u, v, w
integer :: i
integer :: a
real :: b
real(8) :: c
complex :: z
! open(10,file="outpout")
a = 5
b = 0.35
c = -176.0987
u = quaternion(1,2,3,4)
v = quaternion(5,6,7,8)
w=u+v
call quaternion_print(w)
w=u-v
call quaternion_print(w)
w = a * u
call quaternion_print(w)
w = b * u
call quaternion_print(w)
w = c * u
call quaternion_print(w)
w = u * a
call quaternion_print(w)
w = u * b
call quaternion_print(w)
w = u * c
call quaternion_print(w)
w = u * v
call quaternion_print(w)
w = v * u
call quaternion_print(w)
z = (1,2)
print *,z
print *, abs(z)
print *, abs(w)
print*, conjg(w)
w = c + w
call quaternion_print(w)
end program