Node-SPICE: Transiente Modellierung in einem elektrischen Netzwerk

  • Tutorial
Hallo allerseits! Heute möchte ich über eines meiner Projekte sprechen, das als eines der Werkzeuge zum Abrufen von Daten für eine Dissertation erstellt wurde, und da er seine Hauptaufgabe im Moment abgeschlossen hat, möchte ich es in GPLv3-Schwimmen umwandeln - vielleicht ist es für jemanden nützlich noch. Bevor ich jedoch festmachte, entschied ich mich, den Intel Vtune Amplifier Profiler zu verwenden, um sicherzustellen, dass mein Simulationspaket des baumartigen Stromversorgungsnetzwerks die Computer-Ressourcen optimal nutzt. Unter dem Schnitt Details über mich, über das Projekt und über die Leistungsoptimierung (die in einer halben Stunde mehr als verdoppelt wurden)





Einleitung


Seit 6 Jahren beschäftige ich mich mit Energieeinsparung und der Verbesserung der Stromqualität in Industrieanlagen. Erstens handelt es sich um eine Kompensation von Blindleistung auf der Ebene des Stromverbrauchers, so dass dieselbe Blindleistung nicht aus dem industriellen Stromversorgungsnetz verbraucht wird. Parallel zu dieser Aufgabe besteht die Aufgabe, die Spannung an den Lastknoten direkt in der Nähe der Verbraucher zu stabilisieren.

Stellen Sie sich einen herkömmlichen Asynchron-Elektromotor vor. Tausende von ihnen. Sie sehen so aus:


In verschiedenen maßgeblichen und wenig aussagekräftigen Quellen finden Sie statistische Informationen, dass bis zu 70% des erzeugten Stroms genau von Asynchronmotoren verbraucht werden. Ich glaube nicht, dass die reale Zahl weit von diesem Wert entfernt ist.

Haben Sie jemals bemerkt, dass die Lampe blinkt, wenn ein alter Kühlschrank zu Hause anfängt? Dieser Flickereffekt entsteht dadurch, dass der Elektromotor beim Anlauf 5-7 mal mehr Strom verbraucht als der Nennstrom. In den ersten Anlaufmomenten fehlt die Statormagnetisierung, der induktive Widerstand ist minimal und das Netz ist tatsächlich mit einem rein kleinen Wirkwiderstand der Statorwicklung belastet. Wenn dann der Motor beginnt, Drehzahl zu gewinnen, wird der Stator magnetisiert, die Reaktanz der Statorwicklung nimmt zu und der Strom nimmt ab.

Stellen Sie sich nun ein Stromnetz des Unternehmens vor:

Abb. 1 - Hauptstromversorgungskreise von Stromverbrauchern: a - mit verteilten Lasten; b - mit konzentrierten Lasten; In - Block - Transformator - Kofferraum; 1 - Schaltanlage; 2 - Verteilungspunkt; 3 - Leistungsempfänger; 4 - Autobahn; 5 - Reifenmontage.

Dies ist so ein baumartig verzweigtes Stromnetz mit vielen Leistungsempfängern. In einer verallgemeinerten Form kann es so gezeichnet werden:


Abb. 2 - Allgemeines Blockschaltbild der Stromversorgung von elektrischen Empfängern.

In dem Diagramm in Abb. 2, Knoten Ve ist der Punkt der Verbindung der Stromversorgungsquelle (AC kommerzielle Strom, einem Schiff , Generator, Wechselrichter Windrad und dergleichen), wobei die Knotenspannung gleichUe . An die Quelle ist über eine aktiv-induktive Versorgungsleitung mit dem Widerstand Ze = Re + jLe ein Verteilungsknoten V0 mit der Spannung U0 angeschlossen , der definiert ist als:



wobei I_ {e-0} der vom Knoten Ve aufgenommene Strom ist, der der Summe der von nachgeschalteten Lasten aufgenommenen Ströme entspricht :



