コード例 #1
0
ファイル: solve_ion_temp.c プロジェクト: annehutter/21cm_grid
void update_ion_temp(recomb_t *thisRecombRates, double dens_old, double dens, double *Xe_old, double *Xe, double *temp_old, double *temp, double z_old, double z, double gamma, double n, double xray_heating, double Hubble)
{
    int temp_index = temp_recomb_index(thisRecombRates, *temp_old);
    double recomb = thisRecombRates->recHII[temp_index];
    
    *Xe = update_ion_smallXe(n*dens, *Xe_old, recomb, z, z_old, gamma, Hubble);
    *temp = update_temp(dens_old, dens, *Xe_old, *Xe, *temp_old, z, z_old, xray_heating, Hubble);
    
//     printf("Xe_old = %e\t Xe = %e\t z_old = %e\t z = %e\n", *Xe_old, *Xe, z_old, 0.5*(z_old+z));
//     if((*Xe)-(*Xe_old) > 0.1)
//     {
//         update_ion_temp(thisRecombRates, dens_old, dens, Xe_old, Xe, temp_old, temp, z_old, 0.5*(z_old+z), gamma, n, xray_heating, Hubble);
//         update_ion_temp(thisRecombRates, dens_old, dens, Xe_old, Xe, temp_old, temp, 0.5*(z_old+z), z, gamma, n, xray_heating, Hubble);
//     }
    
    if((*Xe) > 0.01)
    {
        *Xe = update_ion_constdens(n*dens*CUB(1.+z_old), *Xe_old, recomb, z, z_old, gamma, Hubble);
        *temp = update_temp(dens_old, dens, *Xe_old, *Xe, *temp_old, z, z_old, xray_heating, Hubble);
    }
    
    if(isnan(*Xe))
    {
        printf("NAN alarm! Xe = %e\t Xe_old = %e\t gamma = %e\t n = %e\t dens = %e\t temp = %e\t recomb = %e\t Hubble = %e\n", *Xe, *Xe_old, gamma, n, dens, *temp_old, recomb, Hubble);
    }
    
    Xe_old = Xe;
    temp_old = temp;
}
コード例 #2
0
ファイル: solve_ion_temp.c プロジェクト: annehutter/21cm_grid
double update_ion_constdens(double dens, double Xe_old, double recomb, double z, double z_old, double gamma, double Hubble)
{
    double z_old_CUB = sqrt(CUB(1.+z_old));
    double z_CUB = sqrt(CUB(1.+z));
    
    double tmp = gamma/(2.*dens*recomb);
    double tmp2 = sqrt(1.+2./tmp);
    
    double atanh_argument = (Xe_old+tmp)/(tmp*tmp2);
    double tanh_argument = gamma*tmp2*(1./z_old_CUB - 1./z_CUB)/(3.*Hubble) - atanh(atanh_argument);
    
    double Xe_new = - tmp * (1. + tmp2 * tanh(tanh_argument));
    
    if(isnan(Xe_new))
    {
        printf("tmp = %e\t tmp2 = %e\t tanh_argument = %e (%e)\t atanh_argument = %e\n", tmp, tmp2, tanh_argument, gamma*tmp2*(1./z_old_CUB - 1./z_CUB)/(3.*Hubble), atanh_argument);
    }
    
    return Xe_new;
}
コード例 #3
0
ファイル: solve_ion_temp.c プロジェクト: annehutter/21cm_grid
double update_ion_smallXe(double dens, double Xe_old, double recomb, double z, double z_old, double gamma, double Hubble)
{    
    double z_old_CUB = sqrt(CUB(1.+z_old));
    
    double exponent = sqrt(4.*dens*recomb*gamma/SQR(Hubble) + 2.25);
    
    double a_div_b = pow((1.+z)/(1.+z_old), exponent);
    
    
    double factor = exponent*2.*Hubble;
    
    double tmp = (1.+ a_div_b)*factor;
    double tmp2 = 1.-a_div_b;
    
    double numerator = tmp + tmp2 * (-3.*Hubble + 4.*gamma/(Xe_old*z_old_CUB));
    double denominator = tmp + tmp2 * (3.*Hubble + 4.*dens*recomb*Xe_old*z_old_CUB);
    
    double Xe_new = Xe_old/sqrt(CUB(1.+z))*z_old_CUB * numerator/denominator;
    
    return Xe_new;
}
コード例 #4
0
ファイル: redshift_tools.c プロジェクト: annehutter/21cm_grid
double z_calc_numdensity_He_at_redshift(double h, double omega_b, double z, double Y)
{
	return 3.*SQR(h*100.*km_cm/Mpc_cm)/(8.*M_PI*G)/mp_g*omega_b*CUB(1.+z)*Y*0.25;
}
コード例 #5
0
ファイル: redshift_tools.c プロジェクト: annehutter/21cm_grid
double z_calc_numdensity_per_mp_at_redshift(double h, double omega_b, double z)
{
	return 3.*SQR(h*100.*km_cm/Mpc_cm)/(8.*M_PI*G)/mp_g*omega_b*CUB(1.+z);
}
コード例 #6
0
ファイル: ForcesTens.cpp プロジェクト: sabeiro/Allink
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
}
コード例 #7
0
void reinitcmintegration(const SlaterDet* Q, const SlaterDet* Qp,
			 cmintegrationpara* par)
{
  alpha = 0.5/(_estimateacm(Q)+_estimateacm(Qp));

  if (par->type == CMNone) {
    par->w[0] = 1.0;
    par->x[0][0] = 0.0; par->x[0][1] = 0.0; par->x[0][2] = 0.0; 
  } 

  else if (par->type == CMSimple) {
    par->w[0] = 0.125*pow(M_PI*alpha,-1.5);
    par->x[0][0] = 0.0; par->x[0][1] = 0.0; par->x[0][2] = 0.0; 
  }

  else if (par->type == CMProd) {
    int nr=par->prod.nr; 
    int nx=par->prod.ntheta; int nphi=par->prod.nphi;
    
    double pointr[nr], weightr[nr];
    GaussSqrHermitePoints(nr, alpha, pointr, weightr);

    double pointx[nx], weightx[nx];
    GaussLegendrePoints(nx, -1.0, 1.0, pointx, weightx);

    double pointphi[nphi], weightphi[nphi];
    ShiftedPeriodicTrapezoidalPoints(nphi, 0, 2*M_PI, 0.00,
				     pointphi, weightphi);

    int i=0;
    int ir, ix, iphi;
    for (ir=0; ir<nr; ir++)
      for (ix=0; ix<nx; ix++)
	for (iphi=0; iphi<nphi; iphi++) {
	  par->x[i][0] = pointr[ir]*sqrt(1-SQR(pointx[ix]))*cos(pointphi[iphi]);
	  par->x[i][1] = pointr[ir]*sqrt(1-SQR(pointx[ix]))*sin(pointphi[iphi]);
	  par->x[i][2] = pointr[ir]*pointx[ix];
	  par->w[i] = 1/CUB(2*M_PI)*
	    weightr[ir]*weightx[ix]*weightphi[iphi];
	  i++;
	}
  }

  else if (par->type == CMPoly) {
    int nr=par->poly.nr; 
    int npoly=par->poly.npoly;
    
    double pointr[nr], weightr[nr];
    GaussSqrHermitePoints(nr, alpha, pointr, weightr);

    int i=0;	
    int ir, ipoly, j;	
    for (ir=0; ir<nr; ir++)
      for (ipoly=0; ipoly<npoly; ipoly++) {
	for (j=0; j<3; j++)
	  par->x[i][j] = pointr[ir]*polyhedron[npoly][ipoly][j];
	par->w[i] = 1/CUB(2*M_PI)*
	  weightr[ir]*(4*M_PI/npoly);
	i++;
      }
  }  
}
コード例 #8
0
void _initcmintegration(const Projection* P, 
                        double alpha,
                        cmintegrationpara* par)
{
  if (P->cm == CMNone) {
    par->n = 1;
    par->x = malloc(3*sizeof(double));
    par->w = malloc(1*sizeof(double));
    par->x[0][0] = 0.0; par->x[0][1] = 0.0; par->x[0][2] = 0.0; 
    par->w[0] = 1.0;
  } 

  else if (P->cm == CMSimple) {
    par->n = 1;
    par->x = malloc(3*sizeof(double));
    par->w = malloc(1*sizeof(double));
    par->x[0][0] = 0.0; par->x[0][1] = 0.0; par->x[0][2] = 0.0; 
    par->w[0] = 0.125*pow(M_PI*alpha,-1.5);
  }

  else if (P->cm == CMProd) {
    int nr=P->cmprod.nr; 
    int nx=P->cmprod.ntheta; int nphi=P->cmprod.nphi;
    
    double pointr[nr], weightr[nr];
    GaussSqrHermitePoints(nr, alpha, pointr, weightr);

    double pointx[nx], weightx[nx];
    GaussLegendrePoints(nx, -1.0, 1.0, pointx, weightx);

    double pointphi[nphi], weightphi[nphi];
    ShiftedPeriodicTrapezoidalPoints(nphi, 0, 2*M_PI, 0.00,
				     pointphi, weightphi);

    par->n = nr*nx*nphi;
    par->x = malloc(3*par->n*sizeof(double));
    par->w = malloc(par->n*sizeof(double));

    int i=0;
    int ir, ix, iphi;
    for (ir=0; ir<nr; ir++)
      for (ix=0; ix<nx; ix++)
	for (iphi=0; iphi<nphi; iphi++) {
	  par->x[i][0] = pointr[ir]*sqrt(1-SQR(pointx[ix]))*cos(pointphi[iphi]);
	  par->x[i][1] = pointr[ir]*sqrt(1-SQR(pointx[ix]))*sin(pointphi[iphi]);
	  par->x[i][2] = pointr[ir]*pointx[ix];
	  par->w[i] = 1/CUB(2*M_PI)*
	    weightr[ir]*weightx[ix]*weightphi[iphi];
	  i++;
	}
  }

  else if (P->cm == CMPoly) {
    int nr=P->cmpoly.nr; 
    int npoly=P->cmpoly.npoly;
    
    double pointr[nr], weightr[nr];
    GaussSqrHermitePoints(nr, alpha, pointr, weightr);

    par->n = nr*npoly;
    par->x = malloc(3*par->n*sizeof(double));
    par->w = malloc(par->n*sizeof(double));

    int i=0;	
    int ir, ipoly, j;	
    for (ir=0; ir<nr; ir++)
      for (ipoly=0; ipoly<npoly; ipoly++) {
	for (j=0; j<3; j++)
	  par->x[i][j] = pointr[ir]*polyhedron[npoly][ipoly][j];
	par->w[i] = 1/CUB(2*M_PI)*
	  weightr[ir]*(4*M_PI/npoly);
	i++;
      }
  }
}
コード例 #9
0
ファイル: ElPolyRepr.cpp プロジェクト: sabeiro/Allink
void ElPoly::IsoSurf(int NSample,double *IsoLevel,int NIso){
  int NPairF = NFile[1]-NFile[0];
  double OldPos[3] = {pNanoPos(0,0),pNanoPos(0,1),pNanoPos(0,2)};
  double DensEl = CUB(NSample)/(pVol()*NPairF);
  double Dens  = 13.3;
  FILE *FNano = fopen("NanoPos.txt","w");
  //IsoLevel *= NPairF;
  for(int ff=NFile[0];ff<NFile[1];ff+=NPairF){
    double *Plot = (double *)calloc(CUBE(NSample),sizeof(double));
    double Min = 0.;
    double Max = 0.;
    VAR_TRIANGLE *Triang = NULL;
    double Pos[3];
    for(int f=ff;f<ff+NPairF&&f<NFile[1];f++){
      Processing(f);
      if(OpenRisk(cFile[f],BF_PART))return;
      for(int b=0;b<pNBlock();b++){
	for(int p=Block[b].InitIdx;p<Block[b].EndIdx;p++){
	  if(pType(p) != 0)continue;
	  for(int d=0;d<3;d++){
	    Pos[d] = pPos(p,d) - (pNanoPos(0,d)-.5*pEdge(d));
	    Pos[d] -= floor(Pos[d]*pInvEdge(d))*pEdge(d);
	  }
	  int sx = (int)(Pos[0]*pInvEdge(0)*NSample);
	  int sy = (int)(Pos[1]*pInvEdge(1)*NSample);
	  int sz = (int)(Pos[2]*pInvEdge(2)*NSample);
	  int sTot = (sx*NSample+sy)*NSample+sz;
	  Plot[sTot] += DensEl;
	  if(Max < Plot[sTot]) Max = Plot[sTot];
	  if(Min > Plot[sTot]) Min = Plot[sTot];
	}
      }
    }
    Matrice Mask(3,3,3);
    Mask.FillGaussian(.5,3.);
    Mask.Print();
    int NDim = 3;
    int IfMinImConv = 1;
    Mask.ConvoluteMatrix(Plot,NSample,NDim,IfMinImConv);
    Mask.ConvoluteMatrix(Plot,NSample,NDim,IfMinImConv);
    // ConvoluteMatrix(Plot,NSample,&Mask,3);
    // ConvoluteMatrix(Plot,NSample,&Mask,3);
    char FString[256];
    sprintf(FString,"IsoSurf%05d.dat",ff);
    FILE *F2Write = fopen(FString,"w");
    fprintf(F2Write,"#l(%lf %lf %lf) v[%d] d[polygon]\n",pEdge(0),pEdge(1),pEdge(2),NSample);
    HeaderNano(F2Write);
    int NTri = 0;
    for(int i=0;i<NIso;i++){
      printf("Min %lf Max %lf IsoLevel %lf DensEl %lf\n",Min,Max,IsoLevel[i],DensEl);
      Triang = MarchingCubes(Plot,NSample,IsoLevel[i],&NTri);
      for(int t=0;t<NTri;t++){
	for(int i=0;i<3;i++){
	  int l1 = t*3 + (i+1)%3;
	  int l2 = t*3 + (i+2)%3;
	  for(int d=0;d<3;d++) Pos[d] = Triang[t].p[i].x[d];
	  int sx = (int)(Pos[0]*pInvEdge(0)*NSample);
	  int sy = (int)(Pos[1]*pInvEdge(1)*NSample);
	  int sz = (int)(Pos[2]*pInvEdge(2)*NSample);
	  int sTot = (sx*NSample+sy)*NSample+sz;
	  fprintf(F2Write,"{t[%d %d %d] ",sTot,t,0);
	  fprintf(F2Write,"x(%lf %lf %lf) ",Pos[0],Pos[1],Pos[2]);
	  fprintf(F2Write,"v(%lf %lf %lf) ",Triang[t].n[i].x[0],Triang[t].n[i].x[1],Triang[t].n[i].x[2]);
	  fprintf(F2Write,"l[%d] l[%d]}\n",l1,l2);
	}
      }
    }
    fclose(F2Write);
    free(Plot);
    free(Triang);continue;
    int NVertex = CUBE(2*NSample-1);
    double *WeightL = (double *) calloc(NVertex,sizeof(double));
    NormalWeight(Triang,WeightL,NSample,NTri);
    double CmStalk[3] = {0.,0.,0.};//OldPos[0],OldPos[1],OldPos[2]};
    double CountStalk = 0.;
    for(int t=0;t<NTri;t++){
      for(int v=0;v<3;v++){
	int vRef = Triang[t].v[v];
	for(int d=0;d<3;d++){
	  CmStalk[d] = Triang[t].p[v].x[d]*WeightL[vRef];
	}
	CountStalk += WeightL[vRef];
      }
    }
    free(WeightL);
    free(Triang);
    if(CountStalk <= 0.) CountStalk = 1.;
    for(int d=0;d<3;d++){
      CmStalk[d] /= CountStalk;
    }
    pPos(CmStalk);
    SetNNano(1);
    for(int d=0;d<3;d++){
      Nano->Pos[d]   = CmStalk[d];
      OldPos[d] = Nano->Pos[d];
    }
    SetNanoBkf(0);
    Nano->Axis[0] = 0.;
    Nano->Axis[1] = 0.;
    Nano->Axis[2] = 1.;
    Nano->Rad     = .5;
    Nano->Height  = 4.;
    Nano->Hamaker = 1.;
    Nano->OffSet  = 1.;
    Nano->Shape = SHAPE_STALK;    
    for(int f=ff;f<ff+NPairF&&f<NFile[1];f++){
      char String[120];
      StringNano(String,0);
      fprintf(FNano,"sed '/Rigid/c\\%s' %s > Ciccia.dat\n",String,cFile[f]);
      fprintf(FNano,"mv Ciccia.dat %s\n",cFile[f]);
      //command("chmod u+x %s\n","NanoPos.txt");
      //SubNanoHeader(cFile[f]);
    }
    printf("\n");
  }
  fclose(FNano);
}