

//                     v1      ---    v2
//          ------------+-----|L1 |----                     ODE SOLVE:
//         |            |      ---     |          
//         |            |    ---->     |                            di1/dt = (v1 - v2)/L1
//        ---          ---    i1      ---
//       |is |        |R1 |          |R2 |
//        ---          ---            ---                   DC SOLVE:
//         |            |              |
//         |            |              |                            (1/R1)*v1 +      0*v2 = is - i1
//          ------------+--------------                                  0*v1 + (1/R2)*v2 = i1
//                      |
//                      0
//
//                                          Figure 1
//
//
//                     v1      ---    v2
//          ------------+-----|L1 |----                     ODE SOLVE:
//         |            |      ---     |          
//         |            |    ---->     |                            di1/dt = (v1 - v2)/L1
//        ---          ---    i1      ---                           dv2/dt = i1/C1
//       |is |        |R1 |          |C1 |
//        ---          ---            ---                   DC SOLVE:
//         |            |              |
//         |            |              |                            (1/R1)*v1 + 0*v2 = is - i1
//          ------------+--------------                                  0*v1 + 0*v2 = 0
//                      |
//                      0
//
//                                          Figure 2                  
//
//
//
//
//          Figure 1 and Figure 2 above show two examples of Spice nodes using a combination of and ODE solution and DC solution.
//          The circuit in Figure 1 is first order, the circuit in Figure 2 is second order. 
// 
//          Note that in Figure 2, "v2" is solved entirely within the ODE solution, making the solution for "v2" in the DC solution
//          redundant.
//
//
//          Next, we verify the circuit shown in Section "Nodal Analysis" in document "C:\ClassDAmplifier\PwmSimulation\Simulation\
//          MultiLevelConverter\NodalAnalysis-Docs\Transient Analysis.mht" as to the equivilence of our approach.
//
//
//
//          Note: Before proceeding it should be pointed out that there is a mistake in document "Transient Analysis.mht".
//                The following is the correct notation for I(n+1)
//
//
//                          I(n+1) = Geq*v(n+1) - Geq*v(n)
//
//
//
//                      v1     ---    v2
//          ------------+-----|R2 |----+---------           ODE SOLVE:                   
//         |            |      ---     | ---->   | 
//         |            |    ---->     |  i1     |                  dv2/dt = i1/C1                
//        ---          ---    i2      ---       ---                         
//       |is |        |R1 |          |R3 |     |C1 |        DC SOLVE:
//        ---          ---            ---       ---                    
//         |            |              |         |                  (1/R1)*v1 +      0*v2 = is - i2
//         |            |              |         |                       0*v1 + (1/R3)*v2 = i2 - i1        
//          ------------+--------------+---------                   (1/R2)*v1 - (1/R2)*v2 = i2                   
//                      |
//                      0
//
//                                          Figure 3    
//
//
//        
//        The "DC SOLVE" needs to be reduced to two equations:
//
//
//                        (1/R1 + 1/R2)*v1 -        (1/R2)*v2 = is                                       (1)
//                           (0 - 1/R2)*v1 + (1/R3 + 1/R2)*v2 = - i1                                     (2)
//
//
//
//                                         i1 = (C1/h) = Geq*dv2 = Geq*(v2(n+1) - v2(n))
//
//
//                                         Ieq = Geq*v2(n)    
//
//
//
//                        (1/R1 + 1/R2)*v1(n+1) -              (1/R2)*v2(n+1) = is 
//                           (0 - 1/R2)*v1(n+1) + (1/R3 + 1/R2 + Geq)*v2(n+1) = Ieq = Geq*v2(n)
//
//
//
//
//       It can be seen as described in "Transient Analysis.mht" that effective differencial term(s)
//       in this group of statements that describe the circuit of Figure 3 are updated as part of
//       of the DC solution.
//
//       This is how Spice performs transcient analysis. The method of variable time stepping must be very similar
//       to our method except for the portion of the mechanism that determines time step correction.
//       
//       With Spice, the "h" is adjusted relative to the measurement of a "change" in current flow in a given node per
//       interation, while being checked against a preset bounds.
//
//
//
//       Our approach to "Spice like" operation in our simulator dictates that we retain the ODE solver presently
//       employed. 
//
//       We add an execution stage after the ODE solver that performs the DC solution of the left terms of the matrix
//       that describes the currents flowing into each node of Spice object representing the sub-circuit in question.
//
//       For the simple cirucit described in Figure 1, the solution is straight forward. Solve the ODE in the typical
//       fashion and update the result "i1". Then apply the gaussian elemination to solve for "v1" and "v2" 
//
//       The simple circuit described in Figure 2 would be complicated if it turned out that the DC solution implied
//       a solution to "v2". For this example this turns out not be be a requirement (In fact, this example requires
//       no matrix solution).
//
//       However, the circuit describe in Figure 3 does pose a problem. The ODE solution happens to be the derivitive
//       of one of the two variables ("v1" and "v2") of the DC solution.
//
//       Unlike the typical Spice simulator, are simulator requires the DC solve and ODE solve to run sequencially.
//
//
//       To solve this problem, we alter how the DC solver of our simulator operates.
//
//       We make the following changes:
//
//                     - All solution variables in the ODE portion of our simulator must be contained in the "right"
//                       side of the DC solution matix. 
//
//       Thus, equations (1) and (2) are re-arranged as follows.
//
//                           (1/R1 + 1/R2)*v1 + 0*i1 = is  + (1/R2)*v2                                   
//                              (0 - 1/R2)*v1 +   i1 = (1/R3 + 1/R2)*v2                                      
//
//       For the DC SOLVE portion of Figure 3, we solve for "v1" and "i1". The resulting "i1" is updated for use
//       in the ODE SOLVE of the next interation. In turn, ODE SOLVE solves for "v2" which is used in the DC SOLVE
//       of the next interation.
//
//
//       There is yet even another way of analizing this problem. When dealing with capacitors, instead of constructing 
//       the "DC SOLVE" equations in terms of "i's" and "v's" alone, add addition to these "q" (or charge). This
//       Allows the "ODE SOLVE" to calculate "dq/dt" instead of "dv/dt". 
//       
//       We then get back to the left side of the matrix contain only "v's" and add to the right side vector "i's" and 
//       "q's".
//
//       For example Figure 3 above is now evaluated as follows.
//
//                      v1     ---    v2
//          ------------+-----|R2 |----+---------           ODE SOLVE:                   
//         |            |      ---     | ---->   | 
//         |            |    ---->     |  i1     |                  dq1/dt = i1                
//        ---          ---    i2      ---       ---                         
//       |is |        |R1 |          |R3 |     |C1 |        DC SOLVE:
//        ---          ---            ---       ---                    
//         |            |              |         |                  (1/R1)*v1 +      0*v2 = is - i2
//         |            |              |         |                       0*v1 + (1/R3)*v2 = i2 - i1        
//          ------------+--------------+---------                   (1/R2)*v1 - (1/R2)*v2 = i2                   
//                      |                                                0*v1 +     C1*v2 = q1
//                      0
//
//
//
//
//
//
//
//                             
//
//
//       Now, for the test...
//
//
//       The diagram for the actual simulation follows. This simulation is designed as a test for validating the 
//       newly added spice objects.   
//
//       A comparison of it's output against the output of PSpice test, file "App_SpiceTest.cir" will be made.
// 
//
//
//
//       Nodal currents for the diagram below are designated as follows.
//
//       "-+" for horizontally drawn currents ("------>")
//      
//       "+   for vertically drawn currents ("^
//        |"                                  |
//                                            |")
//
//                 i1 -+
//                ------------        
//               | v11  i1ct  |
//               |-------- +  |
//             |-   |D11  |-  |
//           - |- + ^   <C11> |
//          S11|-|- |i1st |   | 
//               |--------    |
//   1000 VDC ---| v01  i1cb <C1> (Cell 3p)  
//        i01 -+ |-------- +  |
//             |-   |D12  |-  |
//           - |- + ^   <C12> | 
//          S12|-|- |i1sb |   |
//               |-------     |
//        i1_l + | v12        |
//             -  ---+--------
//                   | 
//                   | 
//    ---------------
//   |
//   |             i2 -+
//   |            ------------        
//   |           | v21  i2ct  |
//   |           |-------- +  |
//   |         |-   |D21  |-  |
//   |       - |- + ^   <C21> |
//   |      S21|-|- |i2st |   | 
//   |           |--------    |
//    -----------| v12  i2cb <C2> (Cell 2p)
//        i12 -+ |-------- +  |
//             |-   |D22  |-  |
//           - |- + ^   <C22> |
//          S22|-|- |i2sb |   |
//               |--------    |
//        i2_l + | v23        |
//             -  ---+--------
//                   |
//                   |
//    ---------------   
//   |                         
//   |             i3 -+                               
//   |            ------------                      
//   |           | v31  i3ct  |                    
//   |           |-------- +  |
//   |         |-   |D31  |-  |
//   |       - |- + ^   <C31> |
//   |      S31|-|- |i3st |   |
//   |           |--------    |
//    -----------| v23  i3cb <C3> (Cell 1p)
//        i23 -+ |-------- +  |
//             |-   |D32  |-  |
//           - |- + ^   <C32> |
//          S32|-|- |i3sb |   |
//               |--------    |
//        i3_l + | v34        |
//             -  ---+--------
//                   |
//                   |
//    -- ------------
//   |   
//   |             i4 -+
//   |            ------------        
//   |           | v41  i4ct  |
//   |           |-------- +  |
//   |         |-   |D41  |-  |
//   |       - |- + ^   <C41> |
//   |      S41|-|- |i4st |   |
//   |           |--------    |
//    -----------| v34  i4cb <C4> (Cell 0p)
//        i34 -+ |-------- +  |
//             |-   |D42  |-  |
//           - |- + ^   <C42> |
//          S42|-|- |i4sb |   |
//               |--------    |
//        i4_l + | v44        |
//             -  ---+--------
//             i44 - |
//                 + |
//                   +----
//                   |    |
//              -- <Lp>  <Rp>
//             |     |    |    ia -+
//             |     +----+------------ vs_a                                             
//             |     |    |                             
//              -- <Ln>  <Rn>                          
//                   |    |                          
//    ---------------+----                           
//   |                                     
//   |             i5 -+                           
//   |            ------------                         
//   |           | v51  i5ct  |                        
//   |           |-------- +  |
//   |         |-   |D51  |-  |
//   |       - |- + ^   <C51> |
//   |      S51|-|- |i5st |   |
//   |           |--------    |
//    -----------| v45  i5cb <C5> (Cell 3n)
//        i45 -+ |-------- +  |
//             |-   |D52  |-  |
//           - |- + ^   <C52> |
//          S52|-|- |i5sb |   |
//               |--------    |
//        i5_l + | v56        |
//             -  ---+--------
//                   |
//                   |
//    ---------------
//   |   
//   |             i6 -+ 
//   |            ------------        
//   |           | v61  i6ct  |
//   |       (12)|-------- +  |
//   |         |-   |D61  |-  |
//   |       - |- + ^   <C61> |
//   |      S61|-|- |i6st |   |
//   |           |--------    |
//    -----------| v56  i6cb <C6> (Cell 2n)
//        i56 -+ |-------- +  |
//             |-   |D62  |-  |
//           - |- + ^   <C62> |
//          S62|-|- |i6sb |   |
//               |--------    |
//        i6_l + | v67        |
//             -  ---+-------
//                   |
//                   |
//    ---------------      
//   |                            
//   |             i7 -+                            
//   |            ------------                       
//   |           | v71  i7ct  |                      
//   |       (14)|-------- +  |
//   |         |-   |D71  |-  |
//   |       - |- + ^   <C71> |
//   |      S71|-|- |i7st |   |
//   |           |--------    |
//    -----------| v67  i7cb <C7> (Cell 1n)
//        i67 -+ |-------- +  |
//             |-   |D72  |-  |
//           - |- + ^   <C72> |
//          S72|-|- |i7sb |   |
//               |--------    |
//        i7_l + | v78        |
//             -  ---+--------
//                   |
//                   |
//    ---------------
//   |   
//   |             i8 -+
//   |            ------------        
//   |           | v81  i8ct  |
//   |           |-------- +  |
//   |         |-   |D81  |-  |
//   |       - |- + ^   <C81> |
//   |      S81|-|- |i8st |   |
//   |           |--------    |
//    -----------| v78  i8cb <C8> (Cell 0n)
//        i78 -+ |-------- +  |
//             |-   |D82  |-  |
//           - |- + ^   <C82> |
//          S82|-|- |i8sb |   |
//               |--------    |
//        i8_l + | v88        |
//             -  ---+--------
//                   |              
//                   |- i88
//                   |+
//                   |
//              - 1000 VDC
//
//
//
//
//    Load connection to "vs_a" if INDUCTIVE_COUPLED_LOAD is defined.
//                                   v1a                             v2a                  
//    vs_a ---------<Lm_a>-----------------------------------<La>-----------------<Ra>---<Ca>---
//                     |             ia -+                                                      |
//                     |                                                                        |
//                     |                                                                        |
//                     |             v1b                             v2b                        |             
//         ---------<lm_b>-----------------------------------<Lb>-----------------<Rb>---<Cb>---+-----
//        |                          ib -+                                                            |
//        |                                                                                          GND
//       GND                                                                                            
//                                                                                                            
//                                                                                                   
//    Load connection to "vs_a" if INDUCTIVE_COUPLED_LOAD is undefined
//
//
//
//    vs_a ---------------------<R_load>-------------
//                                                   |
//                                                  GND
//                                               
//          
//
//
//
//    For Cell 3p:
//
//      DC SOLVE
//            
//      v01/rS11 - v11/rS11 + v01/rD11 - v11/rD11 = i1st    =>    v01*(1/rS11 + 1/rD11) - v11*(1/rS11 + 1/rD11) - i1st =  0   (v01 is a constant)   (1)
//
//      v12/rS12 - v01/rS12 + v12/rD12 - v01/rD12 = i1sb    =>    v12*(1/rS12 + 1/rD12) - v01*(1/rS12 + 1/rD12) - i1sb =  0   (v01 is a constant)   (2)
//
//      i01 + i1_l = i1					                    =>    i01 + i1_l - i1 = 0           				                                    (3)
//
//		i1st + i1ct = i1									=>	  i1st + ilct - il = 0																(4)
//
//		i1sb + i1cb = i1_l									=> 	  i1sb + i1cb - i1_l = 0															(5)
//
//      v11*C1 - v12*C1 = q1                                =>    v11*C1 - v12*C1 = q1                                                              (6)
//
//      v01*C11 - v11*C11 = q11                             =>    v01*C11 - v11*C11 = q11                                     (v01 is a constant)   (7)
//
//      v12*C12 - v01*C12 = q12                             =>    v12*C12 - v01*C12 = q12                                     (v01 is a constant)   (8)
//
//
//      ODE SOLVE
//
//      dq1/dt = i1			                                =>    dq1/dt = i1			                                                            (a)
//
//      dq11/dt = i1ct                                      =>    dq11/dt = i1ct                                                                    (b)
//
//      dq12/dt = i1cb                                      =>    dq12/dt = i1cb                                                                    (c)
//
//
//
//    For Cell 2p:
//
//      DC SOLVE
//            
//      v12/rS21 - v21/rS21 + v12/rD21 - v21/rD21 = i2st                    =>    v12*(1/rS21 + 1/rD21) - v21*(1/rS21 + 1/rD21) - i2st     = 0          (9)
//
//      v23/rS22 - v12/rS22 + v23/rD22 - v12/rD22 = i2sb                    =>    v23*(1/rS22 + 1/rD22) - v12*(1/rS22 + 1/rD22) - i2sb     = 0          (10)
//
//      i12 + i2_l = i2				                    					=>    i12 + i2_l - i2 = 0                   				              	(11)
//
//		i2st + i2ct = i2													=>    i2st + i2ct - i2 = 0													(12)
//
//		i2sb + i2cb = i2_l													=>	  i2sb + i2cb - i2_l = 0												(13)
//
//      v21*C2 - v23*C2 = q2                                                =>    v21*C2 - v23*C2 = q2                                                  (14)
//
//      v12*C21 - v21*C21 = q21                            					=>    v12*C21 - v21*C21 = q21                                    		    (15)
//
//      v23*C22 - v12*C22 = q22                             				=>    v23*C22 - v12*C22 = q22                                               (16)
//
//
//      ODE SOLVE
//
//      dq2/dt = i2                                                         =>    dq2/dt = i2                                                           (d)
//
//      dq21/dt = i2ct                                    					=>    dq21/dt = i2ct                                                        (e)
//
//      dq22/dt = i2cb                                     					=>    dq22/dt = i2cb                                                        (f)
//
//
//
//    For Cell 1p:
//
//      DC SOLVE
//            
//      v23/rS31 - v31/rS31 + v23/rD31 - v31/rD31 = i3st                    =>    v23*(1/rS31 + 1/rD31) - v31*(1/rS31 + 1/rD31) - i3st     = 0           (17)
//
//      v34/rS32 - v23/rS32 + v34/rD32 - v23/rD32 = i3sb                    =>    v34*(1/rS32 + 1/rD32) - v23*(1/rS32 + 1/rD32) - i3sb     = 0           (18)
//
//      i23 + i3_l = i3                                                     =>    i23 + i3_l - i3 = 0                                                    (19)
//
//		i3st + i3ct = i3													=>    i3st + i3ct - i3 = 0											 		 (20)
//
//		i3sb + i3cb = i3_l													=>	  i3sb + i3cb - i3_l = 0												 (21)
//
//      v31*C3 - v34*C3 = q3                                                =>    v31*C3 - v34*C3 = q3                                                   (22)
//
//      v23*C31 - v31*C31 = q31                            					=>    v23*C31 - v31*C31 = q31                                         		 (23)
//
//      v34*C32 - v23*C32 = q32                             				=>    v34*C32 - v23*C32 = q32                                                (24)
//
//
//      ODE SOLVE
//
//      dq3/dt = i3                                                         =>    dq3/dt = i3                                                            (g)
//
//      dq31/dt = i3ct                                    					=>    dq31/dt = i3ct                                                         (h)
//
//      dq32/dt = i3cb                                     					=>    dq32/dt = i3cb                                                         (i)
//
//
//
//
//    For Cell 0p:
//
//      DC SOLVE
//            
//      v34/rS41 - v41/rS41 + v34/rD41 - v41/rD41 = i4st                    =>    v34*(1/rS41 + 1/rD41) - v41*(1/rS41 + 1/rD41) - i4st = 0               (25)
//
//      v44/rS42 - v34/rS42 + v44/rD42 - v34/rD42 = i4sb                	=>    v44*(1/rS42 + 1/rD42) - v34*(1/rS42 + 1/rD42) - i4sb = 0               (26)
//
//      i34 + i4_l = i4                                                     =>    i34 + i4_l - i4 = 0                                                    (27)
//
//		i4st + i4ct = i4													=>    i4st + i4ct - i4 = 0											 		 (28)
//
//		i4sb + i4cb = i4_l													=>	  i4sb + i4cb - i4_l = 0												 (29)
//
//      v41*C4 - v44*C4 = q4                                                =>    v41*C4 - v44*C4 = q4                                                   (30)
//
//      v34*C41 - v41*C41 = q41                            					=>    v34*C41 - v41*C41 = q41                                         		 (31)
//
//      v44*C42 - v34*C42 = q42                             				=>    v44*C42 - v34*C42 = q42                                                (32)
//
//
//      ODE SOLVE
//
//      dq4/dt = i4                                                         =>    dq4/dt = i4                                                            (j)
//
//      dq41/dt = i4ct                                    					=>    dq41/dt = i4ct                                                         (k)
//
//      dq42/dt = i4cb                                     					=>    dq42/dt = i4cb                                                         (l)
//
//
//
//    For interphase inductance:
//
//      DC SOLVE
//
//      v44/Rp - vs_a/Rp + iLp = i44                                       =>    v44*1/Rp - vs_a*1/Rp + iLp - i44      = 0                               (33)
//      
//      vs_a/Rn - v45/Rn + iLn = i45                                       =>    vs_a*1/Rn - v45*1/Rn + iLn - i45      = 0                               (34)
//      
//                        
//
//                        
//
//      ODE SOLVE            
// 
//      Lp*diLp/dt + Mpn*diLn/dt = v44 - vs_a                              =>    Lp*diLp/dt + Mpn*diLn/dt = v44 - vs_a                                   (m)
//     
//      Mnp*diLp/dt + Ln*diLn/dt = vs_a - v45                              =>    Mnp*diLp/dt + Ln*diLn/dt = vs_a - v45                                   (n)
//
//
//    For coupled load circuit (if INDUCTIVE_COUPLED_LOAD is defined):
//
//      DC SOLVE
//        
//      (Note: "ib" is in a loop by itself flowing through GND. Thus, it is not part of the DC solution matrix)
//      
//      0 =  i01 - ia - i88                                                =>   i01 - ia - i78 = 0                                                      (35)
// 
//                i88 = i78                    
//          
//
//
//
//      ODE SOLVE 
//     
//      dqa/dt = ia                                                        =>   dqa/dt = ia                                                              (o)
//
//      dqb/dt = ib                                                        =>   dqb/dt = ib                                                              (p)
//
//      (Lm_a + L_a)*dia/dt + Mab*dib/dt = vs_a - Ra*ia - qa/Ca            =>   (Lm_a + L_a)*dia/dt + Mab*dib/dt = vs_a - Ra*ia - qa/Ca                  (q)
//
//      Mba*dia/dt + (Lm_b + L_b)*dib/dt =  0   - Rb*ib - qb/Cb            =>   Mba*dia/dt + (Lm_b + L_b)*dib/dt = - Rb*ib - qb/Cb                       (r)
//
//
//
//    For simple resistive  load circuit (if INDUCTIVE_COUPLED_LOAD is undefined):
//
//
//      DC SOLVE
//      
//      0 =  i01 - ia - i88                                                =>   i01 - ia - i78 = 0                                                      (35)
// 
//                i88 = i78   
//
//
//
//      ODE SOLVE 
//
//      ia = vs_a/R_load   (In this case the ODE defined above when INDUCTIVE_COUPLED_LOAD is undefined, simple solves for "ia")                         (o)
//
//
//
//
//
//
//
//    For Cell 3n:
//
//      DC SOLVE
//            
//      v45/rS51 - v51/rS51 + v45/rD51 - v51/rD51 = i5st                   =>   v45*(1/rS51 + 1/rD51) - v51*(1/rS51 + 1/rD51) - i5st     = 0              (36)
//
//      v56/rS52 - v45/rS52 + v56/rD52 - v45/rD52 = i5sb                   =>   v56*(1/rS52 + 1/rD52) - v45*(1/rS52 + 1/rD52) - i5sb     = 0              (37)
//
//      i45 + i5_l = i5                                                    =>   i45 + i5_l - i5 = 0                                                       (38)
//
//		i5st + i5ct = i5												   =>   i5st + i5ct - i5 = 0											 		  (39)
//
//		i5sb + i5cb = i5_l												   =>	i5sb + i5cb - i5_l = 0												      (40)
//
//      v51*C5 - v56*C5 = q5                                               =>   v51*C5 - v56*C5 = q5                                                      (41)
//
//      v45*C51 - v51*C51 = q51                            				   =>   v45*C51 - v51*C51 = q51                                         		  (42)
//
//      v56*C52 - v45*C52 = q52                             			   =>   v45*C51 - v51*C51 = q51                                                	  (43)
//
//
//      ODE SOLVE
//
//      dq5/dt = i5                                                        =>   dq5/dt = i5                                                               (s)
//
//      dq51/dt = i5ct                                    				   =>   dq51/dt = i5ct                                                            (t)
//
//      dq52/dt = i5cb                                     				   =>   dq52/dt = i5cb                                                            (u)
//
//
//
//
//    For Cell 2n:
//
//      DC SOLVE
//            
//      v56/rS61 - v61/rS61 + v56/rD61 - v61/rD61 = i6st                    =>   v56*(1/rS61 + 1/rD61) - v61*(1/rS61 + 1/rD61) - i6st     = 0            (44)
//
//      v67/rS62 - v56/rS62 + v67/rD62 - v56/rD62 = i6sb                    =>   v67*(1/rS62 + 1/rD62) - v56*(1/rS62 + 1/rD62) - i6sb     = 0            (45)
//
//      i56 + i6_l = i6                                                     =>   i56 + i6_l - i6 = 0                                                     (46)
//
//		i6st + i6ct = i6												    =>   i6st + i6ct - i6 = 0											 		 (47)
//
//		i6sb + i6cb = i6_l												    =>	 i6sb + i6cb - i6_l = 0												  	 (48)
//
//      v61*C6 - v67*C6 = q6                                                =>   v61*C6 - v67*C6 = q6                                                    (49)
//
//      v56*C61 - v61*C61 = q61                            				    =>   v56*C61 - v61*C61 = q61                                         		 (50)
//
//      v67*C62 - v56*C62 = q62                             			    =>   v67*C62 - v56*C62 = q62                                               	 (51)
//
//
//      ODE SOLVE
//
//      dq6/dt = i6                                                         =>   dq6/dt = i6                                                             (v)
//
//      dq61/dt = i6ct                                    				    =>   dq61/dt = i6ct                                                          (w)
//
//      dq62/dt = i6cb                                     				    =>   dq62/dt = i6cb                                                          (x)
//
//
//
//
//    For Cell 1n:
//
//      DC SOLVE
//            
//      v67/rS71 - v71/rS71 + v67/rD71 - v71/rD71 = i7st                    =>   v67*(1/rS71 + 1/rD71) - v71*(1/rS71 + 1/rD71) - i7st     = 0           (52)
//
//      v78/rS72 - v67/rS72 + v78/rD72 - v67/rD72 = i7sb                    =>   v78*(1/rS72 + 1/rD72) - v67*(1/rS72 + 1/rD72) - i7sb     = 0           (53)
//
//      i67 + i7_l = i7                                                     =>   i67 + i7_l - i7 = 0                                                    (54)
//
//		i7st + i7ct = i7												    =>   i7st + i7ct - i7 = 0											  	    (55)
//
//		i7sb + i7cb = i7_l												    =>	 i7sb + i7cb - i7_l = 0												  	(56)
//
//      v71*C7 - v78*C7 = q7                                                =>   v71*C7 - v78*C7 = q7                                                   (57)
//
//      v67*C71 - v71*C71 = q71                            				    =>   v67*C71 - v71*C71 = q71                                         		(58)
//
//      v78*C72 - v67*C72 = q72                             			    =>   v78*C72 - v67*C72 = q72                                               	(59)
//
//
//      ODE SOLVE
//
//      dq7/dt = i7                                                         =>   dq7/dt = i7                                                            (y)
//
//      dq71/dt = i7ct                                    				    =>   dq71/dt = i7ct                                                         (z)
//
//      dq72/dt = i7cb                                     				    =>   dq72/dt = i7cb                                                         (aa)
//
//
//
//
//    For Cell 0n:
//
//      DC SOLVE
//            
//      v78/rS81 - v81/rS81 + v78/rD81 - v81/rD81 = i8st                     =>   v78*(1/rS81 + 1/rD81) - v81*(1/rS81 + 1/rD81) - i8st     = 0                        (60)
//
//      v88/rS82 - v78/rS82 + v88/rD82 - v78/rD82 = i8sb                     =>   v88*(1/rS82 + 1/rD82) - v78*(1/rS82 + 1/rD82) - i8sb     = 0  (v88 is a constant)   (61)
//
//      i78 + i8_l = i8                                                      =>   i78 + i8_l - i8 = 0                                                                 (62)
//
//		i8st + i8ct = i8												     =>   i8st + i8ct - i8 = 0											  	    			  (63)
//
//		i8sb + i8cb = i8_l												     =>	  i8sb + i8cb - i8_l = 0												  	          (64)
//
//      v81*C8 - v88*C8 = q8                                                 =>   v81*C8 - v88*C8 = q8      (v88 is a constant)                                       (65)
//
//      v78*C81 - v81*C81 = q81                            				     =>   v78*C81 - v81*C81 = q81                                         					  (66)
//
//      v88*C82 - v78*C82 = q82                             			     =>   v88*C82 - v78*C82 = q82   (v88 is a constant)                            	          (67)
//
//
//      ODE SOLVE
// 
//      dq8/dt = i8                                                          =>   dq8/dt = i8                                                            (bb)
//
//      dq81/dt = i8ct                                    				     =>   dq81/dt = i8ct                                                         (cc)
//
//      dq82/dt = i8cb                                     				     =>   dq82/dt = i8cb                                                         (dd)
//
//
//
//
//
//      The known static quantities
//
//      v01 = 1000 VDC
//      v88 = -1000 VDC
//
//      The know quantities after the ODE pass
//
//      q1, q11, q12
//      q2, q21, q22
//		q3, q31, q32
//		q4, q41, q42
//		q5, q51, q52
//		q6, q61, q62
//		q7, q71, q72
//		q8, q81, q82
//		iLp, iLn, qa, qb, ia, ib   (Note: "ib" is not part of the DC solution)
//
//      The state vector for the DC solution (before reductions)
//
//      | v11 v12 v21 v23 v31 v34 v41 v44
//		  vs_a
//        v45 v51 v56 v61 v67 v71 v78 v81
//        i1 i1_l i01 i1st i1ct i1sb i1cb
//		  i2 i2_l i12 i2st i2ct i2sb i2cb
//        i3 i3_l i23 i3st i3ct i3sb i3cb
//        i4 i4_l i34 i4st i4ct i4sb i4cb
//		  i44
//        i5 i5_l i45 i5st i5ct i5sb i5cb
//        i6 i6_l i56 i6st i6ct i6sb i6cb
//        i7 i7_l i67 i7st i7ct i7sb i7cb
//        i8 i8_l i78 i8st i8ct i8sb i8cb
//		  i88 |'
//
//      The vector above can be simplified, given that
//     
//      i01 = i12 = i23 = i34 = i44 = ipl
//
//      and 
//
//      i45 = i56 = i67 = i78 = i88 = inl
//
//      The vector to solve (DC solution), is now
//
//
//      | v11 v12 v21 v23 v31 v34 v41 v44
//		  vs_a
//        v45 v51 v56 v61 v67 v71 v78 v81
//        i1 i1_l ipl i1st i1ct i1sb i1cb
//		  i2 i2_l i2st i2ct i2sb i2cb
//        i3 i3_l i3st i3ct i3sb i3cb
//        i4 i4_l i4st i4ct i4sb i4cb
//        i5 i5_l inl i5st i5ct i5sb i5cb
//        i6 i6_l i6st i6ct i6sb i6cb
//        i7 i7_l i7st i7ct i7sb i7cb
//        i8 i8_l i8st i8ct i8sb i8cb |'
//
//
//      Further simplification of the DC SOVE equations above, putting constants and known quantities after the ODE pass on right side.
//
//
//            - v11*(1/rS11 + 1/rD11) - i1st = - v01*(1/rS11 + 1/rD11)                               (1)
//
//              v12*(1/rS12 + 1/rD12) - i1sb = v01*(1/rS12 + 1/rD12)                                 (2)
//
//              ipl + i1_l - i1 = 0                                                                  (3)
//
//				i1st + ilct - il = 0															     (4)
//
//				i1sb + i1cb - i1_l = 0															     (5)
//
//              v11*C1 - v12*C1 = q1                                                                 (6)
//
//			  - v11*C11 = - v01*C11 + q11 															 (7)
//
//			  - v01*C12 = - v12*C12 + q12															 (8)
//
//              v12*(1/rS21 + 1/rD21) - v21*(1/rS21 + 1/rD21) - i2st = 0                             (9)
//
//              v23*(1/rS22 + 1/rD22) - v12*(1/rS22 + 1/rD22) - i2sb = 0                             (10)
//
//              ipl + i2_l - i2 = 0                                                                  (11)
//
//				i2st + i2ct - i2 = 0																 (12)
//
//				i2sb + i2cb - i2_l = 0																 (13)
//
//              v21*C2 - v23*C2 = q2                                                                 (14)
//
//				v12*C21 - v21*C21 = q21                                    		    				 (15)
//
//				v23*C22 - v12*C22 = q22                                              				 (16)
//
//              v23*(1/rS31 + 1/rD31) - v31*(1/rS31 + 1/rD31) - i3st = 0                             (17)
//
//              v34*(1/rS32 + 1/rD32) - v23*(1/rS32 + 1/rD32) - i3sb = 0                             (18)
//
//              ipl + i3_l - i3 = 0                                                                  (19)
//
//				i3st + i3ct - i3 = 0											 					 (20)
//
//				i3sb + i3cb - i3_l = 0																 (21)
//
//              v31*C3 - v34*C3 = q3                                                                 (22)
//
//				v23*C31 - v31*C31 = q31                                         		   			 (23)
//
//				v34*C32 - v23*C32 = q32                                                				 (24)
//
//              v34*(1/rS41 + 1/rD41) - v41*(1/rS41 + 1/rD41) - i4st = 0                             (25)
//
//              v44*(1/rS42 + 1/rD42) - v34*(1/rS42 + 1/rD42) - i4sb = 0                             (26)
//
//              ipl + i4_l - i4 = 0                                                                  (27)
//
//				i4st + i4ct - i4 = 0											 					 (28)
//
//				i4sb + i4cb - i4_l = 0												 				 (29)
//
//              v41*C4 - v44*C4 = q4                                                                 (30)
//
//				v34*C41 - v41*C41 = q41                                         					 (31)
//
//				v44*C42 - v34*C42 = q42                                               				 (32)
//
//              v44*1/Rp - vs_a*1/Rp - ipl = - iLp                                                   (33)
//
//              vs_a*1/Rn - v45*1/Rn - inl = - iLn                                                   (34)
//
//              ipl - inl = ia                                                                       (35)
//
//              v45*(1/rS51 + 1/rD51) - v51*(1/rS51 + 1/rD51) - i5st = 0                             (36)
//
//              v56*(1/rS52 + 1/rD52) - v45*(1/rS52 + 1/rD52) - i5sb = 0                             (37)
//
//              inl + i5_l - i5 = 0                                                                  (38)
//
//				i5st + i5ct - i5 = 0											 					 (39)
//
//				i5sb + i5cb - i5_l = 0												      			 (40)
//
//              v51*C5 - v56*C5 = q5                                                                 (41)
//
//				v45*C51 - v51*C51 = q51                                         					 (42)
//
//				v45*C51 - v51*C51 = q51                                                	 			 (43)
//
//              v56*(1/rS61 + 1/rD61) - v61*(1/rS61 + 1/rD61) - i6st = 0                             (44)
//
//              v67*(1/rS62 + 1/rD62) - v56*(1/rS62 + 1/rD62) - i6sb = 0                             (45)
//
//              inl + i6_l - i6 = 0                                                                  (46)
//
//				i6st + i6ct - i6 = 0											 		             (47)
//
//				i6sb + i6cb - i6_l = 0												  	             (48)
//
//              v61*C6 - v67*C6 = q6                                                                 (49)
//
//				v56*C61 - v61*C61 = q61                                         					 (50)
//
//				v67*C62 - v56*C62 = q62                                               				 (51)
//
//              v67*(1/rS71 + 1/rD71) - v71*(1/rS71 + 1/rD71) - i7st = 0                             (52)
//
//              v78*(1/rS72 + 1/rD72) - v67*(1/rS72 + 1/rD72) - i7sb = 0                             (53)
//
//              inl + i7_l - i7 = 0                                                                  (54)
//
//				i7st + i7ct - i7 = 0											  	   				 (55)
//
//				i7sb + i7cb - i7_l = 0												  				 (56)
//
//              v71*C7 - v78*C7 = q7                                                                 (57)
//
//				v67*C71 - v71*C71 = q71                                         					 (58)
//
//				v78*C72 - v67*C72 = q72                                               				 (59)
//
//              v78*(1/rS81 + 1/rD81) - v81*(1/rS81 + 1/rD81) - i8st = 0                             (60)
//
//            - v78*(1/rS82 + 1/rD82) - i8sb = - v88*(1/rS82 + 1/rD82)                               (61)
//
//              inl + i8_l - i8 = 0                                                                  (62)
//
//				i8st + i8ct - i8 = 0											  	    			 (63)
//
//				i8sb + i8cb - i8_l = 0												  	             (64)
//
//              v81*C8  = q8 + v88*C8                                                                (65)
//
//				v78*C81 - v81*C81 = q81                                         					 (66)
//
//			  - v78*C82 = q82 - v88*C82                                                	             (67)
//
//      
//       The OLE equations (if INDUCTIVE_COUPLED_LOAD is defined) 
//
//             dq1/dt = i1                                                                           (a) 
//
//			   dq11/dt = i1ct                                                                        (b)
//
//    		   dq12/dt = i1cb                                                                        (c)
//
//             dq2/dt = i2                                                                           (d)
//
//			   dq21/dt = i2ct                                                       				 (e)
//
//			   dq22/dt = i2cb                                                      					 (f)
//
//             dq3/dt = i3                                                                           (g)
//
//			   dq31/dt = i3ct                                                         				 (h)
//
//			   dq32/dt = i3cb                                                         				 (i)
//
//             dq4/dt = i4                                                                           (j)
//
//			   dq41/dt = i4ct                                                         				 (k)
//
//			   dq42/dt = i4cb                                                         				 (l)
//
//             Lp*diLp/dt + Mpn*diLn/dt = v44 - vs_a                                                 (m)
//
//             Mnp*diLp/dt + Ln*diLn/dt = vs_a - v45                                                 (n)
//
//             dqa/dt = ia                                                                           (o)
//
//             dqb/dt = ib                                                                           (p)
//
//             (Lm_a + L_a)*dia/dt + Mab*dib/dt = vs_a - Ra*ia - qa/Ca                               (q)
//
//             Mba*dia/dt + (Lm_b + L_b)*dib/dt = - Rb*ib - qb/Cb                                    (r)
//
//             dq5/dt = i5                                                                           (s)
//
//			   dq51/dt = i5ct                                                          				 (t)
//
//			   dq52/dt = i5cb                                                            			 (u)
//
//             dq6/dt = i6                                                                           (v)
//
//			   dq61/dt = i6ct                                                      				     (w)
//
//			   dq62/dt = i6cb                                                          				 (x)
//
//             dq7/dt = i7                                                                           (y)
//
//			   dq71/dt = i7ct                                                         				 (z)
//
//			   dq72/dt = i7cb                                                         				 (aa)
//
//             dq8/dt = i8                                                                           (bb)
//
//			   dq81/dt = i8ct                                                         				 (cc)
//
//			   dq82/dt = i8cb                                                         				 (dd)
//
//
//
//
//       The OLE equations (if INDUCTIVE_COUPLED_LOAD is undefined) 
//
//             dq1/dt = i1                                                                           (a) 
//
//			   dq11/dt = i1ct                                                                        (b)
//
//    		   dq12/dt = i1cb                                                                        (c)
//
//             dq2/dt = i2                                                                           (d)
//
//			   dq21/dt = i2ct                                                       				 (e)
//
//			   dq22/dt = i2cb                                                      					 (f)
//
//             dq3/dt = i3                                                                           (g)
//
//			   dq31/dt = i3ct                                                         				 (h)
//
//			   dq32/dt = i3cb                                                         				 (i)
//
//             dq4/dt = i4                                                                           (j)
//
//			   dq41/dt = i4ct                                                         				 (k)
//
//			   dq42/dt = i4cb                                                         				 (l)
//
//             Lp*diLp/dt + Mpn*diLn/dt = v44 - vs_a                                                 (m)
//
//             Mnp*diLp/dt + Ln*diLn/dt = vs_a - v45                                                 (n)
//
//             ia = vs_a/R_load                                                                      (o)  (ODE used to solve for "ia" directly).
//
//             dq5/dt = i5                                                                           (s)
//
//			   dq51/dt = i5ct                                                          				 (t)
//
//			   dq52/dt = i5cb                                                            			 (u)
//
//             dq6/dt = i6                                                                           (v)
//
//			   dq61/dt = i6ct                                                      				     (w)
//
//			   dq62/dt = i6cb                                                          				 (x)
//
//             dq7/dt = i7                                                                           (y)
//
//			   dq71/dt = i7ct                                                         				 (z)
//
//			   dq72/dt = i7cb                                                         				 (aa)
//
//             dq8/dt = i8                                                                           (bb)
//
//			   dq81/dt = i8ct                                                         				 (cc)
//
//			   dq82/dt = i8cb                                                         				 (dd)
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

