MC in stereo!

Make the Monte Carlo simulations run in parallel (multiprocessing 17 seconds and scoop 21 seconds instead of 40 seconds)

Scoop

import os

from scoop import futures
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import oopnet as on


def roll_the_dice(network: on.Network) -> pd.Series:
    cnet = on.Copy(network)
    for j in on.get_junctions(cnet):
        j.demand += np.random.normal(0.0, 1.0)
    rpt = cnet.run()
    return rpt.pressure


if __name__ == '__main__':
    filename = os.path.join('data', 'Poulakis.inp')

    net = on.Network.read(filename)
    net.reportprecision.flow = 3
    net.reportprecision.pressure = 3
    mcruns = 1_000
    p = list(futures.map(roll_the_dice, [net] * mcruns))

    p = pd.DataFrame(p, index=list(range(len(p))))
    print(p)

    p_mean = p.mean()
    print(p_mean)

    p_sub = p.sub(p_mean, axis=1)

    x = np.linspace(-1.5, 1.5, 40)
    p_sub[['J-03', 'J-31']].hist(bins=x, layout=(2, 1))
    plt.show()

Multiprocessing

import os
from multiprocessing import Pool

import numpy as np
import pandas as pd
import oopnet as on
from matplotlib import pyplot as plt


def roll_the_dice(network: on.Network) -> pd.Series:
    cnet = on.Copy(network)
    for j in on.get_junctions(cnet):
        j.demand += np.random.normal(0.0, 1.0)
    rpt = cnet.run()
    return rpt.pressure


if __name__ == '__main__':
    filename = os.path.join('data', 'Poulakis.inp')

    net = on.Network.read(filename)
    mcruns = 1_000
    networks = [net] * mcruns

    p = Pool().map(roll_the_dice, networks)

    p = pd.DataFrame(p, index=list(range(len(p))))
    print(p)

    p_mean = p.mean()
    print(p_mean)

    p_sub = p.sub(p_mean, axis=1)

    x = np.linspace(-1.5, 1.5, 40)
    p_sub[['J-03', 'J-31']].hist(bins=x, layout=(2, 1))
    plt.show()