def run_sim(self):
        """ Run model simulation! """

        # class instances
        cf = CarbonFlows(self.control, self.params, self.state, self.fluxes,
                         self.met_data)
        nf = NitrogenFlows(self.control, self.params, self.state, self.fluxes)
        lf = LitterProduction(self.control, self.params, self.state,
                              self.fluxes)
        pg = PlantGrowth(self.control, self.params, self.state, self.fluxes,
                         self.met_data)
        cpl = CarbonPools(self.control, self.params, self.state, self.fluxes)
        npl = NitrogenPools(self.control, self.params, self.state, self.fluxes,
                            self.met_data)
        
        ##################
        self.control.deciduous_model = 1
        self.control.numyears_sim = 12
        self.state.nc_fy = 0.06
        self.state.npp_store = 5.2154
        ##################
        
        
        if self.control.deciduous_model:
            total = self.initialise_deciduous_model()
            # In the first year we don't have last years data, so I have 
            # precalculated the average of all the november-jan chilling values
            last_yrs_accumulated_ncd = 17.0
            
            P = Phenology(self.fluxes, self.state, last_yrs_accumulated_ncd)
        
        # calculate initial C:N ratios and zero annual flux sums
        self.derive(1, self.date, INIT=True)
        self.state.pawater_root = self.params.wcapac_root
        self.state.pawater_tsoil = self.state.pawater_tsoil
        project_day = 0
        
        for yr in xrange(self.control.startyear, 
                         self.control.startyear+self.control.numyears_sim-1):
            yr_days = calc_days_in_year(self.date.year)
            daylen = calculate_daylength(self.date, yr_days,
                                         self.params.latitude)
            
            if self.control.deciduous_model:
                self.zero_annual_sums()
                P.calculate_phenology_flows(daylen, self.date, self.met_data, 
                                            yr_days)
            for d in xrange(yr_days):   
                # litterfall rate: C and N fluxes
                (fdecay, rdecay) = lf.calculate_litter_flows(d)
                
                # co2 assimilation, N uptake and loss
                pg.grow(project_day, self.date, fdecay, rdecay, daylen[d], doy=d)
    
                # soil model fluxes
                cf.calculate_cflows(project_day)
                nf.calculate_nflows()
    
                self.fluxes.nep = self.calculate_nep()
                
                # soil model - update pools
                (cact, cslo, cpas) = cpl.calculate_cpools()
                npl.calculate_npools(cact, cslo, cpas, project_day)
    
                # calculate C:N ratios and increment annual flux sums
                self.derive(project_day, self.date)
                
                print self.fluxes.gpp * 100, self.state.lai
                
                if self.control.print_options == 0:
                    self.pr.save_daily_output(project_day + 1, self.date)
    
                self.increment_date(yr_days)        
                project_day += 1 
            sys.exit()
            # =============== #
            # END OF THE YEAR #                
            # =============== #
            if self.control.deciduous_model:
                self.allocate_stored_c_and_n(total) 
        
        if self.control.print_options == 1:
            # need to save initial SLA to current one!
            self.params.slainit = (self.state.lai / const.M2_AS_HA *
                                    const.KG_AS_TONNES * self.params.cfracts /
                                    self.state.shoot)
            self.correct_rate_constants(output=True)
            self.pr.save_state()

        # house cleaning, close ouput files
        self.pr.tidy_up()