typedef enum {
  SRC_FUNC_NULL = -1,
  SRC_FUNC_Vm0,
  SRC_FUNC_Vm1,
  SRC_FUNC_Vm2,
  SRC_FUNC_Vm3,
  SRC_FUNC_ECtrl1,
  SRC_FUNC_ECtrl2,
  SRC_FUNC_ECtrl3,
  SRC_FUNC_ECtrl4,
  SRC_FUNC_ECtrl5,
  SRC_FUNC_ECtrl6,
  SRC_FUNC_ECtrl7,
  SRC_FUNC_ECtrl8,
  SRC_FUNC_Vref,

} SRC_FUNCTION;


typedef enum {
  ODE_FUNC_NULL = -1,
  ODE_FUNC_q1,
  ODE_FUNC_q11,
  ODE_FUNC_q12,
  ODE_FUNC_q2,
  ODE_FUNC_q21,
  ODE_FUNC_q22,
  ODE_FUNC_q3,
  ODE_FUNC_q31,
  ODE_FUNC_q32,
  ODE_FUNC_q4,
  ODE_FUNC_q41,
  ODE_FUNC_q42,
  ODE_FUNC_iLp_iLn_1,
  ODE_FUNC_iLp_iLn_2,
  ODE_FUNC_qa,
  ODE_FUNC_qb,
  ODE_FUNC_ia_ib_1,
  ODE_FUNC_ia_ib_2,
  ODE_FUNC_q5,
  ODE_FUNC_q51,
  ODE_FUNC_q52,
  ODE_FUNC_q6,
  ODE_FUNC_q61,
  ODE_FUNC_q62,
  ODE_FUNC_q7,
  ODE_FUNC_q71,
  ODE_FUNC_q72,
  ODE_FUNC_q8,
  ODE_FUNC_q81,
  ODE_FUNC_q82,

} ODE_FUNCTION;


typedef enum {
  CTRL_FUNC_NULL = -1,

} CTRL_FUNCTION;


typedef enum {
  COEF_FUNC_NULL = -1,
  COEF_FUNC_recp_rSrD11, 
  COEF_FUNC_recp_rSrD12, 
  COEF_FUNC_q1,
  COEF_FUNC_q11,
  COEF_FUNC_q12,
  COEF_FUNC_recp_rSrD21, 
  COEF_FUNC_recp_rSrD22, 
  COEF_FUNC_q2,
  COEF_FUNC_q21,
  COEF_FUNC_q22,
  COEF_FUNC_recp_rSrD31, 
  COEF_FUNC_recp_rSrD32, 
  COEF_FUNC_q3,
  COEF_FUNC_q31,
  COEF_FUNC_q32,
  COEF_FUNC_recp_rSrD41, 
  COEF_FUNC_recp_rSrD42, 
  COEF_FUNC_q4,
  COEF_FUNC_q41,
  COEF_FUNC_q42,
  COEF_FUNC_iLp,
  COEF_FUNC_iLn,
  COEF_FUNC_ia,
  COEF_FUNC_recp_rSrD51, 
  COEF_FUNC_recp_rSrD52, 
  COEF_FUNC_q5,
  COEF_FUNC_q51,
  COEF_FUNC_q52,
  COEF_FUNC_recp_rSrD61, 
  COEF_FUNC_recp_rSrD62, 
  COEF_FUNC_q6,
  COEF_FUNC_q61,
  COEF_FUNC_q62,
  COEF_FUNC_recp_rSrD71, 
  COEF_FUNC_recp_rSrD72,
  COEF_FUNC_q7,
  COEF_FUNC_q71,
  COEF_FUNC_q72,
  COEF_FUNC_recp_rSrD81, 
  COEF_FUNC_recp_rSrD82, 
  COEF_FUNC_q8_plus_MinusBus_C8,
  COEF_FUNC_q81,
  COEF_FUNC_q82_minus_MinusBus_C82,
} COEF_FUNCTION;



