/*----------------------------------------------------------------------------- * 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)); } } }
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); }
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(); }