#!/usr/bin/python # -*- coding: utf-8 -*- ## Baustelle: MUSS 1. oder 2. Zeile sein # name mb_seriell # MRies, 09/2015 __author__ = 'ries' import numpy as np import matplotlib.pyplot as plt def mb_iteration(x, y): c = complex(x,y) # x+yj z = 0+0j for iteration in range(255): z = z*z + c if abs( z ) >= 2: # Divergenz return iteration return 255 def mb_matrix(x_min, x_max, y_min, y_max, bild): zeilen_zahl = bild.shape[0] spalten_zahl = bild.shape[1] delta_x = (x_max - x_min) / spalten_zahl delta_y = (y_max - y_min) / zeilen_zahl for spalte_j in range(spalten_zahl): x_pix = x_min + spalte_j * delta_x for zeile_i in range(zeilen_zahl): y_pix = y_min + zeile_i * delta_y bild[(zeilen_zahl-1)-zeile_i, spalte_j] = \ mb_iteration(x_pix, y_pix) return bild bild = np.zeros((400, 400), dtype=np.uint8) mb_matrix(-0.088, -0.085, 0.855, 0.858, bild) plt.imshow(bild) plt.gray() plt.show()
#!/usr/bin/python # -*- coding: utf-8 -*- ## Baustelle: MUSS 1. oder 2. Zeile sein # name mb_thread # MRies, 09/2015 __author__ = 'ries' import numpy as np import matplotlib.pyplot as plt import threading def mb_iteration(x, y): c = complex(x,y) # x+yj z = 0+0j for iteration in range(255): z = z*z + c if abs( z ) >= 2: return iteration return 255 def mb_matrix_t(x_min, x_max, y_min, y_max, bild,threads,i): zeilen_zahl = bild.shape[0] spalten_zahl = bild.shape[1] delta_x = (x_max - x_min) / spalten_zahl delta_y = (y_max - y_min) / zeilen_zahl spalten_start = i * spalten_zahl/threads spalten_ende = (i+1) * spalten_zahl/threads for spalte_j in range(spalten_start, spalten_ende): x_pix = x_min + spalte_j * delta_x for zeile_i in range(zeilen_zahl): y_pix = y_min + zeile_i * delta_y bild[(zeilen_zahl-1)-zeile_i, spalte_j] = \ mb_iteration(x_pix, y_pix) return bild bild = np.zeros((400, 400), dtype=np.uint8) threads = 8 jobs = [] for i in range(0, threads): thread = threading.Thread(target=mb_matrix_t, \ args = (-0.088, -0.085, 0.855, 0.858, bild, \ threads,i) ) thread.start() for i in jobs: i.start() for i in jobs: i.join() plt.imshow(bild) plt.jet() # hsv() # hot() # gray() plt.show()
#!/usr/bin/python # -*- coding: utf-8 -*- ## Baustelle: MUSS 1. oder 2. Zeile sein # name mb_multiprocessing # MRies, 09/2015 __author__ = 'ries' import numpy as np import matplotlib.pyplot as plt import multiprocessing def mb_iteration(x, y): c = complex(x,y) # x+yj z = 0+0j for iteration in range(255): z = z*z + c if abs( z ) >= 2: return iteration return 255 def mb_matrix_t(x_min, x_max, y_min, y_max, bild, procs, p_nr): zeilen_zahl = bild.shape[0] spalten_zahl = bild.shape[1] delta_x = (x_max - x_min) / spalten_zahl delta_y = (y_max - y_min) / zeilen_zahl zeilen_start = p_nr * zeilen_zahl/procs zeilen_ende = zeilen_start + zeilen_zahl/procs for zeile_i in range(zeilen_start, zeilen_ende): y_pix = y_min + zeile_i * delta_y for spalte_j in range(spalten_zahl): # Teilen ueber die zeilen wg python x_pix = x_min + spalte_j * delta_x # fortran besser spaltenbloecke bild[(zeilen_zahl-1)-zeile_i, spalte_j] = \ mb_iteration(x_pix, y_pix) # bild auf dem Kopf return bild if __name__ == '__main__': bild = np.zeros((400, 400), dtype=np.uint8) # 400 400 procs = 4 pool = multiprocessing.Pool(processes = procs) results = [ pool.apply_async(mb_matrix_t, \ #args = (-2.0, 1.0, -2.0,1.5, bild, \ args = (-0.088, -0.085, 0.855, 0.858, bild, \ procs,p_nr) ) for p_nr in range(procs) ] pool.close() pool.join() bb = [ p.get() for p in results ] bild = bb[0] # np.zeros((400, 400), dtype=np.uint8) for i in range(1, procs): bild = bild + bb[i] # besser: einzelne Zeilen-Scheiben plt.imshow(bild) plt.jet() # jet() # hsv() # hot() # gray() plt.show()
ries@ceti:~/mympi/p> cat hostfile ceti slots=4 pallas.uni-trier.de slots=4 puppis.uni-trier.de slots=4 omega.uni-trier.de slots=24
#mr:>FW_SERVICES_EXT_TCP="" FW_SERVICES_EXT_TCP="1024:65535" #mr:>FW_TRUSTED_NETS="" FW_TRUSTED_NETS="136.199.234.1"
# MR , Version g6, 12.06.2015
from mpi4py import MPI
import bmp
import numpy as np
import matplotlib.pyplot as plt
welt = MPI.COMM_WORLD
nummer = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()
status = MPI.Status()
#
spalten = 1024 # x, Realteil
zeilen = 1024 # y, Imaginaerteil
MAX_ITER= 1025 # 256
RE_MIN = -0.088 #-2.0
RE_MAX = -0.085 # 2.0
IM_MIN = 0.856 # -2.0
IM_MAX = 0.859 # 2.0
job_anzahl = np.zeros( welt.Get_size(), dtype=np.int16 )
#interactive:>plt.ion()
if welt.Get_rank() == 0: # Master
# init Bild
bild = np.zeros( (zeilen,spalten) )
#sehr langsam:>plt.imshow( bild , vmin=10, vmax=555 , cmap='gray')
#plt.show()
aktive_sklaven = 0
naechste_zeilen_nr = 0
# los geht's: Auftraege an alle Sklaven
for sklave in range( 1, welt.Get_size() ):
welt.send( naechste_zeilen_nr, dest = sklave )
naechste_zeilen_nr = naechste_zeilen_nr + 1 # naechste Zeile
aktive_sklaven = aktive_sklaven + 1
# Master-Schleife
while aktive_sklaven > 0:
puffer = welt.recv( source=MPI.ANY_SOURCE, status=status )
zeile, bildzeile = puffer
sklaven_id = status.Get_source() # so erfahre ich woher das Ergebnis kommt
#print(sklaven_id)
job_anzahl[sklaven_id] += 1
# speicher die Bildzeile im Bild
bild[zeile] = bildzeile
#sehr langsam:>plt.imshow( bild , vmin=10, vmax=555 , cmap='gray')
#plt.draw()
if naechste_zeilen_nr < zeilen:
# neuer Auftrag an diesen Skalven
welt.send( naechste_zeilen_nr, sklaven_id)
naechste_zeilen_nr += 1
else:
# schicke negative Zeilennummer (-1), um Ende zu symbolisieren
welt.send( -1, sklaven_id )
aktive_sklaven = aktive_sklaven - 1
# Statistik
for sklaven_id in range( 1, welt.Get_size() ):
print("{0:5d} Arbeiten durch Sklave {1:3d} erledigt".format( job_anzahl[sklaven_id], sklaven_id ) )
# plot nur am Ende, da sonst SEHR langsam
plt.imshow( bild , vmin=10, vmax=888 , cmap='gray')
plt.show()
else:
# Sklave
while True:
# welche Zeile
zeilennummer = welt.recv( source=0 )
# noch weiter, oder fertig
if zeilennummer < 0:
break
# berechne Bildzeile
bildzeile = np.zeros( spalten) #
# 1j = imaginaere Einheit
c_im = ( IM_MAX - IM_MIN ) *1j * zeilennummer / zeilen + IM_MIN * 1j
for x in range( spalten ):
# und hier der Realteil
c = c_im + ( RE_MAX - RE_MIN ) * x / spalten + RE_MIN
z = 0
for iter in range(MAX_ITER):
z = z * z + c
if abs(z) >= 2.0:
break
bildzeile[x] = iter - 1
# sende Ergebnis an Master
welt.send( [zeilennummer, bildzeile], 0 )
#!/usr/bin/python # -*- coding: utf-8 -*- ## MUSS in 1. oder 2. Zeile # name plot_1.py import numpy as np import matplotlib.pyplot as plt t = np.linspace(-1.0, 2.0, 10) y = 2*t**3 - 3*t**2 + 1 plt.plot(t, y,'*') plt.show()
#!/usr/bin/python
# -*- coding: utf-8 -*- ## MUSS in 1. oder 2. Zeile
# name plot_2.py
from sympy import * # also matplotlib drin
var('t')
plot( 2*t**3 - 3*t**2 + 1 , (t,-1, 2) )
#!/usr/bin/python
# -*- coding: utf-8 -*- ## Baustelle: MUSS 1. oder 2. Zeile sein
# name myrb2_2.py # MRies, 06/2015
import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate
from matplotlib.widgets import Slider
def mydu(u, t, w,fminus,s, fplus ): # t, da odeint das braucht
# Paramater wie in args=(.. ,)
return np.array( [ w * u[0] - ( fminus * u[1] ) * u[0] ,
-s * u[1] + ( fplus * u[0] ) * u[1] ])
w = 3; # Wachstumsrate
fminus = 2; # Gefressen-Werden-Rate
s = 1; # Sterberate
fplus = 0.5; # Fressrate
t = np.linspace(0,10,300) # 100 Punkte
u0 = np.array([1.1, 0.5] ) # Startwerte
u = integrate.odeint(mydu, u0, t, args=(w,fminus,s, fplus,) )
# args, am Ende ein Komma
fig = plt.figure(figsize=(7,10)) # width, heigt in inch
ax_1 = plt.subplot(3,1,1)
ax_1.set_ylim([0.0,10.0])
u1g, = plt.plot(t, u[...,0],'g+') # erste Spalte
u2g, = plt.plot(t, u[...,1],'rx') # zweite Spalte
ax_2 = plt.subplot(3,1,2)
ax_2.set_ylim([0.0,5.0])
u1u2g, = plt.plot(u[...,0], u[...,1],'bx') # Phasenbild
#plt.subplot(3,1,3)
w_axis = plt.axes([0.15,0.3,0.75,0.03]) # Rechteck
w_slider = Slider(w_axis, 'w', 0,10, valinit=3)
fminus_axis = plt.axes([0.15,0.25,0.75,0.03]) # Rechteck
fminus_slider = Slider(fminus_axis, 'fminus', 0,10, valinit=2)
s_axis = plt.axes([0.15,0.2,0.75,0.03]) # Rechteck
s_slider = Slider(s_axis, 's', 0,10, valinit=1)
fplus_axis = plt.axes([0.15,0.15,0.75,0.03]) # Rechteck
fplus_slider = Slider(fplus_axis, 'fplus', 0,10, valinit=0.5)
def update(val): # muss val heißen
#global w, fminus, s, fplus # sonst in mydu nicht geändert
w = w_slider.val # alternativ als args=(.. ,)
fminus = fminus_slider.val # in odeint-Aufruf
s = s_slider.val
fplus = fplus_slider.val
u = integrate.odeint(mydu, u0, t, args=(w,fminus,s, fplus,) )
u1g.set_ydata(u[...,0])
u2g.set_ydata(u[...,1])
u1u2g.set_data(u[...,0],u[...,1])
plt.draw()
w_slider.on_changed(update)
fminus_slider.on_changed(update)
s_slider.on_changed(update)
fplus_slider.on_changed(update)
plt.show()