/*
* wprobe.cpp - AC/DC and transient watt probe class implementation
*
* Copyright (C) 2015, Pedro Macedo
* 2017, Alberto Silva, 1120196@isep.ipp.pt
*
* This file is part of Qucs
*
* Qucs is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Qucs. If not, see .
*
*/
//Taking iprobe as basis
#if HAVE_CONFIG_H
# include
#endif
#include "component.h"
#include "wprobe.h"
using namespace qucs;
wprobe::wprobe () : circuit (4) {
type = CIR_WPROBE;
setProbe (true);
setVSource (true);
setVoltageSources (1);
}
//NODE 1 --> I+
//NODE 2 --> I-
//NODE 3 --> V+
//NODE 4 --> V-
void wprobe::initDC (void) {
allocMatrixMNA ();
voltageSource (VSRC_1, NODE_1, NODE_2);
}
void wprobe::initAC (void) {
initDC ();
}
void wprobe::saveOperatingPoints (void) {
nr_double_t Vr = real (getV (NODE_3) - getV (NODE_4));
nr_double_t Vi = imag (getV (NODE_3) - getV (NODE_4));
setOperatingPoint ("Vr", Vr);
setOperatingPoint ("Vi", Vi); //This section works just like a voltmeter
}
//For specific information regarding The Power triangle and Power factor:
//https://en.wikipedia.org/wiki/Power_factor#Definition_and_calculation
void wprobe::calcOperatingPoints (void) {
//Reading the current and voltage values to calculate power values
nr_double_t VAr = real ((getV (NODE_3) - getV (NODE_4)) * getJ (NODE_1));
nr_double_t VAi = -imag ((getV (NODE_3) - getV (NODE_4)) * getJ (NODE_1));
setOperatingPoint ("VAr", VAr);
setOperatingPoint ("VAi", VAi);
nr_double_t P = VAr;
setOperatingPoint ("P", P);
nr_double_t Q = VAi;
setOperatingPoint ("Q", Q);
//Power Factor calculation
setOperatingPoint ("PF", P/std::sqrt(P*P+VAi*VAi));
}
void wprobe::initTR (void) {
initDC ();
}
//properties
PROP_REQ [] = { PROP_NO_PROP };
PROP_OPT [] = {
PROP_NO_PROP };
struct define_t wprobe::cirdef =
{ "WProbe", 4, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_LINEAR, PROP_DEF };