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)
Subroutine SetVWinSize(nx,ny,horiz)
Integer nx, ny ! Fenstergroesse insgesamt in Pixeln
Logical horiz ! Abb. nebeneinander (=.TRUE.)
! untereinander (=.FALSE.)
Subroutine GrafSetQWin(ipos,draw1,idof1,draw2,idof2,bar)
call setVWinSize(240,350,.FALSE.)
call grafSetQWin(1,'Net-2D',1,'Isolin',3,.FALSE.)
call grafSetQWin(2,'Filled',3,'Bound.',0,.TRUE. )
| 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.
März 2004:
Was bisher in der Dokumentation verschwiegen (bzw. nicht so klar dargestellt) wurde:
Es ist viel leichter ein automatisches Abspeichern der grafischen Darstellungen
(z.B. zwecks Animation) zu realisieren als es scheint. Ein einziger Unterprogrammaufruf
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 ist dann weniger sinnvoll (sie würde zum bereits verschobenen Netz nochmals die
Verschiebung addieren). Man kann aber mit dieser Funktion nach Eingabe eines absoluten
Skalierungsfaktors "-1" wieder das undeformierte Netz anzeigen lassen
(, , a: -1,
bzw. call setu2xabs(-1.0)) - allerdings sind dann in dieser Ansicht wieder
unstimmige Sichtbarkeitseigenschaften zu erwarten.
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.
| 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, 2012) |
|
|
SFB 393, TU Chemnitz, Matthias Pester |