air-pollution-control
Included with Lifetime
$97 forever
Specialized skill for air pollution control equipment selection and design including scrubbers, baghouses, ESPs, oxidizers, and BACT/LAER determination.
Air Quality Management
What this skill does
# Air Pollution Control Design Skill
Air pollution control equipment selection and design for industrial emission reduction.
## Purpose
This skill provides comprehensive capabilities for designing air pollution control systems, including technology selection, equipment sizing, efficiency calculations, and regulatory compliance demonstration (BACT/LAER/MACT).
## Capabilities
### Scrubber Design
- Wet scrubber technology selection
- Packed tower design and sizing
- Spray tower configuration
- Venturi scrubber design
- Pressure drop calculations
- Liquid-to-gas ratio optimization
- Chemical dosing requirements
### Baghouse and Fabric Filter Sizing
- Filter media selection
- Air-to-cloth ratio determination
- Compartmentalization design
- Pulse-jet vs reverse-air cleaning
- Pressure drop estimation
- Bag life prediction
- Hopper sizing
### Electrostatic Precipitator Design
- Collection efficiency calculation
- Specific Collection Area (SCA) determination
- Plate spacing and configuration
- Electrical field strength
- Rapping system design
- Resistivity considerations
- Power supply sizing
### Thermal and Catalytic Oxidizer Specification
- Destruction efficiency requirements
- Temperature and residence time
- Heat recovery options (regenerative, recuperative)
- Catalyst selection for catalytic oxidizers
- Auxiliary fuel requirements
- Turndown capabilities
### Carbon Adsorption System Design
- Activated carbon selection
- Adsorption capacity calculations
- Breakthrough time estimation
- Bed sizing
- Regeneration system design
- Carbon replacement frequency
### Control Efficiency Calculations
- Outlet emission rate determination
- Removal efficiency verification
- Stack testing correlation
- Continuous monitoring requirements
### Pressure Drop and Energy Analysis
- System pressure drop calculation
- Fan power requirements
- Operating cost estimation
- Energy optimization opportunities
### BACT/LAER/MACT Determination
- Control technology identification
- Cost-effectiveness analysis
- Technical feasibility evaluation
- Regulatory database research
- Top-down BACT analysis
## Prerequisites
### Installation
```bash
pip install numpy scipy pandas matplotlib
```
### Optional Dependencies
```bash
# For chemical property lookup
pip install chemicals thermo
# For visualization
pip install plotly
```
## Usage Patterns
### Baghouse Design
```python
import numpy as np
from dataclasses import dataclass
from typing import Dict, List, Optional
@dataclass
class GasStreamData:
"""Gas stream characteristics"""
flow_rate_acfm: float
temperature_f: float
moisture_pct: float
particulate_loading_gr_acf: float
particle_size_micron: float
gas_composition: Dict[str, float] = None
@dataclass
class BaghouseDesign:
"""Baghouse design parameters"""
filter_media: str
bag_diameter_in: float
bag_length_ft: float
air_to_cloth_ratio: float
cleaning_type: str # 'pulse_jet', 'reverse_air', 'shaker'
class BaghouseCalculator:
"""Pulse-jet baghouse sizing calculations"""
# Recommended air-to-cloth ratios (acfm/ft2) by application
AC_RATIOS = {
'cement': {'gross': 4.0, 'net': 3.5},
'coal': {'gross': 6.0, 'net': 5.0},
'foundry': {'gross': 4.5, 'net': 3.5},
'steel': {'gross': 5.0, 'net': 4.0},
'chemical': {'gross': 5.5, 'net': 4.5},
'pharmaceutical': {'gross': 3.5, 'net': 3.0},
'general': {'gross': 5.0, 'net': 4.0}
}
# Filter media properties
MEDIA_PROPERTIES = {
'polyester': {'max_temp_f': 275, 'cost_factor': 1.0, 'acid_resist': 'good'},
'polypropylene': {'max_temp_f': 200, 'cost_factor': 0.9, 'acid_resist': 'excellent'},
'nomex': {'max_temp_f': 400, 'cost_factor': 3.0, 'acid_resist': 'good'},
'fiberglass': {'max_temp_f': 500, 'cost_factor': 2.5, 'acid_resist': 'excellent'},
'ptfe': {'max_temp_f': 500, 'cost_factor': 8.0, 'acid_resist': 'excellent'},
'p84': {'max_temp_f': 500, 'cost_factor': 5.0, 'acid_resist': 'good'}
}
def select_filter_media(self, gas: GasStreamData) -> str:
"""Select appropriate filter media based on gas conditions"""
temp = gas.temperature_f
suitable = []
for media, props in self.MEDIA_PROPERTIES.items():
if props['max_temp_f'] >= temp:
suitable.append((media, props))
# Return lowest cost suitable media
suitable.sort(key=lambda x: x[1]['cost_factor'])
return suitable[0][0] if suitable else 'ptfe'
def calculate_filter_area(self, gas: GasStreamData,
application: str = 'general',
use_net_ratio: bool = True) -> Dict:
"""Calculate required filter area"""
ratios = self.AC_RATIOS.get(application, self.AC_RATIOS['general'])
ac_ratio = ratios['net'] if use_net_ratio else ratios['gross']
filter_area = gas.flow_rate_acfm / ac_ratio
return {
'gas_flow_acfm': gas.flow_rate_acfm,
'air_to_cloth_ratio': ac_ratio,
'filter_area_sqft': filter_area
}
def size_baghouse(self, gas: GasStreamData,
bag_diameter_in: float = 6.0,
bag_length_ft: float = 10.0,
application: str = 'general') -> Dict:
"""Size complete baghouse system"""
# Filter media selection
media = self.select_filter_media(gas)
# Calculate filter area
area_calc = self.calculate_filter_area(gas, application)
required_area = area_calc['filter_area_sqft']
# Bag area calculation
bag_area = np.pi * (bag_diameter_in / 12) * bag_length_ft # sq ft per bag
# Number of bags
num_bags = np.ceil(required_area / bag_area)
# Compartments (typically 8-16 bags per row, 2-4 rows per compartment)
bags_per_compartment = 32 # typical
num_compartments = np.ceil(num_bags / bags_per_compartment)
# Pressure drop estimate (typical for pulse-jet)
dp_filter = 2.5 # inches w.c. for clean filter
dp_tubesheet = 0.5
dp_inlet_outlet = 1.0
total_dp = dp_filter + dp_tubesheet + dp_inlet_outlet
# Hopper sizing (4:1 turndown, 8-hour storage)
dust_rate_lb_hr = gas.particulate_loading_gr_acf * gas.flow_rate_acfm * 60 / 7000
hopper_volume = dust_rate_lb_hr * 8 / 50 # 50 lb/cf bulk density
return {
'filter_media': media,
'required_filter_area_sqft': required_area,
'bag_diameter_in': bag_diameter_in,
'bag_length_ft': bag_length_ft,
'area_per_bag_sqft': bag_area,
'total_bags': int(num_bags),
'num_compartments': int(num_compartments),
'air_to_cloth_gross': gas.flow_rate_acfm / (num_bags * bag_area),
'pressure_drop_in_wc': total_dp,
'dust_rate_lb_hr': dust_rate_lb_hr,
'hopper_volume_cf': hopper_volume,
'max_temp_f': self.MEDIA_PROPERTIES[media]['max_temp_f']
}
# Example usage
gas = GasStreamData(
flow_rate_acfm=50000,
temperature_f=350,
moisture_pct=8,
particulate_loading_gr_acf=2.0,
particle_size_micron=5
)
calculator = BaghouseCalculator()
design = calculator.size_baghouse(gas, application='cement')
print(f"Filter media: {design['filter_media']}")
print(f"Total bags: {design['total_bags']}")
print(f"Compartments: {design['num_compartments']}")
print(f"A/C ratio: {design['air_to_cloth_gross']:.2f} acfm/sqft")
print(f"Pressure drop: {design['pressure_drop_in_wc']:.1f} in w.c.")
```
### Wet Scrubber Design
```python
class WetScrubberDesign:
"""Wet scrubber design calculations"""
def packed_tower_sizing(self, gas_flow_acfm: float,
pollutant: str,
inlet_conc_ppm: float,
outlet_conc_ppm: float,
sc