def simulate_day(census, precip, cell_res=10, precolumbian=False):
    """
    Simulate a day, including water quality effects of modifications.

    `census` contains a distribution of cell-types in the area of interest.

    `cell_res` is as described in `simulate_water_quality`.

    `precolumbian` indicates that artificial types should be turned
    into forest.
    """
    et_max = 0.207
        # From the EPA WaterSense data finder for the Philadelphia airport (19153)
        # Converted to daily number in inches per day.
        # http://www3.epa.gov/watersense/new_homes/wb_data_finder.html
        # TODO: include Potential Max ET as a data layer from CGIAR
        # http://csi.cgiar.org/aridity/Global_Aridity_PET_Methodolgy.asp

    if 'modifications' in census:
        verify_census(census)

    def fn(cell, cell_count):
        # Compute et for cell type
        split = cell.split(':')
        if (len(split) == 2):
            (land_use, bmp) = split
        else:
            (_, land_use, bmp) = split
        et = et_max * lookup_ki(bmp or land_use)

        # Simulate the cell for one day
        return simulate_cell_day(precip, et, cell, cell_count)

    return simulate_modifications(census, fn, cell_res, precip, precolumbian)