wobei N die Anzahl der von diesem Knoten versorgten Lasten ist. Für die Schaltung in Abb. 2 vom Ve- Knoten speist alle im System verfügbaren Lastknoten - V3 - V6 . Knoten- Lade-Knoten V3, V4 sind mit dem Knoten V1 verbunden ; und zum Knoten V2 werden die Knoten V5, V6 geladen dementsprechend.

Warum wurde Node-SPICE gegründet?


Wenn sich eine der Lasten ändert, ändert sich der Strom im gesamten Stromkreis zur Wurzel, daher ändert sich die Spannung in der Wurzel und danach in allen anderen Knoten. Und wenn wir die Spannung an mehreren Stellen im Stromkreis stabilisieren müssen, stellt sich die Aufgabe, dies optimal zu tun, da sich die beiden Stabilisatoren gegenseitig beeinflussen. Um diesen Effekt auf einer Vielzahl von Optionen zu verfolgen, muss das Netzwerk simuliert werden.

Die Schaltung in Abb. 2 Es ist durchaus möglich, sich in das Paket Matlab Simulink zu zeichnen. Aber es gibt einen Haken: Wenn die Schaltung groß ist oder es viele dieser Schaltungen gibt, zeichnen Sie die einzelnen Schaltungen, führen Sie die Simulation aus, schießen Sie die Simulationsergebnisse und speichern Sie sie interessanter (und hier hatte ich recht).

Um die Entwicklung noch interessanter und nützlicher zu machen, habe ich, der strenge Sishnik-zhelezyachnik, als Entwicklungssprache beschlossen, mich endlich mit C ++ zu beschäftigen.

Installation


Quellen sind ein Visual Studio 2013-Projekt und werden auf GitHub veröffentlicht .
Um die Anwendung zu erstellen, müssen Sie die Eigen- Bibliothek für lineare Algebra herunterladen und den Pfad zum Bibliotheksordner mithilfe der Umgebungsvariablen $ system (EIGEN_DIR) angeben . Visual Studio muss den Pfad zu diesem Ordner ermitteln und die Anwendung ohne zu viel Rauschen kompilieren.

Zum Anzeigen und Speichern von Diagrammen verwendet die Anwendung das gnuplot- Paket mit dem cairo-Modul - gnuplot sollte Bilder im PNG-Format speichern können. Sie können dies überprüfen, indem Sie den Befehl set terminal png in der Gnuplot-Konsole ausführen. Gnuplot sollte nicht auf das falsche Argument schimpfen - den letzten sin gnuplot, der mit einer Oktave gebündelt geliefert wird. Der Pfad zu gnuplot muss in angegeben werden$ (PFAD) .

Anwendungsarchitektur


Die Anwendung hätte aus unabhängigen Modulen bestehen sollen (Abb. 3), aber etwas ist schiefgegangen:


Abb. 3 - Blockdiagramm des Programms

Die Hauptmodule des Systems sind:

  1. Board Computing-Modul. In diesem Modul wird die Erstellung von Workbench-Desktops durchgeführt, in denen der Aufbau von Lastknotenschaltungen direkt durchgeführt wird. Darüber hinaus ist dieses Modul für den gesamten Modellierungsprozess verantwortlich.
  2. Uhrenmodul. Verantwortlich für Timing Computing. Die Taktung erfolgt derzeit nach dem Prinzip „Fixed Step“. Im Board-Modul enthalten
  3. Modul öffnen. Verantwortlich für das Lesen der Konfigurationsdatei und ggf. der Datendateien. Im Board-Modul enthalten
  4. Modul speichern. Dient zum Speichern von Simulationsergebnissen in Rohdateien oder im Bildformat. Im Board-Modul enthalten
  5. Plot-Modul. Verantwortlich für die Darstellung des Ergebnisses.

Die Konsolenprogrammschnittstelle - Typen und Parameter der Leistungsempfänger sowie die Konfiguration des Lastknotens sind in den Konfigurationsdateien beschrieben.

