Example #1
0
/*-----------------------------------------------------------------------------
*                             procedure sgp4init
*              this procedure initializes variables for sgp4.
  ----------------------------------------------------------------------------*/
void sgp4init(elsetrec *satrec)
{
     /* --------------------- local variables ------------------------ */
			double tumin,mu,radiusearthkm,xke,j2,j3,j4,j3oj2,ss,qzms2ttemp,
						qzms2t,x2o3,ainv,ao,con42,cosio,cosio2,einv,eccsq,omeosq,posq,
						rp,rteosq,sinio,po,sfour,qzms24,perige,qzms24temp,pinvsq,tsi,etasq,
						eeta,psisq,coef,coef1,cc2,cc3,cosio4,temp1,temp2,temp3,xhdot1,xpidot,
						delmotemp,cc1sq,temp;
     double temp4 = 1.5e-12;

     /* ----------- set all near earth variables to zero ------------ */
     satrec->isimp   = 0;   satrec->aycof  = 0.0;
     satrec->con41   = 0.0; satrec->cc1    = 0.0; satrec->cc4      = 0.0;
     satrec->cc5     = 0.0; satrec->d2     = 0.0; satrec->d3       = 0.0;
     satrec->d4      = 0.0; satrec->delmo  = 0.0; satrec->eta      = 0.0;
     satrec->argpdot = 0.0; satrec->omgcof = 0.0; satrec->sinmao   = 0.0;
     satrec->t       = 0.0; satrec->t2cof  = 0.0; satrec->t3cof    = 0.0;
     satrec->t4cof   = 0.0; satrec->t5cof  = 0.0; satrec->x1mth2   = 0.0;
     satrec->x7thm1  = 0.0; satrec->mdot   = 0.0; satrec->nodedot  = 0.0;
     satrec->xlcof   = 0.0; satrec->xmcof  = 0.0; satrec->nodecf   = 0.0;

     /* ------------------------ earth constants ----------------------- */
     // sgp4fix identify constants and allow alternate values
     getgravconst(&tumin,&mu,&radiusearthkm,&xke,&j2,&j3,&j4,&j3oj2);
     ss = 78.0 / radiusearthkm + 1.0;
     // sgp4fix use multiply for speed instead of pow
     qzms2ttemp = (120.0 - 78.0) / radiusearthkm;
     qzms2t = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp;
     x2o3   =  2.0 / 3.0;

     satrec->t	 = 0.0;

		 initl(&ainv,&ao,&satrec->con41,&con42,&cosio,&cosio2,&einv,&eccsq,&omeosq,&posq,
					&rp,&rteosq,&sinio,&po,&satrec->ecco, &satrec->inclo, &satrec->no);

     if ((omeosq >= 0.0 ) || ( satrec->no >= 0.0))
       {
         satrec->isimp = 0;
         if (rp < (220.0 / radiusearthkm + 1.0))
             satrec->isimp = 1;
         sfour  = ss;
         qzms24 = qzms2t;
         perige = (rp - 1.0) * radiusearthkm;

         /* - for perigees below 156 km, s and qoms2t are altered - */
         if (perige < 156.0)
           {
             sfour = perige - 78.0;
             if (perige < 98.0)
                 sfour = 20.0;
             // sgp4fix use multiply for speed instead of pow
             qzms24temp =  (120.0 - sfour) / radiusearthkm;
             qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp;
             sfour  = sfour / radiusearthkm + 1.0;
           }
         pinvsq = 1.0 / posq;

         tsi  = 1.0 / (ao - sfour);
         satrec->eta  = ao * satrec->ecco * tsi;
         etasq = satrec->eta * satrec->eta;
         eeta  = satrec->ecco * satrec->eta;
         psisq = fabs(1.0 - etasq);
         coef  = qzms24 * pow(tsi, 4.0);
         coef1 = coef / pow(psisq, 3.5);
         cc2   = coef1 * satrec->no * (ao * (1.0 + 1.5 * etasq + eeta *
                        (4.0 + etasq)) + 0.375 * j2 * tsi / psisq * satrec->con41 *
                        (8.0 + 3.0 * etasq * (8.0 + etasq)));
         satrec->cc1   = satrec->bstar * cc2;
         cc3   = 0.0;
         if (satrec->ecco > 1.0e-4)
             cc3 = -2.0 * coef * tsi * j3oj2 * satrec->no * sinio / satrec->ecco;
         satrec->x1mth2 = 1.0 - cosio2;
         satrec->cc4    = 2.0* satrec->no * coef1 * ao * omeosq *
                           (satrec->eta * (2.0 + 0.5 * etasq) + satrec->ecco *
                           (0.5 + 2.0 * etasq) - j2 * tsi / (ao * psisq) *
                           (-3.0 * satrec->con41 * (1.0 - 2.0 * eeta + etasq *
                           (1.5 - 0.5 * eeta)) + 0.75 * satrec->x1mth2 *
                           (2.0 * etasq - eeta * (1.0 + etasq)) * cos(2.0 * satrec->argpo)));
         satrec->cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 *
                        (etasq + eeta) + eeta * etasq);
         cosio4 = cosio2 * cosio2;
         temp1  = 1.5 * j2 * pinvsq * satrec->no;
         temp2  = 0.5 * temp1 * j2 * pinvsq;
         temp3  = -0.46875 * j4 * pinvsq * pinvsq * satrec->no;
         satrec->mdot     = satrec->no + 0.5 * temp1 * rteosq * satrec->con41 + 0.0625 *
                            temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4);
         satrec->argpdot  = -0.5 * temp1 * con42 + 0.0625 * temp2 *
                             (7.0 - 114.0 * cosio2 + 395.0 * cosio4) +
                             temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4);
         xhdot1            = -temp1 * cosio;
         satrec->nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) +
                              2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio;
         xpidot            =  satrec->argpdot+ satrec->nodedot;
         satrec->omgcof   = satrec->bstar * cc3 * cos(satrec->argpo);
         satrec->xmcof    = 0.0;
         if (satrec->ecco > 1.0e-4)
             satrec->xmcof = -x2o3 * coef * satrec->bstar / eeta;
         satrec->nodecf = 3.5 * omeosq * xhdot1 * satrec->cc1;
         satrec->t2cof   = 1.5 * satrec->cc1;
         // sgp4fix for divide by zero with xinco = 180 deg
         if (fabs(cosio+1.0) > 1.5e-12)
             satrec->xlcof = -0.25 * j3oj2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio);
           else
             satrec->xlcof = -0.25 * j3oj2 * sinio * (3.0 + 5.0 * cosio) / temp4;
         satrec->aycof   = -0.5 * j3oj2 * sinio;
         // sgp4fix use multiply for speed instead of pow
         delmotemp = 1.0 + satrec->eta * cos(satrec->mo);
         satrec->delmo   = delmotemp * delmotemp * delmotemp;
         satrec->sinmao  = sin(satrec->mo);
         satrec->x7thm1  = 7.0 * cosio2 - 1.0;

       /* ----------- set variables if not deep space ----------- */
       if (satrec->isimp != 1)
         {
           cc1sq          = satrec->cc1 * satrec->cc1;
           satrec->d2    = 4.0 * ao * tsi * cc1sq;
           temp           = satrec->d2 * tsi * satrec->cc1 / 3.0;
           satrec->d3    = (17.0 * ao + sfour) * temp;
           satrec->d4    = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) *
                            satrec->cc1;
           satrec->t3cof = satrec->d2 + 2.0 * cc1sq;
           satrec->t4cof = 0.25 * (3.0 * satrec->d3 + satrec->cc1 *
                            (12.0 * satrec->d2 + 10.0 * cc1sq));
           satrec->t5cof = 0.2 * (3.0 * satrec->d4 +
                            12.0 * satrec->cc1 * satrec->d3 +
                            6.0 * satrec->d2 * satrec->d2 +
                            15.0 * cc1sq * (2.0 * satrec->d2 + cc1sq));
         }
       } 
}
Example #2
0
int main(int argc, char *argv[])
{
    char  c;
    FILE  *inputf;
    int   skiptoend, opencount, closecount, i, usech;
    long  *loopstarts, *loopsts = calloc(LOOP_DEPTH, sizeof(long));
    STACK_TYPE *stack, *stackstart = calloc(MAX, sizeof(STACK_TYPE));
    
    if (argc == 2) {
        i = 1;
    } else if (argc == 3 && !strcmp(argv[1], "-c")) {
        usech = 1;
        i = 2;
    } else if (argc == 3 && !strcmp(argv[1], "-n")) {
        usech = 0;
        i = 2;
    } else {
        fprintf(stderr, "Invalid command\nThe valid command format is ./brainfuck [-c | -n] <filename>\n");
        exit(1);
    }
    inputf = fopen(argv[i], "r");
    if (!inputf) {
        fprintf(stderr, "Cannot open file %s\n", argv[i]);
        exit(1);
    }
    
    // give error if no memory
    if (!stackstart || !loopsts) {
        fprintf(stderr, "Memory allocation error\n");
        exit(1);
    }
    
    inits(stackstart);
    initl(loopsts);
    stack      = stackstart;
    loopstarts = loopsts;
    skiptoend  = opencount = closecount = 0;
    
    // go through each character
    while ((c = fgetc(inputf)) != EOF) {
        
        // skip to first ] that isn't enclosed by an [
        if (skiptoend) {
            if (c == '[')
                opencount++;
            if (c == ']')
                closecount++;
            if (c != ']' || (opencount - closecount))
                continue;
        }
        
        switch (c) {
        case '+':
            ++*stack;
            break;
        case '-':
            --*stack;
            break;
        case '>':
            if (stack < stackstart + MAX - 1) // keep stack position within range
                ++stack;
            break;
        case '<':
            if (stack > stackstart) // keep stack position within range
                --stack;
            break;
        case ',':
            if (usech)
                *stack = getchar();
            else
                scanf("%lld", stack);
            break;
        case '.':
            if (usech)
                putchar((char) *stack);
            else
                printf("%lld\n", (unsigned long long) *stack); 
            break;
        case '[':
            if (!*stack) {
                skiptoend = opencount = 1;
                closecount = 0;
            } else if (!inloop(CURRENTPOS - 1)) { // check if I've already come here
                ++loopstarts; // inc(loopstart, 0);
                *loopstarts = CURRENTPOS - 1; // loopstart is located at the [
            }
            break;
        case ']':
            if (!skiptoend) { // if the loop is continuing
                jumpto(*loopstarts); // go back to the [
            } else {
                *loopstarts = 0;
                --loopstarts; // continue after the ]
                skiptoend = opencount = closecount = 0;
            }
            break;
        }
    }
    
    if (usech)
        putchar('\n');

    fclose(inputf);
    free(loopsts);
    free(stackstart);
    // free(stack);
    
}
Example #3
0
void Initialization(int l)
{
  MGSolver mg(l);
  Grid initl(l),initr(l);
  Grid f(l);
  real r,phi;
  
  ofstream initf;
  initf.open("init.dat");

  //Initialization
  mg.setGhostLayer(0,1);
  initl.resize(initl.ysize(),initl.xsize()+1);
  initr.resize(initr.ysize(),initr.xsize()+1);
  initl.fill(0.0);
  initr.fill(0.0);
  for (size_t i = 0; i< initl.ysize();++i){
	r = sqrt(1+pow((-1 + i*initl.hsize()),2));
	phi = acos(-1/r);
	initl(i,0) = sqrt(r)*sin(0.5*phi);
	phi = acos(1/r);
	initr(i,0) = sqrt(r)*sin(0.5*phi);
  }
  for (size_t j = 0; j< initl.xsize()-1;++j){
      r = sqrt(1+pow((-1 + j*initl.hsize()),2));
      phi = acos((-1+j*initl.hsize())/r);
      initl(0,j) = sqrt(r)*sin(0.5*phi);
  }
  for (size_t j = 0;j<initr.xsize()-1;++j){
      r = sqrt(1+pow((1 - j*initr.hsize()),2));
      phi = acos((1 - j*initr.hsize())/r);
      initr(0,j) = sqrt(r)*sin(0.5*phi);
  }
  
  for (size_t i=0;i<initl.ysize();++i){
    for (size_t j=0;j<initl.xsize()-1;++j)
	initf<<std::setw(10)<<(-1+j*initl.hsize())<<" "<<std::setw(10)<<(-1+i*initl.hsize())<<" "<<std::setw(10)<<initl(i,j)<<endl;
    for (size_t j=initr.xsize()-2;j>0;--j)
	initf<<std::setw(10)<<(1-(j-1)*initr.hsize())<<" "<<std::setw(10)<<(-1+i*initr.hsize())<<" "<<std::setw(10)<<initr(i,j-1)<<endl;
  }
  for (size_t i=initl.ysize()-1;i>0;--i){
    for (size_t j=0;j<initl.xsize()-1;++j)
	initf<<std::setw(10)<<(-1+j*initl.hsize())<<" "<<std::setw(10)<<(1-(i-1)*initl.hsize())<<" "<<std::setw(10)<<initl(i-1,j)<<endl;
    for (size_t j=initr.xsize()-2;j>0;--j)
	initf<<std::setw(10)<<(1-(j-1)*initr.hsize())<<" "<<std::setw(10)<<(1-(i-1)*initr.hsize())<<" "<<std::setw(10)<<initr(i-1,j-1)<<endl;    
  }

  initf.close();
  
  //mpi Initialization
  // Definition of the variables
  int size; //The total number of processes
  int rank; //The rank/number of this process
  // MPI initialization

  // Determining the number of CPUs and the rank for each CPU
  MPI_Comm_size( MPI_COMM_WORLD, &size );
  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
  
  f.fill(0.0);
  
  std::cout<<"Your Alias: "<<"Wu&Lou"<<std::endl;
  struct timeval t0, t;
  gettimeofday(&t0, NULL);
  
  //pre smooth = 2, post smooth = 1 =>Vcycle(2,1)
  if( rank == 0 )
    for (size_t i = 0;i<8;++i)
      mg.solveFMG(initl,f,3,2,rank);
  if (rank == 1)
    for (size_t i = 0;i<8;++i)
      mg.solveFMG(initr,f,3,2,rank);

  gettimeofday(&t, NULL);
  std::cout << "Wall clock time of MG execution: " <<
  ((int64_t)(t.tv_sec - t0.tv_sec) * (int64_t)1000000 +
  (int64_t)t.tv_usec - (int64_t)t0.tv_usec) * 1e-3
  << " ms" << std::endl;  
  
  real send_buffer[initr.xsize()*initr.ysize()],recv_buffer[initr.xsize()*initr.ysize()];
  MPI_Request request;
  MPI_Status status;

  if(rank == 1){
    for (size_t i=1;i<initr.ysize()-1;++i)
      for (size_t j = 1;j<initr.xsize()-1;j++)
	send_buffer[i*initr.xsize()+j] = initr(i,j);
    MPI_Isend (send_buffer, initr.xsize()*initr.ysize(), MPI_DOUBLE, 0, 77, MPI_COMM_WORLD, &request);
    MPI_Wait (&request, &status);
  }
  if (rank == 0){
    MPI_Irecv (recv_buffer, initr.xsize()*initr.ysize(), MPI_DOUBLE, 1, 77, MPI_COMM_WORLD,&request);
    MPI_Wait (&request, &status);
    for (size_t i=1;i<initr.ysize()-1;++i)
      for (size_t j = 1;j<initr.xsize()-1;j++)
	initr(i,j) = recv_buffer[i*initr.xsize()+j];

    
  }
  
  // MPI finalizations
  MPI_Finalize();

  //output solution into "solution.txt"
  ofstream solution;
  solution.open("solution.dat");
  
  for (size_t i=0;i<initl.ysize();++i){
    for (size_t j=0;j<initl.xsize()-1;++j)
	solution<<std::setw(10)<<(-1+j*initl.hsize())<<" "<<std::setw(10)<<(-1+i*initl.hsize())<<" "<<std::setw(10)<<initl(i,j)<<endl;
    for (size_t j=initr.xsize()-2;j>0;--j)
	solution<<std::setw(10)<<(1-(j-1)*initr.hsize())<<" "<<std::setw(10)<<(-1+i*initr.hsize())<<" "<<std::setw(10)<<initr(i,j-1)<<endl;
  }
  for (size_t i=initl.ysize()-1;i>0;--i){
    for (size_t j=0;j<initl.xsize()-1;++j)
	solution<<std::setw(10)<<(-1+j*initl.hsize())<<" "<<std::setw(10)<<(1-(i-1)*initl.hsize())<<" "<<std::setw(10)<<initl(i-1,j)<<endl;
    for (size_t j=initr.xsize()-2;j>0;--j)
	solution<<std::setw(10)<<(1-(j-1)*initr.hsize())<<" "<<std::setw(10)<<(1-(i-1)*initr.hsize())<<" "<<std::setw(10)<<initr(i-1,j-1)<<endl;    
  }
  solution.close();
  

  
}