Branch data Line data Source code
1 : : /*
2 : : * ecvs.cpp - ecvs class implementation
3 : : *
4 : : * Copyright (C) 2003, 2004, 2006, 2008 Stefan Jahn <stefan@lkcc.org>
5 : : *
6 : : * This is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2, or (at your option)
9 : : * any later version.
10 : : *
11 : : * This software is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this package; see the file COPYING. If not, write to
18 : : * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
19 : : * Boston, MA 02110-1301, USA.
20 : : *
21 : : * $Id$
22 : : *
23 : : */
24 : :
25 : : /** \file ecvs.h
26 : : * \brief The externally controlled voltage source component implementation file.
27 : : *
28 : : */
29 : :
30 : : /**
31 : : * \ingroup QucsInterface
32 : : */
33 : :
34 : : #if HAVE_CONFIG_H
35 : : # include <config.h>
36 : : #endif
37 : :
38 : : #include "component.h"
39 : : #include "ecvs.h"
40 : :
41 : : using namespace qucs;
42 : :
43 : 0 : ecvs::ecvs () : circuit (2) {
44 : 0 : type = CIR_ECVS;
45 : 0 : setVSource (true);
46 [ # # # # ]: 0 : setVoltageSources (1);
47 : 0 : }
48 : :
49 : 0 : void ecvs::initSP (void) {
50 : 0 : allocMatrixS ();
51 [ # # ]: 0 : setS (NODE_1, NODE_1, 0.0);
52 [ # # ]: 0 : setS (NODE_1, NODE_2, 1.0);
53 [ # # ]: 0 : setS (NODE_2, NODE_1, 1.0);
54 [ # # ]: 0 : setS (NODE_2, NODE_2, 0.0);
55 : 0 : }
56 : :
57 : 0 : void ecvs::initDC (void) {
58 : 0 : allocMatrixMNA ();
59 : 0 : voltageSource (VSRC_1, NODE_1, NODE_2);
60 [ # # ]: 0 : setE (VSRC_1, 0);
61 : 0 : }
62 : :
63 : 0 : void ecvs::initAC (void) {
64 : 0 : initDC ();
65 [ # # ]: 0 : setE (VSRC_1, 0);
66 : 0 : }
67 : :
68 : 0 : void ecvs::initTR (void) {
69 : 0 : initDC ();
70 : : // we need to store a history of time values
71 : : // for interpolation, initialise the history here
72 : 0 : deleteHistory ();
73 : 0 : setHistory (true);
74 : 0 : initHistory (0);
75 : 0 : }
76 : :
77 : 0 : void ecvs::calcTR (nr_double_t t) {
78 : 0 : nr_double_t V = 0;
79 : 0 : nr_double_t y0 = 0;
80 : : nr_double_t Tlast;
81 : 0 : int hsize = getHistorySize ();
82 : : // choose the voltage at the current time by interpolating
83 : : // at the current time, using the previous values of the
84 : : // voltage and the value of the voltage at the specified
85 : : // next time in Tnext
86 : 0 : nr_double_t y1 = getPropertyDouble ("U");
87 [ # # ]: 0 : if (hsize < 1)
88 : : {
89 : 0 : Tlast = t;
90 : 0 : y0 = y1;
91 : : }
92 : : else
93 : : {
94 : 0 : Tlast = getHistoryTFromIndex (hsize-1);
95 : 0 : y0 = (getV (NODE_1, hsize-1) - getV (NODE_2, hsize-1));
96 : : }
97 : 0 : nr_double_t Tnext = getPropertyDouble ("Tnext");
98 : : // do the interpolation
99 : 0 : nr_double_t tdiff = t - Tlast;
100 [ # # ]: 0 : if (tdiff <= 0)
101 : : {
102 : 0 : V = y0;
103 : : }
104 : : else
105 : : {
106 : 0 : V = y0 + (y1 - y0) * (tdiff / (Tnext - Tlast));
107 : : }
108 : : #ifdef DEBUG
109 : 0 : printf ("ECVS -- t: %e, V: %e\n", t, V);
110 : : #endif
111 : : // set the voltage source value
112 [ # # ]: 0 : setE (VSRC_1, V);
113 : 0 : }
114 : :
115 : : // properties
116 : : PROP_REQ [] = {
117 : : { "U", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE }, PROP_NO_PROP };
118 : : PROP_OPT [] = {
119 : : { "Interpolator", PROP_STR, { PROP_NO_VAL, "linear" },
120 : : PROP_RNG_STR3 ("hold", "linear", "cubic") },
121 : : { "Tnext", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE },
122 : : PROP_NO_PROP };
123 : : struct define_t ecvs::cirdef =
124 : : { "ECVS", 2, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };
|