Beispiel #1
0
def ElementInfolisteErstellen(elemente, knoten, listenhilfe=[]):
    """Erstelle eine Hilfsliste mit Punktkoordinaten und Volumina aller uebergebenen elemente. Dazu
   wird neben elemente eine Liste aller Punktkoordinaten (knoten) benoetigt. Die optionale
   Uebergabe einer Zuordnung listenhilfe von Labels zu Indizes beschleunigt den Vorgang.
   Gibt elementinfoliste zurueck.
   
   WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine
            oder die folgende listenhilfe uebergeben werden:
   
   listenhilfe = [idx for idx in range(len(knoten))];
   """
    from hilfen import ElementAusOdb, ErstelleLabelsortierteGeomlist
    #
    if (listenhilfe == []):
        if (ElementAusOdb(element=elemente[0])):
            listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=knoten)
        else:
            listenhilfe = [idx for idx in range(len(knoten))]
    #
    elementinfoliste = []
    dimensionen = 2
    if ('3D' in str(elemente[0].type)):
        dimensionen = 3
    #
    for idx, elem in enumerate(elemente):
        punkte = PunktkoordinatenVonElement(element=elem,
                                            knoten=knoten,
                                            listenhilfe=listenhilfe)
        elementinfoliste += [[
            punkte,
            ElementVolumen(punkte=punkte, dimensionen=dimensionen)
        ]]
    #
    return elementinfoliste
Beispiel #2
0
def KnotengewichtungInElement(element, referenzpunkt, knoten, label_zu_idx_punkte=[]):
   """Bestimmt die Anteile, die ein referenzpunkt aus den Knotenpunkten des in punkte definierten
   Elements hat. Die Koordinaten der Elemente muessen in knoten definiert sein. Die optionale
   Uebergabe einer Zuordnung Listenhilfe von Labels zu Indizes beschleunigt den Vorgang.
   Gibt [labelsEckpunkte, Knotengewichtung] zurueck.
   
   WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine
            oder die folgende label_zu_idx_punkte uebergeben werden:
   
   label_zu_idx_punkte = [idx for idx in range(len(knoten))];
   """
   from hilfen import ElementAusOdb, ErstelleLabelsortierteGeomlist
   #
   if (label_zu_idx_punkte == []):
      if (ElementAusOdb(element=element)):
         label_zu_idx_punkte = ErstelleLabelsortierteGeomlist(geomliste=knoten);
      else:
         label_zu_idx_punkte = [idx for idx in range(len(knoten))];
   #
   dimensionen = 2;
   if ('3D' in str(element.type)):
      dimensionen = 3;
   #
   punkte = PunktkoordinatenVonElement(element=element, knoten=knoten,
      listenhilfe=label_zu_idx_punkte);
   punktlabels = [knoten[label_zu_idx_punkte[einzelpunkt]].label for einzelpunkt in element.connectivity];
   return [punktlabels, KnotengewichtungPunktInPunktkoordinaten(punkte=punkte,
      referenzpunkt=referenzpunkt, dimensionen=dimensionen)];