Der Startbefehl lautet wie folgt:

node-spice.exe -f {путь к конфигурационному файлу}

Das Format der Konfigurationsdatei ist Text, bestehend aus Zeilen der Form:

command -a -b -c 1 -d 2 -e 3

Dabei sind a, b, c, d und e Parameterschlüssel, von denen einige (a, b) einen booleschen Datentyp haben - eine aktive oder inaktive Option oder einen inaktiven Modus. Der andere Teil, zum Beispiel c, d, e, hat einen Text- oder Zahlenwert des Parameters.

Eine Konfigurationsdatei, in der ein Elektromotor über einen Qualitätsanalysator in einer dreiphasigen Spannungsquelle und einer asymmetrischen Last angeschlossen ist, lautet wie folgt:

Beispiel für eine Konfigurationsdatei
//длительность моделирования 5 секунд. 
//Частота тактирования математического процессора 8192 Гц
setup -Off 2 -f 8192
//Создаем новый рабочий стол с именем wb0
load -t workbench -name wb0
//Создаем трехфазный источник напряжения с фазным амплитудным напряжением
//Ua = 310В и частотой 50Гц. 
//Внутреннее сопротивление источника R = 0,1 Ом, индуктивность L = 0,01Гн
load -t source -name ideal3f -f 50 -Ua 310 -R 0.1 -L 0.01
//Создаем анализатор качества электроэнергии
//анализатор будет считывать действующие значения тока(ключ -I), 
//напряжения(ключ -U), полной мощности (ключ -S), 
//коэффициента мощности (ключ -Phi),
//активной и реактивной мощности (ключи -P и -Q), 
//а также вычислять потребление электроэнергии (ключ -E)
//при этом вычисление действующего значения производится каждые 0,02c(ключ -tRMS)
//а номинальное напряжение (для регистрации провалов напряжения) 220В
load -t analyzer -name analyzer //-I -U -S -Phi -tRMS 0.02 -Unom 220 -P -Q -E
//создаем электродвигатель  4A80B4Y3, указав параметры его схемы замещения
//ключ -saveGraph активирует режим построения графиков скорости и момента
load -t acmotor -name 4A80B4Y3 -Rs 5.85 -Rr 3.0 -Ls 0.015 -Lr 0.023 -L0 0.350 -J 0.1 -p 2 -saveGraph
//создаем несимметричную нагрузку
//она будет подключена в t=1c(ключ -On 1) и отключена в t=2c(ключ -Off 2).
load -t rlc -name rl1 -On 1 -Off 2 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
//к выходу источника напряжения подключаем анализатор качества
link -output ideal3f -input  analyzer
//к выходу анализатора качества подключаем электродвигатель
link -output analyzer -input 4A80B4Y3
//к выходу анализатора подключаем несимметричную нагрузку
link -output analyzer -input rl1
//запускаем математический процессор на выполнение
solve
//по завершении строим графики и сохраняем их в виде изображений
graph

Auf dem Workbench-Desktop können beliebig viele Knotenelementarknoten gefunden werden, die in einer Baumkonfiguration verbunden sind.

Jeder Knoten hat einen Eingang zum Anschließen einer Spannungsquelle und einen Ausgang zum Versorgen einer nachfolgenden Last. An den Ausgang eines Knotens können mehrere untergeordnete Knoten angeschlossen werden. Der Elternknoten stellt die Spannung an den Anschlüssen des Kinderknotens ein und fordert den Strom an, den er verbraucht. Wenn der untergeordnete Knoten über eigene untergeordnete Knoten verfügt, wird die Operation rekursiv ausgeführt. Das Verhalten des Knotens ist unterschiedlich - die Spannungsquelle ist die einzige im System. Nach der Simulationsphase erhält die Quelle Informationen über den Gesamtstromverbrauch und es werden Informationen über den aktuellen Spannungswert am Quellenausgang zurückgegeben.



