def METHOD_NAME(self, device: Union[IlluminationGeometryBase, PhotoacousticDevice]) -> None:
    """
    runs optical simulations. Volumes are first loaded from HDF5 file and parsed to `self.forward_model`, the output
    is aggregated in case multiple illuminations are defined by `device` and stored in the same HDF5 file.
    :param device: Illumination or Photoacoustic device that defines the illumination geometry
    :return: None
    """
    self.logger.info("Simulating the optical forward process...")
    file_path = self.global_settings[Tags.SIMPA_OUTPUT_PATH]
    wl = str(self.global_settings[Tags.WAVELENGTH])
    absorption = load_data_field(file_path, Tags.DATA_FIELD_ABSORPTION_PER_CM, wl)
    scattering = load_data_field(file_path, Tags.DATA_FIELD_SCATTERING_PER_CM, wl)
    anisotropy = load_data_field(file_path, Tags.DATA_FIELD_ANISOTROPY, wl)
    gruneisen_parameter = load_data_field(file_path, Tags.DATA_FIELD_GRUNEISEN_PARAMETER)
    _device = None
    if isinstance(device, IlluminationGeometryBase):
        _device = device
    elif isinstance(device, PhotoacousticDevice):
        _device = device.get_illumination_geometry()
    else:
        raise TypeError(f"The optical forward modelling does not support devices of type {type(device)}")
    results = self.run_forward_model(_device=_device,
                                     device=device,
                                     absorption=absorption,
                                     scattering=scattering,
                                     anisotropy=anisotropy)
    fluence = results[Tags.DATA_FIELD_FLUENCE]
    if not (Tags.IGNORE_QA_ASSERTIONS in self.global_settings and Tags.IGNORE_QA_ASSERTIONS):
        assert_array_well_defined(fluence, assume_non_negativity=True, array_name="fluence")
    if Tags.LASER_PULSE_ENERGY_IN_MILLIJOULE in self.component_settings:
        units = Tags.UNITS_PRESSURE
        # Initial pressure should be given in units of Pascale
        conversion_factor = 1e6  # 1 J/cm^3 = 10^6 N/m^2 = 10^6 Pa
        initial_pressure = (absorption * fluence * gruneisen_parameter *
                            (self.component_settings[Tags.LASER_PULSE_ENERGY_IN_MILLIJOULE] / 1000)
                            * conversion_factor)
    else:
        units = Tags.UNITS_ARBITRARY
        initial_pressure = absorption * fluence
    if not (Tags.IGNORE_QA_ASSERTIONS in self.global_settings and Tags.IGNORE_QA_ASSERTIONS):
        assert_array_well_defined(initial_pressure, assume_non_negativity=True, array_name="initial_pressure")
    results[Tags.DATA_FIELD_FLUENCE] = fluence
    results[Tags.OPTICAL_MODEL_UNITS] = units
    results[Tags.DATA_FIELD_INITIAL_PRESSURE] = initial_pressure
    optical_output = {}
    for k, item in results.items():
        optical_output[k] = {self.global_settings[Tags.WAVELENGTH]: item}
    optical_output_path = generate_dict_path(Tags.OPTICAL_MODEL_OUTPUT_NAME)
    save_hdf5(optical_output, self.global_settings[Tags.SIMPA_OUTPUT_PATH], optical_output_path)
    self.logger.info("Simulating the optical forward process...[Done]")