typedef enum {
  SWITCH_FUNC_NULL = -1,
  SWITCH_FUNC_rS11,
  SWITCH_FUNC_rS12,
  SWITCH_FUNC_rS21,
  SWITCH_FUNC_rS22,
  SWITCH_FUNC_rS31,
  SWITCH_FUNC_rS32,
  SWITCH_FUNC_rS41,
  SWITCH_FUNC_rS42,
  SWITCH_FUNC_rS51,
  SWITCH_FUNC_rS52,
  SWITCH_FUNC_rS61,
  SWITCH_FUNC_rS62,
  SWITCH_FUNC_rS71,
  SWITCH_FUNC_rS72,
  SWITCH_FUNC_rS81,
  SWITCH_FUNC_rS82,

} SWITCH_FUNCTION;


typedef enum {
  SPICE_FUNC_NULL = -1,
  SPICE_FUNC_MultiLevel,
} SPICE_FUNCTION;

//define this only for debugging the matrix of any declared SpiceObjects. The size must appropriately.
//#define DEBUG_SPICE_MATRIX
//#define SPICE_DEBUG_MATRIX_SIZE 35

//if "DEBUG_SPICE_MATRIX" defined above, as an option we can also elect to dump the "a_matrix" and "a_equate_vector" for
//analysis using Octave.
//#define DUMP_MATRIX_EQUATE_VECTOR_TO_FILE_FOR_EXTERNAL_ANALYSIS 


#include "Simulation.hpp" 


//Parameters....

// Cell parameters
#define C1   .0004 
#define C2   .0004
#define C3   .0004
#define C4   .0004
#define C5   .0004
#define C6   .0004
#define C7   .0004
#define C8   .0004


// Switch coupling capacitor parameters
#define C11	 .0000001
#define C12	 .0000001
#define C21	 .0000001
#define C22	 .0000001
#define C31	 .0000001
#define C32	 .0000001
#define C41	 .0000001
#define C42	 .0000001
#define C51	 .0000001
#define C52	 .0000001
#define C61	 .0000001
#define C62	 .0000001
#define C71	 .0000001
#define C72	 .0000001
#define C81	 .0000001
#define C82	 .0000001



//set this to the same value as the initial "OffRes" of the "SwitchObject"
//that controls switch coeficients.
#define INIT_COEF_RS_RD  1000000.0 


 
// Load parameters (if INDUCTIVE_COUPLED_LOAD is defined)
#define Lm_a  1e-3               
#define Lm_b  Lm_a
#define Mab  .98e-3          
#define Mba  Mab

#define L_a .1e-3            
#define L_b L_a

#define Ra 1.0
#define Rb Ra

#define Ca 300e-6  
#define Cb Ca


// Load parameters (if INDUCTIVE_COUPLED_LOAD is undefined)
#define R_load 100000.0



// Interphase filter parameters

#define Lp  .5e-3
#define Ln  Lp
#define Mpn .49   //(.5mH * .98 coupling)
#define Mnp Mpn 

#define Rp  10.0
#define Rn  Rp

#define RECEP_Rp (1.0/Rp)
#define RECEP_Rn (1.0/Rn)

#define SWITCH_ENABLE_TIME .000750 

#define HALF_PWM_CYCLE .00025      
#define PWM_GAIN 5.0              


#define QUANTUM_PERIOD .0000125  


#define PLUS_DC_BUS_VOLTAGE  1000.0
#define MINUS_DC_BUS_VOLTAGE -1000.0

#define PI   3.1415926535897932384626433832795
  
        // Indices for the vector to solve.
#define Ind_v11     0
#define Ind_v12     1
#define Ind_v21     2
#define Ind_v23     3
#define Ind_v31     4
#define Ind_v34     5
#define Ind_v41     6
#define Ind_v44     7
#define Ind_v45     8
#define Ind_vs_a    9
#define Ind_v51     10
#define Ind_v56     11
#define Ind_v61     12
#define Ind_v67     13
#define Ind_v71     14
#define Ind_v78     15
#define Ind_v81     16
#define Ind_i1      17
#define Ind_i1_l    18
#define Ind_ipl     19
#define Ind_i1st	20
#define Ind_i1ct	21
#define Ind_i1sb	22
#define Ind_i1cb	23
#define Ind_i2    	24
#define Ind_i2_l  	25
#define Ind_i2st	26
#define Ind_i2ct	27
#define Ind_i2sb	28
#define Ind_i2cb	29
#define Ind_i3      30
#define Ind_i3_l    31
#define Ind_i3st	32
#define Ind_i3ct	33
#define Ind_i3sb	34
#define Ind_i3cb	35
#define Ind_i4      36
#define Ind_i4_l    37
#define Ind_i4st	38
#define Ind_i14t	39
#define Ind_i4sb	40
#define Ind_i4cb	41
#define Ind_i5      42
#define Ind_i5_l   	43
#define Ind_i5st	44
#define Ind_i5ct	45
#define Ind_i5sb	46
#define Ind_i5cb	47
#define Ind_inl     48
#define Ind_i6      49
#define Ind_i6_l    50
#define Ind_i6st	51
#define Ind_i6ct	52
#define Ind_i6sb	53
#define Ind_i6cb	54
#define Ind_i7      55
#define Ind_i7_l    56
#define Ind_i7st	57
#define Ind_i7ct	58
#define Ind_i7sb	59
#define Ind_i7cb	60
#define Ind_i8      61
#define Ind_i8_l    62
#define Ind_i8st	63
#define Ind_i8ct	64
#define Ind_i8sb	65
#define Ind_i8cb	66


	!!!!!!!!!!!!!!!!!!!!!!! STOP !!!!!!!!!!!!!!!!!!!!!




// Define if "Vref" should supply a sin() command. If undefined, "Vref" supplies a zero command..
#define APPLY_SINEWAVE_VREF_COMMAND

// Define if  load connected to "vs_a" represents the selected inductively coupled load used for this test. 
// If undefined, the connection to "vs_a" is a simple resistive load.
//#define INDUCTIVE_COUPLED_LOAD



// Control all the ploting in this application by commenting/un-commenting  the definitions below...

  //#define PLOT_SRCOBJECT_Vm0
  //#define PLOT_SRCOBJECT_Vm1
  //#define PLOT_SRCOBJECT_Vm2
  //#define PLOT_SRCOBJECT_Vm3


//#define PLOT_SRCOBJECT_PROBES_ECtrl1
//#define PLOT_SRCOBJECT_PROBES_ECtrl2
//#define PLOT_SRCOBJECT_PROBES_ECtrl3
//#define PLOT_SRCOBJECT_PROBES_ECtrl4
//#define PLOT_SRCOBJECT_PROBES_ECtrl5
//#define PLOT_SRCOBJECT_PROBES_ECtrl6
//#define PLOT_SRCOBJECT_PROBES_ECtrl7
//#define PLOT_SRCOBJECT_PROBES_ECtrl8



  //#define PLOT_ODEOBJECT_q2
  //#define PLOT_ODEOBJECT_q3
  //#define PLOT_ODEOBJECT_q4
  //#define PLOT_ODEOBJECT_iLp_iLn_1
  //#define PLOT_ODEOBJECT_iLp_iLn_2
  //#define PLOT_ODEOBJECT_qa
  //#define PLOT_ODEOBJECT_qb
  //#define PLOT_ODEOBJECT_ia_ib_1       
  //#define PLOT_ODEOBJECT_ia_ib_2
  //#define PLOT_ODEOBJECT_q5
  //#define PLOT_ODEOBJECT_q6
  //#define PLOT_ODEOBJECT_q7
  //#define PLOT_ODEOBJECT_q8






//#define PLOT_SWITCHOBJECT_PROBES_rS11
//#define DO_PROBE_rS11_res
//#define DO_PROBE_rS11_cur
//#define DO_PROBE_rS11_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS12
//#define DO_PROBE_rS12_res
//#define DO_PROBE_rS12_cur
//#define DO_PROBE_rS12_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS21
//#define DO_PROBE_rS21_res
//#define DO_PROBE_rS21_cur
//#define DO_PROBE_rS21_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS22
//#define DO_PROBE_rS22_res
//#define DO_PROBE_rS22_cur
//#define DO_PROBE_rS22_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS31
//#define DO_PROBE_rS31_res
//#define DO_PROBE_rS31_cur
//#define DO_PROBE_rS31_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS32
//#define DO_PROBE_rS32_res
//#define DO_PROBE_rS32_cur
//#define DO_PROBE_rS32_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS41
//#define DO_PROBE_rS41_res
//#define DO_PROBE_rS41_cur
//#define DO_PROBE_rS41_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS42
//#define DO_PROBE_rS42_res
//#define DO_PROBE_rS42_cur
//#define DO_PROBE_rS42_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS51 
//#define DO_PROBE_rS51_res
//#define DO_PROBE_rS51_cur
//#define DO_PROBE_rS51_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS52
//#define DO_PROBE_rS52_res
//#define DO_PROBE_rS52_cur
//#define DO_PROBE_rS52_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS61
//#define DO_PROBE_rS61_res
//#define DO_PROBE_rS61_cur
//#define DO_PROBE_rS61_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS62
//#define DO_PROBE_rS62_res
//#define DO_PROBE_rS62_cur
//#define DO_PROBE_rS62_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS71
//#define DO_PROBE_rS71_res
//#define DO_PROBE_rS71_cur
//#define DO_PROBE_rS71_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS72
//#define DO_PROBE_rS72_res
//#define DO_PROBE_rS72_cur
//#define DO_PROBE_rS72_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS81
//#define DO_PROBE_rS81_res
//#define DO_PROBE_rS81_cur
//#define DO_PROBE_rS81_gate

//#define PLOT_SWITCHOBJECT_PROBES_rS82
//#define DO_PROBE_rS82_res
//#define DO_PROBE_rS82_cur
//#define DO_PROBE_rS82_gate


#define PLOT_SPICEOBJECT_PROBES_solution_vector
  //#define DO_PROBE_v11    
  //#define DO_PROBE_v12    
  //#define DO_PROBE_v21    
  //#define DO_PROBE_v23    
  //#define DO_PROBE_v31    
  //#define DO_PROBE_v34    
  //#define DO_PROBE_v41    
  //#define DO_PROBE_v44    
  //#define DO_PROBE_v45    
#define DO_PROBE_vs_a
  //#define DO_PROBE_v51    
  //#define DO_PROBE_v56    
  //#define DO_PROBE_v61    
  //#define DO_PROBE_v67    
  //#define DO_PROBE_v71    
  //#define DO_PROBE_v78    
  //#define DO_PROBE_v81    
  //#define DO_PROBE_i1   
  //#define DO_PROBE_i1_l     
  //#define DO_PROBE_ipl    
  //#define DO_PROBE_i2
  //#define DO_PROBE_i2_l     
  //#define DO_PROBE_i3 
  //#define DO_PROBE_i3_l     
  //#define DO_PROBE_i4
  //#define DO_PROBE_i4_l     
  //#define DO_PROBE_i5
  //#define DO_PROBE_i5_l     
  //#define DO_PROBE_inl    
  //#define DO_PROBE_i6 
  //#define DO_PROBE_i6_l   
  //#define DO_PROBE_i7
  //#define DO_PROBE_i7_l     
  //#define DO_PROBE_i8
  //#define DO_PROBE_i8_l 






   
// **** SrcObject Classes ********************************

// ---- Vm0 ---------------------------------------------

class Vm0 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SrcRValueUpdate(void);
  Vm0(void);
  ~Vm0(void);
  double t_mod;
  double t_prev;
  double t_scaled_shifted;
  double t_shift;
  double t_freq_scale;
  double PwmRampDir;
  double PwmFreqScale;



};


Vm0 Inst_Vm0;


// --------------------------------------------------------

// ---- Vm1 ---------------------------------------

class Vm1 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SrcRValueUpdate(void);
  Vm1(void);
  ~Vm1(void);
  double t_mod;
  double t_prev;
  double t_scaled_shifted;
  double t_shift;
  double t_freq_scale;
  double PwmRampDir;
  double PwmFreqScale;



};


Vm1 Inst_Vm1;


// --------------------------------------------------------


// ---- Vm2 ----------------------------------------------

class Vm2 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SrcRValueUpdate(void);
  Vm2(void);
  ~Vm2(void);
  double t_mod;
  double t_prev;
  double t_scaled_shifted;
  double t_shift;
  double t_freq_scale;
  double PwmRampDir;
  double PwmFreqScale;



};


Vm2 Inst_Vm2;


// --------------------------------------------------------


// ---- Vm3 ----------------------------------------------

class Vm3 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SrcRValueUpdate(void);
  Vm3(void);
  ~Vm3(void);
  double t_mod;
  double t_prev;
  double t_scaled_shifted;
  double t_shift;
  double t_freq_scale;
  double PwmRampDir;
  double PwmFreqScale;



};


Vm3 Inst_Vm3;


// --------------------------------------------------------



// ---- ECtrl1 ---------------------------------------------

class ECtrl1 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl1(void);
  ~ECtrl1(void);
  double Time_0;
  double V_112;
  double V_210;
  bool   GateCtrl_111;
  bool   GateCtrl_121;
  //storage for probes...
  vector<double> Gate_111;
  vector<double> Gate_121;

};

ECtrl1 Inst_ECtrl1;

// --------------------------------------------------------



// ---- ECtrl2 ---------------------------------------------

class ECtrl2 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl2(void);
  ~ECtrl2(void);
  double Time_0;
  double V_112;
  double V_110;
  bool   GateCtrl_211;
  bool   GateCtrl_221;
  //storage for probes...
  vector<double> Gate_211;
  vector<double> Gate_221;	 

};

ECtrl2 Inst_ECtrl2;

// --------------------------------------------------------


// ---- ECtrl3 ---------------------------------------------

class ECtrl3 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl3(void);
  ~ECtrl3(void);
  double Time_0;
  double V_112;
  double V_410;
  bool   GateCtrl_311;
  bool   GateCtrl_321;
  //storage for probes...
  vector<double> Gate_311;
  vector<double> Gate_321;

};

ECtrl3 Inst_ECtrl3;

// --------------------------------------------------------


// ---- ECtrl4 ---------------------------------------------

class ECtrl4 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl4(void);
  ~ECtrl4(void);
  double Time_0;
  double V_112;
  double V_310;
  bool   GateCtrl_411;
  bool   GateCtrl_421;
  //storage for probes...
  vector<double> Gate_411;
  vector<double> Gate_421;
 

};

ECtrl4 Inst_ECtrl4;

// --------------------------------------------------------


// ---- ECtrl5 ---------------------------------------------

class ECtrl5 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl5(void);
  ~ECtrl5(void);
  double Time_0;
  double V_112;
  double V_210;
  bool   GateCtrl_511;
  bool   GateCtrl_521;
  //storage for probes...
  vector<double> Gate_511;
  vector<double> Gate_521;	 

};

ECtrl5 Inst_ECtrl5;

// --------------------------------------------------------


// ---- ECtrl6 ---------------------------------------------

class ECtrl6 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl6(void);
  ~ECtrl6(void);
  double Time_0;
  double V_112;
  double V_110;
  bool   GateCtrl_611;
  bool   GateCtrl_621;
  //storage for probes...
  vector<double> Gate_611;
  vector<double> Gate_621;
	 

};

ECtrl6 Inst_ECtrl6;

// --------------------------------------------------------


// ---- ECtrl7 ---------------------------------------------

class ECtrl7 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl7(void);
  ~ECtrl7(void);
  double Time_0;
  double V_112;
  double V_410;
  bool   GateCtrl_711;
  bool   GateCtrl_721;
  //storage for probes...
  vector<double> Gate_711;
  vector<double> Gate_721;
	 

};

ECtrl7 Inst_ECtrl7;

// --------------------------------------------------------


// ---- ECtrl8 ---------------------------------------------

class ECtrl8 : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SwitchRValueUpdate(void);
  //we use some probes in this object to get a better understanding
  //of what is going on.
  virtual void RecordProbes(void);
  virtual void PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[]);
  ECtrl8(void);
  ~ECtrl8(void);
  double Time_0;
  double V_112;
  double V_310;
  bool   GateCtrl_811;
  bool   GateCtrl_821;
  //storage for probes...
  vector<double> Gate_811;
  vector<double> Gate_821;
	 

};

ECtrl8 Inst_ECtrl8;

// --------------------------------------------------------

// ---- Vref  ----------------------------------------------------

class Vref : public SrcObject
{
public:
  virtual void SrcFunction(double t);
  virtual void SrcRValueUpdate(void);
  Vref(void);
  ~Vref(void);




};

Vref Inst_Vref;

// ---------------------------------------------------------------







SrcObject * SrcObjectList[] = {(SrcObject *) &Inst_Vm0,
			       (SrcObject *) &Inst_Vm1,
			       (SrcObject *) &Inst_Vm2,
			       (SrcObject *) &Inst_Vm3,
			       (SrcObject *) &Inst_ECtrl1,
			       (SrcObject *) &Inst_ECtrl2,
			       (SrcObject *) &Inst_ECtrl3,
			       (SrcObject *) &Inst_ECtrl4,
			       (SrcObject *) &Inst_ECtrl5,
			       (SrcObject *) &Inst_ECtrl6,
			       (SrcObject *) &Inst_ECtrl7,
			       (SrcObject *) &Inst_ECtrl8,
			       (SrcObject *) &Inst_Vref,
			       0};


// ****************************************************************




// **** OdeObject Classes *****************************************

// ---- q1 ---------------------------------------------

class q1 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q1(void);
  ~q1(void);
  //source for this ODE
  double i1;
 
};

q1 Inst_q1;


// --------------------------------------------------------

// ---- q11 ---------------------------------------------

class q11 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q11(void);
  ~q11(void);
  //source for this ODE
  double i11;
 
};

q11 Inst_q11;


// --------------------------------------------------------

// ---- q12 ---------------------------------------------

class q12 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q12(void);
  ~q12(void);
  //source for this ODE
  double i12;
 
};

q12 Inst_q12;


// --------------------------------------------------------


// ---- q2 ---------------------------------------------

class q2 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q2(void);
  ~q2(void);
  //source for this ODE
  double i2;
 
};

q2 Inst_q2;


// --------------------------------------------------------

// ---- q21 ---------------------------------------------

class q21 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q21(void);
  ~q21(void);
  //source for this ODE
  double i21;
 
};

q21 Inst_q21;


// --------------------------------------------------------

// ---- q22 ---------------------------------------------

class q22 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q22(void);
  ~q22(void);
  //source for this ODE
  double i22;
 
};

q22 Inst_q22;


// --------------------------------------------------------


// ---- q3 ---------------------------------------------

class q3 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q3(void);
  ~q3(void);
  //source for this ODE
  double i3;
 
};

q3 Inst_q3;


// --------------------------------------------------------

// ---- q31 ---------------------------------------------

class q31 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q31(void);
  ~q31(void);
  //source for this ODE
  double i31;

};

q31 Inst_q31;


// --------------------------------------------------------

// ---- q32 ---------------------------------------------

class q32 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q32(void);
  ~q32(void);
  //source for this ODE
  double i32;

};

q32 Inst_q32;


// --------------------------------------------------------

// ---- q4 ---------------------------------------------

class q4 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q4(void);
  ~q4(void);
  //source for this ODE
  double i4;

};

q4 Inst_q4;


// --------------------------------------------------------

// ---- q41 ---------------------------------------------

class q41 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q41(void);
  ~q41(void);
  //source for this ODE
  double i41;

};

q41 Inst_q41;


// --------------------------------------------------------

// ---- q42 ---------------------------------------------

class q42 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q42(void);
  ~q42(void);
  //source for this ODE
  double i42;
 
};

q42 Inst_q42;


// --------------------------------------------------------

// ---- iLp_iLn_1 ---------------------------------------------

class iLp_iLn_1 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  virtual void OdeGroupMSolve(double dydt[],  double dmdt[]);
  iLp_iLn_1(void);
  ~iLp_iLn_1(void);
  //source for this ODE
  double v44;
  double vs_a;


};

iLp_iLn_1 Inst_iLp_iLn_1;

// --------------------------------------------------------

// ---- iLp_iLn_2 ---------------------------------------------

class iLp_iLn_2 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  iLp_iLn_2(void);
  ~iLp_iLn_2(void);
  //source for this ODE
  double v45;
  double vs_a;


};

iLp_iLn_2 Inst_iLp_iLn_2;

// --------------------------------------------------------

// ---- qa ---------------------------------------------

class qa : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void OdeRValueUpdate(void);
  qa(void);
  ~qa(void);
  //source for this ODE
  double ia;

};

qa Inst_qa;


// --------------------------------------------------------

// ---- qb ---------------------------------------------

class qb : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void OdeRValueUpdate(void);
  qb(void);
  ~qb(void);
  //source for this ODE
  double ib;

};

qb Inst_qb;


// --------------------------------------------------------


// ---- ia_ib_1 ---------------------------------------------

class ia_ib_1 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void OdeRValueUpdate(void);
  virtual void CoefRValueUpdate(void);
  virtual void OdeGroupMSolve(double dydt[],  double dmdt[]);
  virtual void PostOdeFunction(double t);
  ia_ib_1(void);
  ~ia_ib_1(void);
  //source for this ODE
  double qa;
  //(ia is represented by "y")
  double vs_a;


};

ia_ib_1 Inst_ia_ib_1;

// --------------------------------------------------------

// ---- ia_ib_2 ---------------------------------------------

class ia_ib_2 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void OdeRValueUpdate(void);
  ia_ib_2(void);
  ~ia_ib_2(void);
  //source for this ODE
  double qb;
 //(ib is represented by "y")



};

ia_ib_2 Inst_ia_ib_2;

// --------------------------------------------------------

// ---- q5 ---------------------------------------------

class q5 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q5(void);
  ~q5(void);
  //source for this ODE
  double i5;

};

q5 Inst_q5;


// --------------------------------------------------------

// ---- q51 ---------------------------------------------

class q51 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q51(void);
  ~q51(void);
  //source for this ODE
  double i51;

};

q51 Inst_q51;


// --------------------------------------------------------

// ---- q52 ---------------------------------------------

class q52 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q52(void);
  ~q52(void);
  //source for this ODE
  double i52;

};

q52 Inst_q52;


// --------------------------------------------------------

// ---- q6 ---------------------------------------------

class q6 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q6(void);
  ~q6(void);
  //source for this ODE
  double i6;

};

q6 Inst_q6;


// --------------------------------------------------------

// ---- q61 ---------------------------------------------

class q61 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q61(void);
  ~q61(void);
  //source for this ODE
  double i61;

};

q61 Inst_q61;


// --------------------------------------------------------

// ---- q62 ---------------------------------------------

class q62 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q62(void);
  ~q62(void);
  //source for this ODE
  double i62;

};