Unabhängig vom Typ verfügen die Knoten über eine gemeinsame Schnittstelle, über die Sie verschiedene Gerätekonfigurationen erstellen können. Mit dem Befehl load wird ein Elementarknoten hinzugefügt.

Allgemeine Ansicht des Ladebefehls:

load -n {имя узла} -t {тип узла} [-ключ значение]

Die folgenden Konfigurationsschlüssel sind allen Knoten gemeinsam:

Tabelle 1 - Die Elementarknoten der Konfiguration mit gemeinsamen Schlüsseln
SchlüsselStandardwertBeschreibung
-namenonameDer eindeutige Name des Knotens. Ein System kann nicht mehrere Knoten mit demselben Namen haben.
-wbKeineDer Name des Desktops, auf dem sich der Leistungsempfänger befindet. Standardmäßig befindet sich der Knoten auf dem zuletzt angekündigten Desktop.
-Auf {c}0Verbindungszeit eines Elementarknotens. Die Zeit wird in Sekunden eingestellt. Der Standardwert ist "0"
-Aus {c}Entspricht der gesamten SimulationszeitZeit zum Herunterfahren des Elementknotens. In Sekunden einstellen. Sie können die Spannungsquelle ausschalten.
-tKein TypDie Art des Knotens (weiter unten erläutert).
-Imax0 (keine Begrenzung)Auslösestrom des Überstromschutzes.
-Breite {Bild}800Diagrammbreite
-höhe {pix}600Diagrammhöhe
-FontArial, 10Schriftart für Diagrammtext
-ZeichnungSpeichern einer Rohdiagrammdatendatei


Implementierte Arten von Knotenelementarknoten:

Desktop-t Workbench.

Es wird davon ausgegangen, dass jeder Desktop eine Art Schema ist und geschachtelte Schemata, dh geschachtelte Desktops, erstellt werden können. Diese Funktion ist in der Testversion des Programms enthalten (aber natürlich nicht implementiert :)). Es gibt keine eindeutigen Schlüssel für den Desktop. Da möglicherweise mehrere Desktops vorhanden sind, sollten Sie nach der Einführung eines zweiten oder mehrerer Desktops für die Knoten angeben, zu welchem ​​Desktop sie gehören. Wenn der Schalter -wb nicht angegeben ist, wird der Elementarknoten auf dem zuletzt erstellten Desktop platziert.

Dreiphasenspannungsquelle -t acsource

In der aktuellen Version des Softwarepakets kann es nur eine Spannungsquelle geben, was die Fähigkeiten des Programms etwas einschränkt, aber für meine Aufgabe ausreicht.

Ich habe Überlegungen, alles zu nehmen und unter Verwendung komplexer Berechnungen eine beliebige Anzahl von Stromquellen und -empfängern beliebiger Konfiguration neu zu schreiben, aber ich flehe mich unter Tränen an, mich danach und nach der Dissertation wieder hinzusetzen. Während Sie sich festhalten.

Host-Konfigurationsschlüssel
SchlüsselStandardwertBeschreibung
-Ua0Der Amplitudenwert der Spannung. Wenn nicht definiert, wird die Taste -Ud durchsucht
-Ud0Effektiver Spannungswert
-f50Frequenz der Wechselspannungsquelle
-R0Quelleninnenwiderstand
-L0Quelleninduktivität
-phi0Quellenspannungsphase


Abbildung 5 zeigt den Prozess der Modellierung einer Spannungsquelle ohne Last:


Abb. 5 - Strom- und Spannungsdiagramme einer Spannungsquelle im Leerlauf

Qualitätsanalysator -t-Analysator

Der Verbrauchsqualitätsanalysator ist in einem beliebigen Teil des Systems enthalten und analysiert verschiedene Verbrauchsparameter. Dieser Knoten ist für die grafische Darstellung verantwortlich.

