File indexing completed on 2024-05-12 13:49:30
0001 /*************************************************************************** 0002 * Copyright (C) 2003-2004 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #include "element.h" 0012 #include "elementset.h" 0013 0014 #include <cassert> 0015 0016 #include <ktechlab_debug.h> 0017 0018 // BEGIN class Element 0019 Element::Element() 0020 { 0021 b_status = false; 0022 p_eSet = nullptr; 0023 b_componentDeleted = false; 0024 0025 for (int i = 0; i < MAX_CNODES; i++) 0026 p_cnode[i] = nullptr; 0027 0028 resetCurrents(); 0029 0030 for (int i = 0; i < MAX_CBRANCHES; i++) 0031 p_cbranch[i] = nullptr; 0032 0033 m_numCBranches = 0; 0034 m_numCNodes = 0; 0035 } 0036 0037 Element::~Element() 0038 { 0039 } 0040 0041 void Element::resetCurrents() 0042 { 0043 for (int i = 0; i < 8; i++) 0044 m_cnodeI[i] = 0.0; 0045 } 0046 0047 void Element::setElementSet(ElementSet *c) 0048 { 0049 assert(!b_componentDeleted); 0050 assert(!p_eSet); 0051 if (!c) 0052 return elementSetDeleted(); 0053 p_eSet = c; 0054 updateStatus(); 0055 } 0056 0057 void Element::componentDeleted() 0058 { 0059 b_componentDeleted = true; 0060 b_status = false; 0061 0062 p_eSet = nullptr; 0063 setCNodes(); 0064 setCBranches(); 0065 } 0066 0067 void Element::elementSetDeleted() 0068 { 0069 if (b_componentDeleted) 0070 return delete this; 0071 0072 b_status = false; 0073 // qCDebug(KTL_LOG) << "Element::elementSetDeleted(): Setting b_status to false, this="<<this; 0074 0075 p_eSet = nullptr; 0076 setCNodes(); 0077 setCBranches(); 0078 } 0079 0080 void Element::setCNodes(const int n0, const int n1, const int n2, const int n3) 0081 { 0082 if (!p_eSet) { 0083 // cerr << "Element::setCNodes: can't set nodes without circuit!"<<endl; 0084 for (int i = 0; i < MAX_CNODES; i++) 0085 p_cnode[i] = nullptr; 0086 return; 0087 } 0088 0089 p_cnode[0] = (n0 > -1) ? p_eSet->cnodes()[n0] : (n0 == -1 ? p_eSet->ground() : nullptr); 0090 p_cnode[1] = (n1 > -1) ? p_eSet->cnodes()[n1] : (n1 == -1 ? p_eSet->ground() : nullptr); 0091 p_cnode[2] = (n2 > -1) ? p_eSet->cnodes()[n2] : (n2 == -1 ? p_eSet->ground() : nullptr); 0092 p_cnode[3] = (n3 > -1) ? p_eSet->cnodes()[n3] : (n3 == -1 ? p_eSet->ground() : nullptr); 0093 updateStatus(); 0094 } 0095 0096 void Element::setCBranches(const int b0, const int b1, const int b2, const int b3) 0097 { 0098 if (!p_eSet) { 0099 // cerr << "Element::setCBranches: can't set branches without circuit!"<<endl; 0100 for (int i = 0; i < 4; i++) 0101 p_cbranch[i] = nullptr; 0102 return; 0103 } 0104 p_cbranch[0] = (b0 > -1) ? p_eSet->cbranches()[b0] : nullptr; 0105 p_cbranch[1] = (b1 > -1) ? p_eSet->cbranches()[b1] : nullptr; 0106 p_cbranch[2] = (b2 > -1) ? p_eSet->cbranches()[b2] : nullptr; 0107 p_cbranch[3] = (b3 > -1) ? p_eSet->cbranches()[b3] : nullptr; 0108 updateStatus(); 0109 } 0110 0111 bool Element::updateStatus() 0112 { 0113 // First, set status to false if all nodes in use are ground 0114 b_status = false; 0115 for (int i = 0; i < m_numCNodes; i++) { 0116 b_status |= p_cnode[i] ? !p_cnode[i]->isGround : false; 0117 } 0118 0119 // Set status to false if any of the nodes are not set 0120 for (int i = 0; i < m_numCNodes; i++) { 0121 if (!p_cnode[i]) 0122 b_status = false; 0123 } 0124 0125 // Finally, set status to false if not all the required branches are set 0126 for (int i = 0; i < m_numCBranches; i++) { 0127 if (!p_cbranch[i]) 0128 b_status = false; 0129 } 0130 0131 // Finally, check for various pointers 0132 if (!p_eSet) 0133 b_status = false; 0134 0135 if (!b_status) { 0136 resetCurrents(); 0137 } 0138 0139 // And return the status :-) 0140 // qCDebug(KTL_LOG) << "Element::updateStatus(): Setting b_status to "<<(b_status?"true":"false")<<" this="<<this; 0141 return b_status; 0142 } 0143 0144 double Element::cbranchCurrent(const int branch) 0145 { 0146 if (!b_status || branch < 0 || branch >= m_numCBranches) 0147 return 0.; 0148 return (*p_cbranch)[branch].i; 0149 } 0150 0151 double Element::cnodeVoltage(const int node) 0152 { 0153 if (!b_status || node < 0 || node >= m_numCNodes) 0154 return 0.; 0155 return (*p_cnode)[node].v; 0156 } 0157 0158 // END class Element