q62 Inst_q62;


// --------------------------------------------------------

// ---- q7 ---------------------------------------------

class q7 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q7(void);
  ~q7(void);
  //source for this ODE
  double i7;
 
};

q7 Inst_q7;


// --------------------------------------------------------

// ---- q71 ---------------------------------------------

class q71 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q71(void);
  ~q71(void);
  //source for this ODE
  double i71;
 
};

q71 Inst_q71;


// --------------------------------------------------------

// ---- q72 ---------------------------------------------

class q72 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q72(void);
  ~q72(void);
  //source for this ODE
  double i72;
 
};

q72 Inst_q72;


// --------------------------------------------------------


// ---- q8 ---------------------------------------------

class q8 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q8(void);
  ~q8(void);
  //source for this ODE
  double i8;
 
};

q8 Inst_q8;


// --------------------------------------------------------

// ---- q81 ---------------------------------------------

class q81 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q81(void);
  ~q81(void);
  //source for this ODE
  double i81;
 
};

q81 Inst_q81;


// --------------------------------------------------------

// ---- q82 ---------------------------------------------

class q82 : public OdeObject
{
public:
  virtual double OdeFunction(double y, double t);
  virtual void CoefRValueUpdate(void);
  q82(void);
  ~q82(void);
  //source for this ODE
  double i82;
 
};

q82 Inst_q82;


// --------------------------------------------------------


OdeObject * OdeObjectList[] = {(OdeObject *) &Inst_q1,
				   (OdeObject *) &Inst_q11,
				   (OdeObject *) &Inst_q12,
			       (OdeObject *) &Inst_q2,
				   (OdeObject *) &Inst_q21,
				   (OdeObject *) &Inst_q22,
			       (OdeObject *) &Inst_q3,
				   (OdeObject *) &Inst_q31,
				   (OdeObject *) &Inst_q32,
			       (OdeObject *) &Inst_q4,
				   (OdeObject *) &Inst_q41,
				   (OdeObject *) &Inst_q42,
			       (OdeObject *) &Inst_iLp_iLn_1,        //the next two are in a group and must be maintained in this order.
			       (OdeObject *) &Inst_iLp_iLn_2,
			       (OdeObject *) &Inst_qa,
			       (OdeObject *) &Inst_qb,
			       (OdeObject *) &Inst_ia_ib_1,          //the next two are in a group and must be maintained in this order. 
			       (OdeObject *) &Inst_ia_ib_2,
			       (OdeObject *) &Inst_q5,
				   (OdeObject *) &Inst_q51,
				   (OdeObject *) &Inst_q52,
			       (OdeObject *) &Inst_q6,
				   (OdeObject *) &Inst_q61,
				   (OdeObject *) &Inst_q62,
			       (OdeObject *) &Inst_q7,
				   (OdeObject *) &Inst_q71,
				   (OdeObject *) &Inst_q72,
			       (OdeObject *) &Inst_q8,
				   (OdeObject *) &Inst_q81,
				   (OdeObject *) &Inst_q82,
			       0};



// ****************************************************************




// **** CtrlObject Classes ****************************************







CtrlObject * CtrlObjectList[] = {                              
				 0};

int CtrlObjectQuantum[] = {0
                            
                          };


// ****************************************************************








// **** CoefObject Classes ****************************************

// ---- Coef_recp_rSrD11 ---------------------------------------------

class Coef_recp_rSrD11 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD11(void);
  ~Coef_recp_rSrD11(void);
  double rS11;
  double rD11;

};

Coef_recp_rSrD11 Coef_recp_rSrD11_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD12 ---------------------------------------------

class Coef_recp_rSrD12 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD12(void);
  ~Coef_recp_rSrD12(void);
  double rS12;
  double rD12;


};

Coef_recp_rSrD12 Coef_recp_rSrD12_i;

// -------------------------------------------------------------



// ---- Coef_q1 ---------------------------------------------

class Coef_q1 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q1(void);
  ~Coef_q1(void);
  double q1;
  


};

Coef_q1 Coef_q1_i;

// -------------------------------------------------------------

// ---- Coef_q11 ---------------------------------------------

class Coef_q11 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q11(void);
  ~Coef_q11(void);
  double q11;



};

Coef_q11 Coef_q11_i;

// -------------------------------------------------------------

// ---- Coef_q12 ---------------------------------------------

class Coef_q12 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q12(void);
  ~Coef_q12(void);
  double q12;



};

Coef_q12 Coef_q12_i;

// -------------------------------------------------------------


// ---- Coef_recp_rSrD21 ---------------------------------------------

class Coef_recp_rSrD21 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD21(void);
  ~Coef_recp_rSrD21(void);
  double rS21;
  double rD21;



};

Coef_recp_rSrD21 Coef_recp_rSrD21_i;

// -------------------------------------------------------------
         
// ---- Coef_recp_rSrD22 ---------------------------------------------

class Coef_recp_rSrD22 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD22(void);
  ~Coef_recp_rSrD22(void);
  double rS22;
  double rD22;



};

Coef_recp_rSrD22 Coef_recp_rSrD22_i;

// -------------------------------------------------------------

// ---- Coef_q2 ---------------------------------------------

class Coef_q2 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q2(void);
  ~Coef_q2(void);
  double q2;
  


};

Coef_q2 Coef_q2_i;

// -------------------------------------------------------------

// ---- Coef_q21 ---------------------------------------------

class Coef_q21 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q21(void);
  ~Coef_q21(void);
  double q21;



};

Coef_q21 Coef_q21_i;

// -------------------------------------------------------------

// ---- Coef_q22 ---------------------------------------------

class Coef_q22 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q22(void);
  ~Coef_q22(void);
  double q22;



};

Coef_q22 Coef_q22_i;

// -------------------------------------------------------------


// ---- Coef_recp_rSrD31 ---------------------------------------------

class Coef_recp_rSrD31 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD31(void);
  ~Coef_recp_rSrD31(void);
  double rS31;
  double rD31;




};

Coef_recp_rSrD31 Coef_recp_rSrD31_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD32 ---------------------------------------------

class Coef_recp_rSrD32 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD32(void);
  ~Coef_recp_rSrD32(void);
  double rS32;
  double rD32;



};

Coef_recp_rSrD32 Coef_recp_rSrD32_i;

// -------------------------------------------------------------

// ---- Coef_q3 ---------------------------------------------

class Coef_q3 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q3(void);
  ~Coef_q3(void);
  double q3;
  


};

Coef_q3 Coef_q3_i;

// -------------------------------------------------------------

// ---- Coef_q31 ---------------------------------------------

class Coef_q31 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q31(void);
  ~Coef_q31(void);
  double q31;



};

Coef_q31 Coef_q31_i;

// -------------------------------------------------------------

// ---- Coef_q32 ---------------------------------------------

class Coef_q32 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q32(void);
  ~Coef_q32(void);
  double q32;



};

Coef_q32 Coef_q32_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD41 ---------------------------------------------

class Coef_recp_rSrD41 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD41(void);
  ~Coef_recp_rSrD41(void);
  double rS41;
  double rD41;



};

Coef_recp_rSrD41 Coef_recp_rSrD41_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD42 ---------------------------------------------

class Coef_recp_rSrD42 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD42(void);
  ~Coef_recp_rSrD42(void);
  double rS42;
  double rD42;



};

Coef_recp_rSrD42 Coef_recp_rSrD42_i;

// -------------------------------------------------------------

// ---- Coef_q4 ---------------------------------------------

class Coef_q4 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q4(void);
  ~Coef_q4(void);
  double q4;
  


};

Coef_q4 Coef_q4_i;

// -------------------------------------------------------------

// ---- Coef_q41 ---------------------------------------------

class Coef_q41 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q41(void);
  ~Coef_q41(void);
  double q41;



};

Coef_q41 Coef_q41_i;

// -------------------------------------------------------------

// ---- Coef_q42 ---------------------------------------------

class Coef_q42 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q42(void);
  ~Coef_q42(void);
  double q42;



};

Coef_q42 Coef_q42_i;

// -------------------------------------------------------------


// ---- Coef_iLp ---------------------------------------------

class Coef_iLp : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_iLp(void);
  ~Coef_iLp(void);
  double iLp;
  


};

Coef_iLp Coef_iLp_i;

// -------------------------------------------------------------


// ---- Coef_iLn ---------------------------------------------

class Coef_iLn : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_iLn(void);
  ~Coef_iLn(void);
  double iLn;

 
};

Coef_iLn Coef_iLn_i;

// -------------------------------------------------------------

// ---- Coef_ia ---------------------------------------------

class Coef_ia : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_ia(void);
  ~Coef_ia(void);
  double ia;
  


};

Coef_ia Coef_ia_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD51 ---------------------------------------------

class Coef_recp_rSrD51 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD51(void);
  ~Coef_recp_rSrD51(void);
  double rS51;
  double rD51;



};

Coef_recp_rSrD51 Coef_recp_rSrD51_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD52 ---------------------------------------------

class Coef_recp_rSrD52 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD52(void);
  ~Coef_recp_rSrD52(void);
  double rS52;
  double rD52;



};

Coef_recp_rSrD52 Coef_recp_rSrD52_i;

// -------------------------------------------------------------

// ---- Coef_q5 ---------------------------------------------

class Coef_q5 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q5(void);
  ~Coef_q5(void);
  double q5;
  


};

Coef_q5 Coef_q5_i;

// -------------------------------------------------------------

// ---- Coef_q51 ---------------------------------------------

class Coef_q51 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q51(void);
  ~Coef_q51(void);
  double q51;



};

Coef_q51 Coef_q51_i;

// -------------------------------------------------------------

// ---- Coef_q52 ---------------------------------------------

class Coef_q52 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q52(void);
  ~Coef_q52(void);
  double q52;



};

Coef_q52 Coef_q52_i;

// -------------------------------------------------------------


// ---- Coef_recp_rSrD61 ---------------------------------------------

class Coef_recp_rSrD61 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD61(void);
  ~Coef_recp_rSrD61(void);
  double rS61;
  double rD61;



};

Coef_recp_rSrD61 Coef_recp_rSrD61_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD62 ---------------------------------------------

class Coef_recp_rSrD62 : public CoefObject
{
public:

  virtual void CoefFunction(void);
  Coef_recp_rSrD62(void);
  ~Coef_recp_rSrD62(void);
  double rS62;
  double rD62;


};

Coef_recp_rSrD62 Coef_recp_rSrD62_i;

// -------------------------------------------------------------

// ---- Coef_q6 ---------------------------------------------

class Coef_q6 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q6(void);
  ~Coef_q6(void);
  double q6;
  


};

Coef_q6 Coef_q6_i;

// -------------------------------------------------------------

// ---- Coef_q61 ---------------------------------------------

class Coef_q61 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q61(void);
  ~Coef_q61(void);
  double q61;



};

Coef_q61 Coef_q61_i;

// -------------------------------------------------------------

// ---- Coef_q62 ---------------------------------------------

class Coef_q62 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q62(void);
  ~Coef_q62(void);
  double q62;



};

Coef_q62 Coef_q62_i;

// -------------------------------------------------------------


// ---- Coef_recp_rSrD71 ---------------------------------------------

class Coef_recp_rSrD71 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD71(void);
  ~Coef_recp_rSrD71(void);
  double rS71;
  double rD71;



};

Coef_recp_rSrD71 Coef_recp_rSrD71_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD72 ---------------------------------------------

class Coef_recp_rSrD72 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD72(void);
  ~Coef_recp_rSrD72(void);
  double rS72;
  double rD72;



};

Coef_recp_rSrD72 Coef_recp_rSrD72_i;

// -------------------------------------------------------------

// ---- Coef_q7 ---------------------------------------------

class Coef_q7 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q7(void);
  ~Coef_q7(void);
  double q7;
  


};

Coef_q7 Coef_q7_i;

// -------------------------------------------------------------

// ---- Coef_q71 ---------------------------------------------

class Coef_q71 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q71(void);
  ~Coef_q71(void);
  double q71;



};

Coef_q71 Coef_q71_i;

// -------------------------------------------------------------

// ---- Coef_q72 ---------------------------------------------

class Coef_q72 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q72(void);
  ~Coef_q72(void);
  double q72;



};

Coef_q72 Coef_q72_i;

// -------------------------------------------------------------


// ---- Coef_recp_rSrD81 ---------------------------------------------

class Coef_recp_rSrD81 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD81(void);
  ~Coef_recp_rSrD81(void);
  double rS81;
  double rD81;



};

Coef_recp_rSrD81 Coef_recp_rSrD81_i;

// -------------------------------------------------------------

// ---- Coef_recp_rSrD82 ---------------------------------------------

class Coef_recp_rSrD82 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_recp_rSrD82(void);
  ~Coef_recp_rSrD82(void);
  double rS82;
  double rD82;



};

Coef_recp_rSrD82 Coef_recp_rSrD82_i;

// -------------------------------------------------------------

// ---- Coef_q8_plus_MinusBus_C8 ---------------------------------------------

class Coef_q8_plus_MinusBus_C8 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q8_plus_MinusBus_C8(void);
  ~Coef_q8_plus_MinusBus_C8(void);
  double q8;
  


};

Coef_q8_plus_MinusBus_C8 Coef_q8_plus_MinusBus_C8_i;

// -------------------------------------------------------------

// ---- Coef_q81 ---------------------------------------------

class Coef_q81 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q81(void);
  ~Coef_q81(void);
  double q81;



};

Coef_q81 Coef_q81_i;

// -------------------------------------------------------------

// ---- Coef_q82_minus_MinusBus_C82 -------------------------------

class Coef_q82_minus_MinusBus_C82 : public CoefObject
{
public:
  virtual void CoefFunction(void);
  Coef_q82_minus_MinusBus_C82(void);
  ~Coef_q82_minus_MinusBus_C82(void);
  double q82;



};

Coef_q82_minus_MinusBus_C82 Coef_q82_minus_MinusBus_C82_i;

// -------------------------------------------------------------








CoefObject * CoefObjectList[] = {(CoefObject *)  &Coef_recp_rSrD11_i,
				 (CoefObject *)  &Coef_recp_rSrD12_i,
				 (CoefObject *)  &Coef_q1_i,
				 (CoefObject *)  &Coef_q11_i,
				 (CoefObject *)  &Coef_q12_i,
				 (CoefObject *)  &Coef_recp_rSrD21_i,
				 (CoefObject *)  &Coef_recp_rSrD22_i,
				 (CoefObject *)  &Coef_q2_i,
				 (CoefObject *)  &Coef_q21_i,
				 (CoefObject *)  &Coef_q22_i,
				 (CoefObject *)  &Coef_recp_rSrD31_i,
				 (CoefObject *)  &Coef_recp_rSrD32_i,
				 (CoefObject *)  &Coef_q3_i,
				 (CoefObject *)  &Coef_q31_i,
				 (CoefObject *)  &Coef_q32_i,
				 (CoefObject *)  &Coef_recp_rSrD41_i,
				 (CoefObject *)  &Coef_recp_rSrD42_i,
				 (CoefObject *)  &Coef_q4_i,
				 (CoefObject *)  &Coef_q41_i,
				 (CoefObject *)  &Coef_q42_i,
				 (CoefObject *)  &Coef_iLp_i,
				 (CoefObject *)  &Coef_iLn_i,
				 (CoefObject *)  &Coef_ia_i,
				 (CoefObject *)  &Coef_recp_rSrD51_i,
				 (CoefObject *)  &Coef_recp_rSrD52_i,
				 (CoefObject *)  &Coef_q5_i,
				 (CoefObject *)  &Coef_q51_i,
				 (CoefObject *)  &Coef_q52_i,
				 (CoefObject *)  &Coef_recp_rSrD61_i,
				 (CoefObject *)  &Coef_recp_rSrD62_i,
				 (CoefObject *)  &Coef_q6_i,
				 (CoefObject *)  &Coef_q61_i,
				 (CoefObject *)  &Coef_q62_i,
				 (CoefObject *)  &Coef_recp_rSrD71_i,
				 (CoefObject *)  &Coef_recp_rSrD72_i,
				 (CoefObject *)  &Coef_q7_i,
				 (CoefObject *)  &Coef_q71_i,
				 (CoefObject *)  &Coef_q72_i,
				 (CoefObject *)  &Coef_recp_rSrD81_i,
				 (CoefObject *)  &Coef_recp_rSrD82_i,
				 (CoefObject *)  &Coef_q8_plus_MinusBus_C8_i,
				 (CoefObject *)  &Coef_q81_i,
				 (CoefObject *)  &Coef_q82_minus_MinusBus_C82_i,
				 
				 0};



// ****************************************************************

// **** SwitchObject Classes **************************************

// ---- Switch_rS11 -----------------------------------------------

class Switch_rS11 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS11(void);
  ~Switch_rS11(void);

};

Switch_rS11 Switch_rS11_i;

// ----------------------------------------------------------------


// ---- Switch_rS12 -----------------------------------------------

class Switch_rS12 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS12(void);
  ~Switch_rS12(void);
};

Switch_rS12 Switch_rS12_i;

// ----------------------------------------------------------------


// ---- Switch_rS21 -----------------------------------------------

class Switch_rS21 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS21(void);
  ~Switch_rS21(void);

};

Switch_rS21 Switch_rS21_i;

// ----------------------------------------------------------------


// ---- Switch_rS22 -----------------------------------------------

class Switch_rS22 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS22(void);
  ~Switch_rS22(void);
};

Switch_rS22 Switch_rS22_i;

// ----------------------------------------------------------------


// ---- Switch_rS31 -----------------------------------------------

class Switch_rS31 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS31(void);
  ~Switch_rS31(void);
};

Switch_rS31 Switch_rS31_i;

// ----------------------------------------------------------------


// ---- Switch_rS32 -----------------------------------------------

class Switch_rS32 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS32(void);
  ~Switch_rS32(void);
};

Switch_rS32 Switch_rS32_i;

// ----------------------------------------------------------------


// ---- Switch_rS41 -----------------------------------------------

class Switch_rS41 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS41(void);
  ~Switch_rS41(void);
};

Switch_rS41 Switch_rS41_i;

// ----------------------------------------------------------------


// ---- Switch_rS42 -----------------------------------------------

class Switch_rS42 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS42(void);
  ~Switch_rS42(void);

};

Switch_rS42 Switch_rS42_i;

// ----------------------------------------------------------------


// ---- Switch_rS51 -----------------------------------------------

class Switch_rS51 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS51(void);
  ~Switch_rS51(void);

};

Switch_rS51 Switch_rS51_i;

// ----------------------------------------------------------------


// ---- Switch_rS52 -----------------------------------------------

class Switch_rS52 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS52(void);
  ~Switch_rS52(void);
};

Switch_rS52 Switch_rS52_i;

// ----------------------------------------------------------------


// ---- Switch_rS61 -----------------------------------------------

class Switch_rS61 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS61(void);
  ~Switch_rS61(void);
};

Switch_rS61 Switch_rS61_i;

// ----------------------------------------------------------------


// ---- Switch_rS62 -----------------------------------------------

class Switch_rS62 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS62(void);
  ~Switch_rS62(void);
};

Switch_rS62 Switch_rS62_i;

// ----------------------------------------------------------------


// ---- Switch_rS71 -----------------------------------------------

class Switch_rS71 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS71(void);
  ~Switch_rS71(void);

};

Switch_rS71 Switch_rS71_i;

// ----------------------------------------------------------------


// ---- Switch_rS72 -----------------------------------------------

class Switch_rS72 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS72(void);
  ~Switch_rS72(void);
};

Switch_rS72 Switch_rS72_i;

// ----------------------------------------------------------------

// ---- Switch_rS81 -----------------------------------------------

class Switch_rS81 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS81(void);
  ~Switch_rS81(void);

};

Switch_rS81 Switch_rS81_i;

// ----------------------------------------------------------------


// ---- Switch_rS82 -----------------------------------------------

class Switch_rS82 : public SwitchObject
{
public:
  virtual void CoefRValueUpdate(void);
  Switch_rS82(void);
  ~Switch_rS82(void);

};

Switch_rS82 Switch_rS82_i;

// ----------------------------------------------------------------



SwitchObject * SwitchObjectList[] = {(SwitchObject *) &Switch_rS11_i,
				     (SwitchObject *) &Switch_rS12_i,
				     (SwitchObject *) &Switch_rS21_i,
				     (SwitchObject *) &Switch_rS22_i,
				     (SwitchObject *) &Switch_rS31_i,
				     (SwitchObject *) &Switch_rS32_i,
				     (SwitchObject *) &Switch_rS41_i,
				     (SwitchObject *) &Switch_rS42_i,
				     (SwitchObject *) &Switch_rS51_i,
				     (SwitchObject *) &Switch_rS52_i,
				     (SwitchObject *) &Switch_rS61_i,
				     (SwitchObject *) &Switch_rS62_i,
				     (SwitchObject *) &Switch_rS71_i,
				     (SwitchObject *) &Switch_rS72_i,
				     (SwitchObject *) &Switch_rS81_i,
				     (SwitchObject *) &Switch_rS82_i,
                                     0};



// ****************************************************************



// **** SpiceObject Classes ***************************************

// ---- Spice_MultiLevel ------------------------------------------

class Spice_MultiLevel : public SpiceObject
{
public:

  Spice_MultiLevel(void);
  ~Spice_MultiLevel(void);
  virtual void OdeRValueUpdate(void);
  virtual void SwitchRValueUpdate(void);

};


Spice_MultiLevel Spice_MultiLevel_i;


// ---------------------------------------------------------------

SpiceObject * SpiceObjectList[] = {(SpiceObject *) &Spice_MultiLevel_i,
				   0};
				    



// **************************************************************



// **** SrcObject Functions **************************************

// ---- Vm0  ----------------------------------------------------


Vm0::Vm0(void)
{
 
  SrcObjItem * pCurSrcItem;


  SrcFuncName = SRC_FUNC_Vm0;
  LiteralName = "Vm0";

 //build the SRC Rvalue list.

  pSrcObjRValList = new SrcObjItem;
  pCurSrcItem = pSrcObjRValList;

  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl2];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl6];


  t_freq_scale = 1.0;
  t_shift = 0;
 
  PwmRampDir = 1.0;

#ifdef PLOT_SRCOBJECT_Vm0
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "Vm0";
}


Vm0::~Vm0(void)
{



}