Tabelle 3 Konfigurationsschlüssel für den Analyzer-Knoten
SchlüsselStandardwertBeschreibung
-tRMS {c}1Berechnungszeitraum für den Effektivwert von Spannung und Strom
-Sammeln-Zeigt an, dass das Übersichtsdiagramm im Diagramm oder die Diagramme nach Phasen angezeigt werden
-Unom {B}220Der effektive Nennspannungswert. Wird verwendet, um Spannungseinbrüche zu beheben
-U-Analysatorspannungsausgang
-I-Stromaufnahme
-Phi-Registrierung eines Leistungsfaktors (Schlüssel -P und -S müssen vorhanden sein)
-S-Volle Energieregistrierung (-U und -I Schlüssel müssen vorhanden sein)
-P-Active Power Registration (-U und -I Schlüssel müssen vorhanden sein)
-Q-Blindleistungserfassung (-S- und -P-Tasten müssen vorhanden sein)
-E-Registrierung des aktiven Energieverbrauchs (-P Schlüssel muss vorhanden sein)

Nach der Simulation zeigt dieser Knoten mit dem Plot-Modul die gewünschten Grafiken an und speichert sie als Bilder auf der Festplatte.

Asynchronmotor - Wechselstrommotor

Dieser Elementarknoten implementiert ein mathematisches Modell eines Induktionsmotors.

Tabelle 4 - Konfigurationsschlüssel für Acmotor-Knoten
SchlüsselStandardwertBeschreibung
-Rs {Ohm}0Widerstand der Statorwicklung
-Rr {Ohm}0Widerstand der Rotorwicklung
-Ls {Mr.}0Induktivität der Statorwicklung
-Lr {Mr.}0Induktivität der Rotorwicklung
-Lm {GN}0Streuinduktivität
-J {}0Rotorträgheitsmoment
-p {}0Die Anzahl der Pole der Statorwicklung
-Ms {N * m2}0Statisches Drehmoment an der Welle
-Ladung {c}0Lade Stoßzeit
-saveGraphKeineAktivierung der Aufzeichnung des Drehmoments auf der Welle und der Antriebsdrehzahl


Bild 6 zeigt den Startvorgang eines Induktionsmotors. Zum Zeitpunkt 1 s. Die Welle wird mit einem Drehmoment von 700 N * m beaufschlagt und der Motor geht in den Betriebsmodus.


Abb. 6 - Diagramme der Drehzahl der Motorwelle sowie des Moments auf der Welle und des statischen Moments beim Motorstart

Parallele RLC - Laden -t rlc

Dieser Elementarknoten ist eine Parallelschaltung von Widerstand, Induktivität und Kapazität. Abhängig von den Parametern können die folgenden standardmäßigen und abnormalen Arten der Exposition gegenüber der Spannungsquelle modelliert werden: ein- und zweiphasige Last, unsymmetrische Last, Kurzschluss in Phase, Kurzschluss und lange Zeit, Kurzschluss nach Erde in allen Phasen, Kurzschluss und lange Zeit.

Tabelle 5 - rlc-Knotenkonfigurationsschlüssel
SchlüsselStandardwertBeschreibung
-Ra {Ohm}
-Rb {Ohm}
-Rc {Ohm}
0 (deaktiviert)Widerstandswiderstand in Phase
-R {Ohm}0 (deaktiviert)Widerstandswiderstand in allen Phasen
-La {Hn}
-Lb {Hn}
-Lc {Hn}
0 (deaktiviert)Induktivität in Phase
-L {Mr.}0 (deaktiviert)Induktivität des Induktors in allen Phasen
-Ca {μF}
-Cb {μF}
-Cc {μF}
0 (deaktiviert)Kapazität des Kondensators in Phase
-C {μF}0 (deaktiviert)Kondensatorkapazität in allen Phasen


Wir simulieren kurzzeitige Kurzschlüsse im Netz:

