Das Programm pi_other.c hat beinahe die gleichen Variablen deklariert wie pi.c. Deshalb werden wir hier nicht weiter auf diese Deklaration eingehen.
Als erstes empfängt das Programm vom Master pi.c die Koordinaten des Quadrates, das es berechnen muss. Der Befehl bufid = pvm_recv(-1, -1); schreibt den empfangenen Puffer in die Variable bufid. Mit dem Befehl pvm_bufinfo(bufid, dum, um, tid); wird getestet, ob die Message wirklich vom Master stammt. pvm_upkdouble(ort, 2, 1); entpackt dann den Puffer und entnimmt ihm einen zweistelligen Array der Klasse double, den wir ort nennen.
Im weiteren Teil des Programmes werden die Variablen ortx und orty verwendet, weshalb hier die Elemente des Arrays in diese beiden Variablen übertragen werden:
bufid=pvm_recv(-1, -1); pvm_bufinfo(bufid, &dum, &dum, &stid); pvm_upkdouble(ort, 2, 1); ortx=ort[0]; orty=ort[1];
Die folgenden for-Schleifen bestimmen für nodes * nodes Koordinaten, ob sie im Kreis liegen oder nicht. Liegen sie ausserhalb des Kreises, wird die Variable send[0] um eins erhöht:
for(i=(ortx+(0.5/steps*nodes))/nodes;i<=(1+ortx-(0.5/steps*nodes))/nodes\ ;i=i+1.0/(steps*nodes)){ for (o=(orty+(0.5/steps*nodes))/nodes;o<=(1+orty-(0.5/steps*nodes))/nodes\ ;o=o+1.0/(steps*nodes)){ z=i*i+o*o; if (z>1){ send[0]++; } } }
Die Funktion zum Zurücksenden der Werte ist die selbe wie schon beim Masterprogramm. Nur wurde dort mit dem Befehl pvm_pkdouble(); eine Variable des Typs double gesendet. In diesem Beispiel wird mit Hilfe des Kommandos pvm_pklong(); ein longint gesendet. Dies vor allem, weil ein longint um einiges grössere Zahlen speichern kann und weil ein double zu wenig exakt ist (mehr zur Wahl der Variablen: Siehe auch 13.4.2):
ptid = pvm_parent(); pvm_initsend(PvmDataDefault); pvm_pklong(send,1,1); pvm_send(ptid, 1);