void Vm0::SrcFunction(double t)
{
  t_scaled_shifted = t * t_freq_scale + t_shift;

  if (t_scaled_shifted >= t_prev){

    t_mod += (t_scaled_shifted - t_prev);
    t_prev = t_scaled_shifted;  

    if(t_mod > HALF_PWM_CYCLE){
      t_mod -=  HALF_PWM_CYCLE;
      PwmRampDir *= -1.0;
    }
 
    y = PWM_GAIN*(t_mod/HALF_PWM_CYCLE - .5)*PwmRampDir;

  }

}

void Vm0::SrcRValueUpdate(void)         
{
  SrcObjItem * pCurSrcItem;
 

  //Update Rvalues
  pCurSrcItem = pSrcObjRValList;

  ((ECtrl2 *) pCurSrcItem->pSrcObject)->V_110 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl6 *) pCurSrcItem->pSrcObject)->V_110 = y;



}

// -----------------------------------------------------------------

// ---- Vm1  ----------------------------------------------------

Vm1::Vm1(void)
{
 
  SrcObjItem * pCurSrcItem;


  SrcFuncName = SRC_FUNC_Vm1;
  LiteralName = "Vm1";

 //build the SRC Rvalue list.

  pSrcObjRValList = new SrcObjItem;
  pCurSrcItem = pSrcObjRValList;

  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl1];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl5];

  t_freq_scale = 1.0;
  t_shift = HALF_PWM_CYCLE/2.0 ;

 
  PwmRampDir = 1.0;

#ifdef PLOT_SRCOBJECT_Vm1 
  PlotThisOutput = TRUE;
#endif 

  Plot_Tag = "Vm1";
}


Vm1::~Vm1(void)
{


}

void Vm1::SrcFunction(double t)
{
  t_scaled_shifted = t * t_freq_scale + t_shift;

  if (t_scaled_shifted >= t_prev){

    t_mod += (t_scaled_shifted - t_prev);
    t_prev = t_scaled_shifted;  

    if(t_mod > HALF_PWM_CYCLE){
      t_mod -=  HALF_PWM_CYCLE;
      PwmRampDir *= -1.0;
    }
 
    y = PWM_GAIN*(t_mod/HALF_PWM_CYCLE - .5)*PwmRampDir;

  }

}

void Vm1::SrcRValueUpdate(void)         
{
  SrcObjItem * pCurSrcItem;
 

  //Update Rvalues
  pCurSrcItem = pSrcObjRValList;

  ((ECtrl1 *) pCurSrcItem->pSrcObject)->V_210 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl5 *) pCurSrcItem->pSrcObject)->V_210 = y;



}


// -----------------------------------------------------------------

// ---- Vm2  ----------------------------------------------------

Vm2::Vm2(void)
{
 
  SrcObjItem * pCurSrcItem;


  SrcFuncName = SRC_FUNC_Vm2;
  LiteralName = "Vm2";

 //build the SRC Rvalue list.

  pSrcObjRValList = new SrcObjItem;
  pCurSrcItem = pSrcObjRValList;

  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl4];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl8];

  t_freq_scale = 1.0;
  t_shift = HALF_PWM_CYCLE;

 
  PwmRampDir = 1.0;

#ifdef PLOT_SRCOBJECT_Vm2
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "Vm2";
}


Vm2::~Vm2(void)
{



}

void Vm2::SrcFunction(double t)
{
  t_scaled_shifted = t * t_freq_scale + t_shift;

  if (t_scaled_shifted >= t_prev){

    t_mod += (t_scaled_shifted - t_prev);
    t_prev = t_scaled_shifted;  

    if(t_mod > HALF_PWM_CYCLE){
      t_mod -=  HALF_PWM_CYCLE;
      PwmRampDir *= -1.0;
    }
 
    y = PWM_GAIN*(t_mod/HALF_PWM_CYCLE - .5)*PwmRampDir;

  }

}

void Vm2::SrcRValueUpdate(void)         
{
  SrcObjItem * pCurSrcItem;
 

  //Update Rvalues
  pCurSrcItem = pSrcObjRValList;

  ((ECtrl4 *) pCurSrcItem->pSrcObject)->V_310 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl8 *) pCurSrcItem->pSrcObject)->V_310 = y;



}


// -----------------------------------------------------------------

// ---- Vm3  ----------------------------------------------------

Vm3::Vm3(void)
{
 
  SrcObjItem * pCurSrcItem;


  SrcFuncName = SRC_FUNC_Vm3;
  LiteralName = "Vm3";

 //build the SRC Rvalue list.

  pSrcObjRValList = new SrcObjItem;
  pCurSrcItem = pSrcObjRValList;

  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl3];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl7];

  t_freq_scale = 1.0;
  t_shift = 3.0*HALF_PWM_CYCLE/2.0;

 
  PwmRampDir = 1.0;

#ifdef PLOT_SRCOBJECT_Vm3
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "Vm3";
}


Vm3::~Vm3(void)
{



}

void Vm3::SrcFunction(double t)
{
  t_scaled_shifted = t * t_freq_scale + t_shift;

  if (t_scaled_shifted >= t_prev){

    t_mod += (t_scaled_shifted - t_prev);
    t_prev = t_scaled_shifted;  

    if(t_mod > HALF_PWM_CYCLE){
      t_mod -=  HALF_PWM_CYCLE;
      PwmRampDir *= -1.0;
    }
 
    y = PWM_GAIN*(t_mod/HALF_PWM_CYCLE - .5)*PwmRampDir;

  } 

}

void Vm3::SrcRValueUpdate(void)         
{
  SrcObjItem * pCurSrcItem;
 

  //Update Rvalues
  pCurSrcItem = pSrcObjRValList;

  ((ECtrl3 *) pCurSrcItem->pSrcObject)->V_410 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl7 *) pCurSrcItem->pSrcObject)->V_410 = y;



}


// -----------------------------------------------------------------




// ---- ECtrl1  ----------------------------------------------------

ECtrl1::ECtrl1(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl1;
  LiteralName = "ECtrl1";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_210 = 0;
  GateCtrl_111 = 0;
  GateCtrl_121 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS11];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS12];


#ifdef PLOT_SRCOBJECT_PROBES_ECtrl1
  DoProbes = TRUE;
#endif

}

ECtrl1::~ECtrl1(void)
{



}

void ECtrl1::SrcFunction(double t) 
{

  if(t > Time_0){
    if((V_210 + V_112) > 0){
        GateCtrl_111 = 1;
    }
    else{
        GateCtrl_111 = 0;
    }

    if((-V_210 - V_112) > 0){
      GateCtrl_121 = 1;
    }
    else{
      GateCtrl_121 = 0;
    }
  }
  else{
    GateCtrl_111 = 0;
    GateCtrl_121 = 0;   

  }
     
}

void ECtrl1::RecordProbes(void)
{
  Gate_111.push_back((double) GateCtrl_111);
  Gate_121.push_back((double) GateCtrl_121);
}

void ECtrl1::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_111, "Gate_111");
    SimuPlot.plot_xy(Plot_t, Gate_121, "Gate_121");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_111"){
	SimuPlot.plot_xy(Plot_t, Gate_111, "Gate_111");
      }
      else if(TagNamesToPlot[i] == "Gate_121"){
	SimuPlot.plot_xy(Plot_t, Gate_121, "Gate_121");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}




void ECtrl1::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS11 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_111;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS12 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_121;

}



// -----------------------------------------------------------------

// ---- ECtrl2  ----------------------------------------------------

ECtrl2::ECtrl2(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl2;
  LiteralName = "ECtrl2";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_110 = 0;
  GateCtrl_211 = 0;
  GateCtrl_221 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS21];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS22];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl2
  DoProbes = TRUE; 
#endif

}

ECtrl2::~ECtrl2(void)
{



}

void ECtrl2::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_110 + V_112) > 0){
        GateCtrl_211 = 1;
    }
    else{
        GateCtrl_211 = 0;
    }

    if((-V_110 - V_112) > 0){
      GateCtrl_221 = 1;
    }
    else{
      GateCtrl_221 = 0;
    }
  }
  else{
    GateCtrl_211 = 0;
    GateCtrl_221 = 0;    

  }

}

void ECtrl2::RecordProbes(void)
{
  Gate_211.push_back((double) GateCtrl_211);
  Gate_221.push_back((double) GateCtrl_221);
}

void ECtrl2::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_211, "Gate_211");
    SimuPlot.plot_xy(Plot_t, Gate_221, "Gate_221");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_211"){
	SimuPlot.plot_xy(Plot_t, Gate_211, "Gate_211");
      }
      else if(TagNamesToPlot[i] == "Gate_221"){
	SimuPlot.plot_xy(Plot_t, Gate_221, "Gate_221");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}

void ECtrl2::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS21 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_211;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS22 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_221;

}




// -----------------------------------------------------------------

// ---- ECtrl3  ----------------------------------------------------

ECtrl3::ECtrl3(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl3;
  LiteralName = "ECtrl3";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_410 = 0;
  GateCtrl_311 = 0;
  GateCtrl_321 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS31];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS32];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl3
  DoProbes = TRUE; 
#endif


}

ECtrl3::~ECtrl3(void)
{



}

void ECtrl3::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_410 + V_112) > 0){
        GateCtrl_311 = 1;
    }
    else{
        GateCtrl_311 = 0;
    }

    if((-V_410 - V_112) > 0){
      GateCtrl_321 = 1;
    }
    else{
      GateCtrl_321 = 0;
    }
  }
  else{
    GateCtrl_311 = 0;
    GateCtrl_321 = 0;    

  }

}

void ECtrl3::RecordProbes(void)
{
  Gate_311.push_back((double) GateCtrl_311);
  Gate_321.push_back((double) GateCtrl_321);
}

void ECtrl3::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_311, "Gate_311");
    SimuPlot.plot_xy(Plot_t, Gate_321, "Gate_321");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_311"){
	SimuPlot.plot_xy(Plot_t, Gate_311, "Gate_311");
      }
      else if(TagNamesToPlot[i] == "Gate_321"){
	SimuPlot.plot_xy(Plot_t, Gate_321, "Gate_321");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}

void ECtrl3::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS31 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_311;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS32 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_321;

}


// -----------------------------------------------------------------

// ---- ECtrl4  ----------------------------------------------------

ECtrl4::ECtrl4(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl4;
  LiteralName = "ECtrl4";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_310 = 0;
  GateCtrl_411 = 0;
  GateCtrl_421 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS41];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS42];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl4
  DoProbes = TRUE; 
#endif


}

ECtrl4::~ECtrl4(void)
{



}

void ECtrl4::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_310 + V_112) > 0){
        GateCtrl_411 = 1;
    }
    else{
        GateCtrl_411 = 0;
    }

    if((-V_310 - V_112) > 0){
      GateCtrl_421 = 1;
    }
    else{
      GateCtrl_421 = 0;
    }
  }
  else{
    GateCtrl_411 = 0;
    GateCtrl_421 = 0;    

  }

}

void ECtrl4::RecordProbes(void)
{
  Gate_411.push_back((double) GateCtrl_411);
  Gate_421.push_back((double) GateCtrl_421);
}

void ECtrl4::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_411, "Gate_411");
    SimuPlot.plot_xy(Plot_t, Gate_421, "Gate_421");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_411"){
	SimuPlot.plot_xy(Plot_t, Gate_411, "Gate_411");
      }
      else if(TagNamesToPlot[i] == "Gate_421"){
	SimuPlot.plot_xy(Plot_t, Gate_421, "Gate_421");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}

void ECtrl4::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS41 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_411;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS42 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_421;

}



// -----------------------------------------------------------------


// ---- ECtrl5  ----------------------------------------------------

ECtrl5::ECtrl5(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl5;
  LiteralName = "ECtrl5";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_210 = 0;
  GateCtrl_511 = 0;
  GateCtrl_521 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS51];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS52];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl5
  DoProbes = TRUE; 
#endif


}

ECtrl5::~ECtrl5(void)
{



}

void ECtrl5::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_210 - V_112) > 0){
        GateCtrl_511 = 1;
    }
    else{
        GateCtrl_511 = 0;
    }

    if((-V_210 + V_112) > 0){
      GateCtrl_521 = 1;
    }
    else{
      GateCtrl_521 = 0;
    }
  }
  else{
    GateCtrl_511 = 0;
    GateCtrl_521 = 0;    

  }

}

void ECtrl5::RecordProbes(void)
{
  Gate_511.push_back((double) GateCtrl_511);
  Gate_521.push_back((double) GateCtrl_521);
}

void ECtrl5::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_511, "Gate_511");
    SimuPlot.plot_xy(Plot_t, Gate_521, "Gate_521");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_511"){
	SimuPlot.plot_xy(Plot_t, Gate_511, "Gate_511");
      }
      else if(TagNamesToPlot[i] == "Gate_521"){
	SimuPlot.plot_xy(Plot_t, Gate_521, "Gate_521");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}


void ECtrl5::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS51 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_511;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS52 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_521;

}




// -----------------------------------------------------------------


// ---- ECtrl6  ----------------------------------------------------

ECtrl6::ECtrl6(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl6;
  LiteralName = "ECtrl6";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_110 = 0;
  GateCtrl_611 = 0;
  GateCtrl_621 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS61];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS62];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl6
  DoProbes = TRUE; 
#endif


}

ECtrl6::~ECtrl6(void)
{



}

void ECtrl6::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_110 - V_112) > 0){
        GateCtrl_611 = 1;
    }
    else{
        GateCtrl_611 = 0;
    }

    if((-V_110 + V_112) > 0){
      GateCtrl_621 = 1;
    }
    else{
      GateCtrl_621 = 0;
    }
  }
  else{
    GateCtrl_611 = 0;
    GateCtrl_621 = 0;    

  }

}

void ECtrl6::RecordProbes(void)
{
  Gate_611.push_back((double) GateCtrl_611);
  Gate_621.push_back((double) GateCtrl_621);
}

void ECtrl6::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_611, "Gate_611");
    SimuPlot.plot_xy(Plot_t, Gate_621, "Gate_621");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_611"){
	SimuPlot.plot_xy(Plot_t, Gate_611, "Gate_611");
      }
      else if(TagNamesToPlot[i] == "Gate_621"){
	SimuPlot.plot_xy(Plot_t, Gate_621, "Gate_621");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}


void ECtrl6::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS61 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_611;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS62 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_621;

}




// -----------------------------------------------------------------


// ---- ECtrl7  ----------------------------------------------------

ECtrl7::ECtrl7(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl7;
  LiteralName = "ECtrl7";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_410 = 0;
  GateCtrl_711 = 0;
  GateCtrl_721 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS71];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS72];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl7
  DoProbes = TRUE; 
#endif


}

ECtrl7::~ECtrl7(void)
{



}

void ECtrl7::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_410 - V_112) > 0){
        GateCtrl_711 = 1;
    }
    else{
        GateCtrl_711 = 0;
    }

    if((-V_410 + V_112) > 0){
      GateCtrl_721 = 1;
    }
    else{
      GateCtrl_721 = 0;
    }
  }
  else{
    GateCtrl_711 = 0;
    GateCtrl_721 = 0;    

  }

}

void ECtrl7::RecordProbes(void)
{
  Gate_711.push_back((double) GateCtrl_711);
  Gate_721.push_back((double) GateCtrl_721);
}

void ECtrl7::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_711, "Gate_711");
    SimuPlot.plot_xy(Plot_t, Gate_721, "Gate_721");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_711"){
	SimuPlot.plot_xy(Plot_t, Gate_711, "Gate_711");
      }
      else if(TagNamesToPlot[i] == "Gate_721"){
	SimuPlot.plot_xy(Plot_t, Gate_721, "Gate_721");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}




void ECtrl7::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS71 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_711;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS72 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_721;

}




// -----------------------------------------------------------------


// ---- ECtrl8  ----------------------------------------------------

ECtrl8::ECtrl8(void)
{
  SwitchObjItem * pCurSwitchItem;

  SrcFuncName = SRC_FUNC_ECtrl8;
  LiteralName = "ECtrl8";

  Time_0 = SWITCH_ENABLE_TIME;
  V_112 = 0;
  V_310 = 0;
  GateCtrl_811 = 0;
  GateCtrl_821 = 0;

 //build the Switch Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS81];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS82];

#ifdef PLOT_SRCOBJECT_PROBES_ECtrl8
  DoProbes = TRUE; 
#endif


}

ECtrl8::~ECtrl8(void)
{



}

void ECtrl8::SrcFunction(double t)
{

  if(t > Time_0){
    if((V_310 - V_112) > 0){
        GateCtrl_811 = 1;
    }
    else{
        GateCtrl_811 = 0;
    }

    if((-V_310 + V_112) > 0){
      GateCtrl_821 = 1;
    }
    else{
      GateCtrl_821 = 0;
    }
  }
  else{
    GateCtrl_811 = 0;
    GateCtrl_821 = 0;    

  }

}

void ECtrl8::RecordProbes(void)
{
  Gate_811.push_back((double) GateCtrl_811);
  Gate_821.push_back((double) GateCtrl_821);
}

void ECtrl8::PlotProbes(Gnuplot & SimuPlot, vector<double> & Plot_t, string TagNamesToPlot[])
{
  int i;
  if(TagNamesToPlot[0] == ""){
    SimuPlot.plot_xy(Plot_t, Gate_811, "Gate_811");
    SimuPlot.plot_xy(Plot_t, Gate_821, "Gate_821");
  }
  else{
    for(i = 0; i < 20; i++){
      if(TagNamesToPlot[i] == "Gate_811"){
	SimuPlot.plot_xy(Plot_t, Gate_811, "Gate_811");
      }
      else if(TagNamesToPlot[i] == "Gate_821"){
	SimuPlot.plot_xy(Plot_t, Gate_821, "Gate_821");
      }
      else if(TagNamesToPlot[i] == ""){
	break;
      }
    }
  }   
}





void ECtrl8::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update RValues
  pCurSwitchItem = pSwitchObjRValList;

  ((Switch_rS81 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_811;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((Switch_rS82 *) pCurSwitchItem->pSwitchObject)->DevGate = GateCtrl_821;

}



// -----------------------------------------------------------------






// ---- Vref  ----------------------------------------------------

Vref::Vref(void)
{
 
  SrcObjItem * pCurSrcItem;


  SrcFuncName = SRC_FUNC_Vref;
  LiteralName = "Vref";


  //build the SRC Rvalue list.

  pSrcObjRValList = new SrcObjItem;
  pCurSrcItem = pSrcObjRValList;

  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl1];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl2];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl3];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl4];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl5];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl6];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl7];
  pCurSrcItem->pNextSrcItem = new SrcObjItem;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;
  pCurSrcItem->pSrcObject = SrcObjectList[SRC_FUNC_ECtrl8];


#ifdef PLOT_SRCOBJECT_Vref
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "Vref";
}

Vref::~Vref(void)
{


}

void Vref::SrcFunction(double t)
{
#ifdef APPLY_SINEWAVE_VREF_COMMAND
  y = 2 * sin(2*PI*60*t);
#else
  y = 0;
#endif 
  
 

}

void Vref::SrcRValueUpdate(void)
{
  SrcObjItem * pCurSrcItem;

  //Update Rvalues
  pCurSrcItem = pSrcObjRValList;

  ((ECtrl1 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl2 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl3 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl4 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl5 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl6 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl7 *) pCurSrcItem->pSrcObject)->V_112 = y;
  pCurSrcItem = pCurSrcItem->pNextSrcItem;    
  ((ECtrl8 *) pCurSrcItem->pSrcObject)->V_112 = y;

}




// -----------------------------------------------------------------

// ******************************************************************


// **** OdeObject Functions ****************************************

// ---- q1 --------------------------------------------------------

q1::q1(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q1;
  LiteralName = "q1";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q1];

  //assign the intial charge
  y = C1*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i1 = 0;

#ifdef PLOT_ODEOBJECT_q1
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q1";

}

q1::~q1(void)
{

}

double q1::OdeFunction(double y, double t)
{
     //i1
  return(i1);

}

void q1::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q1 *) pCurCoefItem->pCoefObject)->q1 = y;

}

// -----------------------------------------------------------------


// ---- q2 --------------------------------------------------------

q2::q2(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q2;
  LiteralName = "q2";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q2];


  //assign the intial charge
  y = C2*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i2 = 0;

#ifdef PLOT_ODEOBJECT_q2
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q2";

}

q2::~q2(void)
{

}

double q2::OdeFunction(double y, double t)
{
     //i2
  return(i2);

}

void q2::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q2 *) pCurCoefItem->pCoefObject)->q2 = y;

}

// -----------------------------------------------------------------


// ---- q3 --------------------------------------------------------

q3::q3(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q3;
  LiteralName = "q3";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q3];

  //assign the intial charge
  y = C3*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i3 = 0;

#ifdef PLOT_ODEOBJECT_q3
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q3";

}

q3::~q3(void)
{

}

double q3::OdeFunction(double y, double t)
{
     //i3
  return(i3);

}

void q3::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q3 *) pCurCoefItem->pCoefObject)->q3 = y;

}

// -----------------------------------------------------------------


// ---- q4 --------------------------------------------------------

q4::q4(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q4;
  LiteralName = "q4";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q4];

  //assign the intial charge
  y = C4*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i4 = 0;

#ifdef PLOT_ODEOBJECT_q4
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q4";

}

q4::~q4(void)
{

}

double q4::OdeFunction(double y, double t)
{
     //i4
  return(i4);

}

void q4::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q4 *) pCurCoefItem->pCoefObject)->q4 = y;

}

// -----------------------------------------------------------------

// ---- iLp_iLn_1 --------------------------------------------------

iLp_iLn_1::iLp_iLn_1(void)
{

  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_iLp_iLn_1;
  LiteralName = "iLp_iLn_1";  

  //this object marks the beginning of a "group solve" of
  //two objects.
  GroupSolve = 1;
  NumberOfGrpOdes = 2;
 
  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_iLp];

  v44 = 0;
  vs_a = 0;

#ifdef PLOT_ODEOBJECT_iLp_iLn_1
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "iLp";


}


iLp_iLn_1::~iLp_iLn_1(void)
{

}

double iLp_iLn_1::OdeFunction(double y, double t)
{

  //Note: This is within a "group" ODE so we are really returning for "dm/dt"

  //v44 - vs_a
  return(v44 - vs_a);

}