load -t acmotor -Rs 0.02 -Rr 0.02 -Ls 0.0008 -Lr 0.0002 -Lm 0.00015 -J 3 -p 2 -Ms 700 -Tload 1
load -t rlc -Ra 0.2 -Rb 0.2 -Rc 0.2 -On 1.5 -Off 1.6



KZ 0,1 s Die Drehzahl hat keine Zeit kritisch zu unterschreiten, der Motor stellt nach Beseitigung des Kurzschlusses die Drehzahl wieder her.

load -t acmotor -Rs 0.02 -Rr 0.02 -Ls 0.0008 -Lr 0.0002 -Lm 0.00015 -J 3 -p 2 -Ms 700 -Tload 1
load -t rlc -Ra 0.2 -Rb 0.2 -Rc 0.2 -On 1.5 -Off 2



KZ 0,5 s gelingt es dem Motor zu bremsen und nach dem Einschalten des Motors wird das Drehmoment geringer als das Drehmoment auf der Welle und der Motor stoppt

load -t acmotor -Rs 0.02 -Rr 0.02 -Ls 0.0008 -Lr 0.0002 -Lm 0.00015 -J 3 -p 2 -Ms 700 -Tload 1
load -t rlc -Ra 0.2 -On 1.5



Kurzschluss in Phase A. Drehzahl sinkt praktisch nicht, aufgrund der Eigenschaften des Asynchron-Elektromotors reichen zwei Phasen dafür aus. Das rotierende Magnetfeld im Spalt nimmt eine ovale Form an und die Welle beginnt mit der Frequenz des Versorgungsnetzes zu schwingen.

Code-Optimierung


Wie sich herausstellte, wurde der Hauptmodellierungsprozess selbst im Allgemeinen ziemlich genau geschrieben und es wurden keine architektonischen Änderungen basierend auf den Simulationsergebnissen vorgenommen. Aber der Teufel steckt im Detail.
Öffnen Sie Intel Vtune Amplifier, erstellen Sie ein neues Projekt: Wir



geben den Pfad zu unserem Programm und den Startschlüsseln an. Es ist hilfreich, die Schaltflächen Binär- / Symbolsuche und Quellensuche zu verwenden und die Pfade zum Quellcode und zu den Binärdateien mit Debud-Symbolen anzugeben. Dann ist es einfacher, durch das Projekt und den Quellcode zu navigieren.

Wir verwenden die folgende Konfiguration:

source_and_motor.txt eine Quelle, ein Motor

//create new solve system:
setup -Off 10 -f 3200 //128 ticks per period
load -t workbench -name wb0
load -t acsource -name ideal3f -f 50 -Ud 220 -R 0.1 //-L 0.001
load -t motor -name motor5 -On 0.5 -Off 4 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t analyzer -name analyzer1 -tRMS 0.02 -U -I -P -E -Collect
link -output ideal3f -input analyzer1
link -output analyzer1 -input motor5
solve
graph 

Alle angegebenen Konfigurationsdateien befinden sich im Ordner / doc des Projekts.

Beginnen wir mit dem einfachsten Basis-Hotspot mit einem Intervall von 1 ms



und führen Sie ihn aus.
Verstrichene Zeit:52,548s
CPU-Zeit:37.460s
Gesamtanzahl der Threads:1,035

Top Hotspots:


Heilige Neutronen ... Natürlich wusste ich, dass Iostream langsam funktioniert, aber so sehr ... Dies deaktiviert übrigens die Synchronisation mit

stdio ios_base::sync_with_stdio(false);



20 Sekunden CPU-Zeit von insgesamt 35 Sekunden. Mehr als 50% der Zeit. Es klettert nicht in irgendwelche Tore.
Lesen Sie hier mehr darüber, wie langsam Threads sind . Es ist sinnvoll, alles in das gepanzerte fprintf () umzuschreiben. Mich hat auch interessiert, dass die Cout- Funktion zweimal in der Tabelle vorkommt . Und sicher - die Gnuplot-Ebene erstellt temporäre Dateien und löscht sie dann. Fügen Sie dem Knoten den Zeichnungsschlüssel hinzu , um unformatierte Diagrammdateien zu speichern. Es gibt Schlüssel - gespeichert, nein, nicht gespeichert.
Wir starten den Profiler. Ha!

