void save_gradstat(SIM_T *simu) { const PARMS_T *parms=simu->parms; const int isim=simu->isim; //Save pistat in the end of simulation for(int iwfs=0; iwfs<simu->parms->nwfs; iwfs++) { int ipowfs=parms->wfsr[iwfs].powfs; const int dtrat=parms->powfs[ipowfs].dtrat; double scale; if(parms->powfs[ipowfs].usephy) { scale=(simu->isim+1-simu->parms->powfs[ipowfs].phystep)/dtrat; } else { scale=(simu->isim+1)/dtrat; } if(scale<=0) continue; if(simu->pistatout && simu->pistatout->p[iwfs]) { int nstep=isim+1-parms->powfs[ipowfs].pistatstart; scale=1./(double)nstep; dcell *pp=simu->pistatout->p[iwfs]; dcellscale(pp,scale); if(parms->sim.skysim) { /*need peak in corner */ for(long ic=0; ic<pp->nx*pp->ny; ic++) { dfftshift(pp->p[ic]); } writebin(pp,"%s/pistat/pistat_seed%d_sa%d_x%g_y%g.bin", dirskysim,simu->seed, parms->powfs[ipowfs].order, parms->wfs[iwfs].thetax*206265, parms->wfs[iwfs].thetay*206265); for(long ic=0; ic<pp->nx*pp->ny; ic++) { dfftshift(pp->p[ic]); } } else { /*need peak in center */ writebin(pp,"pistat_seed%d_wfs%d.bin", simu->seed,iwfs); } dcellscale(pp,1./scale); } } }
static void test_psd(){ rand_t rstat; int seed=4; double r0=0.2; double dx=1./64; long N=1024; long nx=N; long ny=N; long ratio=1; long xskip=nx*(ratio-1)/2; long yskip=ny*(ratio-1)/2; long nframe=512; seed_rand(&rstat, seed); if(1){ map_t *atm=mapnew(nx+1, ny+1, dx,dx, NULL); cmat *hat=cnew(nx*ratio, ny*ratio); //cfft2plan(hat, -1); dmat *hattot=dnew(nx*ratio, ny*ratio); for(long i=0; i<nframe; i++){ info2("%ld of %ld\n", i, nframe); for(long j=0; j<(nx+1)*(ny+1); j++){ atm->p[j]=randn(&rstat); } fractal_do((dmat*)atm, dx, r0,L0,ninit); czero(hat); for(long iy=0; iy<ny; iy++){ for(long ix=0; ix<nx; ix++){ IND(hat,ix+xskip,iy+yskip)=IND(atm,ix,iy); } } cfftshift(hat); cfft2i(hat, -1); cabs22d(&hattot, 1, hat, 1); } dscale(hattot, 1./nframe); dfftshift(hattot); writebin(hattot, "PSD_fractal"); } { dmat *spect=turbpsd(nx, ny, dx, r0, 100, 0, 0.5); writebin(spect, "spect"); cmat *hat=cnew(nx*ratio, ny*ratio); //cfft2plan(hat, -1); dmat *hattot=dnew(nx*ratio, ny*ratio); cmat *atm=cnew(nx, ny); //cfft2plan(atm, -1); dmat *atmr=dnew(atm->nx, atm->ny); dmat *atmi=dnew(atm->nx, atm->ny); cmat* phat=hat; dmat* patmr=atmr; dmat* patmi=atmi; for(long ii=0; ii<nframe; ii+=2){ info2("%ld of %ld\n", ii, nframe); for(long i=0; i<atm->nx*atm->ny; i++){ atm->p[i]=COMPLEX(randn(&rstat), randn(&rstat))*spect->p[i]; } cfft2(atm, -1); for(long i=0; i<atm->nx*atm->ny; i++){ atmr->p[i]=creal(atm->p[i]); atmi->p[i]=cimag(atm->p[i]); } czero(hat); for(long iy=0; iy<ny; iy++){ for(long ix=0; ix<nx; ix++){ IND(phat,ix+xskip,iy+yskip)=IND(patmr,ix,iy); } } cfftshift(hat); cfft2i(hat, -1); cabs22d(&hattot, 1, hat, 1); czero(hat); for(long iy=0; iy<ny; iy++){ for(long ix=0; ix<nx; ix++){ IND(phat,ix+xskip,iy+yskip)=IND(patmi,ix,iy); } } cfftshift(hat); cfft2i(hat, -1); cabs22d(&hattot, 1, hat, 1); } dscale(hattot, 1./nframe); dfftshift(hattot); writebin(hattot, "PSD_fft"); } }
/** Save NGS WFS and other information for later use in MAOS simulations.*/ void skysim_save(const SIM_S *simu, const ASTER_S *aster, const double *ipres, int selaster, int seldtrat, int isky){ const PARMS_S* parms=simu->parms; const int nwvl=parms->maos.nwvl; char path[PATH_MAX]; snprintf(path,PATH_MAX,"Res%d_%d_maos/sky%d",simu->seed_maos,parms->skyc.seed,isky); mymkdir("%s",path); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ dcell *sepsf=dcelldup(aster[selaster].wfs[iwfs].pistat->psf); for(int ic=0; ic<sepsf->nx*sepsf->ny; ic++){ dfftshift(sepsf->p[ic]);/*put peak in center. required by MAOS. */ } writebin(sepsf, "%s/pistat_wfs%d",path,iwfs+6); dcellfree(sepsf); writebin(aster->wfs[iwfs].pistat->sanea->p[seldtrat], "%s/nea_tot_wfs%d",path,iwfs+6); writebin(aster[selaster].wfs[iwfs].pistat->sanea->p[seldtrat], "%s/nea_wfs%d",path,iwfs+6); writebin(aster[selaster].wfs[iwfs].pistat->sanea, "%s/neafull_wfs%d",path,iwfs+6); } writebin(aster[selaster].gain->p[seldtrat], "%s/gain",path); writebin(simu->mres->p[isky], "%s/mres",path); writebin(simu->psd_tt,"%s/psd_tt",path); writebin(simu->psd_ps,"%s/psd_ps",path); char fnconf[PATH_MAX]; snprintf(fnconf,PATH_MAX,"%s/base.conf",path); FILE *fp=fopen(fnconf,"w"); fprintf(fp,"sim.seeds=[%d]\n",simu->seed_maos); fprintf(fp,"sim.end=%d\n", parms->maos.nstep); fprintf(fp,"sim.dt=%g\n", parms->maos.dt); fprintf(fp,"sim.zadeg=%g\n", parms->maos.zadeg); fprintf(fp,"sim.mffocus=%d\n", parms->maos.mffocus); fprintf(fp,"sim.ahstfocus=%d\n", parms->maos.ahstfocus); fprintf(fp,"tomo.ahst_wt=3\n"); fprintf(fp,"sim.servotype_lo=2\n");/*type II */ fprintf(fp,"sim.eplo='gain.bin'\n"); fprintf(fp,"powfs0_llt.fnrange='%s'\n", parms->maos.fnrange); fprintf(fp,"atm.r0z=%.4f\n", parms->maos.r0z); fprintf(fp,"atm.size=[128 128]\n"); if(parms->maos.wddeg){ fprintf(fp, "atm.wddeg=["); for(int ips=0; ips<parms->maos.nwddeg; ips++){ fprintf(fp, "%.2f ", parms->maos.wddeg[ips]); } fprintf(fp, "]\n"); } fprintf(fp,"wfs.thetax=[0 0 -33.287 -20.5725 20.5725 33.287"); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ fprintf(fp," %.4f", aster[selaster].wfs[iwfs].thetax*206265); } fprintf(fp,"]\n"); fprintf(fp,"wfs.thetay=[0 35 10.8156 -28.3156 -28.3156 10.8156"); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ fprintf(fp," %.4f", aster[selaster].wfs[iwfs].thetay*206265); } fprintf(fp,"]\n"); fprintf(fp,"wfs.siglev=[900 900 900 900 900 900"); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ fprintf(fp, " %.2f", aster[selaster].wfs[iwfs].siglevtot); } fprintf(fp,"]\n"); fprintf(fp,"wfs.wvlwts=[1 1 1 1 1 1"); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ for(int iwvl=0; iwvl<nwvl; iwvl++){ fprintf(fp," %.2f ", aster[selaster].wfs[iwfs].siglev->p[iwvl] /aster[selaster].wfs[iwfs].siglevtot); } } fprintf(fp,"]\n"); fprintf(fp,"wfs.powfs=[0 0 0 0 0 0"); for(int iwfs=0; iwfs<aster[selaster].nwfs; iwfs++){ fprintf(fp, " %d", aster[selaster].wfs[iwfs].ipowfs+1); } fprintf(fp,"]\n"); dmat* rnefs=parms->skyc.rnefs; double rne=IND(rnefs,seldtrat,0); double bkgrnd=aster[selaster].wfs[0].bkgrnd; if(parms->maos.npowfs==1){ fprintf(fp, "powfs.piinfile=[\"\" \"pistat\" ]\n"); fprintf(fp, "powfs.neareconfile=[\"\" \"nea_tot\"]\n"); fprintf(fp, "powfs.phyusenea=[0 1]\n"); fprintf(fp, "powfs.dtrat=[1 %d]\n", (int)parms->skyc.dtrats->p[seldtrat]); fprintf(fp, "powfs.bkgrnd=[0 %.2f]\n", bkgrnd); fprintf(fp, "powfs.rne=[3 %.2f]\n", rne); fprintf(fp, "powfs.phystep=[0 %ld]\n", 50+(long)parms->skyc.dtrats->p[seldtrat]*20); fprintf(fp, "powfs.noisy=[1 1 ]\n"); fprintf(fp, "powfs.pixtheta=[0.5/206265 %g/206265000]\n", parms->skyc.pixtheta[1]*206265000); fprintf(fp, "powfs.pixpsa=[6 %d]\n", parms->skyc.pixpsa[0]); fprintf(fp, "powfs.ncomp=[64 %d]\n", parms->maos.ncomp[0]); fprintf(fp, "powfs.nwvl=[1 %d]\n",nwvl); fprintf(fp, "powfs.wvl=[0.589e-6"); for(int ip=0; ip<1; ip++){ for(int iwvl=0; iwvl<nwvl; iwvl++){ fprintf(fp, " %.4g", parms->maos.wvl[iwvl]); } } fprintf(fp,"]\n"); }else if(parms->maos.npowfs==2){ fprintf(fp, "powfs.piinfile=[\"\" \"pistat\" \"pistat\"]\n"); fprintf(fp, "powfs.neareconfile=[\"\" \"nea_tot\" \"nea_tot\"]\n"); fprintf(fp, "powfs.phyusenea=[0 1 1]\n"); fprintf(fp, "powfs.dtrat=[1 %d %d]\n", (int)parms->skyc.dtrats->p[seldtrat], (int)parms->skyc.dtrats->p[seldtrat]); fprintf(fp, "powfs.bkgrnd=[0 %.2f %.2f]\n", bkgrnd, bkgrnd); fprintf(fp, "powfs.rne=[3 %.2f %.2f]\n", rne,rne); fprintf(fp, "powfs.phystep=[0 %ld %ld]\n", 50+(long)parms->skyc.dtrats->p[seldtrat]*20, 50+(long)parms->skyc.dtrats->p[seldtrat]*20); fprintf(fp, "powfs.noisy=[1 1 1]\n"); fprintf(fp, "powfs.pixtheta=[0.5/206265 %g/206265000 %g/206265000]\n", parms->skyc.pixtheta[0]*206265000, parms->skyc.pixtheta[1]*206265000); fprintf(fp, "powfs.pixpsa=[6 %d %d]\n", parms->skyc.pixpsa[0], parms->skyc.pixpsa[1]); fprintf(fp, "powfs.ncomp=[64 %d %d]\n", parms->maos.ncomp[0], parms->maos.ncomp[1]); fprintf(fp, "powfs.nwvl=[1 %d %d]\n",nwvl,nwvl); fprintf(fp, "powfs.wvl=[0.589e-6"); for(int ip=0; ip<2; ip++){ for(int iwvl=0; iwvl<nwvl; iwvl++){ fprintf(fp, " %.4g", parms->maos.wvl[iwvl]); } } fprintf(fp,"]\n"); fprintf(fp, "powfs.wvlwts=[]\n"); }else{ error("Fill this out please\n"); } fclose(fp); snprintf(fnconf,PATH_MAX,"%s/skyres.txt",path); fp=fopen(fnconf,"w"); fprintf(fp, "TotAll\tNGS\tTT\n"); fprintf(fp, "%g\t%g\t%g\n", sqrt(ipres[0])*1e9, sqrt(ipres[1])*1e9, sqrt(ipres[2])*1e9); fclose(fp); }