# OPTIONS_GHC -Wall #
{-# LANGUAGE Safe #-}

  | 
 Module       :   Physics . Learn . Current 
 Copyright    :   ( c )    2012 - 2019 
 License      :   BSD3 ( see LICENSE ) 
 Maintainer   :      <  > 
 Stability    :   experimental 

 This module contains functions for working with current , magnetic field , 
 and magnetic flux . 

Module      :  Physics.Learn.Current
Copyright   :  (c) Scott N. Walck 2012-2019
License     :  BSD3 (see LICENSE)
Maintainer  :  Scott N. Walck <>
Stability   :  experimental

This module contains functions for working with current, magnetic field,
and magnetic flux.
-}

module Physics.Learn.Current
    (
    -- * Current
      Current
    , CurrentDistribution(..)
    -- * Magnetic Field
    , bField
    , bFieldFromLineCurrent
    , bFieldFromSurfaceCurrent
    , bFieldFromVolumeCurrent
    -- * Magnetic Flux
    , magneticFlux
    )
    where

import Physics.Learn.CarrotVec
    ( magnitude
    , (*^)
    , (^/)
    , (><)
    )
import Physics.Learn.Position
    ( VectorField
    , displacement
    , addFields
    )
import Physics.Learn.Curve
    ( Curve(..)
    , crossedLineIntegral
    )
import Physics.Learn.Surface
    ( Surface(..)
    , surfaceIntegral
    , dottedSurfaceIntegral
    )
import Physics.Learn.Volume
    ( Volume(..)
    , volumeIntegral
    )

  | Electric current , in units of Amperes ( A )
type Current = Double

-- | A current distribution is a line current (current through a wire), a surface current,
--   a volume current, or a combination of these.
--   The 'VectorField' describes a surface current density
--   or a volume current density.
data CurrentDistribution = LineCurrent Current Curve               -- ^ current through a wire
                         | SurfaceCurrent VectorField Surface      -- ^ 'VectorField' is surface current density (A/m)
                         | VolumeCurrent VectorField Volume        -- ^ 'VectorField' is volume current density (A/m^2)
                         | MultipleCurrents [CurrentDistribution]  -- ^ combination of current distributions

-- | Magnetic field produced by a line current (current through a wire).
--   The function 'bField' calls this function
--   to evaluate the magnetic field produced by a line current.
bFieldFromLineCurrent
    :: Current      -- ^ current (in Amps)
    -> Curve        -- ^ geometry of the line current
  ^ magnetic field ( in Tesla )
bFieldFromLineCurrent i c r
    = k *^ crossedLineIntegral 1000 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (-i) *^ d ^/ magnitude d ** 3
            where
              d = displacement r' r

-- | Magnetic field produced by a surface current.
--   The function 'bField' calls this function
--   to evaluate the magnetic field produced by a surface current.
--   This function assumes that surface current density
--   will be specified parallel to the surface, and does
--   not check if that is true.
bFieldFromSurfaceCurrent
    :: VectorField  -- ^ surface current density
    -> Surface      -- ^ geometry of the surface current
    -> VectorField  -- ^ magnetic field (in T)
