void save_gradol(SIM_T *simu){ const PARMS_T *parms=simu->parms; const POWFS_T *powfs=simu->powfs; for(int iwfs=0; iwfs<parms->nwfsr; iwfs++){ int ipowfs=parms->wfsr[iwfs].powfs; const int nsa=powfs[ipowfs].saloc->nloc; if(!parms->powfs[ipowfs].psol || !simu->gradlastol->p[iwfs]) continue; if(parms->plot.run){ drawopd("Gpolx",powfs[ipowfs].saloc, simu->gradlastol->p[iwfs]->p,NULL, "WFS Pseudo Openloop Gradients (x)","x (m)", "y (m)", "x %d", iwfs); drawopd("Gpoly",powfs[ipowfs].saloc, simu->gradlastol->p[iwfs]->p+nsa, NULL, "WFS Pseudo Openloop Gradients (y)","x (m)", "y (m)", "y %d", iwfs); } if(simu->save->gradol[iwfs] && (simu->reconisim+1) % parms->powfs[ipowfs].dtrat == 0){ zfarr_dmat(simu->save->gradol[iwfs], simu->reconisim/parms->powfs[ipowfs].dtrat, simu->gradlastol->p[iwfs]); } } if(parms->save.ngcov>0){ /*Outputing psol gradient covariance. */ for(int igcov=0; igcov<parms->save.ngcov; igcov++){ int iwfs1=parms->save.gcov->p[igcov*2]; int iwfs2=parms->save.gcov->p[igcov*2+1]; //info("Computing covariance between wfs %d and %d\n",iwfs1,iwfs2); dmm(&simu->gcov->p[igcov], 1, simu->gradlastol->p[iwfs1], simu->gradlastol->p[iwfs2],"nt",1); } } }
static void test_stfun(){ rand_t rstat; int seed=4; double r0=0.2; double dx=1./16; long N=32; long nx=N; long ny=N; long nframe=500; seed_rand(&rstat, seed); if(L0<9000){ dmat *rr=dlinspace(0, N*dx, N); dmat *covvk=turbcov(rr, sqrt(2)*N*dx, r0, L0); writebin(covvk, "cov_vk"); dfree(rr); dfree(covvk); } /* return; */ { map_t *atm=mapnew(nx+1, ny+1, dx, dx,NULL); stfun_t *data=stfun_init(nx, ny, NULL); zfarr *save=zfarr_init(nframe, 1, "fractal_atm.bin"); for(long i=0; i<nframe; i++){ for(long j=0; j<(nx+1)*(ny+1); j++){ atm->p[j]=randn(&rstat); } fractal_do((dmat*)atm, dx, r0,L0,ninit); stfun_push(data, (dmat*)atm); zfarr_dmat(save, i, (dmat*)atm); if(i%100==0) info("%ld of %ld\n", i, nframe); } zfarr_close(save); dmat *st=stfun_finalize(data); writebin(st, "stfun_fractal.bin"); ddraw("fractal", st, NULL,NULL, "Atmosphere","x","y","stfun"); } /*exit(0); */ { stfun_t *data=stfun_init(nx, ny, NULL); dmat *spect=turbpsd(nx, ny, dx, r0, 100, 0, 0.5); cmat *atm=cnew(nx, ny); //cfft2plan(atm, -1); dmat *atmr=dnew(atm->nx, atm->ny); dmat *atmi=dnew(atm->nx, atm->ny); spect->p[0]=0; for(long ii=0; ii<nframe; ii+=2){ 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]); } stfun_push(data, atmr); stfun_push(data, atmi); if(ii%100==0) info("%ld of %ld\n", ii, nframe); } dmat *st=stfun_finalize(data); writebin(st, "stfun_fft.bin"); ddraw("fft", st, NULL,NULL, "Atmosphere","x","y","stfun"); } }