/// <summary> /// Valida una rama y la agrega al circuito si corresponde /// En caso contrario solo agrega el componente indicado /// </summary> /// <param name="yaanalizados"></param> /// <param name="nodosnormales"></param> /// <param name="ramas"></param> /// <param name="nodo"></param> /// <param name="compo"></param> /// <param name="br"></param> protected static void ValidateBranch(List<Dipole> yaanalizados, List<Node> nodosnormales, List<Branch> ramas, Node nodo, Dipole compo, Branch br) { if (br.Components.Count <= 1) { if (compo is PasiveComponent) { Node other = compo.OtherNode(nodo); other.TypeOfNode = Node.NodeType.MultibranchCurrentNode; if (!nodosnormales.Contains(other)) nodosnormales.Add(other); } yaanalizados.Add(compo); } else { //rama valida ramas.Add(br); Node other = br.OtherNode(nodo); if (!nodosnormales.Contains(other)) nodosnormales.Add(other); yaanalizados.AddRange(br.Components); foreach (var comp in br.Components) { comp.Owner = br; } } }
protected static Branch FindBranch(Circuit cir, Node initialNode, Dipole Component) { Branch br = new Branch(cir); Dipole compo = Component; Node nodo = Component.OtherNode(initialNode); br.Nodes.Clear(); //solo es valido si el circuito fue optimizado, y los paralelos //se reemplazaron por bloques paralelo while (nodo.Components.Count == 2 && cir.Reference != nodo) { br.Components.Add(compo); br.InternalNodes.Add(nodo); compo = nodo.OtherComponent(compo); nodo = compo.OtherNode(nodo); } br.Components.Add(compo); if (br.Components.Count > 1) { initialNode.Components.Remove(Component); initialNode.Components.Add(br); nodo.Components.Remove(compo); nodo.Components.Add(br); nodo.TypeOfNode = Node.NodeType.MultibranchCurrentNode; } br.Nodes.Add(initialNode); br.Nodes.Add(nodo); //hay que recorrer la rama para buscar los nodos intermedios flotantes //y aquellos dependientes de los flotantes nodo = compo.OtherNode(nodo); while (nodo != initialNode) { if (nodo.TypeOfNode == Node.NodeType.VoltageFixedNode) { // nothing, node was calculated } else if (compo is VoltageGenerator || compo is Capacitor) { if (nodo.TypeOfNode == Node.NodeType.Unknow) nodo.TypeOfNode = Node.NodeType.VoltageLinkedNode; else throw new NotImplementedException(); } else if (compo is Resistor) { if (nodo.TypeOfNode == Node.NodeType.Unknow) nodo.TypeOfNode = Node.NodeType.VoltageDivideNode; else throw new NotImplementedException(); } else if (compo is Inductor || compo is CurrentGenerator) { //nada, solo imponen la corriente } else { if (nodo.TypeOfNode == Node.NodeType.Unknow) nodo.TypeOfNode = Node.NodeType.InternalBranchNode; else throw new NotImplementedException(); } compo = nodo.OtherComponent(compo); nodo = compo.OtherNode(nodo); } return br; }