bFieldFromSurfaceCurrent kCurrent c r
    = k *^ surfaceIntegral 100 100 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (kCurrent r' >< d) ^/ magnitude d ** 3
            where
              d = displacement r' r

-- | Magnetic field produced by a volume current.
--   The function 'bField' calls this function
--   to evaluate the magnetic field produced by a volume current.
bFieldFromVolumeCurrent
    :: VectorField  -- ^ volume current density
    -> Volume       -- ^ geometry of the volume current
    -> VectorField  -- ^ magnetic field (in T)
bFieldFromVolumeCurrent j c r
    = k *^ volumeIntegral 50 50 50 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (j r' >< d) ^/ magnitude d ** 3
            where
              d = displacement r' r

-- | The magnetic field produced by a current distribution.
--   This is the simplest way to find the magnetic field, because it
--   works for any current distribution (line, surface, volume, or combination).
bField :: CurrentDistribution -> VectorField
bField (LineCurrent i c) = bFieldFromLineCurrent i c
bField (SurfaceCurrent kC s) = bFieldFromSurfaceCurrent kC s
bField (VolumeCurrent j v) = bFieldFromVolumeCurrent j v
bField (MultipleCurrents cds) = addFields $ map bField cds

-------------------
-- Magnetic Flux --
-------------------

-- | The magnetic flux through a surface produced by a current distribution.
magneticFlux :: Surface -> CurrentDistribution -> Double
magneticFlux surf dist = dottedSurfaceIntegral 100 100 (bField dist) surf


# LANGUAGE Safe #
 * Current
 * Magnetic Field
 * Magnetic Flux
 | A current distribution is a line current (current through a wire), a surface current,
   a volume current, or a combination of these.
   The 'VectorField' describes a surface current density
   or a volume current density.
 ^ current through a wire
 ^ 'VectorField' is surface current density (A/m)
 ^ 'VectorField' is volume current density (A/m^2)
 ^ combination of current distributions
 | Magnetic field produced by a line current (current through a wire).
   The function 'bField' calls this function
   to evaluate the magnetic field produced by a line current.
 ^ current (in Amps)
 ^ geometry of the line current
 | Magnetic field produced by a surface current.
   The function 'bField' calls this function
   to evaluate the magnetic field produced by a surface current.
   This function assumes that surface current density
   will be specified parallel to the surface, and does
   not check if that is true.
 ^ surface current density
 ^ geometry of the surface current
 ^ magnetic field (in T)
 | Magnetic field produced by a volume current.
   The function 'bField' calls this function
   to evaluate the magnetic field produced by a volume current.
 ^ volume current density
 ^ geometry of the volume current
 ^ magnetic field (in T)
 | The magnetic field produced by a current distribution.
   This is the simplest way to find the magnetic field, because it
   works for any current distribution (line, surface, volume, or combination).
-----------------
 Magnetic Flux --
-----------------
 | The magnetic flux through a surface produced by a current distribution.
# OPTIONS_GHC -Wall #

  | 
 Module       :   Physics . Learn . Current 
 Copyright    :   ( c )    2012 - 2019 
 License      :   BSD3 ( see LICENSE ) 
 Maintainer   :      <  > 
 Stability    :   experimental 

 This module contains functions for working with current , magnetic field , 
 and magnetic flux . 

Module      :  Physics.Learn.Current
Copyright   :  (c) Scott N. Walck 2012-2019
License     :  BSD3 (see LICENSE)
Maintainer  :  Scott N. Walck <>
Stability   :  experimental

This module contains functions for working with current, magnetic field,
and magnetic flux.
-}

module Physics.Learn.Current
    (
      Current
    , CurrentDistribution(..)
    , bField
    , bFieldFromLineCurrent
    , bFieldFromSurfaceCurrent
    , bFieldFromVolumeCurrent
    , magneticFlux
    )
    where

import Physics.Learn.CarrotVec
    ( magnitude
    , (*^)
    , (^/)
    , (><)
    )
import Physics.Learn.Position
    ( VectorField
    , displacement
    , addFields
    )
import Physics.Learn.Curve
    ( Curve(..)
    , crossedLineIntegral
    )
import Physics.Learn.Surface
    ( Surface(..)
    , surfaceIntegral
    , dottedSurfaceIntegral
    )
import Physics.Learn.Volume
    ( Volume(..)
    , volumeIntegral
    )

  | Electric current , in units of Amperes ( A )
type Current = Double


bFieldFromLineCurrent
  ^ magnetic field ( in Tesla )
bFieldFromLineCurrent i c r
    = k *^ crossedLineIntegral 1000 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (-i) *^ d ^/ magnitude d ** 3
            where
              d = displacement r' r

bFieldFromSurfaceCurrent
bFieldFromSurfaceCurrent kCurrent c r
    = k *^ surfaceIntegral 100 100 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (kCurrent r' >< d) ^/ magnitude d ** 3
            where
              d = displacement r' r

bFieldFromVolumeCurrent
bFieldFromVolumeCurrent j c r
    = k *^ volumeIntegral 50 50 50 integrand c
      where
  mu0 / ( 4 * pi )
        integrand r' = (j r' >< d) ^/ magnitude d ** 3
            where
              d = displacement r' r

bField :: CurrentDistribution -> VectorField
bField (LineCurrent i c) = bFieldFromLineCurrent i c
bField (SurfaceCurrent kC s) = bFieldFromSurfaceCurrent kC s
bField (VolumeCurrent j v) = bFieldFromVolumeCurrent j v
bField (MultipleCurrents cds) = addFields $ map bField cds


magneticFlux :: Surface -> CurrentDistribution -> Double
magneticFlux surf dist = dottedSurfaceIntegral 100 100 (bField dist) surf