Beispiel #3
0
def _ZustandsuebertragungOdbVorbereiten(dimensionen, odbknoten, odbelemente):
   """Formatiere Ausgabedaten (odbknoten, odbelemente) fuer die externe Bibliothek zur
   Zustandsuebertragung. Gibt [cpp_odbknoten, cpp_odbelemente] zurueck.
   """
   from ctypes import c_double, c_int
   from hilfen import ErstelleLabelsortierteGeomlist
   #
   # Von der externen Bibliothek werden die Knoten-Daten als Array im folgenden Format erwartet:
   # [P0x, P0y, (P0z, ) P1x, P1y, (P1z, ), ...]
   # also sortiert nach den Punkten und fuer jeden Punkt alle Koordianten beginnend mit der
   # x-Koordinate. Die Anzahl an Koordinaten entspricht dimensionen und die Anzahl an Eckpunkten
   # ist in den knoten_pro_...element-Variablen gespeichert
   # Die Element-Daten werden als Array im folgenden Format erwartet:
   # [L0_P0, L0_P1, L0_P2, (L0_P3, L0_P4, L0_P5, L0_P6, L0_P7),   L1_P0, L1_P1, L1_P2, ...]
   # also sortiert nach den Elementen und fuer jedes Element die Labels aller Eckpunkte (fuer
   # Vierecke und Hexahedrons in der passenden Reihenfolge).
   #
   # Fuer odbknoten und odbelemente kann die Sortierung der Label relativ beliebig sein.
   # Deshalb wird ein labelsortiertes Dict erstellt, um von den Labels auf die dazugehoerigen
   # Indizes zuweisen zu koennen. Die Labels starten zusaetzlich bei 1 statt bei 0.
   knoten_pro_odbelement = len(odbelemente[0].connectivity);
   listenhilfe_odbknoten = ErstelleLabelsortierteGeomlist(geomliste=odbknoten);
   mod_odbknoten = [0.0 for idx in range(int(dimensionen*len(odbknoten)))];
   for label_knoten in range(0, len(odbknoten)):
      zielKnoten = odbknoten[listenhilfe_odbknoten[label_knoten+1]];
      for achse in range(dimensionen):
         mod_odbknoten[dimensionen*label_knoten+achse] = zielKnoten.coordinates[achse];
   #
   DoubleArray_odbknoten = c_double * len(mod_odbknoten);
   cpp_odbknoten = DoubleArray_odbknoten(*list(mod_odbknoten));
   #
   listenhilfe_odbelemente = ErstelleLabelsortierteGeomlist(geomliste=odbelemente);
   mod_odbelemente = [0 for idx in range(int(knoten_pro_odbelement*len(odbelemente)))];
   for label_elemente in range(len(odbelemente)):
      zielElement = odbelemente[listenhilfe_odbelemente[label_elemente+1]];
      for idx_eckpunkt in range(knoten_pro_odbelement):
         # Da im Folgenden die Indizes und nicht die Label betrachtet werden,
         # und die Labels mit 1 statt Null starten, ziehe Eins ab
         mod_odbelemente[knoten_pro_odbelement*label_elemente+idx_eckpunkt] = zielElement.connectivity[idx_eckpunkt]-1;
   #
   IntArray_odbelemente = c_int * len(mod_odbelemente);
   cpp_odbelemente = IntArray_odbelemente(*list(mod_odbelemente));
   #
   return [cpp_odbknoten, cpp_odbelemente];
