47 def atmos_init(context: carmaWrap_context, p_atmos: conf.Param_atmos,
48 p_tel: conf.Param_tel, p_geom: conf.Param_geom, ittime=
None, p_wfss=
None,
49 p_targets=
None, dataBase={}, use_DB=
False):
51 Initializes an Atmos object
54 context: (carmaWrap_context): GPU device context
55 p_atmos: (Param_atmos): Atmosphere parameters
56 p_tel: (Param_tel): Telescope parameters
57 p_geom: (Param_geom): Geometry parameters
58 ittime: (float): (optional) exposition time [s]
59 p_wfss: (list of Param_wfs): (optional) WFS parameters
60 p_targets: (list of Param_target): (optional) target parameters
61 dataBase: (dict): (optional) dictionary for data base
62 use_DB: (bool): (optional) flag for using the dataBase system
64 atm : (Atmos): Atmos object
66 if not p_geom.is_init:
67 raise RuntimeError(
"Cannot init atmosphere with uninitialized p_geom.")
71 if p_atmos.r0
is None:
77 p_atmos.alt = p_atmos.alt / np.cos(p_geom.zenithangle * CONST.DEG2RAD)
79 p_atmos.pupixsize = p_tel.diam / p_geom.pupdiam
86 if p_wfss
is not None:
87 norms += [(w.xpos**2 + w.ypos**2)**0.5
for w
in p_wfss]
88 if p_targets
is not None:
89 norms += [(p_target.xpos**2 + p_target.ypos**2)**0.5
for p_target
in p_targets]
94 patch_diam = (p_geom._n + 2 * (max_size * CONST.ARCSEC2RAD * p_atmos.alt) /
95 p_atmos.pupixsize + 4).astype(np.int64)
96 p_atmos.dim_screens = (patch_diam + patch_diam % 2)
99 lin_delta = p_geom.pupdiam / p_tel.diam * p_atmos.windspeed * \
100 np.cos(CONST.DEG2RAD * p_geom.zenithangle) * ittime
101 p_atmos._deltax = lin_delta * np.sin(CONST.DEG2RAD * p_atmos.winddir + np.pi)
102 p_atmos._deltay = lin_delta * np.cos(CONST.DEG2RAD * p_atmos.winddir + np.pi)
105 p_atmos.frac /= np.sum(p_atmos.frac)
107 if p_atmos.L0
is None:
109 p_atmos.L0 = np.ones(p_atmos.nscreens, dtype=np.float32) * 1e5
110 L0_pix = p_atmos.L0 * p_geom.pupdiam / p_tel.diam
112 if p_atmos.seeds
is None:
113 p_atmos.seeds = np.arange(p_atmos.nscreens, dtype=np.int64) + 1234
115 r0_layers = p_atmos.r0 / (p_atmos.frac**(3. / 5.) * p_atmos.pupixsize)
116 stencil_size = itK.stencil_size_array(p_atmos.dim_screens)
118 atm = Atmos(context, p_atmos.nscreens, p_atmos.r0, r0_layers, p_atmos.dim_screens,
119 stencil_size, p_atmos.alt, p_atmos.windspeed, p_atmos.winddir,
120 p_atmos._deltax, p_atmos._deltay, context.active_device)
122 print(
"Creating turbulent layers :")
123 for i
in tqdm(range(p_atmos.nscreens)):
125 A, B, istx, isty = h5u.load_AB_from_dataBase(dataBase, i)
127 A, B, istx, isty = itK.AB(p_atmos.dim_screens[i], L0_pix[i],
128 p_atmos._deltax[i], p_atmos._deltay[i], 0)
130 h5u.save_AB_in_database(i, A, B, istx, isty)
132 atm.init_screen(i, A, B, istx, isty, p_atmos.seeds[i])