void iLp_iLn_1::OdeGroupMSolve(double dydt[], double dmdt[])
{
  //Note: This instance is the first of the group. As such, this
  //      is where the "group solve" of the individual 
  //      "dy/dt's" is performed.
  //
  //
  //
  //      Reference OLE equations (e) and (f) in the description at the beginning of this file.
  //
  //      Unlike the OdeGropMsolve() for Ia_Ib_Ic_1 in "App_Observer.hpp", this time we have a defined
  //      neutral "vs_a". So along with the fact that this is a Group Solve for 2 (instead of 3, for 
  //      Ia_Ib_Ic_1 in "App_Observer.hpp") we have a much simpler solution.
  //
  //      Note that the Spice examples that this project is to be compared with has this so call
  //      intermediate phase inductance "coupled". If desired,  we can easily convert to the actual implementation
  //      of the M2LC for which the interface inductance is not coupled by simpley setting "Mnp" and 
  //      "Mpn" to zero.
  //
  //
  //
  //
  //
  //      Let
  //         diLp = diLp/dt and diLn = diLn/dt 
  //
  //
  //
  //             Lp*diLp + Mpn*diLn = dmdt[0]                                                    (1)  
  //
  //             Mnp*diLp + Ln*diLn = dmdt[1]                                                    (2)
  //
  //      Solve for diLp in (1) and (2) and subtract (2) from (1)
  //
  //             diLp = dmdt[0]/Lp - Mpn*diLn/Lp
  //
  //             diLp = dmdt[1]/Mnp - Ln*diLn/Mnp
  //
  //             dmdt[0]/Lp - Mpn*diLn/Lp = dmdt[1]/Mnp - Ln*diLn/Mnp                            (3)
  //           
  //
  //      Solve for diLn
  //
  //
  //             diLn*(Ln/Mnp - Mpn/Lp) = dmdt[1]/Mnp - dmdt[0]/Lp          
  //
  //      Let
  //                   A_coef = (Ln/Mnp - Mpn/Lp)
  //                   
  //
  //
  //
  //                   diLn = (dmdt[1]/Mnp - dmdt[0]/Lp)/A_coef                                  (4)      
  //     
  //             
  //      Solve for diLp using (4) on (1)
  //
  //
  //                   diLp = (dmdt[0] - Mpn*(dmdt[1]/Mnp - dmdt[0]/Lp)/A_coef)/Lp               (5)
  //
  //

#define A_coef (Ln/Mnp - Mpn/Lp)


  double diLp;
  double diLn;

  diLn = (dmdt[1]/Mnp - dmdt[0]/Lp)/A_coef;          
  diLp = (dmdt[0] - Mpn*(dmdt[1]/Mnp - dmdt[0]/Lp)/A_coef)/Lp;

  dydt[0] = diLp;
  dydt[1] = diLn;
}

void iLp_iLn_1::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_iLp *) pCurCoefItem->pCoefObject)->iLp = y;

}

// -----------------------------------------------------------------

// ---- iLp_iLn_2 --------------------------------------------------

iLp_iLn_2::iLp_iLn_2(void)
{

  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_iLp_iLn_2;
  LiteralName = "iLp_iLn_2";  

 
  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_iLn];

  v45 = 0;
  vs_a = 0;

#ifdef PLOT_ODEOBJECT_iLp_iLn_2
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "iLn";


}


iLp_iLn_2::~iLp_iLn_2(void)
{

}

double iLp_iLn_2::OdeFunction(double y, double t)
{
  //vs_a - v45
  return(vs_a - v45);

}

void iLp_iLn_2::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_iLn *) pCurCoefItem->pCoefObject)->iLn = y;

}


// -----------------------------------------------------------------


// ---- qa --------------------------------------------------------

qa::qa(void)
{
  
  OdeObjItem * pCurOdeItem;

  OdeFuncName = ODE_FUNC_qa;
  LiteralName = "qa";    

  //build the ODE Rvalue list.

  pOdeObjRValList = new OdeObjItem;          
  pCurOdeItem = pOdeObjRValList;
 
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_ia_ib_1];

  ia = 0;

#ifdef PLOT_ODEOBJECT_qa
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "qa";

}

qa::~qa(void)
{

}

double qa::OdeFunction(double y, double t)
{

#ifdef INDUCTIVE_COUPLED_LOAD
     //ia
  return(ia);
#else
  return(0);
#endif 

}

void qa::OdeRValueUpdate(void)
{
#ifdef INDUCTIVE_COUPLED_LOAD

  OdeObjItem * pCurOdeItem;

  //Update Rvalues
  pCurOdeItem = pOdeObjRValList;

  ((ia_ib_1 *) pCurOdeItem->pOdeObject)->qa = y;

#endif 
}

// -----------------------------------------------------------------


// ---- qb --------------------------------------------------------

qb::qb(void)
{
  
  OdeObjItem * pCurOdeItem;

  OdeFuncName = ODE_FUNC_qb;
  LiteralName = "qb";    

  //build the ODE Rvalue list.

  pOdeObjRValList = new OdeObjItem;          
  pCurOdeItem = pOdeObjRValList;
 
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_ia_ib_2];

  ib = 0;

#ifdef PLOT_ODEOBJECT_qb
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "qb";

}

qb::~qb(void)
{

}               

double qb::OdeFunction(double y, double t)
{
#ifdef INDUCTIVE_COUPLED_LOAD
     //ib
  return(ib);
#else
  return(0);
#endif 

}

void qb::OdeRValueUpdate(void)
{
#ifdef INDUCTIVE_COUPLED_LOAD

  OdeObjItem * pCurOdeItem;

  //Update Rvalues
  pCurOdeItem = pOdeObjRValList;

  ((ia_ib_2 *) pCurOdeItem->pOdeObject)->qb = y;

#endif 

}

// -----------------------------------------------------------------

// ---- ia_ib_1 --------------------------------------------------

ia_ib_1::ia_ib_1(void)
{

  CoefObjItem * pCurCoefItem;
  OdeObjItem * pCurOdeItem;

  OdeFuncName = ODE_FUNC_ia_ib_1;
  LiteralName = "ia_ib_1";  

#ifdef INDUCTIVE_COUPLED_LOAD

  //this object marks the beginning of a "group solve" of
  //two objects.
  GroupSolve = 1;
  NumberOfGrpOdes = 2;

#endif 
 
  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_ia]; 

  //build the ODE Rvalue list.	

  pOdeObjRValList = new OdeObjItem;          
  pCurOdeItem = pOdeObjRValList;

  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_qa];  							   

  qa = 0;
  //(ia is represented by "y")
  vs_a = 0;

#ifdef PLOT_ODEOBJECT_ia_ib_1
  PlotThisOutput = TRUE;
#endif 

  Plot_Tag = "ia";


}


ia_ib_1::~ia_ib_1(void)
{

}

double ia_ib_1::OdeFunction(double y, double t)
{
#ifdef INDUCTIVE_COUPLED_LOAD
  //Note: This is within a "group" ODE so we are really returning for "dm/dt"

  // vs_a - Ra*ia - qa/Ca
  return(vs_a - Ra*y - qa/Ca);
#else
  return(0);
#endif

}

void ia_ib_1::PostOdeFunction(double t)
{

#ifndef INDUCTIVE_COUPLED_LOAD
  //(Solve directly for "ia")
  y = vs_a/R_load;
#endif 


}

void ia_ib_1::OdeGroupMSolve(double dydt[], double dmdt[])
{
  //Note: This instance is the first of the group. As such, this
  //      is where the "group solve" of the individual 
  //      "dy/dt's" is performed.
  //
  //
  //      Reference OLE equations (i) and (j) in the description at the beginning of this file.
  //
  //
  //
  //      Let
  //         dia = dia/dt and dib = dib/dt  //
  //
  //
  //
  //             (Lm_a + L_a)*dia + Mab*dib = dmdt[0]                                                      (1)
  //
  //             Mba*dia + (Lm_b + L_b)*dib = dmdt[1]                                                      (2)
  //
  //      Solve for dia in (1) and (2) and subtract (2) from (1)
  //
  //             dia = dmdt[0]/(Lm_a + L_a) - Mab*dib/(Lm_a + L_a)                            
  //
  //             dia = dmdt[1]/Mba - (Lm_b + L_b)*dib/Mba   
  //
  //             dmdt[0]/(Lm_a + L_a) - Mab*dib/(Lm_a + L_a) = dmdt[1]/Mba - (Lm_b + L_b)*dib/Mba          (3)  
  //
  //      Solve for dib
  //
  //             dib((Lm_b + L_b)/Mba - Mab/(Lm_a + L_a)) = dmdt[1]/Mba - dmdt[0]/(Lm_a + L_a)  
  //
  //
  //      Let
  //
  //            B_coef = (Lm_b + L_b)
  //            C_coef = (Lm_a + L_a)
  //
  //
  //            dib = (dmdt[1]/Mba - dmdt[0]/C_coef)/(B_coef/Mba - Mab/C_coef)                            (4)
  //
  //
  //      Solve for diLp using (4) on (1)
  //
  //
  //           dia  = (dmdt[0] - Mab*dib)/(Lm_a + L_a)
  //
  //           dia  = (dmdt[0] - Mab*(dmdt[1]/Mba - dmdt[0]/C_coef)/(B_coef/Mba - Mab/C_coef))/C_coef     (5) 
  //
  //
  //
  //
  
#define B_coef (Lm_b + L_b)
#define C_coef (Lm_a + L_a)

  double dia;
  double dib;

  dib = (dmdt[1]/Mba - dmdt[0]/C_coef)/(B_coef/Mba - Mab/C_coef);  
  dia = (dmdt[0] - Mab*(dmdt[1]/Mba - dmdt[0]/C_coef)/(B_coef/Mba - Mab/C_coef))/C_coef;


  dydt[0] = dia;
  dydt[1] = dib;
  

}

void ia_ib_1::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_ia *) pCurCoefItem->pCoefObject)->ia = y;

}

void ia_ib_1::OdeRValueUpdate(void)
{
  OdeObjItem * pCurOdeItem;

  //Update Rvalues
  pCurOdeItem = pOdeObjRValList;

  ((class qa *) pCurOdeItem->pOdeObject)->ia = y;

}

// -----------------------------------------------------------------

// ---- ia_ib_2 --------------------------------------------------

ia_ib_2::ia_ib_2(void)
{

  OdeObjItem * pCurOdeItem;

  OdeFuncName = ODE_FUNC_ia_ib_2;
  LiteralName = "ia_ib_2";  


  //build the ODE Rvalue list.	

  pOdeObjRValList = new OdeObjItem;          
  pCurOdeItem = pOdeObjRValList;

  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_qb];    								   

  qb = 0;
 //(ib is represented by "y") 
 
#ifdef PLOT_ODEOBJECT_ia_ib_2
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "ib";


}

ia_ib_2::~ia_ib_2(void)
{

}
           
double ia_ib_2::OdeFunction(double y, double t)
{

#ifdef INDUCTIVE_COUPLED_LOAD
  //Note: This is within a "group" ODE so we are really returning for "dm/dt"

  // - Rb*ib - qb/Cb 
  return(- Rb*y - qb/Cb);
#else
  return(0);
#endif

}

void ia_ib_2::OdeRValueUpdate(void)
{
  OdeObjItem * pCurOdeItem;

  //Update Rvalues
  pCurOdeItem = pOdeObjRValList;

  ((class qb *) pCurOdeItem->pOdeObject)->ib = y;

}

// -----------------------------------------------------------------


// ---- q5 --------------------------------------------------------

q5::q5(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q5;
  LiteralName = "q5";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q5];

  //assign the intial charge
  y = C5*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i5 = 0;

#ifdef PLOT_ODEOBJECT_q5
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q5";

}

q5::~q5(void)
{

}

double q5::OdeFunction(double y, double t)
{
     //i5
  return(i5);

}

void q5::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q5 *) pCurCoefItem->pCoefObject)->q5 = y;

}

// -----------------------------------------------------------------




// ---- q6 --------------------------------------------------------

q6::q6(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q6;
  LiteralName = "q6";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q6];

  //assign the intial charge
  y = C6*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i6 = 0;

#ifdef PLOT_ODEOBJECT_q6
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q6";

}

q6::~q6(void)
{

}

double q6::OdeFunction(double y, double t)
{
     //i6
  return(i6);

}

void q6::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q6 *) pCurCoefItem->pCoefObject)->q6 = y;

}

// -----------------------------------------------------------------



// ---- q7 --------------------------------------------------------

q7::q7(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q7;
  LiteralName = "q7";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q7];

  //assign the intial charge
  y = C7*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i7 = 0;

#ifdef PLOT_ODEOBJECT_q7
  PlotThisOutput = TRUE;
#endif

  Plot_Tag = "q7";

}

q7::~q7(void)
{

}

double q7::OdeFunction(double y, double t)
{
     //i7
  return(i7);

}

void q7::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q7 *) pCurCoefItem->pCoefObject)->q7 = y;

}

// -----------------------------------------------------------------



// ---- q8 --------------------------------------------------------

q8::q8(void)
{
  
  CoefObjItem * pCurCoefItem;

  OdeFuncName = ODE_FUNC_q8;
  LiteralName = "q8";    

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_q8_plus_MinusBus_C8];

  //assign the intial charge
  y = C8*(PLUS_DC_BUS_VOLTAGE - MINUS_DC_BUS_VOLTAGE)/4.0;

  i8 = 0;

#ifdef PLOT_ODEOBJECT_q8
  PlotThisOutput = TRUE;
#endif 

  Plot_Tag = "q8";

}

q8::~q8(void)
{

}

double q8::OdeFunction(double y, double t)
{
     //i8
  return(i8);

}

void q8::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_q8_plus_MinusBus_C8 *) pCurCoefItem->pCoefObject)->q8 = y;

}

// -----------------------------------------------------------------

// ******************************************************************


// **** CtrlObject Functions ****************************************

// ******************************************************************



// **** CoefObject Functions ****************************************

// ---- Coef_recp_rSrD11 ---------------------------------------------

Coef_recp_rSrD11::Coef_recp_rSrD11(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD11;
  LiteralName = "recp_rSrD11"; 
  rS11 = INIT_COEF_RS_RD;
  rD11 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD11::~Coef_recp_rSrD11(void)
{


}

void Coef_recp_rSrD11::CoefFunction(void)
{

  y = 1/rS11 + 1/rD11;

}



// ------------------------------------------------------------------

// ---- Coef_recp_rSrD12 ---------------------------------------------

Coef_recp_rSrD12::Coef_recp_rSrD12(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD12;
  LiteralName = "recp_rSrD12"; 
  rS12 = INIT_COEF_RS_RD;
  rD12 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD12::~Coef_recp_rSrD12(void)
{


}

void Coef_recp_rSrD12::CoefFunction(void)
{

  y = 1/rS12 + 1/rD12;

}



// ------------------------------------------------------------------        


// ---- Coef_q1 ----------------------------------------------------

Coef_q1::Coef_q1(void)
{
  CoefFuncName = COEF_FUNC_q1;
  LiteralName = "q1"; 

}

Coef_q1::~Coef_q1(void)
{


}

void Coef_q1::CoefFunction(void)
{

  y = q1;

}

// ------------------------------------------------------------------    


// ---- Coef_recp_rSrD21 ---------------------------------------------

Coef_recp_rSrD21::Coef_recp_rSrD21(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD21;
  LiteralName = "recp_rSrD21"; 
  rS21 = INIT_COEF_RS_RD;
  rD21 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD21::~Coef_recp_rSrD21(void)
{


}

void Coef_recp_rSrD21::CoefFunction(void)
{

  y = 1/rS21 + 1/rD21;

}



// ------------------------------------------------------------------

// ---- Coef_recp_rSrD22 ---------------------------------------------

Coef_recp_rSrD22::Coef_recp_rSrD22(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD22;
  LiteralName = "recp_rSrD22"; 
  rS22 = INIT_COEF_RS_RD;
  rD22 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD22::~Coef_recp_rSrD22(void)
{


}

void Coef_recp_rSrD22::CoefFunction(void)
{

  y = 1/rS22 + 1/rD22;

}

// ------------------------------------------------------------------  

// ---- Coef_q2 ----------------------------------------------------

Coef_q2::Coef_q2(void)
{
  CoefFuncName = COEF_FUNC_q2;
  LiteralName = "q2"; 

}

Coef_q2::~Coef_q2(void)
{


}

void Coef_q2::CoefFunction(void)
{

  y = q2;

}

// ------------------------------------------------------------------    



  
// ---- Coef_recp_rSrD31 ---------------------------------------------

Coef_recp_rSrD31::Coef_recp_rSrD31(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD31;
  LiteralName = "recp_rSrD31"; 
  rS31 = INIT_COEF_RS_RD;
  rD31 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD31::~Coef_recp_rSrD31(void)
{


}

void Coef_recp_rSrD31::CoefFunction(void)
{

  y = 1/rS31 + 1/rD31;

}

// ------------------------------------------------------------------

// ---- Coef_recp_rSrD32 ---------------------------------------------

Coef_recp_rSrD32::Coef_recp_rSrD32(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD32;
  LiteralName = "recp_rSrD32"; 
  rS32 = INIT_COEF_RS_RD;
  rD32 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD32::~Coef_recp_rSrD32(void)
{


}

void Coef_recp_rSrD32::CoefFunction(void)
{

  y = 1/rS32 + 1/rD32;

}
// ------------------------------------------------------------------  

// ---- Coef_q3 ----------------------------------------------------

Coef_q3::Coef_q3(void)
{
  CoefFuncName = COEF_FUNC_q3;
  LiteralName = "q3"; 

}

Coef_q3::~Coef_q3(void)
{


}

void Coef_q3::CoefFunction(void)
{

  y = q3;

}

// ------------------------------------------------------------------    



// ---- Coef_recp_rSrD41 ---------------------------------------------

Coef_recp_rSrD41::Coef_recp_rSrD41(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD41;
  LiteralName = "recp_rSrD41"; 
  rS41 = INIT_COEF_RS_RD;
  rD41 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD41::~Coef_recp_rSrD41(void)
{


}

void Coef_recp_rSrD41::CoefFunction(void)
{

  y = 1/rS41 + 1/rD41;

}

// ------------------------------------------------------------------

// ---- Coef_recp_rSrD42 ---------------------------------------------

Coef_recp_rSrD42::Coef_recp_rSrD42(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD42;
  LiteralName = "recp_rSrD42"; 
  rS42 = INIT_COEF_RS_RD;
  rD42 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD42::~Coef_recp_rSrD42(void)
{


}

void Coef_recp_rSrD42::CoefFunction(void)
{

  y = 1/rS42 + 1/rD42;

}

// ------------------------------------------------------------------  

// ---- Coef_q4 ----------------------------------------------------

Coef_q4::Coef_q4(void)
{
  CoefFuncName = COEF_FUNC_q4;
  LiteralName = "q4"; 

}

Coef_q4::~Coef_q4(void)
{


}

void Coef_q4::CoefFunction(void)
{

  y = q4;

}

// ------------------------------------------------------------------    



// ---- Coef_iLp ----------------------------------------------------

Coef_iLp::Coef_iLp(void)
{
  CoefFuncName = COEF_FUNC_iLp;
  LiteralName = "iLp"; 

}

Coef_iLp::~Coef_iLp(void)
{


}

void Coef_iLp::CoefFunction(void)
{

  y = iLp;

}

// ------------------------------------------------------------------    

// ---- Coef_iLn ----------------------------------------------------

Coef_iLn::Coef_iLn(void)
{
  CoefFuncName = COEF_FUNC_iLn        ;
  LiteralName = "iLn"; 

}

Coef_iLn::~Coef_iLn(void)
{


}

void Coef_iLn::CoefFunction(void)
{

  y = iLn;

}

// ------------------------------------------------------------------    

// ---- Coef_ia ----------------------------------------------------

Coef_ia::Coef_ia(void)
{
  CoefFuncName = COEF_FUNC_ia;
  LiteralName = "ia"; 

}

Coef_ia::~Coef_ia(void)
{


}

void Coef_ia::CoefFunction(void)
{

  y = ia;

}

// ------------------------------------------------------------------    




// ---- Coef_recp_rSrD51 ---------------------------------------------

Coef_recp_rSrD51::Coef_recp_rSrD51(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD51;
  LiteralName = "recp_rSrD51"; 
  rS51 = INIT_COEF_RS_RD;
  rD51 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD51::~Coef_recp_rSrD51(void)
{


}

void Coef_recp_rSrD51::CoefFunction(void)
{

  y = 1/rS51 + 1/rD51;

}

// ------------------------------------------------------------------

// ---- Coef_recp_rSrD52 ---------------------------------------------

Coef_recp_rSrD52::Coef_recp_rSrD52(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD52;
  LiteralName = "recp_rSrD52"; 
  rS52 = INIT_COEF_RS_RD;
  rD52 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD52::~Coef_recp_rSrD52(void)
{


}

void Coef_recp_rSrD52::CoefFunction(void)
{

  y = 1/rS52 + 1/rD52;

}

// ------------------------------------------------------------------  

// ---- Coef_q5 ----------------------------------------------------

Coef_q5::Coef_q5(void)
{
  CoefFuncName = COEF_FUNC_q5;
  LiteralName = "q5"; 

}

Coef_q5::~Coef_q5(void)
{


}

void Coef_q5::CoefFunction(void)
{

  y = q5;

}

// ------------------------------------------------------------------  



// ---- Coef_recp_rSrD61 ---------------------------------------------

Coef_recp_rSrD61::Coef_recp_rSrD61(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD61;
  LiteralName = "recp_rSrD61"; 
  rS61 = INIT_COEF_RS_RD;
  rD61 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD61::~Coef_recp_rSrD61(void)
{


}

void Coef_recp_rSrD61::CoefFunction(void)
{

  y = 1/rS61 + 1/rD61;

}

// ------------------------------------------------------------------

// ---- Coef_recp_rSrD62 ---------------------------------------------

Coef_recp_rSrD62::Coef_recp_rSrD62(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD62;
  LiteralName = "recp_rSrD62"; 
  rS62 = INIT_COEF_RS_RD;
  rD62 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD62::~Coef_recp_rSrD62(void)
{


}

void Coef_recp_rSrD62::CoefFunction(void)
{

  y = 1/rS62 + 1/rD62;

}

// ------------------------------------------------------------------ 

// ---- Coef_q6 ----------------------------------------------------

Coef_q6::Coef_q6(void)
{
  CoefFuncName = COEF_FUNC_q6;
  LiteralName = "q6"; 

}

Coef_q6::~Coef_q6(void)
{


}

void Coef_q6::CoefFunction(void)
{

  y = q6;

}

// ------------------------------------------------------------------  
 



// ---- Coef_recp_rSrD71 ---------------------------------------------

Coef_recp_rSrD71::Coef_recp_rSrD71(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD71;
  LiteralName = "recp_rSrD71"; 
  rS71 = INIT_COEF_RS_RD;
  rD71 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD71::~Coef_recp_rSrD71(void)
{


}

void Coef_recp_rSrD71::CoefFunction(void)
{

  y = 1/rS71 + 1/rD71;

}


// ------------------------------------------------------------------

// ---- Coef_recp_rSrD72 ---------------------------------------------

Coef_recp_rSrD72::Coef_recp_rSrD72(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD72;
  LiteralName = "recp_rSrD72"; 
  rS72 = INIT_COEF_RS_RD;
  rD72 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD72::~Coef_recp_rSrD72(void)
{


}

void Coef_recp_rSrD72::CoefFunction(void)
{

  y = 1/rS72 + 1/rD72;

}


// ------------------------------------------------------------------  

// ---- Coef_q7 ----------------------------------------------------

Coef_q7::Coef_q7(void)
{
  CoefFuncName = COEF_FUNC_q7;
  LiteralName = "q7"; 

}

Coef_q7::~Coef_q7(void)
{


}

void Coef_q7::CoefFunction(void)
{

  y = q7;

}

// ------------------------------------------------------------------  


// ---- Coef_recp_rSrD81 ---------------------------------------------

Coef_recp_rSrD81::Coef_recp_rSrD81(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD81;
  LiteralName = "recp_rSrD81"; 
  rS81 = INIT_COEF_RS_RD;
  rD81 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD81::~Coef_recp_rSrD81(void)
{


}

void Coef_recp_rSrD81::CoefFunction(void)
{

  y = 1/rS81 + 1/rD81;

}



// ------------------------------------------------------------------

// ---- Coef_recp_rSrD82 ---------------------------------------------

Coef_recp_rSrD82::Coef_recp_rSrD82(void)
{
  CoefFuncName = COEF_FUNC_recp_rSrD82;
  LiteralName = "recp_rSrD82"; 
  rS82 = INIT_COEF_RS_RD;
  rD82 = INIT_COEF_RS_RD;

}

Coef_recp_rSrD82::~Coef_recp_rSrD82(void)
{


}

void Coef_recp_rSrD82::CoefFunction(void)
{

  y = 1/rS82 + 1/rD82;

}



// ------------------------------------------------------------------  

// ---- Coef_q8_plus_MinusBus_C8 ----------------------------------------------------

Coef_q8_plus_MinusBus_C8::Coef_q8_plus_MinusBus_C8(void)
{
  CoefFuncName = COEF_FUNC_q8_plus_MinusBus_C8;
  LiteralName = "q8_plus_MinusBus_C8"; 

}

Coef_q8_plus_MinusBus_C8::~Coef_q8_plus_MinusBus_C8(void)
{


}

void Coef_q8_plus_MinusBus_C8::CoefFunction(void)
{

  y = q8 + MINUS_DC_BUS_VOLTAGE * C8;

}

// ------------------------------------------------------------------  





// ******************************************************************



// **** SwitchObject Functions **************************************

// ---- Switch_rS11 -----------------------------------------------

Switch_rS11::Switch_rS11(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS11;
  LiteralName = "rS11";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD11];

  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS11
  DoProbes = TRUE;
#ifdef DO_PROBE_rS11_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS11_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS11_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS11::~Switch_rS11(void)
{

}

void Switch_rS11::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD11 *) pCurCoefItem->pCoefObject)->rS11 = y_igbt;
  ((Coef_recp_rSrD11 *) pCurCoefItem->pCoefObject)->rD11 = y_diode;

}

// ------------------------------------------------------------------


// ---- Switch_rS12 -----------------------------------------------

Switch_rS12::Switch_rS12(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS12;
  LiteralName = "rS12";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD12];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS12
  DoProbes = TRUE;
#ifdef DO_PROBE_rS12_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS12_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS12_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS12::~Switch_rS12(void)
{

}

void Switch_rS12::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD12 *) pCurCoefItem->pCoefObject)->rS12 = y_igbt;
  ((Coef_recp_rSrD12 *) pCurCoefItem->pCoefObject)->rD12 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS21 -----------------------------------------------

Switch_rS21::Switch_rS21(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS21;
  LiteralName = "rS21";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD21];

  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS21
  DoProbes = TRUE;
#ifdef DO_PROBE_rS21_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS21_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS21_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS21::~Switch_rS21(void)
{

}

void Switch_rS21::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD21 *) pCurCoefItem->pCoefObject)->rS21 = y_igbt;
  ((Coef_recp_rSrD21 *) pCurCoefItem->pCoefObject)->rD21 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS22 -----------------------------------------------

Switch_rS22::Switch_rS22(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS22;
  LiteralName = "rS22";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD22];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS22
  DoProbes = TRUE;
#ifdef DO_PROBE_rS22_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS22_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS22_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS22::~Switch_rS22(void)
{

}

void Switch_rS22::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD22 *) pCurCoefItem->pCoefObject)->rS22 = y_igbt;
  ((Coef_recp_rSrD22 *) pCurCoefItem->pCoefObject)->rD22 = y_diode;

}



// ------------------------------------------------------------------


// ---- Switch_rS31 -----------------------------------------------

Switch_rS31::Switch_rS31(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS31;
  LiteralName = "rS31";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD31];



  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS31
  DoProbes = TRUE;
#ifdef DO_PROBE_rS31_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS31_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS31_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS31::~Switch_rS31(void)
{

}

void Switch_rS31::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD31 *) pCurCoefItem->pCoefObject)->rS31 = y_igbt;
  ((Coef_recp_rSrD31 *) pCurCoefItem->pCoefObject)->rD31 = y_diode;

}



// ------------------------------------------------------------------


// ---- Switch_rS32 -----------------------------------------------

Switch_rS32::Switch_rS32(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS32;
  LiteralName = "rS32";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD32];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS32
  DoProbes = TRUE;
#ifdef DO_PROBE_rS32_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS32_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS32_gate
  DoProbes_gate = TRUE;
#endif 
#endif

}

Switch_rS32::~Switch_rS32(void)
{

}

void Switch_rS32::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD32 *) pCurCoefItem->pCoefObject)->rS32 = y_igbt;
  ((Coef_recp_rSrD32 *) pCurCoefItem->pCoefObject)->rD32 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS41 -----------------------------------------------

