def analyze(self, mode=None, timesteps=None):
        """Analyzes the grid by power flow analysis

        Analyze the grid for violations of hosting capacity. Means, perform a
        power flow analysis and obtain voltages at nodes (load, generator,
        stations/transformers and branch tees) and active/reactive power at
        lines.

        The power flow analysis can currently only be performed for both grid
        levels MV and LV. See ToDos section for more information.

        A static `non-linear power flow analysis is performed using PyPSA
        <https://www.pypsa.org/doc/power_flow.html#full-non-linear-power-flow>`_.
        The high-voltage to medium-voltage transformer are not included in the
        analysis. The slack bus is defined at secondary side of these
        transformers assuming an ideal tap changer. Hence, potential
        overloading of the transformers is not studied here.

        Parameters
        ----------
        mode : str
            Allows to toggle between power flow analysis (PFA) on the whole
            grid topology (MV + LV), only MV or only LV. Defaults to None which
            equals power flow analysis for MV + LV which is the only
            implemented option at the moment. See ToDos section for
            more information.
        timesteps : :pandas:`pandas.DatetimeIndex<datetimeindex>` or :pandas:`pandas.Timestamp<timestamp>`
            Timesteps specifies for which time steps to conduct the power flow
            analysis. It defaults to None in which case the time steps in
            timeseries.timeindex (see :class:`~.grid.network.TimeSeries`) are
            used.

        Notes
        -----
        The current implementation always translates the grid topology
        representation to the PyPSA format and stores it to
        :attr:`self.network.pypsa`.

        ToDos
        ------
        The option to export only the edisgo MV grid (mode = 'mv') to conduct
        a power flow analysis is implemented in
        :func:`~.tools.pypsa_io.to_pypsa` but NotImplementedError is raised
        since the rest of edisgo does not handle this option yet. The analyze
        function will throw an error since
        :func:`~.tools.pypsa_io.process_pfa_results`
        does not handle aggregated loads and generators in the LV grids. Also,
        grid reinforcement, pypsa update of time series, and probably other
        functionalities do not work when only the MV grid is analysed.

        Further ToDos are:
        * explain how power plants are modeled, if possible use a link
        * explain where to find and adjust power flow analysis defining
        parameters

        See Also
        --------
        :func:`~.tools.pypsa_io.to_pypsa`
            Translator to PyPSA data format

        """
        if timesteps is None:
            timesteps = self.network.timeseries.timeindex
        # check if timesteps is array-like, otherwise convert to list
        if not hasattr(timesteps, "__len__"):
            timesteps = [timesteps]

        if self.network.pypsa is None:
            # Translate eDisGo grid topology representation to PyPSA format
            self.network.pypsa = pypsa_io.to_pypsa(
                self.network, mode, timesteps)
        else:
            if self.network.pypsa.edisgo_mode is not mode:
                # Translate eDisGo grid topology representation to PyPSA format
                self.network.pypsa = pypsa_io.to_pypsa(
                    self.network, mode, timesteps)

        # check if all timesteps are in pypsa.snapshots, if not update time
        # series
        if False in [True if _ in self.network.pypsa.snapshots else False
                     for _ in timesteps]:
            pypsa_io.update_pypsa_timeseries(self.network, timesteps=timesteps)
        # run power flow analysis
        pf_results = self.network.pypsa.pf(timesteps)

        if all(pf_results['converged']['0'].tolist()):
            pypsa_io.process_pfa_results(
                self.network, self.network.pypsa, timesteps)
        else:
            raise ValueError("Power flow analysis did not converge.")
def analyze ( self , mode = None , timesteps = None ) : if timesteps is None : timesteps = self . network . timeseries . timeindex if not hasattr ( timesteps , "__len__" ) : timesteps = [ timesteps ] if self . network . pypsa is None : self . network . pypsa = pypsa_io . to_pypsa ( self . network , mode , timesteps ) else : if self . network . pypsa . edisgo_mode is not mode : self . network . pypsa = pypsa_io . to_pypsa ( self . network , mode , timesteps ) if False in [ True if _ in self . network . pypsa . snapshots else False for _ in timesteps ] : pypsa_io . update_pypsa_timeseries ( self . network , timesteps = timesteps ) pf_results = self . network . pypsa . pf ( timesteps ) if all ( pf_results [ 'converged' ] [ '0' ] . tolist ( ) ) : pypsa_io . process_pfa_results ( self . network , self . network . pypsa , timesteps ) else : raise ValueError ( "Power flow analysis did not converge." )
Analyzes the grid by power flow analysis

        Analyze the grid for violations of hosting capacity. Means, perform a
        power flow analysis and obtain voltages at nodes (load, generator,
        stations/transformers and branch tees) and active/reactive power at
        lines.

        The power flow analysis can currently only be performed for both grid
        levels MV and LV. See ToDos section for more information.

        A static `non-linear power flow analysis is performed using PyPSA
        <https://www.pypsa.org/doc/power_flow.html#full-non-linear-power-flow>`_.
        The high-voltage to medium-voltage transformer are not included in the
        analysis. The slack bus is defined at secondary side of these
        transformers assuming an ideal tap changer. Hence, potential
        overloading of the transformers is not studied here.

        Parameters
        ----------
        mode : str
            Allows to toggle between power flow analysis (PFA) on the whole
            grid topology (MV + LV), only MV or only LV. Defaults to None which
            equals power flow analysis for MV + LV which is the only
            implemented option at the moment. See ToDos section for
            more information.
        timesteps : :pandas:`pandas.DatetimeIndex<datetimeindex>` or :pandas:`pandas.Timestamp<timestamp>`
            Timesteps specifies for which time steps to conduct the power flow
            analysis. It defaults to None in which case the time steps in
            timeseries.timeindex (see :class:`~.grid.network.TimeSeries`) are
            used.

        Notes
        -----
        The current implementation always translates the grid topology
        representation to the PyPSA format and stores it to
        :attr:`self.network.pypsa`.

        ToDos
        ------
        The option to export only the edisgo MV grid (mode = 'mv') to conduct
        a power flow analysis is implemented in
        :func:`~.tools.pypsa_io.to_pypsa` but NotImplementedError is raised
        since the rest of edisgo does not handle this option yet. The analyze
        function will throw an error since
        :func:`~.tools.pypsa_io.process_pfa_results`
        does not handle aggregated loads and generators in the LV grids. Also,
        grid reinforcement, pypsa update of time series, and probably other
        functionalities do not work when only the MV grid is analysed.

        Further ToDos are:
        * explain how power plants are modeled, if possible use a link
        * explain where to find and adjust power flow analysis defining
        parameters

        See Also
        --------
        :func:`~.tools.pypsa_io.to_pypsa`
            Translator to PyPSA data format