Beispiel #4
0
def ElementAuswahlLabelliste(elemente, punktliste, sortierung=0, aufsteigend=True,
   listenhilfe=[]):
   """Sortiert alle uebergebenen elemente nach der Koordinatenrichtung sortierung basierend auf den
   Koordinaten des Elementmittelpunktes. Fuer die Berechnung der Mittelpunktkoordinaten werden die
   Knoten der Elemente benutzt. Fuer die Zuordnung der einzelnen Punkte zu den Elementen muss eine
   punktliste uebergeben werden, die alle Punkte aller elemente enthaelt. Gibt eine Liste der Labels
   aller uebergebenen elemente zurueck, deren Mittelpunkte nach der Koordinatenrichtung sortierung
   sortiert ist.

   Fuer die sortierung ist die jeweilige Richtung (0, 1 oder 2) anzugeben. Die Reihenfolge wird
   ueber die Koordinaten der Mittelpunkte der Elemente bestimmt. Die Werte koennen entweder
   aufsteigend oder absteigend sortiert werden.
   
   Optional kann die korrekte Zuordnung der Labels der Punkte bei odb-elementen durch Uebergabe
   einer listenhilfe beschleunigt werden.
   
   WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine
            oder die folgende listenhilfe uebergeben werden:
   
   listenhilfe = [idx for idx in range(len(punktliste))];
   """
   from operator import itemgetter
   from hilfen import Log, ElementAusOdb, ErstelleLabelsortierteGeomlist
   #
   tempsortierung = sortierung;
   if ((not (sortierung == 0)) and (not (sortierung == 1)) and (not (sortierung == 2))):
      Log('# Warnung: Ungueltige sortierung, nehme sortierung = 0');
      tempsortierung = 0;
   #
   if (len(elemente) == 0):
      Log('# Hinweis: Keine Elemente uebergeben');
      return [];
   #
   if (listenhilfe == []):
      if (ElementAusOdb(element=elemente[0])):
         listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=punktliste);
      else:
         listenhilfe = [idx for idx in range(len(punktliste))];
   #
   templiste = [];
   anzahlpunkte = float(len(elemente[0].connectivity));
   for elem in elemente:
      mittelwert = 0;
      for punktlabel in elem.connectivity:
         punkt = punktliste[listenhilfe[punktlabel]];
         mittelwert = punkt.coordinates[tempsortierung]/anzahlpunkte;
      #
      templiste += [(mittelwert, elem.label), ];
   #
   templiste.sort(key=itemgetter(0));
   labelliste = [x[1] for x in templiste];
   if (aufsteigend):
      return labelliste;
   else:
      return list(reversed(labelliste));
Beispiel #5
0
def PunktInElement(elemente, knoten, referenzpunkt, listenhilfe=[], elementinfoliste=[]):
   """Gebe den Label des Elements aus elemente zurueck, das referenzpunkt enthaelt. Die
   Koordinaten der elemente muessen in knoten definiert sein. Die optionale Uebergabe einer
   Zuordnung listenhilfe von Labels zu Indizes beschleunigt den Vorgang. Falls eine elementinfoliste
   mit den Volumina und Punktkoordinaten aller Elemente verfuegbar ist, kann ebenfalls eine kleine
   Beschleunigung erzielt werden. Gibt zielElement zurueck.
   
   WICHTIG: Wenn Elemente einer mdb statt einer odb untersucht werden sollen, sollte entweder keine
            oder die folgende listenhilfe uebergeben werden:
   
   listenhilfe = [idx for idx in range(len(knoten))];
   """
   from hilfen import Log, ElementAusOdb, ErstelleLabelsortierteGeomlist
   #
   if (listenhilfe == []):
      if (ElementAusOdb(element=elemente[0])):
         listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=knoten);
      else:
         listenhilfe = [idx for idx in range(len(knoten))];
   #
   zielElement = None;
   minverhaeltnis = 2.0;
   dimensionen = 2;
   if ('3D' in str(elemente[0].type)):
      dimensionen = 3;
   #
   if (elementinfoliste == []):
      for elem in elemente:
         punkte = PunktkoordinatenVonElement(element=elem, knoten=knoten, listenhilfe=listenhilfe);
         if (not _PunktMoeglicherweiseInElement(punkte=punkte, referenzpunkt=referenzpunkt,
            dimensionen=dimensionen)):
            continue;
         #
         volverhaeltnis = _PunktInnerhalbElement(punkte=punkte, referenzpunkt=referenzpunkt,
            dimensionen=dimensionen);
         if (volverhaeltnis < minverhaeltnis):
            zielElement = elem.label;
            minverhaeltnis = volverhaeltnis;
   else:
      if (not len(elemente) == len(elementinfoliste)):
         Log('# Abbruch: Anzahl Elemente stimmt nicht mit Eintraegen in Elementlist ueberein');
         return zielElement;
      for idx, elem in enumerate(elemente):
         if (not _PunktMoeglicherweiseInElement(punkte=elementinfoliste[idx][0],
            referenzpunkt=referenzpunkt, dimensionen=dimensionen)):
            continue;
         #
         referenzpunktvol = _ElementZuReferenzpunktVolumen(punkte=elementinfoliste[idx][0],
            referenzpunkt=referenzpunkt, dimensionen=dimensionen);
         volverhaeltnis = referenzpunktvol/elementinfoliste[idx][1];
         if (volverhaeltnis < minverhaeltnis):
            zielElement = elem.label;
            minverhaeltnis = volverhaeltnis;
   #
   return zielElement;
