[Prev][Next][Index][Thread]

Re: formulas (fwd)





---------- Forwarded message ----------
Date: Sun, 12 Jul 98 20:46:30 EDT
From: Jim Monte <JDM95003-at-UCONNVM.UCONN.EDU>
To: tesla-at-pupman-dot-com
Subject: Re: formulas


>Date: Sat, 11 Jul 1998 00:19:55 -0500
>From: Shaun <shaunobrien-at-geocities-dot-com>
>To: Tesla List <tesla-at-pupman-dot-com>
>Subject: Formula's
>
>
>    Anyone happen to have the formula for finding the inductance
>of a cone primary? I saw it once before but I don't remember where.
  I can't seem to find that one.
>Also I can't remember how to find the length of a sprial. I also need
>to find the length for the primary.
>
Here is a short C program that compares the exact length of wire to
an approximate value (underestimate) using the mean diameter*pi*#turns.
The input and output aren't the prettiest, but there is some built-in
help and good argument checking.  The program had to tolerate an ASCII ->
EBCIDIC translation.  If you try to compile the program and get errors,
check braces and brackets, which don't always translate well.

Jim Monte
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/**/
#include <math.h>
#include <stdio.h>
#include <errno.h>
#define f(x) sqrt((x)*(x)+k*k+A*A)
#define A (H/(2*pi*N))
#define k ((Ro-Ri)/(2*pi*N))
int main(int argc, char *argv›!);

int main(int argc, char *argv›!){
  int rc;
  const double pi=3.141592653589793238462643383279502884197169;
  double H,L,La,N,Ro,Ri,log_term;

  /* Input and check line arguments.  Exit on error */
  if(argc|=5){
    rc=4;
    goto output_format;
    }
  if(sscanf(argv›1!,"%lf",&N)|=1){
    (void)fprintf(stderr,"Error:  the number of turns \"%s\" is invalid\n",
        argv›1!);
    rc=8;
    goto output_format;
    }
  if(N<0){
    (void)fprintf(stderr,"Error:  the number of turns must be nonnegative"n");
    rc=8;
    goto output_format;
    }
  if(sscanf(argv›2!,"%lf",&Ri)|=1){
    (void)fprintf(stderr,"Error:  the inner radius \"%s\" is invalid\n",
        argv›2!);
    rc=8;
    goto output_format;
    }
  if(Ri<0){
    (void)fprintf(stderr,"Error:  the inner radius must be nonnegative"n");
    rc=8;
    goto output_format;
    }
  if(sscanf(argv›3!,"%lf",&Ro)|=1){
    (void)fprintf(stderr,"Error:  the outer radius \"%s\" is invalid\n",
        argv›3!);
    rc=8;
    goto output_format;
    }
  if(Ro<=0){
    (void)fprintf(stderr,"Error:  the outer radius must be positive"n");
    rc=8;
    goto output_format;
    }
  if(Ro<Ri){
    (void)fprintf(stderr,
        "Error:  the outer radius cannot be smaller than the inner radius\n");
    rc=8;
    goto output_format;
    }
  if(sscanf(argv›4!,"%lf",&H)|=1){
    (void)fprintf(stderr,"Error:  the coil height \"%s\" is invalid\n",
        argv›4!);
    rc=8;
    goto output_format;
    }
  if(H<0){
    (void)fprintf(stderr,"Error:  the coil height must be nonnegative\n");
    rc=8;
    goto output_format;
    }

  /* Echo inputs */
  (void)fprintf(stdout,
      "Turns=%lf, Inner radius=%lf, Outer radius=%lf, Height=%lf\n",
      N,Ri,Ro,H);

  /* Calculate wire length */
  if(N>0.0) /* if # turns >0 */
    if(Ro>Ri){ /* if outer radius > inner radius */
      errno = 0; /* clear error flag before call to log */
      log_term=log((f(Ro)+Ro)/(f(Ri)+Ri));
      if(errno) /* error raised indicates log argument too close to 0 */
        L=2*pi*N*sqrt(Ri*Ri+A*A); /* treat as Ro = Ri */
      else /* log calculated OK */
        L=(Ro*f(Ro)-Ri*f(Ri))/(2*k) + (k*k+A*A)/(2*k)*log_term;
      }
    else /* outer radius = inner radius */
      L=2*pi*N*sqrt(Ri*Ri+A*A);
  else
    L=sqrt((Ro-Ri)*(Ro-Ri)+H*H); /* 0 turn case */
  La=(Ri+Ro)*N*pi;
  (void)fprintf(stdout,
      "Exact wire length=      %lf\n"
      "Approximate wire length=%lf\n"
      "%% error=                %lf\n",
      L,La,100.0*fabs(L-La)/L);
  return 0;

output_format:
  (void)fprintf(stderr,
      "Function:  Determine the length of wire or tubing needed to "
          "wind a coil\n"
      "Format:  %s <number turns> <inner radius>"
      " <outer radius> <height>\n"
      "All measurements are taken at the centers of the wire.\n"
      "All measurement units must argree (all meters or all inches, etc.).\n",
      argv›0!);
  return rc;
  }