private double run_model(Model model, List<Output> out, File folder, String simName, double[] x) throws Exception {

        Map<String, Object> parameter = model.getParameter();
        Object comp = model.getComponent();

        // spatial params
        ParameterData[] pd = Step.create(params, parameter);
        for (int i = 0; i < pd.length; i++) {
            pd[i].generateValues(x[i]);
        }

        for (int i = 0; i < pd.length; i++) {
            String name = pd[i].getName();
            double[] val = pd[i].getDataValue();
            parameter.put(name, toValue(name, val, parameter));
        }

        ComponentAccess.callAnnotated(comp, Initialize.class, true);

        // setting the input data;
        boolean success = ComponentAccess.setInputData(parameter, comp, log);
        if (!success) {
            throw new RuntimeException("There are Parameter problems. Simulation exits.");
        }

        ComponentAccess.adjustOutputPath(folder, comp, log);
        for (Output e : out) {
            e.setup(comp, folder, simName);
        }
        // execute phases and be done.
        log.config("Exec ...");
        ComponentAccess.callAnnotated(comp, Execute.class, false);
        log.config("Finalize ...");
        ComponentAccess.callAnnotated(comp, Finalize.class, true);

        for (Output e : out) {
            e.done();
        }

        return ObjFunc.calculateObjectiveFunctionValue(ofs, startMonthOfYear, sens_start, sens_end, folder);
    }