Switch_rS41::Switch_rS41(void)
{

  CoefObjItem * pCurCoefItem;


  SwitchFuncName = SWITCH_FUNC_rS41;
  LiteralName = "rS41";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD41];



  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS41
  DoProbes = TRUE;
#ifdef DO_PROBE_rS41_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS41_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS41_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS41::~Switch_rS41(void)
{

}

void Switch_rS41::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD41 *) pCurCoefItem->pCoefObject)->rS41 = y_igbt;
  ((Coef_recp_rSrD41 *) pCurCoefItem->pCoefObject)->rD41 = y_diode;

}



// ------------------------------------------------------------------


// ---- Switch_rS42 -----------------------------------------------

Switch_rS42::Switch_rS42(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS42;
  LiteralName = "rS42";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD42];

  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS42
  DoProbes = TRUE;
#ifdef DO_PROBE_rS42_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS42_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS42_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS42::~Switch_rS42(void)
{

}

void Switch_rS42::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD42 *) pCurCoefItem->pCoefObject)->rS42 = y_igbt;
  ((Coef_recp_rSrD42 *) pCurCoefItem->pCoefObject)->rD42 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS51 -----------------------------------------------

Switch_rS51::Switch_rS51(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS51;
  LiteralName = "rS51";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD51];

  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS51
  DoProbes = TRUE;
#ifdef DO_PROBE_rS51_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS51_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS51_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}
Switch_rS51::~Switch_rS51(void)
{

}

void Switch_rS51::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD51 *) pCurCoefItem->pCoefObject)->rS51 = y_igbt;
  ((Coef_recp_rSrD51 *) pCurCoefItem->pCoefObject)->rD51 = y_diode;

}



// ------------------------------------------------------------------


// ---- Switch_rS52 -----------------------------------------------

Switch_rS52::Switch_rS52(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS52;
  LiteralName = "rS52";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD52];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS52
  DoProbes = TRUE;
#ifdef DO_PROBE_rS52_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS52_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS52_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS52::~Switch_rS52(void)
{

}

void Switch_rS52::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD52 *) pCurCoefItem->pCoefObject)->rS52 = y_igbt;
  ((Coef_recp_rSrD52 *) pCurCoefItem->pCoefObject)->rD52 = y_diode;

}




// ------------------------------------------------------------------


// ---- Switch_rS61 -----------------------------------------------

Switch_rS61::Switch_rS61(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS61;
  LiteralName = "rS61";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD61];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS61
  DoProbes = TRUE;
#ifdef DO_PROBE_rS61_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS61_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS61_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS61::~Switch_rS61(void)
{

}

void Switch_rS61::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD61 *) pCurCoefItem->pCoefObject)->rS61 = y_igbt;
  ((Coef_recp_rSrD61 *) pCurCoefItem->pCoefObject)->rD61 = y_diode;

}



// ------------------------------------------------------------------


// ---- Switch_rS62 -----------------------------------------------

Switch_rS62::Switch_rS62(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS62;
  LiteralName = "rS62";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD62];



  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS62
  DoProbes = TRUE;
#ifdef DO_PROBE_rS62_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS62_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS62_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS62::~Switch_rS62(void)
{

}

void Switch_rS62::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD62 *) pCurCoefItem->pCoefObject)->rS62 = y_igbt;
  ((Coef_recp_rSrD62 *) pCurCoefItem->pCoefObject)->rD62 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS71 -----------------------------------------------

Switch_rS71::Switch_rS71(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS71;
  LiteralName = "rS71";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD71];

  
  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS71
  DoProbes = TRUE;
#ifdef DO_PROBE_rS71_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS71_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS71_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS71::~Switch_rS71(void)
{

}

void Switch_rS71::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD71 *) pCurCoefItem->pCoefObject)->rS71 = y_igbt;
  ((Coef_recp_rSrD71 *) pCurCoefItem->pCoefObject)->rD71 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS72 -----------------------------------------------

Switch_rS72::Switch_rS72(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS72;
  LiteralName = "rS72";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD72];



  IsIgbt = TRUE;
  IsMinusPol = FALSE;

#ifdef PLOT_SWITCHOBJECT_PROBES_rS72
  DoProbes = TRUE;
#ifdef DO_PROBE_rS72_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS72_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS72_gate
  DoProbes_gate = TRUE;
#endif 
#endif



}

Switch_rS72::~Switch_rS72(void)
{

}

void Switch_rS72::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD72 *) pCurCoefItem->pCoefObject)->rS72 = y_igbt;
  ((Coef_recp_rSrD72 *) pCurCoefItem->pCoefObject)->rD72 = y_diode;

}


// ------------------------------------------------------------------



// ---- Switch_rS81 -----------------------------------------------

Switch_rS81::Switch_rS81(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS81;
  LiteralName = "rS81";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD81];


  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS81
  DoProbes = TRUE;
#ifdef DO_PROBE_rS81_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS81_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS81_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS81::~Switch_rS81(void)
{

}

void Switch_rS81::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD81 *) pCurCoefItem->pCoefObject)->rS81 = y_igbt;
  ((Coef_recp_rSrD81 *) pCurCoefItem->pCoefObject)->rD81 = y_diode;

}


// ------------------------------------------------------------------


// ---- Switch_rS82 -----------------------------------------------

Switch_rS82::Switch_rS82(void)
{

  CoefObjItem * pCurCoefItem;

  SwitchFuncName = SWITCH_FUNC_rS82;
  LiteralName = "rS82";

  //build the COEF Rvalue list.

  pCoefObjRValList = new CoefObjItem;          
  pCurCoefItem = pCoefObjRValList;
 
  pCurCoefItem->pCoefObject = CoefObjectList[COEF_FUNC_recp_rSrD82];



  IsIgbt = TRUE;
  IsMinusPol = FALSE;


#ifdef PLOT_SWITCHOBJECT_PROBES_rS82
  DoProbes = TRUE;
#ifdef DO_PROBE_rS82_res
  DoProbes_res = TRUE;
#endif
#ifdef DO_PROBE_rS82_cur
  DoProbes_cur = TRUE;
#endif
#ifdef DO_PROBE_rS82_gate
  DoProbes_gate = TRUE;
#endif 
#endif


}

Switch_rS82::~Switch_rS82(void)
{

}

void Switch_rS82::CoefRValueUpdate(void)
{
  CoefObjItem * pCurCoefItem;

  //Update Rvalues
  pCurCoefItem = pCoefObjRValList;

  ((Coef_recp_rSrD82 *) pCurCoefItem->pCoefObject)->rS82 = y_igbt;
  ((Coef_recp_rSrD82 *) pCurCoefItem->pCoefObject)->rD82 = y_diode;

}


// ------------------------------------------------------------------

   


// ******************************************************************



// **** SpiceObject Functions ***************************************

// ---- Spice_MultiLevel ------------------------------------------

Spice_MultiLevel::Spice_MultiLevel(void)
{
  SpiceObjItem * pCurSpiceItem;
  OdeObjItem * pCurOdeItem;
  SwitchObjItem * pCurSwitchItem;
    
  SpiceFuncName = SPICE_FUNC_MultiLevel;
  LiteralName = "MLvl";


#ifdef PLOT_SPICEOBJECT_PROBES_solution_vector
  DoProbes = TRUE;
#endif


  
  InitializeMatrix(35);   //(35 rows, 36 columns)
  
  //Eq. (1)
  a_CoefObj[0][Ind_v11] = &Coef_recp_rSrD11_i;
  a_Static[0][Ind_v11] = -1.0;
  a_CoefObj[0][Ind_i1] = 0;
  a_Static[0][Ind_i1] = -1.0;
  a_CoefObj[0][35] = &Coef_recp_rSrD11_i;
  a_Static[0][35] = -PLUS_DC_BUS_VOLTAGE;
  
  //Eq. (2)
  a_CoefObj[1][Ind_v12] = &Coef_recp_rSrD12_i;
  a_Static[1][Ind_v12] = 1.0;
  a_CoefObj[1][Ind_i1_l] = 0;
  a_Static[1][Ind_i1_l] = -1.0;
  a_CoefObj[1][35] = &Coef_recp_rSrD12_i;
  a_Static[1][35] = PLUS_DC_BUS_VOLTAGE;

  //Eq. (3)
  a_CoefObj[2][Ind_ipl] = 0;
  a_Static[2][Ind_ipl] = 1.0;
  a_CoefObj[2][Ind_i1_l] = 0;
  a_Static[2][Ind_i1_l] = 1.0;
  a_CoefObj[2][Ind_i1] = 0;
  a_Static[2][Ind_i1] = -1.0;
  a_CoefObj[2][35] = 0;
  a_Static[2][35] = 0;
   
  //Eq. (4)
  a_CoefObj[3][Ind_v11] = 0;
  a_Static[3][Ind_v11] = C1;
  a_CoefObj[3][Ind_v12] = 0;
  a_Static[3][Ind_v12] = -C1;
  a_CoefObj[3][35] = &Coef_q1_i;
  a_Static[3][35] = 1.0;
  
  //Eq. (5)
  a_CoefObj[4][Ind_v12] = &Coef_recp_rSrD21_i;
  a_Static[4][Ind_v12] = 1.0;
  a_CoefObj[4][Ind_v21] = &Coef_recp_rSrD21_i; 
  a_Static[4][Ind_v21] = -1.0;
  a_CoefObj[4][Ind_i2] = 0;
  a_Static[4][Ind_i2] = -1.0;
  a_CoefObj[4][35] = 0;
  a_Static[4][35] = 0;
  
  //Eq. (6)
  a_CoefObj[5][Ind_v23] = &Coef_recp_rSrD22_i;
  a_Static[5][Ind_v23] = 1.0;
  a_CoefObj[5][Ind_v12] = &Coef_recp_rSrD22_i; 
  a_Static[5][Ind_v12] = -1.0;
  a_CoefObj[5][Ind_i2_l] = 0;
  a_Static[5][Ind_i2_l] = -1.0;
  a_CoefObj[5][35] = 0;
  a_Static[5][35] = 0;

  //Eq. (7)
  a_CoefObj[6][Ind_ipl] = 0;
  a_Static[6][Ind_ipl] = 1.0;
  a_CoefObj[6][Ind_i2_l] = 0;
  a_Static[6][Ind_i2_l] = 1.0;
  a_CoefObj[6][Ind_i2] = 0;
  a_Static[6][Ind_i2] = -1.0;
  a_CoefObj[6][35] = 0;
  a_Static[6][35] = 0;

  //Eq. (8)
  a_CoefObj[7][Ind_v21] = 0;
  a_Static[7][Ind_v21] = C2;
  a_CoefObj[7][Ind_v23] = 0;
  a_Static[7][Ind_v23] = -C2;
  a_CoefObj[7][35] = &Coef_q2_i;
  a_Static[7][35] = 1.0;
  
  //Eq. (9)
  a_CoefObj[8][Ind_v23] = &Coef_recp_rSrD31_i;
  a_Static[8][Ind_v23] = 1.0;
  a_CoefObj[8][Ind_v31] = &Coef_recp_rSrD31_i; 
  a_Static[8][Ind_v31] = -1.0;
  a_CoefObj[8][Ind_i3] = 0;
  a_Static[8][Ind_i3] = -1.0;
  a_CoefObj[8][35] = 0;
  a_Static[8][35] = 0;
  
  //Eq. (10)
  a_CoefObj[9][Ind_v34] = &Coef_recp_rSrD32_i;
  a_Static[9][Ind_v34] = 1.0;
  a_CoefObj[9][Ind_v23] = &Coef_recp_rSrD32_i; 
  a_Static[9][Ind_v23] = -1.0;
  a_CoefObj[9][Ind_i3_l] = 0;
  a_Static[9][Ind_i3_l] = -1.0;
  a_CoefObj[9][35] = 0;
  a_Static[9][35] = 0;
  
  //Eq. (11)
  a_CoefObj[10][Ind_ipl] = 0;
  a_Static[10][Ind_ipl] = 1.0;
  a_CoefObj[10][Ind_i3_l] = 0;
  a_Static[10][Ind_i3_l] = 1.0;
  a_CoefObj[10][Ind_i3] = 0;
  a_Static[10][Ind_i3] = -1.0;
  a_CoefObj[10][35] = 0;
  a_Static[10][35] = 0;

  //Eq. (12)
  a_CoefObj[11][Ind_v31] = 0;
  a_Static[11][Ind_v31] = C3;
  a_CoefObj[11][Ind_v34] = 0;
  a_Static[11][Ind_v34] = -C3;
  a_CoefObj[11][35] = &Coef_q3_i;
  a_Static[11][35] = 1.0;
  
  //Eq. (13)
  a_CoefObj[12][Ind_v34] = &Coef_recp_rSrD41_i;
  a_Static[12][Ind_v34] = 1.0;
  a_CoefObj[12][Ind_v41] = &Coef_recp_rSrD41_i; 
  a_Static[12][Ind_v41] = -1.0;
  a_CoefObj[12][Ind_i4] = 0;
  a_Static[12][Ind_i4] = -1.0;
  a_CoefObj[12][35] = 0;
  a_Static[12][35] = 0;
  
  //Eq. (14)
  a_CoefObj[13][Ind_v44] = &Coef_recp_rSrD42_i;
  a_Static[13][Ind_v44] = 1.0;
  a_CoefObj[13][Ind_v34] = &Coef_recp_rSrD42_i; 
  a_Static[13][Ind_v34] = -1.0;
  a_CoefObj[13][Ind_i4_l] = 0;
  a_Static[13][Ind_i4_l] = -1.0;
  a_CoefObj[13][35] = 0;
  a_Static[13][35] = 0;

  //Eq. (15)
  a_CoefObj[14][Ind_ipl] = 0;
  a_Static[14][Ind_ipl] = 1.0;
  a_CoefObj[14][Ind_i4_l] = 0;
  a_Static[14][Ind_i4_l] = 1.0;
  a_CoefObj[14][Ind_i4] = 0;
  a_Static[14][Ind_i4] = -1.0;
  a_CoefObj[14][35] = 0;
  a_Static[14][35] = 0;
  
  //Eq. (16)
  a_CoefObj[15][Ind_v41] = 0;
  a_Static[15][Ind_v41] = C4;
  a_CoefObj[15][Ind_v44] = 0;
  a_Static[15][Ind_v44] = -C4;
  a_CoefObj[15][35] = &Coef_q4_i;
  a_Static[15][35] = 1.0;
  
  //Eq. (17)
  a_CoefObj[16][Ind_v44] = 0;
  a_Static[16][Ind_v44] = RECEP_Rp;
  a_CoefObj[16][Ind_vs_a] = 0;
  a_Static[16][Ind_vs_a] = -RECEP_Rp;   
  a_CoefObj[16][Ind_ipl] = 0;
  a_Static[16][Ind_ipl] = -1.0;
  a_CoefObj[16][35] = &Coef_iLp_i;
  a_Static[16][35] = -1.0;
  
  //Eq. (18)
  a_CoefObj[17][Ind_v45] = 0;
  a_Static[17][Ind_v45] = -RECEP_Rn;
  a_CoefObj[17][Ind_vs_a] = 0;
  a_Static[17][Ind_vs_a] = RECEP_Rn;   
  a_CoefObj[17][Ind_inl] = 0;
  a_Static[17][Ind_inl] = -1.0;
  a_CoefObj[17][35] = &Coef_iLn_i;
  a_Static[17][35] = -1.0;
  
  //Eq. (19)
  a_CoefObj[18][Ind_ipl] = 0;
  a_Static[18][Ind_ipl] = 1.0;
  a_CoefObj[18][Ind_inl] = 0;
  a_Static[18][Ind_inl] = -1.0;
  a_CoefObj[18][35] = &Coef_ia_i;
  a_Static[18][35] = 1.0;
   
  //Eq. (20)
  a_CoefObj[19][Ind_v45] = &Coef_recp_rSrD51_i;
  a_Static[19][Ind_v45] = 1.0;
  a_CoefObj[19][Ind_v51] = &Coef_recp_rSrD51_i; 
  a_Static[19][Ind_v51] = -1.0;
  a_CoefObj[19][Ind_i5] = 0;
  a_Static[19][Ind_i5] = -1.0;
  a_CoefObj[19][35] = 0;
  a_Static[19][35] = 0;
  
  //Eq. (21)
  a_CoefObj[20][Ind_v56] = &Coef_recp_rSrD52_i;
  a_Static[20][Ind_v56] = 1.0;
  a_CoefObj[20][Ind_v45] = &Coef_recp_rSrD52_i; 
  a_Static[20][Ind_v45] = -1.0;
  a_CoefObj[20][Ind_i5_l] = 0;
  a_Static[20][Ind_i5_l] = -1.0;
  a_CoefObj[20][35] = 0;
  a_Static[20][35] = 0;

  //Eq. (22)
  a_CoefObj[21][Ind_inl] = 0;
  a_Static[21][Ind_inl] = 1.0;
  a_CoefObj[21][Ind_i5_l] = 0;
  a_Static[21][Ind_i5_l] = 1.0;
  a_CoefObj[21][Ind_i5] = 0;
  a_Static[21][Ind_i5] = -1.0;
  a_CoefObj[21][35] = 0;
  a_Static[21][35] = 0;
  
  //Eq. (23)
  a_CoefObj[22][Ind_v51] = 0;
  a_Static[22][Ind_v51] = C5;
  a_CoefObj[22][Ind_v56] = 0;
  a_Static[22][Ind_v56] = -C5;
  a_CoefObj[22][35] = &Coef_q5_i;
  a_Static[22][35] = 1.0;

  //Eq. (24)
  a_CoefObj[23][Ind_v56] = &Coef_recp_rSrD61_i;
  a_Static[23][Ind_v56] = 1.0;
  a_CoefObj[23][Ind_v61] = &Coef_recp_rSrD61_i; 
  a_Static[23][Ind_v61] = -1.0;
  a_CoefObj[23][Ind_i6] = 0;
  a_Static[23][Ind_i6] = -1.0;
  a_CoefObj[23][35] = 0;
  a_Static[23][35] = 0;
  
  //Eq. (25)
  a_CoefObj[24][Ind_v67] = &Coef_recp_rSrD62_i;
  a_Static[24][Ind_v67] = 1.0;
  a_CoefObj[24][Ind_v56] = &Coef_recp_rSrD62_i; 
  a_Static[24][Ind_v56] = -1.0;
  a_CoefObj[24][Ind_i6_l] = 0;
  a_Static[24][Ind_i6_l] = -1.0;
  a_CoefObj[24][35] = 0;
  a_Static[24][35] = 0;

  //Eq. (26)
  a_CoefObj[25][Ind_inl] = 0;
  a_Static[25][Ind_inl] = 1.0;
  a_CoefObj[25][Ind_i6_l] = 0;
  a_Static[25][Ind_i6_l] = 1.0;
  a_CoefObj[25][Ind_i6] = 0;
  a_Static[25][Ind_i6] = -1.0;
  a_CoefObj[25][35] = 0;
  a_Static[25][35] = 0;
  
  //Eq. (27)
  a_CoefObj[26][Ind_v61] = 0;
  a_Static[26][Ind_v61] = C6;
  a_CoefObj[26][Ind_v67] = 0;
  a_Static[26][Ind_v67] = -C6;
  a_CoefObj[26][35] = &Coef_q6_i;
  a_Static[26][35] = 1.0;
   
  //Eq. (28)
  a_CoefObj[27][Ind_v67] = &Coef_recp_rSrD71_i;
  a_Static[27][Ind_v67] = 1.0;
  a_CoefObj[27][Ind_v71] = &Coef_recp_rSrD71_i; 
  a_Static[27][Ind_v71] = -1.0;
  a_CoefObj[27][Ind_i7] = 0;
  a_Static[27][Ind_i7] = -1.0;
  a_CoefObj[27][35] = 0;
  a_Static[27][35] = 0;
  
  //Eq. (29)
  a_CoefObj[28][Ind_v78] = &Coef_recp_rSrD72_i;
  a_Static[28][Ind_v78] = 1.0;
  a_CoefObj[28][Ind_v67] = &Coef_recp_rSrD72_i; 
  a_Static[28][Ind_v67] = -1.0;
  a_CoefObj[28][Ind_i7_l] = 0;
  a_Static[28][Ind_i7_l] = -1.0;
  a_CoefObj[28][35] = 0;
  a_Static[28][35] = 0;

  //Eq. (30)
  a_CoefObj[29][Ind_inl] = 0;
  a_Static[29][Ind_inl] = 1.0;
  a_CoefObj[29][Ind_i7_l] = 0;
  a_Static[29][Ind_i7_l] = 1.0;
  a_CoefObj[29][Ind_i7] = 0;
  a_Static[29][Ind_i7] = -1.0;
  a_CoefObj[29][35] = 0;
  a_Static[29][35] = 0;
  
  //Eq. (31)
  a_CoefObj[30][Ind_v71] = 0;
  a_Static[30][Ind_v71] = C7;
  a_CoefObj[30][Ind_v78] = 0;
  a_Static[30][Ind_v78] = -C7;
  a_CoefObj[30][35] = &Coef_q7_i;
  a_Static[30][35] = 1.0;
  
  //Eq. (32)
  a_CoefObj[31][Ind_v78] = &Coef_recp_rSrD81_i;
  a_Static[31][Ind_v78] = 1.0;
  a_CoefObj[31][Ind_v81] = &Coef_recp_rSrD81_i; 
  a_Static[31][Ind_v81] = -1.0;
  a_CoefObj[31][Ind_i8] = 0;
  a_Static[31][Ind_i8] = -1.0;
  a_CoefObj[31][35] = 0;
  a_Static[31][35] = 0;    
  
  //Eq. (33)
  a_CoefObj[32][Ind_v78] = &Coef_recp_rSrD82_i;
  a_Static[32][Ind_v78] = -1.0;
  a_CoefObj[32][Ind_i8_l] = 0;
  a_Static[32][Ind_i8_l] = -1.0;
  a_CoefObj[32][35] = &Coef_recp_rSrD82_i;
  a_Static[32][35] = - MINUS_DC_BUS_VOLTAGE;

  //Eq. (34)
  a_CoefObj[33][Ind_inl] = 0;
  a_Static[33][Ind_inl] = 1.0;
  a_CoefObj[33][Ind_i8_l] = 0;
  a_Static[33][Ind_i8_l] = 1.0;
  a_CoefObj[33][Ind_i8] = 0;
  a_Static[33][Ind_i8] = -1.0;
  a_CoefObj[33][35] = 0;
  a_Static[33][35] = 0;
  
  //Eq. (35)
  a_CoefObj[34][Ind_v81] = 0;
  a_Static[34][Ind_v81] = C8;    
  a_CoefObj[34][35] = &Coef_q8_plus_MinusBus_C8_i;
  a_Static[34][35] = 1.0;
  
  
  //build the ODE Rvalue list.

  pOdeObjRValList = new OdeObjItem;          
  pCurOdeItem = pOdeObjRValList;
 
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q1];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q2];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q3];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q4];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_iLp_iLn_1];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_iLp_iLn_2];    
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;   
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_ia_ib_1];    
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;   
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q5];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q6];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q7];  
  pCurOdeItem->pNextOdeItem = new OdeObjItem;
  pCurOdeItem = pCurOdeItem->pNextOdeItem;  
  pCurOdeItem->pOdeObject = OdeObjectList[ODE_FUNC_q8];  

  //build the SWITCH Rvalue list.

  pSwitchObjRValList = new SwitchObjItem;
  pCurSwitchItem = pSwitchObjRValList;

  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS11];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;  
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS12];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS21];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS22];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS31];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS32];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS41];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS42];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS51];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS52];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS61];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS62];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS71];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS72];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS81];
  pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem; 
  pCurSwitchItem->pSwitchObject = SwitchObjectList[SWITCH_FUNC_rS82];