Verstrichene Zeit:22.421s
CPU-Zeit:17.107s
Gesamtanzahl der Threads:1,035

Top-Hotspots:



Die Spitzenreiter speichern weiterhin die Ausgabe, benötigen jedoch weniger als 5% der CPU-Zeit. Ernster Erfolg! Wir betrachten die Bottom-Up-Drei:



Der zweite und der dritte Platz sind mit Zeigern und Iteratoren belegt



.



Dieser Code wurde als Test des Konzepts eines gleitenden Messmodus geschrieben. Wie Sie dem Code entnehmen können, ist jeder neue Schritt des Lösers mit einer kleinen Verschiebung (64-128 Zeichen) verbunden, aber immer noch mit einem Array. Es ist sinnvoll, einen Ringpuffer zu verwenden, um dieses Problem zu lösen. Dann hat die Operation zum Hinzufügen eines neuen Elements den Wert O (1) anstelle von O (N).



"Warum ist das notwendig?" Sie sagen, der Qualitätsanalysator ist der einzige im System. Es ist besser, Motoren zur Konfiguration hinzuzufügen. Und Sie werden sich als halb richtig herausstellen - wir werden definitiv Motoren hinzufügen, aber nur Analysatoren im System können genauso viele sein wie im Knotensystem - das ist ein Merkmal meiner Dissertation.
Schauen wir uns an, was mit GetVoltage und GetCurrent nicht stimmt:



Hmm, wie wäre es mit der Verwendung der Links?



Starten Sie die Profilerstellung neu:

Verstrichene Zeit:23,197s
CPU-Zeit:16.551s
Gesamtanzahl der Threads:1,048

Top-Hotspots:



Bottom-Up drei zeigt, dass das erste auf der Liste wieder unser Fprintf und Pango ist, die unter dem Gnuplot hervorkriechen - wir werden nicht mehr auf sie zugreifen (obwohl es sich lohnen würde).



Und was wirklich gefällt, ist die Tatsache, dass NewStep, von dem aus ein paar Schritte zu Solve führten. Führen Sie die Simulation 40 Sekunden lang aus und sehen Sie, wie sich das Bild ändert:

Verstrichene Zeit:73,235s
CPU-Zeit:61.790s
Gesamtanzahl der Threads:1,048



Der Effekt ist skalierbar, daher haben wir hier nichts zu tun.

Um es zusammenzufassen
WarIst gewordenWirkung
CPU-Zeit:37.460s16.551s226%

Nicht schlecht für eine halbe Stunde?
Fügen Sie dem System der Absätze der Motoren hinzu:

source_and_motors.txt: Eine Quelle fünf Motoren

//create new solve system:
setup -Off 10 -f 3200 //64 ticks per period
load -t workbench -name wb0
load -t acsource -name ideal3f -f 50 -Ud 220 -R 0.1 //-L 0.001
load -t motor -name motor1 -On 0.5 -Off 5 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t motor -name motor2 -On 1 -Off 6 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t motor -name motor3 -On 1.5 -Off 7 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t motor -name motor4 -On 2 -Off 8 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t motor -name motor5 -On 2.5 -Off 9 -Rs 2 -Rr 0.8 -Ls 0.00991 -Lr 0.00991 -Lm 0.008419 -J 0.5 -p 2 -Ms 50 -Tload 2 -saveGraph//15kW
load -t analyzer -name analyzer1 -tRMS 0.02 -U -I -P -E -Collect
link -output ideal3f -input analyzer1
link -output analyzer1 -input motor1
link -output analyzer1 -input motor2
link -output analyzer1 -input motor3
link -output analyzer1 -input motor4
link -output analyzer1 -input motor5
solve
graph 

