Research-Stack/0-Core-Formalism/lean/external/OTOM/PhysicsLagrangian.lean

76 lines
2.3 KiB
Text

import Semantics.PhysicsEuclidean
namespace Semantics.PhysicsLagrangian
open Semantics.PhysicsScalar
open Semantics.PhysicsEuclidean
abbrev Q16_16 := PhysicsScalar.Q16_16
structure PhysicsLagrangian (n : Nat) where
position : PhysicsEuclidean.PhysicsEuclidean n
velocity : PhysicsEuclidean.PhysicsEuclidean n
momentum : PhysicsEuclidean.PhysicsEuclidean n
massScale : Q16_16
actionDensity : Q16_16
namespace PhysicsLagrangian
def zero (n : Nat) : PhysicsLagrangian n :=
{ position := PhysicsEuclidean.zero n
, velocity := PhysicsEuclidean.zero n
, momentum := PhysicsEuclidean.zero n
, massScale := Q16_16.one
, actionDensity := Q16_16.zero }
instance {n : Nat} : Inhabited (PhysicsLagrangian n) where
default := zero n
def kineticProxy (state : PhysicsLagrangian n) : Q16_16 :=
let momentumEnergy := PhysicsEuclidean.dot state.velocity state.momentum
Q16_16.mul Q16_16.half momentumEnergy
def transportWeight (state : PhysicsLagrangian n) : Q16_16 :=
Q16_16.add state.massScale state.actionDensity
def advanceLinear (delta : Q16_16) (state : PhysicsLagrangian n) : PhysicsLagrangian n :=
let displacement := PhysicsEuclidean.scale delta state.velocity
{ state with position := PhysicsEuclidean.add state.position displacement }
def updateMomentum
(coupling : Q16_16)
(state : PhysicsLagrangian n) : PhysicsLagrangian n :=
let shiftedMomentum := PhysicsEuclidean.scale coupling state.velocity
{ state with momentum := PhysicsEuclidean.add state.momentum shiftedMomentum }
def applyImpulse
(impulse : PhysicsEuclidean.PhysicsEuclidean n)
(state : PhysicsLagrangian n) : PhysicsLagrangian n :=
{ state with momentum := PhysicsEuclidean.add state.momentum impulse }
def dampVelocity
(retention : Q16_16)
(state : PhysicsLagrangian n) : PhysicsLagrangian n :=
{ state with velocity := PhysicsEuclidean.scale retention state.velocity }
def withActionDensity (actionDensity : Q16_16) (state : PhysicsLagrangian n) : PhysicsLagrangian n :=
{ state with actionDensity := actionDensity }
def effectiveEnergy (state : PhysicsLagrangian n) : Q16_16 :=
Q16_16.add (kineticProxy state) state.actionDensity
end PhysicsLagrangian
abbrev BodyState2D := PhysicsLagrangian 2
abbrev BodyState3D := PhysicsLagrangian 3
abbrev BodyState4D := PhysicsLagrangian 4
end Semantics.PhysicsLagrangian