#ifdef PLOT_SPICEOBJECT_PROBES_solution_vector
  DoProbes = TRUE;
#endif
#ifdef DO_PROBE_v11    
  pDoProbes_[Ind_v11] = TRUE;
  pProbeName[Ind_v11] = "v11";
#endif
#ifdef DO_PROBE_v12   
  pDoProbes_[Ind_v12] = TRUE;
  pProbeName[Ind_v12] = "v12";
#endif 
#ifdef DO_PROBE_v21   
  pDoProbes_[Ind_v21] = TRUE;
  pProbeName[Ind_v21] = "v21";
#endif 
#ifdef DO_PROBE_v23   
  pDoProbes_[Ind_v23] = TRUE;
  pProbeName[Ind_v23] = "v23";
#endif 
#ifdef DO_PROBE_v31   
  pDoProbes_[Ind_v31] = TRUE;
  pProbeName[Ind_v31] = "v31";
#endif 
#ifdef DO_PROBE_v34 
  pDoProbes_[Ind_v34] = TRUE;
  pProbeName[Ind_v34] = "v34";
#endif   
#ifdef DO_PROBE_v41  
  pDoProbes_[Ind_v41] = TRUE;
  pProbeName[Ind_v41] = "v41";
#endif  
#ifdef DO_PROBE_v44  
  pDoProbes_[Ind_v44] = TRUE;
  pProbeName[Ind_v44] = "v44";
#endif  
#ifdef DO_PROBE_v45   
  pDoProbes_[Ind_v45] = TRUE;
  pProbeName[Ind_v45] = "v45";
#endif 
#ifdef DO_PROBE_vs_a   
  pDoProbes_[Ind_vs_a] = TRUE;
  pProbeName[Ind_vs_a] = "vs_a";
#endif
#ifdef DO_PROBE_v51    
  pDoProbes_[Ind_v51] = TRUE;
  pProbeName[Ind_v51] = "v51";
#endif
#ifdef DO_PROBE_v56   
  pDoProbes_[Ind_v56] = TRUE;
  pProbeName[Ind_v56] = "v56";
#endif 
#ifdef DO_PROBE_v61   
  pDoProbes_[Ind_v61] = TRUE;
  pProbeName[Ind_v61] = "v61";
#endif 
#ifdef DO_PROBE_v67    
  pDoProbes_[Ind_v67] = TRUE;
  pProbeName[Ind_v67] = "v67";
#endif
#ifdef DO_PROBE_v71    
  pDoProbes_[Ind_v71] = TRUE;
  pProbeName[Ind_v71] = "v71";
#endif
#ifdef DO_PROBE_v78    
  pDoProbes_[Ind_v78] = TRUE;
  pProbeName[Ind_v78] = "v78";
#endif
#ifdef DO_PROBE_v81    
  pDoProbes_[Ind_v81] = TRUE;
  pProbeName[Ind_v81] = "v81";
#endif
#ifdef DO_PROBE_i1    
  pDoProbes_[Ind_i1] = TRUE;
  pProbeName[Ind_i1] = "i1";
#endif
#ifdef DO_PROBE_i1_l  
  pDoProbes_[Ind_i1_l] = TRUE;
  pProbeName[Ind_i1_l] = "i1_l";
#endif
#ifdef DO_PROBE_ipl   
  pDoProbes_[Ind_ipl] = TRUE;
  pProbeName[Ind_ipl] = "ipl";
#endif 
#ifdef DO_PROBE_i2    
  pDoProbes_[Ind_i2] = TRUE;
  pProbeName[Ind_i2] = "i2";
#endif 
#ifdef DO_PROBE_i2_l    
  pDoProbes_[Ind_i2_l] = TRUE;
  pProbeName[Ind_i2_l] = "i2_l";
#endif 
#ifdef DO_PROBE_i3   
  pDoProbes_[Ind_i3] = TRUE;
  pProbeName[Ind_i3] = "i3";
#endif  
#ifdef DO_PROBE_i3_l   
  pDoProbes_[Ind_i3_l] = TRUE;
  pProbeName[Ind_i3_l] = "i3_l";
#endif 
#ifdef DO_PROBE_i4 
  pDoProbes_[Ind_i4] = TRUE;
  pProbeName[Ind_i4] = "i4";
#endif    
#ifdef DO_PROBE_i4_l 
  pDoProbes_[Ind_i4_l] = TRUE;
  pProbeName[Ind_i4_l] = "i4_l";
#endif 
#ifdef DO_PROBE_i5  
  pDoProbes_[Ind_i5] = TRUE;
  pProbeName[Ind_i5] = "i5";
#endif   
#ifdef DO_PROBE_i5_l  
  pDoProbes_[Ind_i5_l] = TRUE;
  pProbeName[Ind_i5_l] = "i5_l";
#endif   
#ifdef DO_PROBE_inl  
  pDoProbes_[Ind_inl] = TRUE;
  pProbeName[Ind_inl] = "inl";
#endif  
#ifdef DO_PROBE_i6   
 pDoProbes_[Ind_i6] = TRUE;
 pProbeName[Ind_i6] = "i6";
#endif  
#ifdef DO_PROBE_i6_l   
 pDoProbes_[Ind_i6_l] = TRUE;
 pProbeName[Ind_i6_l] = "i6_l";
#endif  
#ifdef DO_PROBE_i7  
 pDoProbes_[Ind_i7] = TRUE;
 pProbeName[Ind_i7] = "i7";
#endif   
#ifdef DO_PROBE_i7_l  
 pDoProbes_[Ind_i7_l] = TRUE;
 pProbeName[Ind_i7_l] = "i7_l";
#endif
#ifdef DO_PROBE_i8  
  pDoProbes_[Ind_i8] = TRUE;
  pProbeName[Ind_i8] = "i8";
#endif
#ifdef DO_PROBE_i8_l  
  pDoProbes_[Ind_i8_l] = TRUE;
  pProbeName[Ind_i8_l] = "i8_l";
#endif

}

Spice_MultiLevel::~Spice_MultiLevel(void)
{

}



void Spice_MultiLevel::OdeRValueUpdate(void)
{

  OdeObjItem * pCurOdeItem;

  //Update Rvalues
  pCurOdeItem = pOdeObjRValList;

  ((class q1 *) pCurOdeItem->pOdeObject)->i1 = a[Ind_i1][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q2 *) pCurOdeItem->pOdeObject)->i2 = a[Ind_i2][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q3 *) pCurOdeItem->pOdeObject)->i3 = a[Ind_i3][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q4 *) pCurOdeItem->pOdeObject)->i4 = a[Ind_i4][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class iLp_iLn_1 *) pCurOdeItem->pOdeObject)->v44 = a[Ind_v44][35];
  ((class iLp_iLn_1 *) pCurOdeItem->pOdeObject)->vs_a = a[Ind_vs_a][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class iLp_iLn_2 *) pCurOdeItem->pOdeObject)->vs_a = a[Ind_vs_a][35];
  ((class iLp_iLn_2 *) pCurOdeItem->pOdeObject)->v45 = a[Ind_v45][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class ia_ib_1 *) pCurOdeItem->pOdeObject)->vs_a = a[Ind_vs_a][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q5 *) pCurOdeItem->pOdeObject)->i5 = a[Ind_i5][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q6 *) pCurOdeItem->pOdeObject)->i6 = a[Ind_i6][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q7 *) pCurOdeItem->pOdeObject)->i7 = a[Ind_i7][35];
  pCurOdeItem = pCurOdeItem->pNextOdeItem;
  ((class q8 *) pCurOdeItem->pOdeObject)->i8 = a[Ind_i8][35];


						    

}

void Spice_MultiLevel::SwitchRValueUpdate(void)
{
  SwitchObjItem * pCurSwitchItem;

  //Update Rvalues
  pCurSwitchItem = pSwitchObjRValList;

  ((class Switch_rS11 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i1][35];
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS12 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i1_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS21 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i2][35];
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS22 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i2_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS31 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i3][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS32 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i3_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS41 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i4][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS42 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i4_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS51 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i5][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS52 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i5_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS61 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i6][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS62 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i6_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS71 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i7][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS72 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i7_l][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS81 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i8][35];  
  pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  ((class Switch_rS82 *) pCurSwitchItem->pSwitchObject)->DevCur = a[Ind_i8_l][35]; 




}


// ---------------------------------------------------------------

// **************************************************************

 
                                                                                  

// **** SimuObject ************************************************




SimuObject Simulation;

SimuObject::SimuObject(void)
{
  OdeObjItem * pCurOdeItem;
  SrcObjItem * pCurSrcItem;
  CtrlObjItem * pCurCtrlItem;
  CtrlObjGroup * pCurCtrlGroup;
  CoefObjItem * pCurCoefItem;         
  SpiceObjItem * pCurSpiceItem;
  SwitchObjItem * pCurSwitchItem;


  int i;

#ifdef DEBUGGING_SIMULATION_TIME
  SimuTime = .01;       
#else
  SimuTime = .06;   //(Same as App_SpiceTest.cir and App_NgSpiceTest.cir)
#endif 
  
  MinimumPlotTime = 0;
  MaximumPlotTime = 1;



  ExceptionTime = .05;

  //For this example the setting of "RelTol" is important. If it is set to large
  //the system will become unstable. 
  RelTol =  .0000000001;
  //Setting "AbsTol" too small will make a system with a decaying oscillation 
  //take too long to finish.
  AbsTol =  .0000000000001; 
  //typical error correction setting as per "RungeKutta_java.htm" (never set higher then "1.0")
  Safety = .98;
  h_start = .000000001; 

  h = h_start;






  //set to a value other then "0" to clamp maximum "h";
  h_max = .0000002;

  //set to store and plot "h" parameter.
  Do_h_Plot = 1;
  
  TimeQuantum = h;
  CtrlTimeQuantum = QUANTUM_PERIOD;

  //set tp force CTRL update on first ODE update.
  CtrlTimeAccumulator = 0;

  SrcPeriodQuantum = QUANTUM_PERIOD;
  SrcPeriodAccumulator = 0;
 

  //build the SRC equation list
  pSrcEquationList = new SrcObjItem;
  pCurSrcItem = pSrcEquationList;
  i = 0;
  while(SrcObjectList[i]){
    pCurSrcItem->pSrcObject = SrcObjectList[i];
    i++;
    if(!SrcObjectList[i])
      break;
    pCurSrcItem->pNextSrcItem = new SrcObjItem;
    pCurSrcItem = pCurSrcItem->pNextSrcItem;


  }

  //build the ODE equation list.
  pOdeEquationList = new OdeObjItem;
  pCurOdeItem = pOdeEquationList;
  i = 0;
  while(1){
    pCurOdeItem->pOdeObject = OdeObjectList[i];
    i++;
    if(!OdeObjectList[i])
      break;
    pCurOdeItem->pNextOdeItem = new OdeObjItem;
    pCurOdeItem = pCurOdeItem->pNextOdeItem;
  }



  if(CtrlObjectList[0]){

    pCtrlGroupList = new CtrlObjGroup;
    pCurCtrlGroup = pCtrlGroupList;

    pCurCtrlGroup->pCtrlEquationList = new CtrlObjItem;
    pCurCtrlItem = pCurCtrlGroup->pCtrlEquationList;
    //set tp force CTRL update on first ODE update.
    pCurCtrlGroup->QuantumCount = 1;
    pCurCtrlGroup->QuantumNum = CtrlObjectQuantum[0];

    i = 0;
    while(1){
      pCurCtrlItem->pCtrlObject = CtrlObjectList[i];   
      i++;
      if(!CtrlObjectList[i])                 
	break;

      if(CtrlObjectQuantum[i] == CtrlObjectQuantum[i-1]){
	pCurCtrlItem->pNextCtrlItem = new CtrlObjItem;
	pCurCtrlItem = pCurCtrlItem->pNextCtrlItem;
      }
      else{
	//create a new group...
	pCtrlGroupList->pNextCtrlGroup = new CtrlObjGroup;
	pCurCtrlGroup = pCtrlGroupList->pNextCtrlGroup;

	pCurCtrlGroup->pCtrlEquationList = new CtrlObjItem;
	pCurCtrlItem = pCurCtrlGroup->pCtrlEquationList;
	//set tp force CTRL update on first ODE update.
	pCurCtrlGroup->QuantumCount = 1;
	pCurCtrlGroup->QuantumNum = CtrlObjectQuantum[i];  
      }
    }
  }

  //build the COEF equation list.              //NOTE: The COEF list is used only for exception processing.
  pCoefEquationList = new CoefObjItem;
  pCurCoefItem = pCoefEquationList;
  i = 0;
  while(1){
    pCurCoefItem->pCoefObject = CoefObjectList[i];
    i++;
    if(!CoefObjectList[i])
      break;
    pCurCoefItem->pNextCoefItem = new CoefObjItem;
    pCurCoefItem = pCurCoefItem->pNextCoefItem;
  }



  //build the SPICE equation list.
  pSpiceEquationList = new SpiceObjItem;
  pCurSpiceItem = pSpiceEquationList;
  i = 0;
  while(1){
    pCurSpiceItem->pSpiceObject = SpiceObjectList[i];
    i++;
    if(!SpiceObjectList[i])
      break;
    pCurSpiceItem->pNextSpiceItem = new SpiceObjItem;
    pCurSpiceItem = pCurSpiceItem->pNextSpiceItem;
  }
 
  //build the SWITCH equation list.
  pSwitchEquationList = new SwitchObjItem;
  pCurSwitchItem = pSwitchEquationList;
  i = 0;
  while(1){
    pCurSwitchItem->pSwitchObject = SwitchObjectList[i];
    i++;
    if(!SwitchObjectList[i])
      break;
    pCurSwitchItem->pNextSwitchItem = new SwitchObjItem;
    pCurSwitchItem = pCurSwitchItem->pNextSwitchItem;
  }





}

SimuObject::~SimuObject(void)
{

  //(ideally we should delete all make allocation make in the constructor, here)

}



// ************************************************************






bool ExecuteSimulation(void)
{

   

  Simulation.OdeSimuType = ODE_SIMU_56;

  while(Simulation.t < Simulation.SimuTime){               

    if(!Simulation.DoOneInteration())
      return FALSE;
    
  }
  if(Simulation.GotException){
    cout << Simulation.ExceptionMessageBuffer.str().c_str();
  }

  return TRUE;
}

void PlotResults(string TagNamesToPlot[], double ScaleFactors[], double MinPlotTimes[], double MaxPlotTimes[], 
		 double PlotTimeSteps[], double PlotTimeOffset)
{
  Simulation.PlotSimuResults(TagNamesToPlot, ScaleFactors, MinPlotTimes, MaxPlotTimes, PlotTimeSteps, PlotTimeOffset);


}
