This shows you the differences between two versions of the page.
| — |
gnucap:manual:tech:plugins:devices:ac_analysis [2015/12/11 15:39] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Device plugins ====== | ||
| + | ===== Implementation ===== | ||
| + | ==== AC analysis ==== | ||
| + | |||
| + | The AC functions in Gnucap correspond to a combination of the AC and PZ functions in Spice. Actually, they are more like the PZ functions, in the sense that frequency (SIM::jomega) is complex. | ||
| + | |||
| + | == void ac_iwant_matrix() == | ||
| + | Notify the sparse matrix of what nodes this device uses. | ||
| + | |||
| + | AC analysis uses a single matrix "acx", which serves as both the nodal admittance matrix and the LU factors. This is likely to change in the future to two matrices like in transient analysis. | ||
| + | |||
| + | This notification is done by invoking the matrix "iwant" call with node pairs that need allocating. | ||
| + | This line: | ||
| + | acx.iwant(_n[0].m_(),_n[1].m_()); | ||
| + | requests allocation of space for an element stamp connecting _n[0] and _n[1]. This is usually four places in the matrix. | ||
| + | |||
| + | Usually, this is not done directly, but calls another function: | ||
| + | * ac_iwant_matrix_passive(), for two-terminal elements like resistors, with a symmetric stamp | ||
| + | * ac_iwant_matrix_active(), for controlled sources, with an asymmetric stamp | ||
| + | * ac_iwant_matrix_extended(), the general case, allocates all combinations | ||
| + | |||
| + | == void ac_begin() == | ||
| + | This is called at the beginning of every AC analysis. It should call BASE::ac_begin() before doing anything else. It sets the value of any AC variables that remain constant through a run. | ||
| + | |||
| + | == void do_ac() == | ||
| + | In most cases, the do_ac functions do the real work, or call the ac_eval function to do it. | ||
| + | |||
| + | If necessary, it evaluates the model. Calling this function more than once on an iteration is harmless, except for the waste of time. Usually, it uses state variables from a previous DC or transient analysis to compute AC values. | ||
| + | |||
| + | Unlike Spice, Gnucap does not actually load the matrix here. | ||
| + | |||
| + | == void ac_load() == | ||
| + | This function gives the appearance of loading the admittance matrix and current vector with the values calculated in do_ac. | ||
| + | |||
| + | The actual loading is done by one or more of a small group of general functions, depending on whether the element is active, passive, poly, or a source. Only certain patterns can be stamped. Complex devices use a combination of these patterns. | ||
| + | |||
| + | WARNING to model developers: DO NOT stamp the matrix directly! | ||