Von den Bottom-Up-drei ist bereits wenig klar:



Wenn Sie sich jetzt den Anruferzähler ansehen, können Sie sehen, wohin die Ressourcen gehen. Zur Lösung von Matrixgleichungen bei der Berechnung der Matte. Elektromotormodelle - die meiste Zeit läuft die Eigenbibliothek.



Wir kommen nicht in die Bibliothek, es ist besser, die Motoren durch RL-Lasten zu ersetzen. Sie sind für mich viel wichtiger - Sie können alle Arten von unterschiedlichen Phasenungleichgewichten, Kurzschlüssen, Störungen und anderen Freuden erzeugen.

Da Sie für einen Tick eigentlich nichts zählen müssen, erhöhen wir die Taktfrequenz des Solvers und bringen die Lasten auf 10 Stück.

source_and_rlc.txt Eine Quelle und 10 RL werden geladen

//create new solve system:
setup -Off 10 -f 6400 //128 ticks per period
load -t workbench -name wb0
load -t acsource -name ideal3f -f 50 -Ud 220 -R 0.1 //-L 0.001
load -t rlc -name rl1 -On 1 -Off 34 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl2 -On 2 -Off 35 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl3 -On 3 -Off 36 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl4 -On 4 -Off 37 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl5 -On 5 -Off 38 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl11 -On 11 -Off 24 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl21 -On 12 -Off 25 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl31 -On 13 -Off 26 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl41 -On 14 -Off 27 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t rlc -name rl51 -On 15 -Off 28 -Ra 100 -Rb 100 -Rc 100 -La 0.01 -Lb 0.01 -Lc 0.01
load -t analyzer -name analyzer1 -tRMS 0.02 -U -I -P -E -Collect
link -output ideal3f -input analyzer1
link -output analyzer1 -input rl1
link -output analyzer1 -input rl2
link -output analyzer1 -input rl3
link -output analyzer1 -input rl4
link -output analyzer1 -input rl5
link -output analyzer1 -input rl11
link -output analyzer1 -input rl21
link -output analyzer1 -input rl31
link -output analyzer1 -input rl41
link -output analyzer1 -input rl51
solve
graph 

Verstrichene Zeit:11.008s
CPU-Zeit:6,485s
Gesamtanzahl der Threads:1,245



Wir berühren nicht Fprintf, sondern den Hauptschuldigen:



Hier kopieren wir die doppelten [4] Vektoren aufeinander. Wie Sie sehen, ist das Kopieren eines Vektors mithilfe des Vektors selbst nicht optimal. Wir verstopfen den Zyklus - für 4 Elemente sollten Sie nicht besonders ausgehen:



Und das letzte Mal
Verstrichene Zeit:9,563s
CPU-Zeit:6,386s
Gesamtanzahl der Threads:1,245





Schlussfolgerungen:


Aber es gibt keine. Ich habe für mich entschieden, dass es wertlos ist, Bremsanwendungen in OpenSource hochzuladen, und bin ein wenig mit einem praktischen und leistungsstarken Profiling-Tool gesessen. Im Gegensatz zu der Anordnung von Zeitstempeln im Code "steckt" Vtune "seine Schnauze" in den langsamen Code, was darauf hindeutet, dass es schön wäre, das eine oder andere Stück umzuschreiben.

Tatsächlich kann meine Anwendung unendlich optimiert werden - für eine Krücke auf einer Krücke. Sie können Eigen werfen und Acmotor mit Boost umschreiben, Sie können grafische Ausgaben mit demselben Boost schreiben, Sie können eine Reihe von Stellen mit Vektoranweisungen umschreiben (hier ist übrigens der Intel Advisor-Profiler nützlich), Sie können das Programm mit Multithreading (TBB, OpenMP, OpenCL) usw. umschreiben. .

Übrigens hier Sie können eine kostenlose Version von Intel parallel Studio für Schüler- und Bildungszwecke erwerben.

Jetzt auch beliebt: