Matplotlib线图不可能?

时间:2014-12-25 23:52:30

标签: python matplotlib plot

我正在使用此代码来描绘一些压力和压力:

from mpl_toolkits.mplot3d import *     # für Druckplots benötigt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from math import *                     # für pi und exp benötigt
from scipy.special import *            # für expn benötigt
import matplotlib.pyplot as plt        # für Plotting in 2D/3D benötigt
import numpy as np                     # für für Arrays benötigt
import csv                             # optional zum Export von Daten
#from maintest1 import CT                                        
#import os
#clear = lambda: os.system('cls')
#clear()

#==============================================================================
#                            Globale Parameter
#==============================================================================

rhog = 2700.0                          # Dichte überlagerndes Gestein [kg/m³]
z = 3500.0                             # Reservoirtiefe [m]
g = 9.81                               # Erdbeschleunigung [m/s²]
rhof = 1000.0                         # Dichte Flüssigkeit [kg/m³]
lameu = 11.2e9                         # Lamé-Parameter, undrained [GPa]
lame = 8.4e9                           # Lamé-Parameter, drained [GPa]
pi                                     # durch Pythonmodul "math" gegeben
alpha = 0.65                           # Biot-Willis-Koeffizient
G = 8.4e9                              # Schermodul [GPa]
k = 1.0e-15                            # Permeabilität [m²] bzw. [Darcy] 
eta = 0.001                            # Viskosität des Fluids [Pa*s]
# q wird bei well festgelegt [m³/s]

# Berechnung der Permeabilität nach Rudnicki (1986), [m³*s/kg] 
kappa = k/eta  

# Berechnung der Diffusivität
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))

#==============================================================================
#                       Variablen (max 3 Faults + 3 Bohrungen)
#==============================================================================

# Zeiträume
t = 100*24*3600                       # betrachteter Zeitraum [s] 
nt = 100                              # Anzahl an Zeitschritten
tsteps = t/nt                          # Zeitschritt [s]
t1start = 0*24*3600                    # Startzeitpunkt Bohrung 1 (B1)
t2start = 0*24*3600                    # Startzeitpunkt Bohrung 2 (B2)
t3start = 0*24*3600                    # Startzeitpunkt Bohrung 3 (B3)

# Förder-oder Injektionsmenge
q1 = 20.0/1000                          # Fluidmenge B1                      
q2 = 0.0/1000                         # Fluidmenge B2                          
q3 = 0.0/1000                          # Fluidmenge B3

# Lage der Bohrungen 
x1lage, y1lage = 0.0, 0.0               # Lage und Koordinaten von B1 [m]
x2lage, y2lage = 0.0, 0.0                # Lage und Koordinaten von B2 [m]
x3lage, y3lage = 0.0, 0.0                # Lage und Koordinaten von B3 [m]

# Faults 
f1x1, f1y1 = 40.0, 40.0                   # Startpunkt Fault 1
f1x2, f1y2 = 25.0, 60.0                    # Endpunkt Fault 1
f2x1, f2y1 = 40.0, 20.0                    # Startpunkt Fault 2
f2x2, f2y2 = 80.0, 40.0                    # Endpunktpunkt Fault 2
f3x1, f3y1 = 60.0, 80.0                    # Startpunkt Fault 3
f3x2, f3y2 = 80.0, 95.0                    # Endpunktpunkt Fault 3
f1nstrike = 50.0                         # Streichen gegenüber Nord
f2nstrike = 70.0                         # Streichen gegenüber Nord
f3nstrike = 80.0                         # Streichen gegenüber Nord                
f1length = 500.0                         # Länge Fault 1   
f2length = 800.0                         # Länge Fault 2
f1dip = 30.0                             # Fallen Fault 1
f2dip = 45.0                             # Fallen Fault 2
f3dip = 60.0                             # Fallen Fault 3   

#==============================================================================
#                               Wertebereich
#==============================================================================

# betrachtete Achsenbereiche in NS- und EW-Richtung
# für eine gute Auflösung und Rechengeschwindigkeit bietet es sich an, ein Ver-
# hältnis von 50-100 für (xmax-xmin)/xsteps zu erhalten
xmin = 0.0
xmax = 100.0
nx = 10                           # Anzahl Schritte im Bereich xmax-xmin
xsteps = float((xmax-xmin)/nx)             # Schrittlänge entlang x-Achse [m]
ymin = 0.0
ymax = 100.0
ny = 10                            # Anzahl Schritte im Bereich xmax-xmin                    
ysteps = float((ymax-ymin)/ny)             # Schrittlänge entlang y-Achse [m]           
#nx = int((xmax-xmin)/xsteps)        # Berechnung der x-Schritte
#ny = int((ymax-ymin)/ysteps)        # Berechnung der y-Schritte

# Bildung von Arrays aus den Achsenbereichen 
x = np.arange(xmin, xmax, xsteps)
y = np.arange(ymin, ymax, ysteps)
X, Y = np.meshgrid (x, y)           # meshgrid bildet alle möglichen Kombinat-
                                    # ionen zwischen x und y

#==============================================================================
#                       Lage der Störungen + Bohrungen 
#==============================================================================

# Variante 1: Anfangs- + Endpunkt
#plt.figure()
#plt.grid(True)                                   # Gitteranzeige einblenden
#plt.title ('Lage der Bohrungen und Stoerungen')  # Überschrift des Schaubildes 
#plt.xlabel('x-Richtung [m]')                     # Beschriftung x-Achse
#plt.ylabel('y-Richtung [m]')                     # Beschriftung y-Achse
#plt.axis([xmin, xmax, ymin, ymax])               # Skalierung der Achsen in [m]
#plt.plot(x1lage, y1lage, "ro", label="Bohrloch 1" )
#plt.plot(x2lage, y2lage, "go", label="Bohrloch 2" )
#plt.plot(x3lage, y3lage, "bo", label="Bohrloch 3" )
#plt.plot([f1x1,f1x2],[f1y1,f1y2],'c-', label = "Fault 1")      
#plt.plot([f2x1,f2x2],[f2y1,f2y2],'m-', label = "Fault 2") 
#plt.plot([f3x1,f3x2],[f3y1,f3y2],'y-', label = "Fault 3") 
#plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., numpoints = 1)
#plt.show()

# Variante 2: mit Länge, Mittelpunkt, Streichen und Dip  

#==============================================================================
#               Koordinatentransformation von Spannungsfernfeld   
#==============================================================================

def CT (sx, sy, sz, sxy, syz, sxz, azimut, rw):
    # Winkel
    lamda = (90-azimut)*pi/180          # Berechnung von lamda in Bogenmaß
    theta = rw*pi/180                   # Berechnung von theta in Bogenmaß                    
    # Richtungscosinus
    l11 = cos(theta)*cos(lamda)
    l12 = cos(theta)*sin(lamda)
    l13 = -sin(theta)
    l21 = -sin(lamda)
    l22 = cos(lamda)
    l23 = 0
    l31 = cos(lamda)*sin(theta)
    l32 = sin(theta)*sin(lamda)
    l33 = cos(theta)
    # Transformationsgleichungen nach Jaeger et al., 2007
    sxneu = l11**2*sx + l12**2*sy + l13**2*sz + 2*l11*l12*sxy + 2*l11*l13*sxz + 2*l12*l13*syz
    syneu = l21**2*sx + l22**2*sy + l23**2*sz + 2*l21*l22*sxy + 2*l21*l23*sxz + 2*l22*l23*syz
    szneu = l31**2*sx + l32**2*sy + l33**2*sz + 2*l31*l32*sxy + 2*l31*l33*sxz + 2*l32*l33*syz
    sxyneu = l11*l21*sx + l12*l22*sy + l13*l23*sz + (l11*l22+l12*l21)*sxy + (l12*l23+l13*l22)*syz + (l11*l23+l13*l21)*sxz
    syzneu = l21*l31*sx + l22*l32*sy + l23*l33*sz + (l21*l32+l22*l31)*sxy + (l22*l33+l23*l32)*syz + (l21*l33+l23*l31)*sxz
    sxzneu = l11*l31*sx + l12*l32*sy + l13*l33*sz + (l11*l32+l12*l31)*sxy + (l12*l33+l13*l32)*syz + (l11*l33+l13*l31)*sxz
    # Ausgabe neuer Spannungen

    return sxneu, syneu, szneu, sxyneu, syzneu, sxzneu
# Fernfeldspannungen regional 
sv = 0.0 # alternativ: rhog*z*g            # Vertikalspannung [MPa]
sH = 0.0                                   # maximale Horizontalspannung [MPa]
sh = 0.0                                   # minimale Horizontalspannung [MPa]
azimut = 0.0                               # Azimut des Fernfeldes [°]
rw = 0.0                                   # Rotationswinkel Theta [°]

# Zuweisung Koordinatenachsen für Transformation
#sx = sH
#sy = sh
#sz = sv   
sxy = 0.0                                    # initiale Scherspannung in Ebene xy
syz = 0.0                                    # initiale Scherspannung in Ebene yz
sxz = 0.0                                    # initiale Scherspannung in Ebene xz

# Aufruf der Funktion CT und Ausgabe von regionalen, transformierten Spannungen
sxr, syr, szr, sxyr, syzr, sxzr = CT(sH, sh, sv, sxy, syz, sxz, azimut, rw)                                   
#print sxr, syr, szr, sxyr 
#print sxr, syr, sxyr
#print azimut

#==============================================================================
#                                 Bohrlöcher
#==============================================================================

def calc (q,tstart,xlage,ylage):

    P = np.zeros((nt,nx,ny))           # initiales, leeres Array (Feld) für P
    sx = np.zeros((nt,nx,ny))          # initiales, leeres Array (Feld) für sx1
    sy = np.zeros((nt,nx,ny))          # initiales, leeres Array (Feld) für sy1
    sxy = np.zeros((nt,nx,ny))         # initiales, leeres Array (Feld) für sxy1

    fk = (q*alpha*G)/(rhof*4*pi*kappa*(lame+2*G))  # Abkürzung des Vorfaktors

    for i in range (nt):       # absolute Zeit steckt in i; absolute Zeit = i*tstep
        t = i*tsteps-tstart   # Zeit ab Produktionsbeginn - t1start berücksichtigt
        if t >= 0: 
            for j in range (nx):
                x = xmin+j*xsteps            
                for k in range (ny):
                    y = ymin + k*ysteps
                    r = sqrt((x-xlage)**2+(y-ylage)**2)
                    if r == 0:  # für r = 0 wird r = 0.5 gesetzt, damit nicht durch
                        r = 0.5 # 0 geteilt wird

                    if (4*c*(t)) == 0: # wenn der Nenner expn = 0 ist, wird die
                                       # Berechnung ungültig
                        P[i,j,k] = 0
                        sx[i,j,k] = 0
                        sy[i,j,k] = 0
                        sxy[i,j,k] = 0
                    else:
                        # Berechnung des Drucks nach Rudnicki (1986) Eq. 51 
                        P[i,j,k] = ((q/(rhof*4*pi*kappa))*(expn(1,(r**2)\
                        /(4*c*(t)))))/1e6 
                        # Einführen von fr zwecks Übersicht
                        fr = (r**2)/(4*c*t)
                        # Berechnung der Spannungen nach Rudnicki (1986) Eq. 52
                        sx[i,j,k] = (-1.0)*(fk*((1-(2*(x-xlage)**2/r**2)*(4*c*(t)\
                        /(r**2)*(1-exp(-fr)))-expn(1,fr))))/1e6
                        sy[i,j,k] = (-1.0)*(fk*((1-(2*(y-ylage)**2/r**2)*(4*c*(t)\
                        /(r**2)*(1-exp(-fr)))-expn(1,fr))))/1e6
                        sxy[i,j,k] = (-1.0)*(fk*((-2*((x-xlage)*(y-ylage))/(r**2))\
                        *(4*c*(t)/(r**2))*(1-np.exp(-fr))))/1e6
                    if P[i,j,k] == np.inf:
                        print i,j,k,r


    return P,sx,sy,sxy

P1, sx1, sy1, sxy1 = calc (q1,t1start,x1lage,y1lage)

P2, sx2, sy2, sxy2 = calc (q2,t2start,x2lage,y2lage) 

P3, sx3, sy3, sxy3 = calc (q3,t3start,x3lage,y3lage)


#==============================================================================
#                       Werteberechnung für globales Feld
#==============================================================================

# Erstellen von leeren Arrays für die Addition der...
P = np.zeros((nt,nx,ny))        # ...Drücke B1+B2+B3
sx = np.zeros((nt,nx,ny))       # ...sx-Komponenten B1+B2+B3
sy = np.zeros((nt,nx,ny))       # ...sy-Komponenten B1+B2+B3
sxy = np.zeros((nt,nx,ny))      # ...sxy-Komponenten B1+B2+B3
sxg = np.zeros((nt,nx,ny))      # ...sx-Komponenten B1+B2+B3 und Fernfeld
syg = np.zeros((nt,nx,ny))      # ...sy-Komponenten B1+B2+B3 und Fernfeld
sxyg = np.zeros((nt,nx,ny))     # ...sxy-Komponenten B1+B2+B3 und Fernfeld

# Addition von Druck und Spannungskomponenten der Bohrungen und des Fernfeldes
for i in range (nt):
    for j in range (nx):
        for k in range (ny):

            P[i,j,k] = P1[i,j,k]+P2[i,j,k]+P3[i,j,k]          # Druck
            sx[i,j,k] = sx1[i,j,k]+sx2[i,j,k]+sx3[i,j,k]      # sx-Komponenten
            sy[i,j,k] = sy1[i,j,k]+sy2[i,j,k]+sy3[i,j,k]      # sy-Komponenten
            sxy[i,j,k] = sxy1[i,j,k]+sxy2[i,j,k]+sxy3[i,j,k]  # sxy-Komponenten
            sxg[i,j,k] = sxr+sx[i,j,k]    # sx-Komponenten von globalem Feld
            syg[i,j,k] = syr+sy[i,j,k]    # sy-Komponenten von globalem Feld
            sxyg[i,j,k] = sxyr+sxy[i,j,k] # sxy-Komponenten von globalem Feld
            #print sxg[i,j,k], "  ", sx[i,j,k], "  ", syg[i,j,k], "  ", sy[i,j,k]      

# Erstellen von leeren Arrays für das Spannungsfeld an jedem Punkt
angle = np.zeros((nt,nx,ny)) 
sHg = np.zeros((nt,nx,ny))
shg = np.zeros((nt,nx,ny))
for i in range (nt):      
        for j in range (nx):
                x = xmin+j*xsteps            
                for k in range (ny):
                    y = ymin + k*ysteps
                    angle[i,j,k] =(np.arctan2(2*sxyg[i,j,k],(sxg[i,j,k]-syg[i,j,k])))/2 # berechnet Hauptspannungswinkel
                    sHg[i,j,k] = sxg[i,j,k]*(cos(angle[i,j,k]))**2 + syg[i,j,k]*(sin(angle[i,j,k]))**2 + 2*(sxyg[i,j,k]*sin(angle[i,j,k])*cos(angle[i,j,k]))
                    shg[i,j,k] = sxg[i,j,k]*(sin(angle[i,j,k]))**2 + syg[i,j,k]*(cos(angle[i,j,k]))**2 - 2*(sxyg[i,j,k]*sin(angle[i,j,k])*cos(angle[i,j,k]))
                    hel = np.degrees(angle[i,j,k])
                    #print hel

                   #print sHg[i,j,k], "  ", shg[i,j,k]

#==============================================================================
#                               Plotting
#==============================================================================

xPosition = 60.0
yPosition = 0.0
px = float((xmin+xPosition)/xsteps)
py = float((ymin+yPosition)/ysteps)

fig=plt.figure()
ax=fig.add_subplot(1,1,1)

Zeit = nt-1                               # Zeitschritte-1, sonst Fehlermeldung
Tage = float((Zeit*tsteps)/(24*3600))  
Jahre = float(Zeit*tsteps)/(24*3600*365)     
print "Zeit:", Tage , "Tage", "oder", "%.3f" % Jahre, "Jahre"
print "nt =", tsteps/86400, "Tag(e)"
plt.title("zeitliche Entwicklung von P")
for i in range (nt):

    plt.plot(i, sx1[i,px,py], "r^")
    plt.plot(i, sy1[i,px,py], "go")
    plt.plot(i, P1[i,px,py], "bo")
plt.grid(True)
plt.xlabel("Zeitschritte nt")
plt.ylabel("Druck [MPa]")


plt.show()

我想使用简单的线条(例如plt.plot(i,P1[i,px,py], "b-"))而不是点,三角形和方形图。如果我尝试运行代码,我不会看到任何情节。有原因吗?到目前为止找不到任何解决方案......

一个。

1 个答案:

答案 0 :(得分:1)

您的代码未运行的原因可能是因为您没有在脚本中定义源代码编码。由于德语注释,您必须将# -*- coding: utf-8 -*-添加到脚本的顶部。

在脚本中,您已将每个单独的测量点绘制为图中的“点”。以下部分适用于:

for i in range (nt):
   plt.plot(i, sx1[i,px,py], "r^")
   plt.plot(i, sy1[i,px,py], "go")
   plt.plot(i, P1[i,px,py],  "bo")

当你单独绘制它们时(至少我的知识)你不能在它们之间画一条线。补救措施是将它们定义为列表并绘制它。但是,列表中的数据存储非常复杂。我无法弄明白。但非常粗略地说(实际上类似于你的循环)你可以将你想要绘制的点存储在一个列表中,然后绘制它们:

sxx1 = []
syy1 = []
P11 = []
for i in range(len(sx1)):
    sxx1.append(sx1[i, px,py])
    syy1.append(sy1[i, px,py])
    P11.append(P1[i, px,py])

plt.plot(range(nt), sxx1, "-r^")
plt.plot(range(nt), syy1, "-go")
plt.plot(range(nt), P11, "-bo")

我在这方面修改了你的脚本。希望它有所帮助。要调整线路设置,请参阅this page

# -*- coding: utf-8 -*-
from mpl_toolkits.mplot3d import *     # für Druckplots benötigt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from math import *                     # für pi und exp benötigt
from scipy.special import *            # für expn benötigt
import matplotlib.pyplot as plt        # für Plotting in 2D/3D benötigt
import numpy as np                     # für für Arrays benötigt
import csv                             # optional zum Export von Daten
#from maintest1 import CT                                        
#import os
#clear = lambda: os.system('cls')
#clear()

#==============================================================================
#                            Globale Parameter
#==============================================================================

rhog = 2700.0                          # Dichte überlagerndes Gestein [kg/m³]
z = 3500.0                             # Reservoirtiefe [m]
g = 9.81                               # Erdbeschleunigung [m/s²]
rhof = 1000.0                         # Dichte Flüssigkeit [kg/m³]
lameu = 11.2e9                         # Lamé-Parameter, undrained [GPa]
lame = 8.4e9                           # Lamé-Parameter, drained [GPa]
pi                                     # durch Pythonmodul "math" gegeben
alpha = 0.65                           # Biot-Willis-Koeffizient
G = 8.4e9                              # Schermodul [GPa]
k = 1.0e-15                            # Permeabilität [m²] bzw. [Darcy] 
eta = 0.001                            # Viskosität des Fluids [Pa*s]
# q wird bei well festgelegt [m³/s]

# Berechnung der Permeabilität nach Rudnicki (1986), [m³*s/kg] 
kappa = k/eta  

# Berechnung der Diffusivität
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))

#==============================================================================
#                       Variablen (max 3 Faults + 3 Bohrungen)
#==============================================================================

# Zeiträume
t = 100*24*3600                       # betrachteter Zeitraum [s] 
nt = 100                              # Anzahl an Zeitschritten
tsteps = t/nt                          # Zeitschritt [s]
t1start = 0*24*3600                    # Startzeitpunkt Bohrung 1 (B1)
t2start = 0*24*3600                    # Startzeitpunkt Bohrung 2 (B2)
t3start = 0*24*3600                    # Startzeitpunkt Bohrung 3 (B3)

# Förder-oder Injektionsmenge
q1 = 20.0/1000                          # Fluidmenge B1                      
q2 = 0.0/1000                         # Fluidmenge B2                          
q3 = 0.0/1000                          # Fluidmenge B3

# Lage der Bohrungen 
x1lage, y1lage = 0.0, 0.0               # Lage und Koordinaten von B1 [m]
x2lage, y2lage = 0.0, 0.0                # Lage und Koordinaten von B2 [m]
x3lage, y3lage = 0.0, 0.0                # Lage und Koordinaten von B3 [m]

# Faults 
f1x1, f1y1 = 40.0, 40.0                   # Startpunkt Fault 1
f1x2, f1y2 = 25.0, 60.0                    # Endpunkt Fault 1
f2x1, f2y1 = 40.0, 20.0                    # Startpunkt Fault 2
f2x2, f2y2 = 80.0, 40.0                    # Endpunktpunkt Fault 2
f3x1, f3y1 = 60.0, 80.0                    # Startpunkt Fault 3
f3x2, f3y2 = 80.0, 95.0                    # Endpunktpunkt Fault 3
f1nstrike = 50.0                         # Streichen gegenüber Nord
f2nstrike = 70.0                         # Streichen gegenüber Nord
f3nstrike = 80.0                         # Streichen gegenüber Nord                
f1length = 500.0                         # Länge Fault 1   
f2length = 800.0                         # Länge Fault 2
f1dip = 30.0                             # Fallen Fault 1
f2dip = 45.0                             # Fallen Fault 2
f3dip = 60.0                             # Fallen Fault 3   

#==============================================================================
#                               Wertebereich
#==============================================================================

# betrachtete Achsenbereiche in NS- und EW-Richtung
# für eine gute Auflösung und Rechengeschwindigkeit bietet es sich an, ein Ver-
# hältnis von 50-100 für (xmax-xmin)/xsteps zu erhalten
xmin = 0.0
xmax = 100.0
nx = 10                           # Anzahl Schritte im Bereich xmax-xmin
xsteps = float((xmax-xmin)/nx)             # Schrittlänge entlang x-Achse [m]
ymin = 0.0
ymax = 100.0
ny = 10                            # Anzahl Schritte im Bereich xmax-xmin                    
ysteps = float((ymax-ymin)/ny)             # Schrittlänge entlang y-Achse [m]           
#nx = int((xmax-xmin)/xsteps)        # Berechnung der x-Schritte
#ny = int((ymax-ymin)/ysteps)        # Berechnung der y-Schritte

# Bildung von Arrays aus den Achsenbereichen 
x = np.arange(xmin, xmax, xsteps)
y = np.arange(ymin, ymax, ysteps)
X, Y = np.meshgrid (x, y)           # meshgrid bildet alle möglichen Kombinat-
                                    # ionen zwischen x und y

#==============================================================================
#                       Lage der Störungen + Bohrungen 
#==============================================================================

# Variante 1: Anfangs- + Endpunkt
#plt.figure()
#plt.grid(True)                                   # Gitteranzeige einblenden
#plt.title ('Lage der Bohrungen und Stoerungen')  # Überschrift des Schaubildes 
#plt.xlabel('x-Richtung [m]')                     # Beschriftung x-Achse
#plt.ylabel('y-Richtung [m]')                     # Beschriftung y-Achse
#plt.axis([xmin, xmax, ymin, ymax])               # Skalierung der Achsen in [m]
#plt.plot(x1lage, y1lage, "ro", label="Bohrloch 1" )
#plt.plot(x2lage, y2lage, "go", label="Bohrloch 2" )
#plt.plot(x3lage, y3lage, "bo", label="Bohrloch 3" )
#plt.plot([f1x1,f1x2],[f1y1,f1y2],'c-', label = "Fault 1")      
#plt.plot([f2x1,f2x2],[f2y1,f2y2],'m-', label = "Fault 2") 
#plt.plot([f3x1,f3x2],[f3y1,f3y2],'y-', label = "Fault 3") 
#plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., numpoints = 1)
#plt.show()

# Variante 2: mit Länge, Mittelpunkt, Streichen und Dip  

#==============================================================================
#               Koordinatentransformation von Spannungsfernfeld   
#==============================================================================

def CT (sx, sy, sz, sxy, syz, sxz, azimut, rw):
    # Winkel
    lamda = (90-azimut)*pi/180          # Berechnung von lamda in Bogenmaß
    theta = rw*pi/180                   # Berechnung von theta in Bogenmaß                    
    # Richtungscosinus
    l11 = cos(theta)*cos(lamda)
    l12 = cos(theta)*sin(lamda)
    l13 = -sin(theta)
    l21 = -sin(lamda)
    l22 = cos(lamda)
    l23 = 0
    l31 = cos(lamda)*sin(theta)
    l32 = sin(theta)*sin(lamda)
    l33 = cos(theta)
    # Transformationsgleichungen nach Jaeger et al., 2007
    sxneu = l11**2*sx + l12**2*sy + l13**2*sz + 2*l11*l12*sxy + 2*l11*l13*sxz + 2*l12*l13*syz
    syneu = l21**2*sx + l22**2*sy + l23**2*sz + 2*l21*l22*sxy + 2*l21*l23*sxz + 2*l22*l23*syz
    szneu = l31**2*sx + l32**2*sy + l33**2*sz + 2*l31*l32*sxy + 2*l31*l33*sxz + 2*l32*l33*syz
    sxyneu = l11*l21*sx + l12*l22*sy + l13*l23*sz + (l11*l22+l12*l21)*sxy + (l12*l23+l13*l22)*syz + (l11*l23+l13*l21)*sxz
    syzneu = l21*l31*sx + l22*l32*sy + l23*l33*sz + (l21*l32+l22*l31)*sxy + (l22*l33+l23*l32)*syz + (l21*l33+l23*l31)*sxz
    sxzneu = l11*l31*sx + l12*l32*sy + l13*l33*sz + (l11*l32+l12*l31)*sxy + (l12*l33+l13*l32)*syz + (l11*l33+l13*l31)*sxz
    # Ausgabe neuer Spannungen

    return sxneu, syneu, szneu, sxyneu, syzneu, sxzneu
# Fernfeldspannungen regional 
sv = 0.0 # alternativ: rhog*z*g            # Vertikalspannung [MPa]
sH = 0.0                                   # maximale Horizontalspannung [MPa]
sh = 0.0                                   # minimale Horizontalspannung [MPa]
azimut = 0.0                               # Azimut des Fernfeldes [°]
rw = 0.0                                   # Rotationswinkel Theta [°]

# Zuweisung Koordinatenachsen für Transformation
#sx = sH
#sy = sh
#sz = sv   
sxy = 0.0                                    # initiale Scherspannung in Ebene xy
syz = 0.0                                    # initiale Scherspannung in Ebene yz
sxz = 0.0                                    # initiale Scherspannung in Ebene xz

# Aufruf der Funktion CT und Ausgabe von regionalen, transformierten Spannungen
sxr, syr, szr, sxyr, syzr, sxzr = CT(sH, sh, sv, sxy, syz, sxz, azimut, rw)                                   
#print sxr, syr, szr, sxyr 
#print sxr, syr, sxyr
#print azimut

#==============================================================================
#                                 Bohrlöcher
#==============================================================================

def calc (q,tstart,xlage,ylage):

    P = np.zeros((nt,nx,ny))           # initiales, leeres Array (Feld) für P
    sx = np.zeros((nt,nx,ny))          # initiales, leeres Array (Feld) für sx1
    sy = np.zeros((nt,nx,ny))          # initiales, leeres Array (Feld) für sy1
    sxy = np.zeros((nt,nx,ny))         # initiales, leeres Array (Feld) für sxy1

    fk = (q*alpha*G)/(rhof*4*pi*kappa*(lame+2*G))  # Abkürzung des Vorfaktors

    for i in range (nt):       # absolute Zeit steckt in i; absolute Zeit = i*tstep
        t = i*tsteps-tstart   # Zeit ab Produktionsbeginn - t1start berücksichtigt
        if t >= 0: 
            for j in range (nx):
                x = xmin+j*xsteps            
                for k in range (ny):
                    y = ymin + k*ysteps
                    r = sqrt((x-xlage)**2+(y-ylage)**2)
                    if r == 0:  # für r = 0 wird r = 0.5 gesetzt, damit nicht durch
                        r = 0.5 # 0 geteilt wird

                    if (4*c*(t)) == 0: # wenn der Nenner expn = 0 ist, wird die
                                       # Berechnung ungültig
                        P[i,j,k] = 0
                        sx[i,j,k] = 0
                        sy[i,j,k] = 0
                        sxy[i,j,k] = 0
                    else:
                        # Berechnung des Drucks nach Rudnicki (1986) Eq. 51 
                        P[i,j,k] = ((q/(rhof*4*pi*kappa))*(expn(1,(r**2)\
                        /(4*c*(t)))))/1e6 
                        # Einführen von fr zwecks Übersicht
                        fr = (r**2)/(4*c*t)
                        # Berechnung der Spannungen nach Rudnicki (1986) Eq. 52
                        sx[i,j,k] = (-1.0)*(fk*((1-(2*(x-xlage)**2/r**2)*(4*c*(t)\
                        /(r**2)*(1-exp(-fr)))-expn(1,fr))))/1e6
                        sy[i,j,k] = (-1.0)*(fk*((1-(2*(y-ylage)**2/r**2)*(4*c*(t)\
                        /(r**2)*(1-exp(-fr)))-expn(1,fr))))/1e6
                        sxy[i,j,k] = (-1.0)*(fk*((-2*((x-xlage)*(y-ylage))/(r**2))\
                        *(4*c*(t)/(r**2))*(1-np.exp(-fr))))/1e6
                    if P[i,j,k] == np.inf:
                        print i,j,k,r


    return P,sx,sy,sxy

P1, sx1, sy1, sxy1 = calc (q1,t1start,x1lage,y1lage)

P2, sx2, sy2, sxy2 = calc (q2,t2start,x2lage,y2lage) 

P3, sx3, sy3, sxy3 = calc (q3,t3start,x3lage,y3lage)


#==============================================================================
#                       Werteberechnung für globales Feld
#==============================================================================

# Erstellen von leeren Arrays für die Addition der...
P = np.zeros((nt,nx,ny))        # ...Drücke B1+B2+B3
sx = np.zeros((nt,nx,ny))       # ...sx-Komponenten B1+B2+B3
sy = np.zeros((nt,nx,ny))       # ...sy-Komponenten B1+B2+B3
sxy = np.zeros((nt,nx,ny))      # ...sxy-Komponenten B1+B2+B3
sxg = np.zeros((nt,nx,ny))      # ...sx-Komponenten B1+B2+B3 und Fernfeld
syg = np.zeros((nt,nx,ny))      # ...sy-Komponenten B1+B2+B3 und Fernfeld
sxyg = np.zeros((nt,nx,ny))     # ...sxy-Komponenten B1+B2+B3 und Fernfeld

# Addition von Druck und Spannungskomponenten der Bohrungen und des Fernfeldes
for i in range (nt):
    for j in range (nx):
        for k in range (ny):

            P[i,j,k] = P1[i,j,k]+P2[i,j,k]+P3[i,j,k]          # Druck
            sx[i,j,k] = sx1[i,j,k]+sx2[i,j,k]+sx3[i,j,k]      # sx-Komponenten
            sy[i,j,k] = sy1[i,j,k]+sy2[i,j,k]+sy3[i,j,k]      # sy-Komponenten
            sxy[i,j,k] = sxy1[i,j,k]+sxy2[i,j,k]+sxy3[i,j,k]  # sxy-Komponenten
            sxg[i,j,k] = sxr+sx[i,j,k]    # sx-Komponenten von globalem Feld
            syg[i,j,k] = syr+sy[i,j,k]    # sy-Komponenten von globalem Feld
            sxyg[i,j,k] = sxyr+sxy[i,j,k] # sxy-Komponenten von globalem Feld
            #print sxg[i,j,k], "  ", sx[i,j,k], "  ", syg[i,j,k], "  ", sy[i,j,k]      

# Erstellen von leeren Arrays für das Spannungsfeld an jedem Punkt
angle = np.zeros((nt,nx,ny)) 
sHg = np.zeros((nt,nx,ny))
shg = np.zeros((nt,nx,ny))
for i in range (nt):      
        for j in range (nx):
                x = xmin+j*xsteps            
                for k in range (ny):
                    y = ymin + k*ysteps
                    angle[i,j,k] =(np.arctan2(2*sxyg[i,j,k],(sxg[i,j,k]-syg[i,j,k])))/2 # berechnet Hauptspannungswinkel
                    sHg[i,j,k] = sxg[i,j,k]*(cos(angle[i,j,k]))**2 + syg[i,j,k]*(sin(angle[i,j,k]))**2 + 2*(sxyg[i,j,k]*sin(angle[i,j,k])*cos(angle[i,j,k]))
                    shg[i,j,k] = sxg[i,j,k]*(sin(angle[i,j,k]))**2 + syg[i,j,k]*(cos(angle[i,j,k]))**2 - 2*(sxyg[i,j,k]*sin(angle[i,j,k])*cos(angle[i,j,k]))
                    hel = np.degrees(angle[i,j,k])
                    #print hel

                   #print sHg[i,j,k], "  ", shg[i,j,k]

#==============================================================================
#                               Plotting
#==============================================================================

xPosition = 60.0
yPosition = 0.0
px = float((xmin+xPosition)/xsteps)
py = float((ymin+yPosition)/ysteps)

fig=plt.figure()
ax=fig.add_subplot(1,1,1)

Zeit = nt-1                               # Zeitschritte-1, sonst Fehlermeldung
Tage = float((Zeit*tsteps)/(24*3600))  
Jahre = float(Zeit*tsteps)/(24*3600*365)     
print "Zeit:", Tage , "Tage", "oder", "%.3f" % Jahre, "Jahre"
print "nt =", tsteps/86400, "Tag(e)"
plt.title("zeitliche Entwicklung von P")

sxx1 = []
syy1 = []
P11 = []
for i in range(len(sx1)):
    sxx1.append(sx1[i, px,py])
    syy1.append(sy1[i, px,py])
    P11.append(P1[i, px,py])

plt.plot(range(nt), sxx1, "-r^")
plt.plot(range(nt), syy1, "-go")
plt.plot(range(nt), P11, "-bo")

plt.grid(True)
plt.xlabel("Zeitschritte nt")
plt.ylabel("Druck [MPa]")


plt.show()