Slave Source Code For Bifurcation Map


/* slave program for bug population - bifurcation map of m*y*(1-y) */
#include <stdio.h>
#include <pvm3.h>

FILE *output;					/* internal file name */

main()
{
double m, sent[5], new, old;
int bufid, dum, ptid, type, x, xskip, xcount;
char name[30], tmp[10], tmp2[10];

ptid = pvm_parent();

pvm_setopt(PvmRoute, PvmRouteDirect);		/* tell master we are ready */ 
pvm_initsend(PvmDataDefault);
pvm_send(ptid, 2);
gethostname(tmp2, 10);

do						/* wait for news from master */
{
   bufid=pvm_recv(ptid, -1);			/* any message from master */
   pvm_bufinfo(bufid, &dum, &type, &dum);	/* kind of message ? */
   if (type)					/* more work arrived */
   {
      pvm_upkdouble(sent, 5, 1);
      xskip=sent[3];				/* skip transients */
      xcount=sent[4];				/* how many points to record */
      strcpy(name, tmp2);			/* create unique file name */
      sprintf(tmp, "%f", sent[1]);
      strcat(name, tmp);
      strcat(name, ".dat");
      output=fopen(name, "w");
      
      for (m=sent[0]; m<sent[1]; m+=(sent[1]-sent[0])/sent[2])
      {
         old=0.5;					/* arbitrary starting value */
         for (x=1; x<=xskip; x++) old=m*old*(1-old);	/* wait until stable */
         fprintf(output, "%f\t%f\n", m, old);		/* make sure we get one */
         for (x=1; x<=xcount; x++)			/* then record xcount points */
         {
            new=m*old*(1-old);				/* avoid some doubles */
            if (new!=old) fprintf(output, "%f\t%f\n", m, old);
            old=new;
         }
      }
      fclose (output);
      pvm_initsend(PvmDataDefault);		/* tell master we are ready */
      pvm_send(ptid, 2);
   }
}while(type);

pvm_exit;  					/* type=0 means we are done */           
}

Download: A html-free code you can save
Back: A slave nearly identical to the sequential version