Exemplo n.º 1
0
  SolutionInstance TubeMCM::Integrate(d dt){ // Integrate using
					     // MacCormack method
    d t=sol.getTime();
    d newt=t+dt;

    d lambda=dt/dx;

    SolutionInstance predictor(gp);
    {				// Predictor step
      const vd& oldrho=sol.rho();
      const vd& oldm=sol.m();
      const vd& oldrhoE=sol.rhoE();
    
      vd& prho=predictor.rho_ref();
      vd& pm=predictor.m_ref();
      vd& prhoE=predictor.rhoE_ref();
      // Fluxes from previous solution
      vd Cflux=sol.Cflux();
      vd Mflux=sol.Mflux();
      vd Eflux=sol.Eflux();

      // Density
      prho.tail(gp-1)=oldrho.tail(gp-1)
	-lambda*(Cflux.tail(gp-1)-Cflux.head(gp-1));
      // The first element
      prho(0)=oldrho(0)-lambda*(Cflux(1)-Cflux(0));

      // Momentum
      d oldu0=oldm(0)/oldrho(0);
      d momfluxl = pow(oldm(0), 2)/oldrho(0) + pleft(t);

      pm.tail(gp-1)=oldm.tail(gp-1)
	-lambda*(Mflux.tail(gp-1)-Mflux.head(gp-1));
      // The first element
      pm(0)=oldm(0)-lambda*(Mflux(1)-momfluxl);
      pm(gp-1)=0;

      // Energy
      prhoE.tail(gp-1)=oldrhoE.tail(gp-1)
	-lambda*(Eflux.tail(gp-1)-Eflux.head(gp-1));
      // The first element
      prhoE(0)=oldrhoE(0)-lambda*(Eflux(1)-Eflux(0));

    }
    SolutionInstance corrector(gp);
    // Temp test hack:
    corrector=predictor;
    corrector.setTime(newt);

    return corrector;
  }					     // Integrate(dt)
