intcalc.spt


#include <splot.h>

/* This example file illustrates some of the internal math capabilities */ 
/* In this case  x,y data points for several parabolas are calculated */
/* and then drawn. Also the photon uses the sine function to draw a wave. */
/* For the photon the data is not stored in an array, rather the calculated */ 
/* values are added to offsets given as parameters to the photon subroutine */

/* make space for the to be generated data */
double pdat[101][2];

main()
   {
   double x0,y0;

   x0 = 10;
   y0 = 5.5;

   /* draw parabolas at x0,y0  to represent bands*/
   siband(x0,y0);

   /* draw circles to represent holes in the valence band */
   arc(x0 - 0.5,y0 - 0.25,0.25,0,360);
   stroke();
   arc(x0 + 0.5,y0 - 0.25,0.25,0,360);
   stroke();

   /* draw electrons in the conduction band */
   moveto(x0 + 4.25,y0 + 3.25);
   rlineto(-0.5,0);
   moveto(x0 - 4.25,y0 + 3.25);
   rlineto(0.5,0);
   stroke();

   /* draw arrows to indicate optical transitions */
   moveto(x0 + 3.5,y0 + 2.75);
   arrowto(x0 + 1,y0 + 0.25);
   moveto(x0 - 3.5,y0 + 2.75);
   arrowto(x0 - 1,y0 + 0.25);

   /* label the photon */
   text(x0 + 5, y0,"h!w! = 2E_g_");
   /* but bar through h */
   moveto(x0 + 4.95,y0 + 0.16);
   rlineto(0.3,0.3);
   stroke();

   /* draw bands again but higher up */
   x0 = 10;
   y0 = 19;
   siband(x0,y0);

   /* draw single hole */
   arc(x0,y0 - 0.25,0.25,0,360);
   stroke();

   /* draw single electron */
   moveto(x0 + 4.25,y0 + 3.25);
   rlineto(-0.5,0);
   stroke();
   moveto(x0 + 3.5,y0 + 2.75);
   arrowto(x0 + 0.5,y0 + 0.25);

   /* label photon */
   text(x0 + 5, y0,"h!w! = E_g_");
   moveto(x0 + 4.95,y0 + 0.16);
   rlineto(0.3,0.3);
   stroke();                

   /* add titles */
   text(10.0,25.15,"Infrared Luminescence",CENTER);
   text(10.0,11.8,"Visible Luminescence",CENTER);
   }

int siband(double x0,y0)
   {

   /* draws strained SiGe band structure */
   /* as a set of parabolas */
   parab(x0,y0,0.1,-0.1);
   parab(x0,y0 - 1.0,0.05,-0.3);
   parab(x0 - 4.0,y0 + 3.0,0.05,0.3);
   parab(x0 + 4.0,y0 + 3.0,0.05,0.3);

   /* draw axes */
   moveto(x0,y0 - 4.0);
   rlineto(0,0.3);
   moveto(x0,y0 - 4.0);
   rarrowto(6,0);
   moveto(x0,y0 - 4.0);
   rarrowto(-6,0);
   stroke();
   moveto(x0 - 7, y0);
   rarrowto(0,3);
   rarrowto(0,-3);
   moveto(x0 - 7.25,y0);
   rlineto(0.5,0);
   moveto(x0 - 7.25,y0 + 3);
   rlineto(0.5,0);
   stroke();

   /* draw a photon */
   photon(x0 + 4.5,y0 + 1.5,0.3,0.3);

   /* a k vector labels */
   text(x0,y0 - 5,"0",CENTER);
   text(x0 + 6,y0 - 5,"k");
   text(x0 - 7.5,y0 + 1.5,"E_g_",RIGHT);
   }

int parab(double x0,double y0,double dx,double a)
   {
   int i;
   double x;
   /* draws a parabola by generating */
   /* a data array first */
   for (i = 0; i <= 50;i++)
      {
      x = i * dx;
      pdat[50 + i][1] = a * x * x + y0; 
      pdat[50 - i][1] = a * x * x + y0; 
      pdat[50 + i][0] = x0 + x;
      pdat[50 - i][0] = x0 - x;
      }
   moveto(pdat[0][0],pdat[0][1]);
   for (i = 0;i <= 100;i++)
      {
      lineto(pdat[i][0],pdat[i][1]);
      }
   stroke();
   }

int photon(double x0,double y0,double xscale,double yscale)
   {
   double x,y;
   int i;

   /* draw a photon using the sine function */
   moveto(x0,y0);
   for (i = 0;i < 50;i++)
      {
      x = i * 0.255;
      y = sin(x);
      lineto(x * xscale + x0,y * yscale + y0);
      }
   set(FONTMULT,2);    
   rarrowto(2.5 * xscale,0);
   set(FONTMULT,0.5);    
   stroke();
   }