Qucs-core
0.0.19
|
00001 /* 00002 * vpulse.cpp - pulse voltage source class implementation 00003 * 00004 * Copyright (C) 2004, 2005, 2006, 2008 Stefan Jahn <stefan@lkcc.org> 00005 * 00006 * This is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2, or (at your option) 00009 * any later version. 00010 * 00011 * This software is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this package; see the file COPYING. If not, write to 00018 * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 00019 * Boston, MA 02110-1301, USA. 00020 * 00021 * $Id$ 00022 * 00023 */ 00024 00025 #if HAVE_CONFIG_H 00026 # include <config.h> 00027 #endif 00028 00029 #include "component.h" 00030 #include "vpulse.h" 00031 00032 using namespace qucs; 00033 00034 vpulse::vpulse () : circuit (2) { 00035 type = CIR_VPULSE; 00036 setVSource (true); 00037 setVoltageSources (1); 00038 } 00039 00040 void vpulse::initSP (void) { 00041 allocMatrixS (); 00042 setS (NODE_1, NODE_1, 0.0); 00043 setS (NODE_1, NODE_2, 1.0); 00044 setS (NODE_2, NODE_1, 1.0); 00045 setS (NODE_2, NODE_2, 0.0); 00046 } 00047 00048 void vpulse::initDC (void) { 00049 allocMatrixMNA (); 00050 voltageSource (VSRC_1, NODE_1, NODE_2); 00051 setE (VSRC_1, getPropertyDouble ("U1")); 00052 } 00053 00054 void vpulse::initAC (void) { 00055 initDC (); 00056 setE (VSRC_1, 0); 00057 } 00058 00059 void vpulse::initTR (void) { 00060 initDC (); 00061 } 00062 00063 void vpulse::calcTR (nr_double_t t) { 00064 nr_double_t u1 = getPropertyDouble ("U1"); 00065 nr_double_t u2 = getPropertyDouble ("U2"); 00066 nr_double_t t1 = getPropertyDouble ("T1"); 00067 nr_double_t t2 = getPropertyDouble ("T2"); 00068 nr_double_t tr = getPropertyDouble ("Tr"); 00069 nr_double_t tf = getPropertyDouble ("Tf"); 00070 nr_double_t ut = 0; 00071 nr_double_t s = getNet()->getSrcFactor (); 00072 00073 if (t < t1) { // before pulse 00074 ut = u1; 00075 } 00076 else if (t < t1 + tr) { // rising edge 00077 ut = u1 + (u2 - u1) / tr * (t - t1); 00078 } 00079 else if (t < t2 - tf) { // during full pulse 00080 ut = u2; 00081 } 00082 else if (t < t2) { // falling edge 00083 ut = u2 + (u1 - u2) / tf * (t - (t2 - tf)); 00084 } 00085 else { // after pulse 00086 ut = u1; 00087 } 00088 setE (VSRC_1, ut * s); 00089 } 00090 00091 // properties 00092 PROP_REQ [] = { 00093 { "U1", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE }, 00094 { "U2", PROP_REAL, { 1, PROP_NO_STR }, PROP_NO_RANGE }, 00095 { "T1", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE }, 00096 { "T2", PROP_REAL, { 1e-3, PROP_NO_STR }, PROP_POS_RANGE }, 00097 PROP_NO_PROP }; 00098 PROP_OPT [] = { 00099 { "Tr", PROP_REAL, { 1e-9, PROP_NO_STR }, PROP_POS_RANGE }, 00100 { "Tf", PROP_REAL, { 1e-9, PROP_NO_STR }, PROP_POS_RANGE }, 00101 PROP_NO_PROP }; 00102 struct define_t vpulse::cirdef = 00103 { "Vpulse", 2, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };