43 from rich.progress
import track
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
56 p_atmos: (Param_atmos): Atmosphere parameters
58 p_tel: (Param_tel): Telescope parameters
60 p_geom: (Param_geom): Geometry parameters
63 ittime: (float): exposition time [s]
65 p_wfss: (list of Param_wfs): WFS parameters
67 p_targets: (list of Param_target): target parameters
69 dataBase: (dict): dictionary for data base
71 use_DB: (bool): flag for using the dataBase system
74 atm : (Atmos): Atmos object
76 if not p_geom.is_init:
77 raise RuntimeError(
"Cannot init atmosphere with uninitialized p_geom.")
81 if p_atmos.r0
is None:
87 p_atmos.alt = p_atmos.alt / np.cos(p_geom.zenithangle * CONST.DEG2RAD)
89 p_atmos.pupixsize = p_tel.diam / p_geom.pupdiam
96 if p_wfss
is not None:
97 norms += [(w.xpos**2 + w.ypos**2)**0.5
for w
in p_wfss]
98 if p_targets
is not None:
99 norms += [(p_target.xpos**2 + p_target.ypos**2)**0.5
for p_target
in p_targets]
101 max_size = max(norms)
104 patch_diam = (p_geom._n + 2 * (max_size * CONST.ARCSEC2RAD * p_atmos.alt) /
105 p_atmos.pupixsize + 4).astype(np.int64)
106 p_atmos.dim_screens = (patch_diam + patch_diam % 2)
109 lin_delta = p_geom.pupdiam / p_tel.diam * p_atmos.windspeed * \
110 np.cos(CONST.DEG2RAD * p_geom.zenithangle) * ittime
111 p_atmos._deltax = lin_delta * np.sin(CONST.DEG2RAD * p_atmos.winddir + np.pi)
112 p_atmos._deltay = lin_delta * np.cos(CONST.DEG2RAD * p_atmos.winddir + np.pi)
115 p_atmos.frac /= np.sum(p_atmos.frac)
117 if p_atmos.L0
is None:
119 p_atmos.L0 = np.ones(p_atmos.nscreens, dtype=np.float32) * 1e5
120 L0_pix = p_atmos.L0 * p_geom.pupdiam / p_tel.diam
122 if p_atmos.seeds
is None:
123 p_atmos.seeds = np.arange(p_atmos.nscreens, dtype=np.int64) + 1234
125 r0_layers = p_atmos.r0 / (p_atmos.frac**(3. / 5.) * p_atmos.pupixsize)
126 stencil_size = itK.stencil_size_array(p_atmos.dim_screens)
128 atm = Atmos(context, p_atmos.nscreens, p_atmos.r0, r0_layers, p_atmos.dim_screens,
129 stencil_size, p_atmos.alt, p_atmos.windspeed, p_atmos.winddir,
130 p_atmos._deltax, p_atmos._deltay, context.active_device)
132 print(
"Creating turbulent layers :")
133 for i
in track(range(p_atmos.nscreens)):
135 A, B, istx, isty = h5u.load_AB_from_dataBase(dataBase, i)
137 A, B, istx, isty = itK.AB(p_atmos.dim_screens[i], L0_pix[i],
138 p_atmos._deltax[i], p_atmos._deltay[i], 0)
140 h5u.save_AB_in_database(i, A, B, istx, isty)
142 atm.init_screen(i, A, B, istx, isty, p_atmos.seeds[i])
Parameter classes for COMPASS.
Numerical constants for shesha and config enumerations for safe-typing.
def atmos_init(carmaWrap_context context, conf.Param_atmos p_atmos, conf.Param_tel p_tel, conf.Param_geom p_geom, ittime=None, p_wfss=None, p_targets=None, dataBase={}, use_DB=False)
Initializes an Atmos object.
Functions for handling the database system.
Stencil and matrices computation for the creation of a turbulent screen.