LCOV - code coverage report
Current view: top level - Preamplifier - ModifiedMunroPiazzaTriodeFunction.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 25 0.0 %
Date: 2021-02-18 20:07:22 Functions: 0 6 0.0 %

          Line data    Source code
       1             : /**
       2             :  * \file ModifiedMunroPiazzaTriodeFunction.h
       3             :  * From http://www.duncanamps.com/spice/valves/dm12ax7s.inc
       4             :  */
       5             : 
       6             : #ifndef ATK_PREAMPLIFIER_MODIFIEDMUNROPIAZZATRIODEFUNCTION_H
       7             : #define ATK_PREAMPLIFIER_MODIFIEDMUNROPIAZZATRIODEFUNCTION_H
       8             : 
       9             : #include <ATK/Utility/fmath.h>
      10             : 
      11             : #include <cmath>
      12             : #include <iostream>
      13             : 
      14             : namespace ATK
      15             : {
      16             :   /// Tube model, used with TriodeFilter from Munro and Piazza
      17             :   template <typename DataType_>
      18             :   class ModifiedMunroPiazzaTriodeFunction
      19             :   {
      20             :   private:
      21             :     const DataType_ mu;
      22             :     const DataType_ K;
      23             :     const DataType_ Kp;
      24             :     const DataType_ Kvb;
      25             :     const DataType_ Kg;
      26             :     const DataType_ sigma;
      27             :     const DataType_ sqrt_sigma;
      28             :     
      29             :     DataType_ sqrt_muvbe;
      30             :     DataType_ E1;
      31             :     DataType_ sqrt_E1;
      32             :     
      33             :   public:
      34             :     /// For non static models
      35             :     const DataType_ Cpg;
      36             :     
      37             :     /// Compute grid current
      38           0 :     DataType_ Lb(DataType_ Vbe, DataType_ Vce)
      39             :     {
      40           0 :       if(mu + Vbe > 0)
      41             :       {
      42           0 :         sqrt_muvbe = std::sqrt(sigma + (mu + Vbe) * (mu + Vbe) * (mu + Vbe));
      43           0 :         return K * (sqrt_muvbe - sqrt_sigma);
      44             :       }
      45           0 :       return 0;
      46             :     }
      47             :     
      48             :     /// Compute grid current derivative relative to the grid cathode voltage
      49           0 :     DataType_ Lb_Vbe(DataType_ Vbe, DataType_ Vce)
      50             :     {
      51           0 :       if(mu + Vbe > 0)
      52             :       {
      53           0 :         return 3 * K * (mu + Vbe) * (mu + Vbe) / (2 * sqrt_muvbe);
      54             :       }
      55           0 :       return 0;
      56             :     }
      57             :     
      58             :     /// Compute grid current derivative relative to the plate cathode voltage
      59           0 :     DataType_ Lb_Vce(DataType_ Vbe, DataType_ Vce)
      60             :     {
      61           0 :       return 0;
      62             :     }
      63             :     
      64             :     /// Compute plate current
      65           0 :     DataType_ Lc(DataType_ Vbe, DataType_ Vce)
      66             :     {
      67           0 :       E1 = Kp + Vce + Kg * Vbe;
      68           0 :       if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
      69             :       {
      70           0 :         sqrt_E1 = std::sqrt(E1);
      71           0 :         return Vce / 5 * Kvb * sqrt_E1 * E1;
      72             :       }
      73           0 :       return 0;
      74             :     }
      75             :     
      76             :     /// Compute plate current derivative relative to the grid cathode voltage
      77           0 :     DataType_ Lc_Vbe(DataType_ Vbe, DataType_ Vce)
      78             :     {
      79           0 :       if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
      80             :       {
      81           0 :         return Kg * Vce / 5 * Kvb * sqrt_E1 * 1.5F;
      82             :       }
      83           0 :       return 0;
      84             :     }
      85             :     
      86             :     /// Compute plate current derivative relative to the plate cathode voltage
      87           0 :     DataType_ Lc_Vce(DataType_ Vbe, DataType_ Vce)
      88             :     {
      89           0 :       if (E1 > 0 && Vbe >= 0 && Vbe <= 5)
      90             :       {
      91           0 :         return Kvb * sqrt_E1 * E1 / 5 + Vce / 5 * Kvb * sqrt_E1 * 1.5F;
      92             :       }
      93           0 :       return 0;
      94             :     }
      95             :     
      96             :     /// Constructor
      97             :     ModifiedMunroPiazzaTriodeFunction(DataType_ mu, DataType_ K, DataType_ Kp, DataType_ Kvb, DataType_ Kg, DataType_ sigma, DataType_ Cpg)
      98             :     :mu(mu), K(K), Kp(Kp), Kvb(Kvb), Kg(Kg), sigma(sigma), sqrt_sigma(std::sqrt(sigma)), Cpg(Cpg)
      99             :     {
     100             :     }
     101             :     
     102             :     /// Build a new triode function for a filter (12AX7/ECC83)
     103             :     static ModifiedMunroPiazzaTriodeFunction build_standard_function(DataType_ mu = 0.2, DataType_ K = 5e-6, DataType_ Kp = 45, DataType_ Kvb = 1.147e-6, DataType_ Kg = 95.43, DataType_ sigma = 1, DataType_ Cpg = 1.7e-12)
     104             :     {
     105             :       return ModifiedMunroPiazzaTriodeFunction(mu, K, Kp, Kvb, Kg, sigma, Cpg);
     106             :     }
     107             :   };
     108             : }
     109             : 
     110             : #endif

Generated by: LCOV version TK-3.3.0-4-gdba42eea