Exemplo n.º 2
0
void Forces::WriteTens(char *FTens,int Comp,double InvNFile){
  double InvValues = 1. / Tens.NSlab;
  double InvVolume = prho()*CUBE(Tens.NSlab)/pVol();
  if(VAR_IF_TYPE(Tens.CalcMode,CALC_2d)){
#ifdef OMPI_MPI_H
  MPI_Allreduce(MPI_IN_PLACE,Tens.Pre[Comp],SQR(Tens.NSlab),MPI_DOUBLE,MPI_SUM,Proc->CommGrid);  
  for(int t=0;t<2;t++){
    MPI_Allreduce(MPI_IN_PLACE,Tens.Dens[t],SQR(Tens.NSlab),MPI_DOUBLE,MPI_SUM,Proc->CommGrid);
  }
 int Rank=0;
  MPI_Comm_rank(Proc->CommGrid, &Rank);
  if(Rank==0){
#endif
    FILE *FWrite = fopen(FTens,"w");
    WriteTens2d(FWrite,Comp,InvNFile);
    fclose(FWrite);
    for(int s=0;s<SQR(Tens.NSlab);s++){
      Tens.Pre[Comp][s] = 0.;
      Tens.Dens[0][s] = 0.;
      Tens.Dens[1][s] = 0.;      
    }
    #ifdef OMPI_MPI_H
        }
    #endif
  }
  if(VAR_IF_TYPE(Tens.CalcMode,CALC_3d)){
#ifdef OMPI_MPI_H
    MPI_Allreduce(MPI_IN_PLACE,Tens.Pre[Comp],CUB(Tens.NSlab),MPI_DOUBLE,MPI_SUM,Proc->CommGrid);  
    for(int t=0;t<2;t++){
      MPI_Allreduce(MPI_IN_PLACE,Tens.Dens[t],CUB(Tens.NSlab),MPI_DOUBLE,MPI_SUM,Proc->CommGrid);
    }
    int Rank=0;
    MPI_Comm_rank(Proc->CommGrid, &Rank);
    if(Rank==0){
#endif
    FILE *FWrite = fopen(FTens,"w");
    fprintf(FWrite,"# l(%.1f %.1f %.1f) r(%.2f %.2f %.2f) v[%d] d[color]\n",pEdge(0),pEdge(1),pEdge(2),Tens.RefPos[0],Tens.RefPos[1],Tens.RefPos[2],Tens.NSlab);
    for(int sx=0;sx<Tens.NSlab;sx++){
      double x = sx*InvValues*pEdge(CLat1);
      for(int sy=0;sy<Tens.NSlab;sy++){
	double y = sy*InvValues*pEdge(CLat2);
	for(int sz=0;sz<Tens.NSlab;sz++){
	  double z = sz*InvValues*pEdge(CNorm);
	  int v = (sx*Tens.NSlab+sy)*Tens.NSlab+sz;
	  if(Tens.Dens[0][v] <= 0 && Tens.Dens[1][v] <= 0 && ABS(Tens.Pre[Comp][v]) <= 0) continue;
	  fprintf(FWrite,"{x(%.3f %.3f %.3f)",x,y,z);
	  fprintf(FWrite," v( %lf %.2f %.2f)}\n",
		  -Tens.Pre[Comp][v]*InvNFile*InvVolume,
		    Tens.Dens[0][v]*InvNFile*InvVolume,
		  Tens.Dens[1][v]*InvNFile*InvVolume);
	}
      }
    }
    fclose(FWrite);
    for(int s=0;s<CUB(Tens.NSlab);s++){
      Tens.Pre[Comp][s] = 0.;
      Tens.Dens[0][s] = 0.;
      Tens.Dens[1][s] = 0.;      
    }
  }
#ifdef OMPI_MPI_H
  }
#endif
}
Exemplo n.º 3
0
Arquivo: prho.c Projeto: FairSky/ggnfs
int rho_factor(unsigned long *factors, mpz_t n)
/********************************************************************/
{ int    numFactors=0, res, sorted=1, i, retVal;
  static mpz_t stack[32];
  static int initialized=0, stackSize=0;
  long c;

  if (!(initialized)) {
    mpz_init(div1); mpz_init(div2); mpz_init(remain);
    for (i=0; i<32; i++) mpz_init(stack[i]);
    initialized=1;
  }
  if (mpz_cmp_ui(n, 1)==0) {
    factors[0]=1;  return 0;
  }
  mpz_abs(remain, n);
  while (mpz_even_p(remain)) {
    factors[numFactors++]=2;
    mpz_tdiv_q_2exp(remain, remain, 1);
  }

  if (mpz_probab_prime_p(remain, 1)) {
    if (mpz_fits_ulong_p(remain)) {
      factors[numFactors++] = mpz_get_ui(remain);
      return numFactors;
    } else return -1;
  }

  /* 50000 is sufficient for all primes below 100,000,000. */
  c = 1;
  do {
    if (c <= 2)
      res = prho(div1, div2, remain, c, 50000);
    else
      res = prho(div1, div2, remain, c, c*50000);
    c++;
  } while (res && (c <4));

  if (res) {
#define _QUIET
#ifndef _QUIET
    printf("Gave up on factoring "); mpz_out_str(stdout, 10, remain); 
    printf(" (useTrialDivision = %d)\n", useTrialDivision);
#endif
    return -1;
  }

  if (mpz_cmp(div1, div2) > 0) mpz_swap(div1, div2);
  if (mpz_probab_prime_p(div1, 1)) {
    if (mpz_fits_ulong_p(div1)) {
      factors[numFactors++] = mpz_get_ui(div1);
    } else return -1; /* Prime factor that doesn't fit in a long. */
  } else {
    mpz_set(stack[stackSize++], div2);
    retVal = rho_factor(&factors[numFactors], div1);
    mpz_set(div2, stack[--stackSize]);
    if (retVal >=0) numFactors += retVal;
    else return retVal;
  }
  if (mpz_probab_prime_p(div2, 1)) {
    if (mpz_fits_ulong_p(div2)) {
      factors[numFactors++] = mpz_get_ui(div2);
    } else return -1; /* Prime factor that doesn't fit in a long. */
  } else {
    retVal = rho_factor(&factors[numFactors], div2);
    if (retVal >=0) numFactors += retVal;
    else return retVal;
  }
    
  /* Here we should sort the factors. */
  for (i=0; i<(numFactors-1); i++) 
    if (factors[i] > factors[i+1])
      sorted=0;
  if (!(sorted)) {
    /***********************************************************/
    /* This will only happen very very rarely, so it's ok to   */
    /* use quick sort, even though it's only a small number of */
    /* integers, and we could sort it much faster in an ad-hoc */
    /* way.                                                    */
    /***********************************************************/
    qsort(factors, numFactors, sizeof(long), cmpUL);
  }

  return numFactors;
}