call grafsetshadow(switch) (LOGICAL switch : .TRUE. mit bzw. .FALSE. ohne Licht/Schatten)
call setu2xabs(scale) call setu2xrel(scale)
Subroutine GrafSetQuiet(draw1,idof1,draw2,idof2,bar) Character*(*) draw1, draw2 Integer idof1, idof2 Logical bar
iDim | Raumdimension 2 oder 3, bzw.
iDim=1 - nur ein (2D-)Vektor (könnte alte Version ersetzen), iDim=0 - alte Version - Vektorpfeile (bis auf weiteres) |
iTyp | Erscheinungsbild der lokalen Koordinatensysteme
0 - einfache Striche pro Koordinatenrichtung 1 - Pfeile in jede Koordinatenrichtung 2 - Kreuze (2. Vektor orthogonal zum ersten bestimmt, nur bei iDim=1 sinnvoll) |
scale | Skalierungsfaktor für die Länge der darzustellenden
Vektoren, relativ zur Fenstergröße; Standardwert: 0.02 |
i1,i2,i3 | Startindizes (DoF-Nummern) der jeweils ersten Komponente der
(max) 3 Vektoren, d.h. erster Vektor besteht aus den DoFs i1,i1+1[,i1+2], zweiter Vektor aus i2,i2+1[,i2+2] usw. |
icol1-3 | Farbindizes fuer die drei Vektoren, z.B. 2,3,4 fuer rot,grün,blau
(0=wie Netz, weiß/schwarz)
Farbindizes > 110 bedeuten: Farbe richtet sich nach dem Betrag des jeweiligen Vektors |
↓ | ↓ | ↓ |
subroutine sig2tens(d,N,Sigma,V) integer d, N double precision Sigma(N,d*(d+1)/2), V(N,d*d)
Input: | d | Raumdimension 2 oder 3 |
N | Anzahl der Knotenpunkte | |
Sigma(k,i) | Spannungswerte für jeden Knoten k (für d=3: sig11, sig22, sig33, sig12, sig23, sig13, entsprechend für i=1,...,6, bzw. für d=2: sig11, sig22, sig12, für i=1,2,3) | |
Output: | V | d Eigenvektoren pro Knoten (Anordnung in V wie für Visualisierung erforderlich (s.o.)). |
SUBROUTINE grafik2d (do_fire, do_mat, iDoF, nEl, ne, Elem, * Nk, ndim, Coord, U, Xi, Material, H, maxH ) |
||
do_fire | Logical | .true. entspricht dem Aufruf von firegraf, d.h. Xi enthält Stromfunktionswerte, letzter Freiheitsgrad von U wird besonders behandelt (Druck, nur an Eckpunkten der Elemente definiert) |
do_mat | Logical | .true. entspricht Aufruf von gebmgraf, d.h. auf Material wird pro Element eine Materialnummer (oder ein anderer ganzzahliger elementbezogener Wert) übergeben. |
iDoF | Integer | Nummer des Freiheitsgrades (aus U), der zuerst dargestellt werden soll, bei iDoF=0 nur das Netz. |
nEl | Integer | Anzahl der 2D-FEM-Elemente |
ne | Integer | Anzahl der Knoten pro Element (3-, 6-Knoten-Dreiecke, 4-, 8-, 9-Knoten-Vierecke) |
Elem | (Ne,Nel) Integer | Elementliste, Knotennummern der Elemente |
Nk | Integer | Anzahl der Knoten |
ndim | Integer | Anzahl der Werte pro Knoten in Coord, i.a. ndim=3 (x,y,Bitmaske) |
Coord | (ndim,Nk) Real | Knotenkoordinaten |
U | (Nk,*) DoublePrecision | darzustellende Lösung(en), pro Freiheitsgrad ein Vektor der Länge Nk |
Xi | (Nk) DoublePrecision | Stromfunktion bei do_fire, sonst unbenutzt |
Material | (Nel) Integer | pro Element eine Materialnummer, falls do_mat, sonst unbenutzt |
H | (*) DoublePrecision | Arbeitsfeld zur Berechnung der Pixelkoordinaten usw. |
maxH | Integer | Länge des Arbeitsfeldes (in Doppelworten), oder: -1, falls Länge nicht bekannt oder als "ausreichend" angenommen werden soll. |
call SetGrafLevScale(nr)
März 2003: Man kann bei der grafischen Darstellung ohne Interaktion auch mehrere Abbildungen in einem Fenster neben- oder untereinander ausgeben lassen. Dazu ist es zweckmäßig, vorher die Fenstergröße passend (vor-)einzustellen:
Subroutine SetVWinSize(nx,ny,horiz) Integer nx, ny ! Fenstergroesse insgesamt in Pixeln Logical horiz ! Abb. nebeneinander (=.TRUE.) ! untereinander (=.FALSE.) Die Festlegung der darzustellenden Abbildungen erfolgt analog zu GrafSetQuiet durch mehrmaligen Aufruf der Routine: Subroutine GrafSetQWin(ipos,draw1,idof1,draw2,idof2,bar) Dabei ist ipos die Angabe einer Positionsnummer (1...4) innerhalb des Fensters. Diese Positionen können nur lückenlos (aufsteigend) definiert werden.
Beispiel für nebenstehende Darstellung:
call setVWinSize(240,350,.FALSE.) call grafSetQWin(1,'Net-2D',1,'Isolin',3,.FALSE.) call grafSetQWin(2,'Filled',3,'Bound.',0,.TRUE. ) Beachte: Bei Angabe von 0 für idof1 kann es zu
Darstellungsfehlern kommen, wenn etwas anderes als 'Net-2D', 'Net+U'
oder 'Bound.' ausgewählt wird, ohne vorher einen Freiheitsgrad zu
bestimmen.
|
SUBROUTINE grafquer (Nel, ne, Elem, Nk, ndim, Coord, U) | ||
nEl | Integer | Anzahl der 2D-FEM-Elemente |
ne | Integer | Anzahl der Knoten pro Element (3-, 6-Knoten-Dreiecke, 4-, 8-, 9-Knoten-Vierecke) |
Elem | (Ne,Nel) Integer | Elementliste, Knotennummern der Elemente |
Nk | Integer | Anzahl der Knoten |
ndim | Integer | Anzahl der Werte pro Knoten in Coord, i.a. ndim=3 (x,y,Bitmaske) |
Coord | (ndim,Nk) Real | Knotenkoordinaten |
U | (Nk,*) DoublePrecision | darzustellende Lösung(en), pro Freiheitsgrad ein Vektor der Länge Nk |
Dieses Unterprogramm grafquer muss nach dem Unterprogramm grafik2d
gerufen werden.
Alternativ ist der Aufruf über das Menü des Grafikfensters möglich:
→ .
Das Programm erfragt die Anzahl der zu tabellierenden Funktionswerte entlang der
Geraden, die Koordinaten der Endpunkte der Schnittgeraden sowie einen Wortstamm
"<name>" als Basisname für die beiden auszugebenden
Dateien.
t f(x(t),y(t)) x(t) y(t) el_nrwobei der Parameter t nicht auf (0,1) normiert ist, sondern der Länge der Geraden (in Koordinateneinheiten) entspricht, also t ∈ (0,|B-A|). Die in der 5. Spalte angegebene Elementnummer ist für die Darstellung ohne Bedeutung. Der Wert el_nr=-1 zeigt aber an, dass der Punkt nicht im Gebiet liegt oder eine genaue Zuordnung nicht möglich war. (Die betreffende Zeile ist deshalb in der Datei auskommentiert.)
load "<name>.plot"einzugeben, um eine Funktion t → f(t) anzuzeigen.
set xlabel "x" ... plot ... using 3:2 ....um eine Darstellung x → f(x) bezüglich der x-Richtung der Geraden zu erhalten.
call grab_image(nr)nach dem UP-Aufruf zur grafischen Darstellung erledigt alles (Interaktion zur Abfrage des Filenamens und Übermittlung der Anforderungen an XXgrab, ggf. auch Abschalten des ganzen). Voraussetzung ist natürlich, dass das Programm XXgrab irgendwo (im Hintergrund) läuft. Die Interaktion in grab_image findet nur statt, solange auch der Grafikmodus interaktiv läuft. Nach Umschaltung auf "Quiet" bleiben die letzten Einstellungen für grab_image bis auf Widerruf gültig.
call auto_ps(nr)kann in Verbindung mit dem Batch-Modus (vgl. GrafSetQuiet) automatisch eine Folge von Postscript-Bildern (ohne weitere Nutzereingaben) geschrieben werden. Beim ersten Aufruf von auto_ps besteht die Möglichkeit, einen gemeinsamen Anfang für die Dateinamen festzulegen. Dieser Namensteil wird automatisch ergänzt um die laufende Nummer, die wahlweise (Abfrage bei erstem Aufruf) aus dem Parameter nr übernommen wird oder bei jedem Aufruf von auto_ps automatisch um 1 erhöht wird. Das Programm sollte bspw. in folgender Weise genutzt werden:
... nr = 1 ... DO ... ! Hauptschleife zur Berechnung verschiedener Loesungen ... call auto_ps(nr) ! erste/neue PS-Datei definieren call GrafSetQuiet('Filled',3,'Net-2D',0,.FALSE.) ! Auswahl der Anzeige call grafik2d(.......) ! Ausgabe Bildschirm und PS-Datei nr=nr+1 ! oder in auto_ps weiterzaehlen lassen ENDDO
SUBROUTINE s3dgraph (nDoF, nFaceInSolid, nNodeInSolid, * SolidF, SolidN, SolidU, MSolid, NSolid, iMaterial, * Face, MFace, NFace, iRand, mRand, Edge, MEdge, NEdge, * Node, MNode, NNode, H, maxH, IER ) |
||
nDoF | Integer | Anzahl Freiheitsgrade pro Knoten |
nFaceInSolid | Integer | Anzahl Faces pro Element (4=Tetraeder, 6=Hexaeder) |
nNodeInSolid | Integer | Knotenzahl pro Element (→ Elementtyp: 4, 10 → Tet.; 8, 20, 27 → Hex.) |
SolidF | (MSolid,NSolid) Int. | Facenummern der Elemente; entspricht Solid(1,1) |
SolidN | (MSolid,NSolid) Int. | Knotennummern der Elemente; entspricht Solid(1+MelFac,1) |
SolidU | (MSolid,NSolid) Real | Knotenwerte zu allen Knoten des Elements,
pro Knoten jeweils nDoF Real-Werte
(NDoF x nNodeInSolid); entspricht Solid(1+MelFac+MelNod,1) |
MSolid | Integer | Länge des Eintrags für ein 3D-Element im Feld Solid (betrifft hier SolidF, SolidN, SolidU) |
NSolid | Integer | Anzahl der Elemente |
iMaterial | Integer | Index, Position der Materialnummer im Feld Face |
Face | (MFace,NFace) Int. | Liste der Faces, (Kantennummern, Materialnr., RB) |
MFace | Integer | Länge des Eintrags pro Face |
NFace | Integer | Anzahl Faces insgesamt |
iRand,mRand | Integer | Index innerhalb von Face und Bitmaske für Randface-Markierung |
Edge | (MEdge,NEdge) Int. | Kantenliste (Knotennummern: na, ne, ...) |
MEdge | Integer | Länge des Eintrags pro Kante |
NEdge | Integer | Anzahl Kanten insgesamt |
Node | (MNode,NNode) Real | Knotenliste (x,y,z, ...), evtl. Werte u1, u2, ... werden hier nicht benutzt. |
MNode | Integer | Länge des Eintrags pro Knoten |
NNode | Integer | Anzahl Knoten insgesamt |
H | (*) Integer oder Real | Arbeitsfeld zur internen Verwendung bei Berechnung der Grafik (sollte an Doppelwortadresse beginnen) |
maxH | Integer | Länge des Arbeitsfeldes (in Worten) |
IER | Integer | Fehleranzeiger (Beachte: ggf. vorher 0 setzen) Spezialfunktion: Input: IER=1 bedeutet, dass die ersten NFace Werte auf H anstelle der Materialnummern verwendet werden sollen (zu Testzwecken, Anzeige von Integer-Werten auf Faces). Output: IER=1: keine X11-Verbindung, IER=2: zu wenig Speicherplatz, IER=3: falsche oder widersprüchliche Parameter (keine sichtbaren Elemente) |
SUBROUTINE grafSetClip3D (nx,ny,nz,d) | ||
nx,ny,nz | Real | Komponenten des Normalenvektors einer Ebene, zeigt in Richtung des
abzuschneidenden Halbraums. Spezialfall: nx=ny=nz=0.0 - alle bisherigen Clip-Ebenen werden entfernt. |
d | Real | Abstand der Ebene vom Ursprung (Vorzeichen entsprechend der Richtung des Normalenvektors). |
SUBROUTINE grafSetClipTyp (Typ) | ||
Typ | Character | Bei mehreren Clip-Ebenen muss festgelegt werden, ob der Durchschnitt oder
die Vereinigung der Halbräume ausgeschnitten werden soll: Entscheidend ist nur das erste Zeichen von Typ: 'D[urchschnitt]' oder 'V[ereinigung]' bzw. 'I[ntersection]' oder 'U[nion]' |
Beispiel mit 3 Clip-Ebenen:
call grafsetClip3D(1.,0.,0.,0.) call grafsetClip3D(0.,-1.,0.,0.) call grafsetClip3D(0.,0.,1.,0.) |
||
call grafSetClipTyp('D') | call grafSetClipTyp('V') |
SUBROUTINE grafSetAxes (show) | ||
show | Logical | Sichtbarkeit der Koordinatenachsen (.TRUE.|.FALSE.) |
% Modifiers for drawing coordinate axes /axvisible { true } def % (un)visible /axfontsiz { 10 } def % Font size for text /axshift { 0 0 } def % rel. shift (x y) in pts. /axscale { 1 } def % rel. scale
Deshalb ist es nun möglich, bereits vor der Projektion die 3D-Koordinaten neu berechnen zu lassen, um dann eine korrekte Ansicht des deformierten Gebiets zu erhalten. Optional (über einen Schalter [V] im 3D-Menü) kann das gesamte Gebiet mit verschobenen Koordinaten dargestellt werden, wenn die berechnete Verschiebung auf den ersten 3 Lösungskomponenten steht. Diese Verschiebung wird aber unskaliert angewendet und ergibt damit nur bei großen Deformationen einen sichtbaren Effekt. Verfügbar ist diese Funktion bei den Grafikschnittstellen x3dgraph und s3dgraph.
Die Darstellung
Auch die Zoom-Einstellung orientiert sich dann am deformierten Gebiet, so dass das
Originalgebiet die Fenstergrenzen überschreiten kann.
Alternativ kann dieser Schalter auch durch den Aufruf eines Unterprogramms gesetzt werden:
SUBROUTINE grafSet3DShift (shift) | ||
shift | Logical | Anzeige des deformierten 3D-Gebietes ein-/ausschalten (.TRUE.|.FALSE.) |
LOGICAL FUNCTION do3DShifts () | ||
Funktionswert | Logical | Rückgabe der momentanen Einstellung dieser Anzeige (.TRUE.|.FALSE.) |
In der Grobnetzdarstellung für 3D-Netze mittels Java-Applet werden die
Faces, an denen Randbedingungen definiert sind, verschiedenfarbig markiert
(s. Abb.).
Die Funktion ist über eine Checkbox am linken Rand abschaltbar.
Damit lassen sich evtl. Fehler im Eingabefile besser lokalisieren und in Verbindung mit der Anzeige der Face-Nummern leichter beheben. Da auch Materialbereiche farbig markiert sind, muss ggf. eine dieser Optionen ausgeschaltet werden, wenn die Zuordnung der Farben nicht mehr eindeutig ist. |
Insbesondere bei schnell aufeinanderfolgenden Darstellungen kann das wiederholte Löschen und Neuzeichnen im Grafikfenster störend sein. Zur Abhilfe kann die Grafik zunächst im Hintergrund als Pixmap im Speicher erstellt werden, um dann (ohne Flimmern) als komplettes Bild angezeigt zu werden.
GRAF = GrafXeinzufügen bzw. abzuändern.
Im Menü
gibt es zu der bisherigen Auswahl der Farbpaletten einen weiteren
Eintrag mit einem Farbverlauf von Blau über Violett zu Rot (mit 102 Abstufungen)
|
März 2016: Mit diesem Aufruf kann man für einzelne Freiheitsgrade durch Vorgabe von Minimum und Maximum des Funktionswertes den Farbverlauf fixieren (so dass bei einer Serie von Darstellungen gleiche Farben gleiche Werte bedeuten):
Subroutine SetGrafValScale(iDoF,umin,umax) Integer iDoF ! Nummer des Freiheitsgrades (laut DoF-Menü) Real umin, umax ! Vorgabe der beiden Extremwerte für die Farbskala
Die Fixierung des Farbverlaufs erfolgt nur, wenn zmin < zmax, anderenfalls wird ggf. eine voherige Fixierung wieder aufgehoben.
August 2016: Anstelle der interaktiven Auswahl , (zum Ein-/Ausschalten des Patch-Modus) kann man diese Option durch folgenden Unterprogramm-Aufruf setzen:
Subroutine GrafSetPatchMode(Patch,Grid) Logical Patch ! .TRUE. / .FALSE. für ein/aus Logical Grid ! .TRUE. / .FALSE. für mit/ohne Netz bzw. Optimierung
Der Parameter Grid bestimmt im Fall Patch=.TRUE., ob die Netzlinien jeweils sofort auf
die farbigen Flächen gezeichnet werden sollen (vgl. Eintrag von
März 2015).
Im Fall Patch=.FALSE. bestimmt Grid, ob auch die Polygon-Optimierung
wieder eingeschaltet wird, die im Patch-Modus grundsätzlich aus ist.
Anmerkung: Es gibt ein Unterprogramm call SetOptFil(iopt), mit dem
eine Variante zur Polygon-Optimierung (Zusammenfassung vieler kleiner Polygonflächen gleicher Farbe zu einem größeren Polygon) festgelegt werden kann
(iopt=0,1,2,3,4), als Standard ist iopt=4 voreingestellt,
vgl. Info von März 2004.
Bei iopt=0 findet keine Optimierung statt, die anderen sind Testversionen,
die bei manchen Gebieten nicht korrekt funktionieren oder deutlich länger dauern.
(Der Aufruf call SetOptFil(0) ist somit gleichwertig mit call GrafSetPatchMode(.TRUE.,.FALSE.)
und der Aufruf call SetOptFil(4) entspricht call GrafSetPatchMode(.FALSE.,.TRUE.).)
Beachte: Wenn die Einstellung für den Patch-Modus im Zusammenhang mit mehreren Unterfenstern
verwendet wird (siehe oben, März 2003), gilt
sie für das zum Zeitpunkt des Aufrufs zuletzt verwendete Fenster. Nach einer nicht-interaktiven Grafik-Ausgabe
ist das in der Regel das letzte Fenster (mit der höchsten Positionsnummer).
Die Einstellung
bleibt für dieses Fenster gültig bis zu einer neuen Einstellung (interaktiv
oder mit diesem Unterprogramm)
Empfehlung: gleich nach der Initialisierung der Fenster (in dieser Reihenfolge)
aufrufen (z.B. für 3 Fenster):
call GrafSetQWin(1,'Filled',iDoF1,'none',0,.TRUE.) call GrafSetPatchMode(.TRUE.,.TRUE.) ! Fenster 1: Patch-Mode mit Netz call GrafSetQWin(2,'Net-2D',1,'none',0,.FALSE.) call GrafSetPatchMode(.TRUE.,.FALSE.) ! Fenster 2: Patch-Mode ohne Netz call GrafSetQWin(3,'Filled',iDof2,'Isolin',iDof2,.FALSE.) call GrafSetPatchMode(.FALSE.,.TRUE.) ! Fenster 3: kein Patch-Mode, Polygon-Optimierung ein
setu2x... | (Voreinstellung Skalierung, 2002) |
grafsetquiet | (Grafikausgabe ohne Interaktion, 2002) |
settensor... | (Einstellungen zur Anzeige von Tensorpfeilen, 2002) |
grafik2d | (Rufzeile 2D-Grafik vereinheitlicht, 2002) |
Infos per Mausclick | (Werte an beliebigen Punkten im Gebiet, 2002) |
SetGrafLevScale | (verschiedene Skalierung für Isolinien oder Farbverlauf, 2002) |
grafSetQWin | (Voreinstellungen Multi-Window, 2003) |
grafquer | (interpolierte Schnittgerade durch 2D-Gebiet, 2003) |
Licht/Schatten in 3D | (Hinweise zu Standardeinstellungen, 2003) |
grabimage | (Automatische Erstellung von Bildserien für Videosequenzen, u.a., 2004) |
autopost | (Automatische Ausgabe von PS-Files im Hintergrund, 2005) |
s3dgraph | (spezielle Schnittstelle für 3D-Grafik, Knotenwerte bei jedem Element gespeichert, 2010) |
setclip | (3D-Schnittebenen im Programm voreinstellen, 2010) |
Koordinatenachsen | (optionale Anzeige der Koordinatenachsen am Bildschirm und im PS-File, 2010) |
Verschiebungen | (optionale Anzeige großer (3D-)Deformationen, 2011) |
Randbedingungen | (farbige Markierung in Grobnetzanzeige, 2011) |
flimmerfrei | (Zeichnen im Hintergrund mit libGrafX.a , 2012) |
BluRed | (eine weitere Farbpalette, 2013) |
Nichtkonvexe Körper | (verbesserte kombinierte Ansicht mit Farbverlauf + Netz bei verdeckten Flächen, 2015) |
SetGrafValScale | (Min/Max-Vorgabe für Farbverlauf, 2016) |
GrafSetPatchMode | (Voreinstellung für Patch-Modus, 2016) |
SFB 393, TU Chemnitz, Fak. f. Mathematik, Matthias Pester |