Beispiel #6
0
def _OdbElementAuswahl(elemente,
                       punktliste,
                       bedingung='True',
                       var=[],
                       listenhilfe=[]):
    """Gib eine Sequenz an Elementen aus den uebergebenen elemente zurueck, die bzw. deren Punkte die
   bedingung erfuellen (nur odb). Fuer die Zuordnung der einzelnen Punkte zu den Elementen muss eine
   punktliste uebergeben werden, die alle Punkte aller elemente enthaelt. Die korrekte Zuordnung der
   Labels der Punkte kann durch Uebergabe einer listenhilfe beschleunigt werden.
   Gibt die Sequenz der ausgewaehlten Elemente zurueck.
   
   In der Bedingung kann mit elem auf ein einzelnes Element und mit punkt auf einen Punkt des
   Elements zugegriffen werden. Die Koordinaten eines Punktes koennen mit punkt.coordinates[#]
   erhalten werden, wobei die Raute fuer 0, 1 oder 2 und somit eine der drei Bezugsrichtungen steht.
   """
    from math import pi, sqrt, sin, cos, tan, asin, acos, atan
    from hilfen import Log, _Eval_Basispruefung, ErstelleLabelsortierteGeomlist
    #
    ausgewaehlteElemente = elemente[0:0]
    erlaubt = [
        'coordinates', 'connectivity', 'featureName', 'index', 'instanceName',
        'instanceNames', 'isReferenceRep', 'pointOn', 'sectionCategory',
        'label', 'type', 'var', 'elem', 'punkt'
    ]
    #
    if (not _Eval_Basispruefung(code=bedingung, zusatz_erlaubt=erlaubt)):
        Log('# Abbruch: Uebergebene bedingung ist ungueltig')
        return ausgewaehlteElemente
    #
    if (listenhilfe == []):
        listenhilfe = ErstelleLabelsortierteGeomlist(geomliste=punktliste)
    #
    numPunkte = len(elemente[0].connectivity)
    for idx, elem in enumerate(elemente):
        numErfuellt = 0
        for punktlabel in elem.connectivity:
            punkt = punktliste[listenhilfe[punktlabel]]
            if (eval(bedingung)):
                numErfuellt += 1
            else:
                continue
        #
        if (numErfuellt == numPunkte):
            ausgewaehlteElemente += elemente[idx:idx + 1]
    #
    return ausgewaehlteElemente
Beispiel #7
0
def LabelAuswahl(elemente, labelliste, elementhilfsliste=[]):
   """Erstelle eine Sequenz aller uebergebener elemente, deren Label sich in labelliste befindet.
   Optional kann eine elementhilfsliste vorab erzeugt und uebergeben werden, was vorallem bei
   mehrmaligen Aufrufen einer LabelAuswahl fuer gleiche elemente deutlich schneller ist.
   Falls keine elementhilfsliste uebergeben worden ist, wird (jedes mal) intern eine erstellt.
   Gibt die Sequenz der ausgewaehlten Elemente zurueck.
   """
   from hilfen import ErstelleLabelsortierteGeomlist
   #
   if (elementhilfsliste == []):
      elementhilfsliste = ErstelleLabelsortierteGeomlist(geomliste=elemente);
   #
   ausgewaehlteElemente = elemente[0:0];
   for label in labelliste:
      idxelem = elementhilfsliste[label];
      ausgewaehlteElemente += elemente[idxelem:idxelem+1];
   #
   return ausgewaehlteElemente;