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; }
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; }
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; }
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; }
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); }
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 }
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++; } } }
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++; } } }
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); }