FORTRAN90: მოქმედებები ვექტორებზე


ნუ, ვ ობშემ ამ ბოლო დროს ფორტრანს ვსწავლობ, როგორც იცით…

დავწერე პატარა სავარჯიშო მოდული, რომელიც შეიცავს სტრუქტურა ვექტორს და მასზე/მათზე განსაზღვრულ ფუნქციათა უმეტესობას: ვექტორულ, სკალარულ, შერეულ ნამრავლს, სიგრძეს(მოდულს), მიმატება-გამოკლებას, გამრავლებას ნამდვილ რიცხვზე…

მოცემული მოდულის გარჩევით ადამიანი გაეცნობა მოდულთა დაწერას, ფუქნციების განსაზღვრას, ოპერატორებისა და ფუნქციების გადატვირთვას… ზედაპირულ დონეზე, რა თქმა უნდა 🙂

ასევე, რადგან ფორტრანში არ არის წინასწარ განსაზღვრული მუდმივა პი რიცხვისთვის, ჩვენ დინამიურად ვიღებთ მას დიდი სიზუსტით ტრიგონომეტრიული ფუნქციების მეშვეობით…

კიდევ ერთხელ: ეს არის მხოლოდ და მხოლოდ სავარჯიშო. ნუ ეძებთ მასში სრუყოფილებას ან იდეალს… 🙂

MODULE VectorMathMod
IMPLICIT NONE
REAL*8 :: PI
PI = ACOS(0.0D0)*2.D0
TYPE Vector
REAL*8 :: X
REAL*8 :: Y
REAL*8 :: Z
END TYPE Vector
INTERFACE ABS
MODULE PROCEDURE VLength
END INTERFACE
INTERFACE OPERATOR (+)
MODULE PROCEDURE Add
END INTERFACE
INTERFACE OPERATOR (-)
MODULE PROCEDURE Substract
END INTERFACE
INTERFACE OPERATOR (*)
MODULE PROCEDURE MultScalar
END INTERFACE
INTERFACE OPERATOR (**)
MODULE PROCEDURE MultVector
END INTERFACE
CONTAINS
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!---FUNCTIONS---!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TYPE(Vector) FUNCTION Add(vector1, vector2)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2
Add.X = vector1.X + vector2.X
Add.Y = vector1.Y + vector2.Y
Add.Z = vector1.Z + vector2.Z
END FUNCTION Add
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TYPE(Vector) FUNCTION Substract(vector1, vector2)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2
Substract.X = vector1.X - vector2.X
Substract.Y = vector1.Y - vector2.Y
Substract.Z = vector1.Z - vector2.Z
END FUNCTION Substract
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TYPE(Vector) FUNCTION Multiply(vector1, coeff)
IMPLICIT NONE
TYPE(Vector), INTENT(IN):: vector1
REAL*8, INTENT(IN) :: coeff
Multiply.X = vector1.X*coeff
Multiply.Y = vector1.Y*coeff
Multiply.Z = vector1.Z*coeff
END FUNCTION Multiply
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REAL*8 FUNCTION VLength(vect)
IMPLICIT NONE
TYPE(Vector) :: vect
VLength = SQRT(vect.X**2 + vect.Y**2 + vect.Z**2)
END FUNCTION VLength
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REAL*8 FUNCTION VAngle(vector1, vector2)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2
VAngle = (vector1.X*vector2.X + vector1.Y*vector2.Y + vector1.Z*vector2.Z) &
/ (VLength(vector1)*VLength(vector2))
END FUNCTION VAngle
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REAL*8 FUNCTION MultScalar(vector1, vector2)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2
MultScalar = VLength(vector1)*VLength(vector2)*VAngle(vector1, vector2)
END FUNCTION MultScalar
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TYPE(Vector) FUNCTION MultVector(vector1, vector2)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2
MultVector.X = vector1.Y*vector2.Z - vector2.Y*vector1.Z
MultVector.Y = vector1.Z*vector2.X - vector2.Z*vector1.X
MultVector.Z = vector1.X*vector2.Y - vector2.X*vector1.Y
! CHECK FOR: {3, -4, -8} AND {-5, 2, -1}
! RESULT IS {20, 43, -14}
END FUNCTION MultVector
REAL*8 FUNCTION MultMixed(vector1, vector2, vector3)
IMPLICIT NONE
TYPE(Vector), INTENT(IN) :: vector1, vector2, vector3
MultMixed = MultScalar(vector1, MultVector(vector2, vector3))
END FUNCTION MultMixed
END MODULE VectorMathMod
view raw VectorOperations hosted with ❤ by GitHub

3 thoughts on “FORTRAN90: მოქმედებები ვექტორებზე”

  1. ასეთი ენა (fortran90) თუ არსებობდა პირველად გავიგე , ახალია ?, და რას იტყვი კონკურენციას გაუწევს ისეთ “თანამედროვე” ენებს, როგორიც სი შარპია ?

    Like

    1. სალამი 🙂 ახალი კი არ არის ერთ-ერთი უძველესი ენაა.
      კონკურენციის გაწევა არც კი სჭირდება – მხოლოდ საკმაოდ ვიწრო, სამეცნიერო და საინჟინრო დარგებში იყენებენ. იქ, სადაც მათემატიკური გამოთვლების სიჩქარეს აქვს დიდი მნიშვნელობა.

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s