├── LICENSE ├── README.md ├── calpy.py ├── clean.py ├── data └── winter │ ├── area_source.csv │ ├── receptors_info.csv │ ├── samples.csv │ ├── source_emission.csv │ ├── source_info.csv │ ├── species_decay.csv │ └── species_options.csv ├── example.py └── utils └── calpuff_template.inp /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Pavinberg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # calpy -- CALPUFF model managing module in Python 2 | 3 | ## Introduction 4 | 5 | [CALPUFF](http://www.src.com) is an advanced non-steady-state meteorological and air quality modeling system. Since its parameter file INP file (suffixed with ".inp") is old, ill-designed and hard-to-use, this python module provides functions to manage the INP file of CALPUFF model. This module needs `python >= 3.6`. 6 | 7 | ## Usage 8 | 9 | Clone this repository as your project directory. To run the example, run: 10 | 11 | ```shell 12 | $ python3 example.py 13 | ``` 14 | 15 | Before running the program, you need to place your `calpuff.exe` into the `exe/` directory and all related data to the `data/` directory. To try the example, put your `calmet.dat` into the `data/winter/` directory which is generated by CALMET model. 16 | 17 | ## Explanation 18 | 19 | The main idea is to use a class called `InpGroup` to operate the parameters by its methods. In the example below you will see operations like setting directory path, setting species information, setting source information and so on. In fact these operations just save the information into the data structure contained in the `InpGroup` class. When you call `calpy.run_calpuff()` function, it will output all the parameters to a file called `calpuff.inp` and run the `calpuff.exe` in the `exe/` directory. 20 | 21 | The information (*i.e.*, data) should be stored in the csv files in `data/` directory. As long as you set them right, `calpy` will do the things left, *e.g.*, setting number of species and sources. If you need to do multiple tasks, you can create a sub-directory in `data/` just like the example, where it uses a `data/winter/` directory to place all the data files and set this prefix by `InpGroup.set_data_dir("data/winter/")`. See code below for details. 22 | 23 | ## Limitation 24 | 25 | The module is too simple for practical purposes. So you may need to understand this module before using it. It only support Lambert projection and use a base `calpuff_template.inp` file in the `utils/` directory to set default parameters value. So you may need to alter to your own `calpuff_template.inp` file. 26 | 27 | If you want to manage other preprocessors INP files, you may need to implement them yourself. Since CALPUFF model's INP file is the most complicated one, other INP files management is easy. 28 | 29 | ## Summary 30 | 31 | The project directory should be like: 32 | 33 | ``` 34 | . 35 | ├── calpy.py 36 | ├── clean.py 37 | ├── data 38 | │   └── winter 39 | │   ├── area_source.csv 40 | │   ├── calmet.dat 41 | │   ├── receptors_info.csv 42 | │   ├── samples.csv 43 | │   ├── source_emission.csv 44 | │   ├── source_info.csv 45 | │   ├── species_decay.csv 46 | │   └── species_options.csv 47 | ├── exe 48 | │   └── calpuff.exe 49 | ├── images 50 | ├── output 51 | │   └── winter 52 | ├── utils 53 | │   └── calpuff_template.inp 54 | └── yourCode.py 55 | ``` 56 | 57 | ## Example 58 | 59 | ```python 60 | import calpy 61 | 62 | params = { 63 | # CALMET file 64 | "metFile": "calmet.dat", 65 | # time -- Input Group 1 66 | "startYear": 2019, "startMonth": 1, "startDay": 23, "startHour": 0, 67 | "endYear": 2019, "endMonth": 1, "endDay": 23, "endHour": 12, 68 | "timeZone": "UTC+0000", 69 | "timeStep": 3600, # no larger than 3600 70 | # lambert projection -- Input Grroup 4 71 | "lambertlat1": "25N", 72 | "lambertlat2": "40N", 73 | "centerLat0": "31N", 74 | "centerLon0": "120E", 75 | # grids -- Input Grroup 4 76 | "nx": 60, "ny": 60, "nz": 11, "cellsize": 1, 77 | "zface": [0, 20, 40, 80, 160, 320, 640, 78 | 1000, 1500, 2000, 2500, 3000], # length should be `nz`+1 79 | "xorigin": -30, "yorigin": -30 80 | } 81 | group = calpy.load_calpuff() 82 | group.set_data_dir("data/winter") 83 | group.set_output_dir("output/winter") 84 | group.set_exe_dir("exe/") 85 | group.set_params(params) 86 | group.load_species_options(unit="ug/m**3") 87 | print("species:\n", group.speciesList) 88 | group.load_species_decay() 89 | # print("decay:\n", group.speciesDecay) 90 | group.load_source_info() 91 | # print("source:\n", group.sourceInfo) 92 | group.load_source_emission(unit="g/s") 93 | # print("emissn:\n", group.sourceEmiss) 94 | group.load_receptors_info() 95 | # print("receptors:\n", group.receptors) 96 | #group.load_area_source() 97 | 98 | calpy.run_calpuff(group, disp=True) # run CALPUFF 99 | 100 | times, samples = calpy.load_samples(group, timeZone="UTC+0800", filename="samples.csv") 101 | timeseries = calpy.extract_receptors(group) 102 | simulates = timeseries.get_simulates(times) # get simulated concentrations of each receptors 103 | 104 | # do something 105 | ``` 106 | 107 | This will load all the information set in `data/winter/` and run the model. All the output of CALPUFF model will be put into `output/winter/` directory. 108 | 109 | There are example csv files in this repository. The first columns of `source_info.csv` and `species_options.csv` are "%process" which indicate whether to add the source or species into the INP file, 1 for yes and 0 for no. 110 | 111 | Area source's csv file is too simple and crude for I didn't have time to re-design it. You may want to rewrite this part on your own. 112 | 113 | `clean.py` is used to clean the annoying files created by CALPUFF. 114 | -------------------------------------------------------------------------------- /calpy.py: -------------------------------------------------------------------------------- 1 | """CALPUFF model managing module 2 | 3 | Including: 4 | - functions and class to read and write CALPUFF INP file 5 | - functions to read CALPUFF LST file and draw plots 6 | - functions for inversion 7 | 8 | INP file is a parameters file for CALPUFF model. Only data within the 9 | delimeters('!') are processed. 10 | 11 | LST file is the CALPUFF output log file. 12 | 13 | Author: Pavinberg 14 | Email: pavin0702@gmail.com 15 | 16 | """ 17 | 18 | import sys 19 | import re 20 | import datetime 21 | import pathlib 22 | import subprocess 23 | import itertools as it 24 | from collections import OrderedDict 25 | import numpy as np 26 | import pandas as pd 27 | import matplotlib.pyplot as plt 28 | import pygal 29 | 30 | 31 | __all__ = [ 32 | "InpGroups", "Series", "load_calpuff", "dump_calpuff", "run_calpuff", 33 | "get_coef", "extract_receptors", "extract_proportions", 34 | "load_samples", "draw_position", "draw_concentrations" 35 | ] 36 | 37 | 38 | unitsVel = { 39 | "g/s": 1, 40 | "kg/h": 2, 41 | "lb/hr": 3, 42 | "tons/yr": 4, 43 | "m**3/s": 5, 44 | "m**3/min": 6, 45 | "mtons/yr": 7, 46 | "Bq/s": 8, 47 | "GBq/yr": 9 48 | } 49 | 50 | unitsConc = { 51 | "g/m**3": 1, 52 | "mg/m**3": 2, 53 | "ug/m**3": 3, 54 | "ng/m**3": 4, 55 | "odour": 5, 56 | "TBq/m**3": 6, 57 | "GBq/m**3": 7, 58 | "Bq/m**3": 8 59 | } 60 | 61 | 62 | class InpGroups: 63 | """A class to manage INP file information""" 64 | def __init__(self, idname="NULL", groups=None): 65 | self.id = idname # module name of these groups 66 | self.groups = groups 67 | self._keys = {} # key: variable - value: group number it belongs to 68 | # init keys from groups 69 | for i, group in enumerate(groups): 70 | for key in group.keys(): 71 | if key in self._keys.keys(): 72 | raise ValueError(f"duplicate variable name {key} " 73 | f"in group{self._keys[key]} and {i}") 74 | self._keys[key] = i 75 | defaultParams = { 76 | # filenames -- Input Group 0 77 | "metFile": "calmet.dat", 78 | # time -- Input Group 1 79 | "startYear": 2019, "startMonth": 1, "startDay": 1, "startHour": 0, 80 | "endYear": 2019, "endMonth": 1, "endDay": 2, "endHour": 0, 81 | "timeZone": "UTC+0000", 82 | "timeStep": 3600, # no larger than 3600 83 | # lambert projection -- Input Grroup 4 84 | "lambertlat1": "25N", 85 | "lambertlat2": "40N", 86 | "centerLat0": "31N", 87 | "centerLon0": "120E", 88 | # grids -- Input Grroup 4 89 | "nx": 60, "ny": 60, "nz": 11, "cellsize": 0.1, 90 | "zface": [0, 20, 40, 80, 160, 320, 640, 91 | 1000, 1500, 2000, 2500, 3000], # length should be `nz`+1 92 | "xorigin": -3, "yorigin": -3 93 | } 94 | self.params = defaultParams 95 | self.dataDir = "data/" 96 | self.outDir = "output/" 97 | self.exeDir = "exe/" 98 | 99 | def __getitem__(self, varname): 100 | return self.groups[self._keys[varname]][varname] 101 | 102 | def __setitem__(self, varname, value): 103 | if isinstance(value, list): 104 | self.groups[self._keys[varname]][varname] = str(value)[1:-1] 105 | elif type(value) in [int, float, str]: 106 | self.groups[self._keys[varname]][varname] = value 107 | else: 108 | raise ValueError( 109 | f"\033[0;31;1mThere is an exception at line 114 in calpy.py" 110 | f"with type {type(value)}. Please contact the author" 111 | f"(pavin0702@gmail.com) with this information. " 112 | f"Thank You!\033[0m") 113 | 114 | def __len__(self): 115 | return len(self.groups) 116 | 117 | def set_data_dir(self, dirname: str): 118 | self.dataDir= dirname 119 | 120 | def set_output_dir(self, dirname: str): 121 | self.outDir = dirname 122 | 123 | def set_exe_dir(self, dirname: str): 124 | self.exeDir = dirname 125 | 126 | def set_params(self, params: dict = None): 127 | """Parse a dict to set some common parameters by alias names. 128 | Keys of params and their default values are: 129 | 130 | defaultParams = { 131 | # filenames -- Input Group 0 132 | "metFile": "calmet.dat", 133 | # time 134 | "startYear": 2019, "startMonth": 1, "startDay": 1, "startHour": 0, 135 | "endYear": 2019, "endMonth": 1, "endDay": 2, "endHour": 0, 136 | "timeZone": "UTC+0000", 137 | "timeStep": 3600, 138 | # lambert projection 139 | "lambertlat1": "25N", 140 | "lambertlat2": "40N", 141 | "centerLat0": "31N", 142 | "centerLon0": "120E", 143 | # grids 144 | "nx": 60, "ny": 60, "nz": 11, "cellsize": 0.1, 145 | "zface": [0, 20, 40, 80, 160, 320, 640, 146 | 1000, 1500, 2000, 2500, 3000], 147 | "xorigin": -3, "yorigin": -3 148 | } 149 | 150 | Args: 151 | 152 | params (dict/None): parameters to set. 153 | Default to None to set defaultParams. 154 | 155 | """ 156 | if self.id != "CALPUFF": 157 | raise ValueError(f"this InpGroups id is {self.id}. You should " 158 | f"load species only when the id is 'CALPUFF'.") 159 | if params: 160 | for key, value in params.items(): 161 | if key in self.params.keys(): 162 | self.params[key] = value 163 | else: 164 | raise KeyError(f"Unknown parameter \"{key}\"") 165 | realname = { 166 | # filenames -- Input Group 0 167 | "metFile": "METDAT", 168 | # time -- Input Group 1 169 | "startYear": "IBYR", "startMonth": "IBMO", "startDay": "IBDY", "startHour": "IBHR", 170 | "endYear": "IEYR", "endMonth": "IEMO", "endDay": "IEDY", "endHour": "IEHR", 171 | "timeZone": "ABTZ", 172 | "timeStep": "NSECDT", 173 | # lambert projection -- Input Group 4 174 | "lambertlat1": "XLAT1", 175 | "lambertlat2": "XLAT2", 176 | "centerLat0": "RLAT0", 177 | "centerLon0": "RLON0", 178 | # grids -- Input Grroup 4 179 | "nx": "NX", "ny": "NY", "nz": "NZ", "cellsize": "DGRIDKM", 180 | "zface": "ZFACE", 181 | "xorigin": "XORIGKM", "yorigin": "YORIGKM" 182 | } 183 | for key, value in self.params.items(): 184 | real = realname[key] 185 | self.groups[self._keys[real]][real] = value 186 | self.groups[4]["IECOMP"] = self.params["nx"] 187 | self.groups[4]["IESAMP"] = self.params["nx"] 188 | self.groups[4]["JECOMP"] = self.params["ny"] 189 | self.groups[4]["JESAMP"] = self.params["ny"] 190 | self.groups[4]["ZFACE"] = str(self.params["zface"])[1:-1] 191 | self.groups[0]["METDAT"] = pathlib.Path(self.dataDir) \ 192 | / self.params['metFile'] 193 | outputFile = ["PUFLST", "CONDAT"] 194 | for param in outputFile: 195 | self.groups[0][param] = pathlib.Path(self.outDir) \ 196 | / pathlib.Path(self.groups[0][param]).name 197 | 198 | def load_species_options(self, filename="species_options.csv", 199 | unit="ug/m**3"): 200 | ''' load species basic information from a csv file. 201 | The header of csv file should be as follows: 202 | 203 | spec, modeled, emitted, deposited, droplets, 204 | conc_printed, conc_saved, dryflux_printed, dryflux_saved, 205 | wetflux_printed, wetflux_saved, massflux_saved 206 | 207 | ''' 208 | if self.id != "CALPUFF": 209 | raise ValueError(f"this InpGroups id is {self.id}. You should " 210 | f"load species only when the id is 'CALPUFF'.") 211 | 212 | filefullname = pathlib.Path(self.dataDir) / filename 213 | specOpt = pd.read_csv(filefullname, dtype=object) 214 | self.speciesList = specOpt[specOpt["%process"] == "1"]["spec"].to_numpy() 215 | self.speciesNum = len(self.speciesList) 216 | self.groups[1]["NSPEC"] = self.speciesNum 217 | self.groups[1]["NSE"] = self.speciesNum 218 | self.groups[5]["IPRTU"] = unitsConc[unit] 219 | 220 | def set_species(self, species): 221 | self.speciesList = np.array(species) 222 | self.speciesNum = len(self.speciesList) 223 | self.groups[1]["NSPEC"] = self.speciesNum 224 | self.groups[1]["NSE"] = self.speciesNum 225 | 226 | def load_species_decay(self, filename="species_decay.csv"): 227 | ''' load species decay half-life parameters. 228 | Use after load_species_options. 229 | ''' 230 | if self.id != "CALPUFF": 231 | raise ValueError(f"this InpGroups id is {self.id}. You should " 232 | f"load species only when the id is 'CALPUFF'.") 233 | if not hasattr(self, "speciesList"): 234 | raise ValueError(f"should call InpGroups.load_species_options before" 235 | f" calling InpGroups.load_species_decay") 236 | colOrder = ['spec', 'half-life', 'mass-yield'] 237 | filefullname = pathlib.Path(self.dataDir) / filename 238 | decay = pd.read_csv(filefullname, dtype=object)[colOrder] 239 | cond = [False] * decay.shape[0] 240 | speciesSet = set(self.speciesList) 241 | for i, row in decay.iterrows(): 242 | if row['spec'] in speciesSet: 243 | cond[i] = True 244 | self.speciesDecay = decay[cond].to_numpy() 245 | self.groups[11]["NDECAY"] = self.speciesDecay.shape[0] 246 | self.groups[2]["MCHEM"] = 5 247 | 248 | def load_source_info(self, filename="source_info.csv"): 249 | if self.id != "CALPUFF": 250 | raise ValueError(f"this InpGroups id is {self.id}. You should " 251 | f"load species only when the id is 'CALPUFF'.") 252 | colOrder = ['src', 'X', 'Y', 'stack-height', 'elevation', 253 | 'diameter', 'velocity', 'temperature', 'downwash'] 254 | filefullname = pathlib.Path(self.dataDir) / filename 255 | srcInfo = pd.read_csv(filefullname, dtype=object) 256 | self.sourceInfo = srcInfo[srcInfo["%process"] == "1"][colOrder].to_numpy() 257 | self.sourceNum = self.sourceInfo.shape[0] 258 | self.groups[13]["NPT1"] = self.sourceNum 259 | 260 | def load_source_emission(self, filename="source_emission.csv", unit="g/s"): 261 | if self.id != "CALPUFF": 262 | raise ValueError(f"this InpGroups id is {self.id}. You should " 263 | f"load species only when the id is 'CALPUFF'.") 264 | if not (hasattr(self, "speciesList") and hasattr(self, "sourceInfo")): 265 | raise ValueError(f"should call InpGroups.load_source_info and " 266 | f"InpGroups.load_species_options before calling" 267 | f"InpGroups.load_source_emission") 268 | filefullname = pathlib.Path(self.dataDir) / filename 269 | srcEmissAll = pd.read_csv(filefullname, dtype=object, index_col=0) 270 | try: 271 | srcEmiss = srcEmissAll.loc[self.sourceInfo[:, 0], self.speciesList] 272 | except KeyError: 273 | raise ValueError( 274 | "source emissions file does not contain all species that you specified." 275 | ) 276 | self.sourceEmiss = srcEmiss.to_numpy().astype(float) 277 | self.groups[13]["IPTU"] = unitsVel[unit] 278 | 279 | def load_receptors_info(self, filename="receptors_info.csv"): 280 | """Read receptors information from a csv file 281 | 282 | Args: 283 | 284 | filename (str, optional): csv file name to read. 285 | Defaults to "receptors.csv". 286 | 287 | """ 288 | colOrder = ["ID", "coorX", "coorY", "coorZ"] 289 | filefullname = pathlib.Path(self.dataDir) / filename 290 | self.receptors = pd.read_csv(filefullname, dtype=object)[colOrder].to_numpy() 291 | self.receptorsNum = self.receptors.shape[0] 292 | self.groups[21]["NREC"] = self.receptorsNum 293 | 294 | def load_area_source(self, filename="area_source.csv", unit="g/s"): 295 | ''' First line is basic information. 296 | Second line is polygon's X and third line is Y. 297 | Forth line is emissions rate of the species 298 | ''' 299 | if self.id != "CALPUFF": 300 | raise ValueError(f"this InpGroups id is {self.id}. You should " 301 | f"load species only when the id is 'CALPUFF'.") 302 | filefullname = pathlib.Path(self.dataDir) / filename 303 | with open(filefullname, "r") as fp: 304 | self.areaSource = np.array(fp.readline().strip().split(',')) 305 | self.areaSourceCoor = [None] * 2 306 | self.areaSourceCoor[0] = np.array(fp.readline().strip().split(',')) 307 | self.areaSourceCoor[1] = np.array(fp.readline().strip().split(',')) 308 | self.areaSourceEmiss = np.array(fp.readline().strip().split(',')) 309 | if len(self.areaSourceEmiss) != self.speciesNum: 310 | raise ValueError( 311 | f"area source file species number not corresponded to " 312 | f"species specified " 313 | ) 314 | self.groups[14]["NAR1"] = 1 315 | self.groups[14]["IARU"] = unitsVel[unit] 316 | 317 | def reset_source_emission(self, sourceEmiss): 318 | """Quick reset a new matrix of source emissions""" 319 | self.sourceEmiss = sourceEmiss 320 | 321 | def set_source_emission(self, sourceEmiss: np.ndarray, unit=None): 322 | if unit: 323 | self.groups[13]["IPTU"] = unitsVel[unit] 324 | if self.id != "CALPUFF": 325 | raise ValueError(f"this InpGroups id is {self.id}. You should " 326 | f"load species only when the id is 'CALPUFF'.") 327 | self.sourceEmiss = sourceEmiss 328 | 329 | def set_area_source_emission(self, areaEmiss): 330 | self.areaSourceEmiss = areaEmiss 331 | 332 | def dump_source_emission(self, filename): 333 | with open(filename, "w") as fp: 334 | fp.write(f"src,{','.join(self.speciesList)}\n") 335 | srcEmiss = [] 336 | for line in self.sourceEmiss: 337 | srcEmiss.append(list(map(lambda x: f"{x:.4f}", line))) 338 | mat = np.hstack((self.sourceInfo[:, 0:1], srcEmiss)) 339 | for line in mat: 340 | fp.write(",".join(line) + '\n') 341 | 342 | def printGroup(self, groupnum: int): 343 | if groupnum > len(self.groups): 344 | raise ValueError( 345 | "group number out of range. There are {len(self.groups)} groups." 346 | ) 347 | for key, value in self.groups[groupnum].items(): 348 | if key[:3] != "END": 349 | print(f"{key:<8} = {value}") 350 | 351 | def dump(self, fp, groupnum: int = -1): 352 | ''' output parameters of group: `groupname` to file pointer fp. 353 | If groupnum == -1: output all groups. 354 | ''' 355 | if groupnum > len(self.groups): 356 | raise ValueError( 357 | "group number out of range. There are {len(self.groups)} groups." 358 | ) 359 | if groupnum == -1: 360 | # dump all groups 361 | for group in self.groups: 362 | for key, value in group.items(): 363 | fp.write(f"! {key} = {value} !\n") 364 | fp.write("!END!\n") 365 | else: 366 | for key, value in self.groups[groupnum].items(): 367 | fp.write(f"! {key} = {value} !\n") 368 | fp.write("!END!\n") 369 | 370 | def raw_set(self, **kwargs): 371 | ''' set parameters in groups with real name ''' 372 | for key, value in kwargs.items(): 373 | if key in self._keys.keys(): 374 | self.groups[self._keys[key]][key] = value 375 | else: 376 | raise ValueError(f"variable name {key} not found in InpGroups") 377 | 378 | def get_time_info(self): 379 | """get start date, end date and time step 380 | 381 | Returns: 382 | 383 | datetime.datetime: start date 384 | datetime.datetime: end date 385 | datetime.timedelta: time step 386 | """ 387 | startDate = datetime.datetime( 388 | self.params["startYear"], self.params["startMonth"], 389 | self.params["startDay"], self.params["startHour"] 390 | ) 391 | endDate = datetime.datetime( 392 | self.params["endYear"], self.params["endMonth"], 393 | self.params["endDay"], self.params["endHour"] 394 | ) 395 | timeStep = datetime.timedelta(seconds=self.params["timeStep"]) 396 | return startDate, endDate, timeStep 397 | 398 | 399 | def basic_read(content: str) -> OrderedDict: 400 | ''' read parameters from a template string ''' 401 | items = re.findall("!.*?!", content) 402 | params = OrderedDict() 403 | for item in items: 404 | pair = re.split("!|=", item[1:-1]) 405 | pair = list(map(str.strip, pair)) 406 | if pair[0] == "END": 407 | ... 408 | # global ENDCount 409 | # params[f"END{ENDCount}"] = ENDCount 410 | # ENDCount += 1 411 | else: 412 | params[pair[0]] = pair[1] 413 | return params 414 | 415 | 416 | def load_calpuff(filename="utils/calpuff_template.inp") -> InpGroups: 417 | """load calpuff_template.inp as template 418 | 419 | Args: 420 | filename (str, optional): calpuff template INP file. 421 | 422 | Returns: 423 | calpy.InpGroups: a class to manage INP file parameters. 424 | """ 425 | SPECIAL_GROUPS = [3, 7, 8] 426 | with open(filename, "r") as fp: 427 | contents = fp.read().split("INPUT GROUP")[1:] 428 | if len(contents) != 22: 429 | print("Should have 22 groups. Check the file input.") 430 | sys.exit() 431 | grps = [None] * 22 432 | for i, content in enumerate(contents): 433 | if i in SPECIAL_GROUPS: 434 | grps[i] = OrderedDict() 435 | else: 436 | grps[i] = basic_read(content) 437 | return InpGroups(idname="CALPUFF", groups=grps) 438 | 439 | 440 | def cut_line(line, maxlength=80): 441 | pos = [i for i, ch in enumerate(line) if ch == ","] 442 | nx = [] 443 | old = 0 444 | for idx, nxt in zip(pos, np.roll(pos, shift=-1)): 445 | if nxt - old >= maxlength: 446 | nx.append(line[old:idx+1]) 447 | old = idx + 1 448 | nx.append(line[old:]) 449 | return "\n".join(nx) 450 | 451 | 452 | def dump_calpuff(groups: InpGroups, filename="calpuff.inp"): 453 | ''' output a calpuff.inp file''' 454 | if groups.id != "CALPUFF": 455 | raise ValueError("groups' id should be 'CALPUFF'") 456 | 457 | def group3dump(fp, i): 458 | if hasattr(groups, "speciesList"): 459 | for spec in groups.speciesList: 460 | fp.write(f"! CSPEC = {spec} ! !END!\n") 461 | for spec in groups.speciesList: 462 | fp.write(f"! {spec} = 1, 1, 0, 0, 0 !\n") 463 | fp.write("!END!\n") 464 | 465 | def group5dump(fp, i): 466 | if hasattr(groups, "speciesList"): 467 | for spec in groups.speciesList: 468 | fp.write(f"! {spec} = 1, 1, 0, 0, 0, 0, 0 !\n") 469 | groups.dump(fp, 5) 470 | 471 | def group7dump(fp, i): 472 | fp.write("!END!\n") 473 | 474 | def group8dump(fp, i): 475 | fp.write("!END!\n") 476 | 477 | def group10dump(fp, i): 478 | fp.write("!END!\n") 479 | groups.dump(fp, 10) 480 | 481 | def group11dump(fp, i): 482 | groups.dump(fp, 11) 483 | if hasattr(groups, "speciesDecay"): 484 | for line in groups.speciesDecay: 485 | fp.write(f"! {line[0]} = {line[1]}, {line[2]} ! !END!\n") 486 | #fp.write("!END!\n") 487 | fp.write("!END!\n") 488 | 489 | def group13dump(fp, i): 490 | groups.dump(fp, 13) 491 | if hasattr(groups, "sourceInfo"): 492 | srcEmiss = groups.sourceEmiss 493 | for line, emiss in zip(groups.sourceInfo, srcEmiss): 494 | emissStr = list(map(lambda x: f"{x:.4f}", emiss)) 495 | xline = ','.join(np.concatenate([line[1:], emissStr])) 496 | xline = f"! X = {xline} !\n" 497 | if len(xline) > 80: 498 | xline = cut_line(xline) 499 | 500 | fp.write( 501 | f"! SRCNAM = {line[0]} !\n" 502 | f"{xline}" 503 | f"! ZPLTFM = 0 !\n" 504 | f"! FMFAC = 1.0 ! " 505 | f"!END!\n") 506 | 507 | def group14dump(fp, i): 508 | groups.dump(fp, 14) 509 | if hasattr(groups, "areaSource"): 510 | fp.write(f"! SRCNAM = {groups.areaSource[0]} !\n") 511 | xline = (f"! X = {','.join(groups.areaSource[1:])}," 512 | f" {','.join(groups.areaSourceEmiss)} ! !END!\n") 513 | # if len(xline) > 80: 514 | # xline = cut_line(xline) 515 | fp.write(xline) 516 | fp.write(f"! SRCNAM = {groups.areaSource[0]} !\n") 517 | fp.write(f"! XVERT = {','.join(groups.areaSourceCoor[0])} !\n") 518 | fp.write(f"! YVERT = {','.join(groups.areaSourceCoor[1])} ! !END!\n") 519 | 520 | def group21dump(fp, i): 521 | groups.dump(fp, 21) 522 | if hasattr(groups, "receptors"): 523 | for line in groups.receptors: 524 | fp.write(f"! X = {line[1]}, {line[2]}, {line[3]} ! !END!\n") 525 | 526 | def default(fp, i): 527 | groups.dump(fp, i) 528 | 529 | groups_func = { 530 | 3: group3dump, 531 | 5: group5dump, 532 | 7: group7dump, 533 | 8: group8dump, 534 | 10: group10dump, 535 | 11: group11dump, 536 | 13: group13dump, 537 | 14: group14dump, 538 | 21: group21dump 539 | } 540 | 541 | # !!CAREFUL!! the first line of title is very important. 542 | # It must contain 3 parts with lengths of 16+16+(48) repectively. 543 | # Use spaces for pacing. Make sure the 32 < length <= 80. 544 | title = "CALPUFF.INP 7.01 Created by inp-module\n" 545 | # |---------------|---------------|----------------------------------------------| 546 | # 0 16 32 80 547 | 548 | # filefullname = pathlib.Path(groups.exeDir) / filename 549 | with open(filename, "w") as fp: 550 | fp.write(title+"\n\n\n") 551 | for i in range(len(groups)): 552 | groups_func.get(i, default)(fp, i) 553 | 554 | 555 | def run_calpuff(groups: InpGroups, exe="calpuff.exe", disp=True): 556 | """Run CALPUFF model with the groups 557 | 558 | Args: 559 | 560 | groups (InpGroups): InpGroups with parameters to run the model 561 | 562 | exe (str, optional): calpuff executable file name. 563 | Defaults to "exe/calpuff.exe". 564 | 565 | Returns: 566 | 567 | bool: True if run successfully. 568 | """ 569 | dump_calpuff(groups) 570 | exefilename = pathlib.Path(groups.exeDir) / exe 571 | ret = subprocess.run(str(exefilename), stdout=subprocess.PIPE, stderr=subprocess.PIPE) 572 | if disp: 573 | print(ret.stdout.decode("utf8")) 574 | print(ret.stderr.decode("utf8")) 575 | if b"HALTED" in ret.stderr or b"ERROR" in ret.stderr or b"severe" in ret.stderr: 576 | print("Error when running calpuff") 577 | sys.exit() 578 | return True 579 | 580 | 581 | def get_coef(groups: InpGroups, simulates: np.ndarray): 582 | """get coefficient which is (C/Q)_sim 583 | 584 | Args: 585 | 586 | groups (calpy.InpGroups): paramenters 587 | 588 | simulates (numpy.ndarray): simulated result created by the model. 589 | dimension: [species x receptors x (source+1)] 590 | 591 | Returns: 592 | 593 | numpy.ndarray: [species x receptors x source] 594 | 595 | """ 596 | simu = simulates[:, :, :-1] # last vectors are total, should be excluded 597 | src = groups.sourceEmiss.transpose() 598 | # for every species 599 | mp = map(lambda sim, emiss: np.nan_to_num(sim / emiss), simu, src) 600 | return np.array(list(mp)) 601 | 602 | 603 | class Series: 604 | """storage time series as a 4-dimensions numpy array. 605 | 606 | period_number x source_number x receptors_number x species_number 607 | """ 608 | def __init__(self, timeSeries: np.ndarray, startDate: datetime.datetime, 609 | timeStep: datetime.timedelta): 610 | self.timeSeries = timeSeries 611 | self.startDate = startDate 612 | self.timeStep = timeStep 613 | self.shape = timeSeries.shape 614 | self.sourceNum = self.shape[1] - 1 615 | self.speciesNum = self.shape[3] 616 | self.iteri = 0 617 | 618 | def __iter__(self): 619 | self.iteri = 0 620 | return self 621 | 622 | def __next__(self): 623 | if self.iteri < self.speciesNum: 624 | frame = self.timeSeries[self.iteri] 625 | self.iteri += 1 626 | return frame 627 | raise StopIteration 628 | 629 | def get_simulates(self, times: list): 630 | # species x receptors x sources 631 | simulates = np.empty((self.speciesNum, len(times), self.sourceNum + 1)) 632 | for recep, time in enumerate(times): 633 | simulates[:, recep, :] = self.timeSeries[time, :, recep, :].transpose() 634 | return simulates 635 | 636 | 637 | def extract_receptors(groups: InpGroups, filename=None): 638 | """read calpuff.lst file and get concentrations 639 | information for each receptors 640 | 641 | """ 642 | if groups.id != "CALPUFF": 643 | raise ValueError("groups' id should be 'CALPUFF'") 644 | if not filename: 645 | filename = groups["PUFLST"] 646 | startDate, endDate, timeStep = groups.get_time_info() 647 | timeFramesNum = (endDate - startDate) // timeStep # should be divided exactly 648 | sourceNum = groups.sourceNum 649 | if hasattr(groups, "areaSource"): 650 | sourceNum += 1 651 | recepNum = groups.receptorsNum 652 | speciesNum = groups.speciesNum 653 | seriesLen = timeFramesNum * (sourceNum + 1) 654 | 655 | series = np.empty((seriesLen, recepNum, speciesNum)) 656 | with open(filename, "r") as fp: 657 | blocks = it.filterfalse( 658 | lambda x: x[0], 659 | it.groupby(fp, lambda x: x.startswith(" Receptor No.")) 660 | ) 661 | blocks = it.islice(blocks, 1, None) # drop the first one 662 | for iframe, block in zip(range(seriesLen), blocks): 663 | for irecp, line in zip(range(recepNum), block[1]): 664 | record = line.split()[1:] 665 | series[iframe, irecp] = np.array(list(map(float, record))) 666 | series = series.reshape(timeFramesNum, sourceNum + 1, recepNum, speciesNum) 667 | # series = series.transpose(3, 0, 1, 2) # species x time x source x receptors 668 | return Series(series, startDate, timeStep) 669 | 670 | 671 | def extract_proportions(groups: InpGroups): 672 | """ Get species proportions of each source 673 | and the total source emission rates 674 | 675 | Returns: 676 | 677 | numpy.ndarray: proportions, [sources x species] 678 | numpy.ndarray: total emission of every source [sources x 1] 679 | """ 680 | srcEmiss = groups.sourceEmiss 681 | total = np.array([np.sum(src) for src in srcEmiss]).reshape(-1, 1) 682 | return total, np.nan_to_num(srcEmiss / total) 683 | 684 | 685 | def load_samples(groups: InpGroups, filename="samples.csv", timeZone="UTC+0800"): 686 | if not re.match(r"UTC[+|-](0\d|1[012])", timeZone): 687 | raise ValueError(f"unknown format of UTC time zone '{timeZone}''. " 688 | f"Should be like 'UTC+0800' ") 689 | filefullname = pathlib.Path(groups.dataDir) / filename 690 | df = pd.read_csv(filefullname, index_col=0) 691 | try: 692 | concentrations = df.loc[groups.receptors[:, 0], groups.speciesList].to_numpy() 693 | except KeyError: 694 | raise ValueError( 695 | "samples file does not contain all species that you specified." 696 | ) 697 | 698 | def getDatetime(dateStr: str): 699 | dateList = np.array(dateStr.split("-")).astype(int) 700 | return datetime.datetime(*dateList) 701 | 702 | def getIndex(date: datetime.datetime): 703 | startDate, _, timeStep = groups.get_time_info() 704 | return (date - startDate) // timeStep 705 | 706 | timeDiff = int(timeZone[3:6]) - int(groups.params['timeZone'][3:6]) 707 | dates = df['time'].apply(getDatetime) 708 | times = np.array(list(map(getIndex, dates))) 709 | times = times - timeDiff # index of time corresponded to receptors 710 | return times, concentrations 711 | 712 | 713 | def draw_position(groups, filename="position.svg", dir="images", 714 | drawSource=True, drawReceptors=True): 715 | ''' plot sources' and receptors' position ''' 716 | from pygal import Config 717 | config = Config() 718 | config.title = "Position" 719 | config.show_lengend = False 720 | config.height = 500 721 | config.stroke = False 722 | config.dots_size = 2.5 723 | plot = pygal.XY( 724 | config, x_title="X/m", y_title="Y/m", show_x_guides=True, 725 | print_labels=True, style=pygal.style.styles["default"] 726 | (value_font_size=2) 727 | ) 728 | if drawSource: 729 | src = groups.sourceInfo 730 | meta = [] 731 | for line in src: 732 | name = line[0] 733 | coor = line[1:3].astype(float) * 1000 734 | meta.append({'value': tuple(coor), 'label': name}) 735 | plot.add("sources", meta) 736 | if drawReceptors: 737 | recep = groups.receptors 738 | meta = [] 739 | for line in recep: 740 | name = line[0] 741 | coor = line[1:3].astype(float) * 1000 742 | meta.append({'value': tuple(coor), 'label': name, 'dots_size': 2}) 743 | plot.add("receptors", meta) 744 | plot.render_to_file(pathlib.Path(dir) / filename) 745 | 746 | 747 | def draw_concentrations(groups: InpGroups, species=None, 748 | filenmae="images/concentration.png", 749 | inputfile=None, drawSource=True, drawReceptors=True): 750 | ''' read the calpost output about concentrations and plot a heatmap''' 751 | xorigin, yorigin = groups.params['xorigin'], groups.params['yorigin'] 752 | nx, ny = groups.params['nx'], groups.params['ny'] 753 | cellsize = groups.params['cellsize'] 754 | minx, miny = 0, 0 755 | maxx, maxy = nx, ny 756 | 757 | if drawSource: 758 | coors = groups.sourceInfo[:, 1:3].astype(float).T 759 | srcx = (coors[0] - xorigin) / cellsize 760 | srcy = (coors[1] - yorigin) / cellsize 761 | minx, miny = np.min(srcx), np.min(srcy) 762 | maxx, maxy = np.max(srcx), np.max(srcy) 763 | if drawReceptors: 764 | coors = groups.receptors[:, 1:3].astype(float).T 765 | recpx = (coors[0] - xorigin) / cellsize 766 | recpy = (coors[1] - yorigin) / cellsize 767 | minx, miny = min(minx, np.min(recpx)), min(miny, np.min(recpy)) 768 | maxx, maxy = max(maxx, np.max(recpx)), max(maxy, np.max(recpy)) 769 | 770 | margin = int(max(nx, ny) * 0.05) 771 | minx, miny = max(int(minx) - margin, 0), max(int(miny) - margin, 0) 772 | maxx, maxy = min(int(maxx) + margin, nx), min(int(maxy) + margin, ny) 773 | 774 | if inputfile is None: 775 | if species is None: 776 | raise ValueError("parse species name as argument") 777 | species = species.lower() 778 | concfile = f"output/calpost/rank(0)_{species}_12hr_conc.csv" 779 | else: 780 | concfile = inputfile 781 | with open(concfile) as fp: 782 | for i in range(6): 783 | fp.readline() 784 | df = pd.read_csv(fp, header=None) 785 | conc = df.iloc[:, 2].to_numpy() 786 | concgrid = conc.reshape(nx, ny) 787 | plt.pcolor(concgrid, cmap=plt.cm.Blues) 788 | plt.colorbar() 789 | if drawSource: 790 | plt.scatter(srcx, srcy, label="sources", c="red", alpha=0.5, s=10) 791 | plt.legend() 792 | if drawReceptors: 793 | plt.scatter(recpx, recpy, label="receptors", c="orange", alpha=0.5, s=10) 794 | plt.legend() 795 | plt.xlim(minx, maxx) 796 | plt.ylim(miny, maxy) 797 | plt.title(species) 798 | plt.show() 799 | -------------------------------------------------------------------------------- /clean.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | removeList = ["luse.clr", "pftrak.dat", "qagrid.bna", "qaluse.grd", 4 | "qapnts.dat", "qarecd.dat", "qarecg.dat", "qaterr.grd"] 5 | 6 | for file in removeList: 7 | os.remove(file) 8 | 9 | print("Cleaned") -------------------------------------------------------------------------------- /data/winter/area_source.csv: -------------------------------------------------------------------------------- 1 | AREA, 1.5, 0.0, 0.1 2 | 0.25, 0.25, 0.40, 0.40 3 | 0.37, 0.46, 0.46, 0.37 4 | 0.000,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001 -------------------------------------------------------------------------------- /data/winter/receptors_info.csv: -------------------------------------------------------------------------------- 1 | ID,coorX,coorY,coorZ 2 | RECP1,7.395,3.3845,3 3 | RECP2,8.383,4.4776,5 4 | RECP3,7.353,4.4535,3 5 | RECP4,8.959,3.3842,5 -------------------------------------------------------------------------------- /data/winter/samples.csv: -------------------------------------------------------------------------------- 1 | ID,time,SPEC1,SPEC2,SPEC3,SPEC4 2 | RECP1,2019-1-23-11,1.482,3.666,8.214,3.022 3 | RECP2,2019-1-23-13,2.451,6.631,7.882,3.093 4 | RECP3,2019-1-23-9,1.889,8.257,13.586,3.44 5 | RECP4,2019-1-23-10,1.169,2.346,8.276,2.854 -------------------------------------------------------------------------------- /data/winter/source_emission.csv: -------------------------------------------------------------------------------- 1 | src,SPEC1,SPEC2,SPEC3,SPEC4 2 | SRC1,0.4,1.3,0.3,0.5 3 | SRC2,0.2,3.5,0.1,0.7 4 | SRC3,22.4,0.8,16.2,0.5 5 | SRC4,0.9,1.2,1.0,0.2 6 | SRC5,1.4,1.3,2.7,0.2 -------------------------------------------------------------------------------- /data/winter/source_info.csv: -------------------------------------------------------------------------------- 1 | %process,src,X,Y,stack-height,elevation,diameter,velocity,temperature,downwash 2 | 1,SRC1,2.784,4.004,20,0,0.8,8.5,290.8,0.0 3 | 1,SRC2,2.648,4.450,20,0,0.7,8.4,292.8,0.0 4 | 1,SRC3,3.080,3.802,25,0,0.7,8.9,292.7,0.0 5 | 1,SRC4,4.529,3.814,15,0,0.3,19.3,290.6,0.0 6 | 1,SRC5,1.226,4.367,0,0.5,6.6,291.4,0.0 -------------------------------------------------------------------------------- /data/winter/species_decay.csv: -------------------------------------------------------------------------------- 1 | spec,half-life,mass-yield 2 | SPEC1,46800,-1 3 | SPEC2,86400,-1 4 | SPEC3,28800,-1 5 | SPEC4,61200,-1 6 | SPEC5,156384,-1 7 | SPEC6,7776000,-1 8 | SPEC7,50400,-1 -------------------------------------------------------------------------------- /data/winter/species_options.csv: -------------------------------------------------------------------------------- 1 | %process,name,spec 2 | 1,sulfur_dioxide,SPEC1 3 | 1,nitrogen_oxides,SPEC2 4 | 0,ozone,SPEC3 5 | 0,PM,SPEC4 6 | 0,toluene,SPEC5 7 | 0,furan,SPEC6 8 | 0,olefin,SPEC7 9 | -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | import calpy 2 | 3 | params = { 4 | # CALMET file 5 | "metFile": "calmet.dat", 6 | # time -- Input Group 1 7 | "startYear": 2019, "startMonth": 1, "startDay": 23, "startHour": 0, 8 | "endYear": 2019, "endMonth": 1, "endDay": 23, "endHour": 12, 9 | "timeZone": "UTC+0000", 10 | "timeStep": 3600, # no larger than 3600 11 | # lambert projection -- Input Grroup 4 12 | "lambertlat1": "25N", 13 | "lambertlat2": "40N", 14 | "centerLat0": "31N", 15 | "centerLon0": "120E", 16 | # grids -- Input Grroup 4 17 | "nx": 60, "ny": 60, "nz": 11, "cellsize": 1, 18 | "zface": [0, 20, 40, 80, 160, 320, 640, 19 | 1000, 1500, 2000, 2500, 3000], # length should be `nz`+1 20 | "xorigin": -30, "yorigin": -30 21 | } 22 | group = calpy.load_calpuff() 23 | group.set_data_dir("data/winter") 24 | group.set_output_dir("output/winter") 25 | group.set_exe_dir("exe/") 26 | group.set_params(params) 27 | group.load_species_options(unit="ug/m**3") 28 | print("species:\n", group.speciesList) 29 | group.load_species_decay() 30 | # print("decay:\n", group.speciesDecay) 31 | group.load_source_info() 32 | # print("source:\n", group.sourceInfo) 33 | group.load_source_emission(unit="g/s") 34 | # print("emissn:\n", group.sourceEmiss) 35 | group.load_receptors_info() 36 | # print("receptors:\n", group.receptors) 37 | #group.load_area_source() 38 | 39 | calpy.run_calpuff(group, disp=True) # run CALPUFF 40 | 41 | times, samples = calpy.load_samples(group, timeZone="UTC+0800", filename="samples.csv") 42 | timeseries = calpy.extract_receptors(group) 43 | simulates = timeseries.get_simulates(times) # get simulated concentrations of each receptors 44 | 45 | # do something 46 | -------------------------------------------------------------------------------- /utils/calpuff_template.inp: -------------------------------------------------------------------------------- 1 | CALPUFF.INP 7.01 AGDISP SPRAY Source Added 2 | CALPUFF Demonstration Run 3 | (Not intended as a guide for configuring options) 4 | 5 | ---------------- Run title (3 lines) ------------------------------------------ 6 | MODEL: Version 7.3.0 7 | DEMONSTRATION FILE 8 | ------------------------------------------------------------------------------- 9 | 10 | CALPUFF MODEL CONTROL FILE 11 | -------------------------- 12 | 13 | ------------------------------------------------------------------------------- 14 | 15 | INPUT GROUP: 0 -- Input and Output File Names 16 | -------------- 17 | 18 | Default Name Type File Name 19 | ------------ ---- --------- 20 | CALMET.DAT input ! METDAT = calmet.dat ! 21 | or 22 | ISCMET.DAT input # ISCDAT = # 23 | or 24 | PLMMET.DAT input # PLMDAT = # 25 | or 26 | PROFILE.DAT input # PRFDAT = # 27 | SURFACE.DAT input # SFCDAT = # 28 | RESTARTB.DAT input # RSTARTB= # 29 | -------------------------------------------------------------------------------- 30 | CALPUFF.LST output ! PUFLST = calpuff.lst ! 31 | CONC.DAT output ! CONDAT = calpuff.con ! 32 | DFLX.DAT output # DFDAT = calpuff.dry # 33 | WFLX.DAT output # WFDAT = # 34 | 35 | VISB.DAT output # VISDAT = # 36 | TK2D.DAT output # T2DDAT = # 37 | RHO2D.DAT output # RHODAT = # 38 | RESTARTE.DAT output # RSTARTE= # 39 | -------------------------------------------------------------------------------- 40 | Other Files 41 | ----------- 42 | OZONE.DAT input # OZDAT = # 43 | VD.DAT input # VDDAT = # 44 | CHEM.DAT input # CHEMDAT= # 45 | AUX input # AUXEXT = # 46 | (Extension added to METDAT filename(s) for files 47 | with auxiliary 2D and 3D data) 48 | H2O2.DAT input # H2O2DAT= # 49 | NH3Z.DAT input # NH3ZDAT= # 50 | HILL.DAT input # HILDAT= # 51 | HILLRCT.DAT input # RCTDAT= # 52 | COASTLN.DAT input # CSTDAT= # 53 | FLUXBDY.DAT input # BDYDAT= # 54 | BCON.DAT input # BCNDAT= # 55 | DEBUG.DAT output # DEBUG = ../data/calpuff/debug.dat # 56 | MASSFLX.DAT output # FLXDAT= # 57 | MASSBAL.DAT output # BALDAT= ../data/calpuff/massbal.dat # 58 | FOG.DAT output # FOGDAT= # 59 | RISE.DAT output # RISDAT= # 60 | PFTRAK.DAT output # TRKDAT= ../data/calpuff/pftrak.trk # 61 | -------------------------------------------------------------------------------- 62 | All file names will be converted to lower case if LCFILES = T 63 | Otherwise, if LCFILES = F, file names will be converted to UPPER CASE 64 | T = lower case ! LCFILES = T ! 65 | F = UPPER CASE 66 | NOTE: (1) file/path names can be up to 132 characters in length 67 | 68 | 69 | Provision for multiple CALMET Domains and files 70 | ----------------------------------------------------- 71 | 72 | Number of CALMET.DAT Domains (NMETDOM) 73 | Default: 1 ! NMETDOM = 1 ! 74 | 75 | Number of CALMET.DAT files (NMETDAT) 76 | (Total for ALL Domains) 77 | Default: 1 ! NMETDAT = 1 ! 78 | 79 | Variable point/area/volume/flare emissions input files 80 | ------------------------------------------------------- 81 | 82 | Number of POINT source files (PTEMARB.DAT) 83 | with time-varying data (NPTDAT) 84 | Default: 0 ! NPTDAT = 0 ! 85 | 86 | Number of BUOYANT AREA source files (BAEMARB.DAT) 87 | with time-varying data (NARDAT) 88 | Default: 0 ! NARDAT = 0 ! 89 | 90 | Number of VOLUME source files (VOLEMARB.DAT) 91 | with time-varying data (NVOLDAT) 92 | Default: 0 ! NVOLDAT = 0 ! 93 | 94 | Number of FLARE source files (FLEMARB.DAT) 95 | with time-varying data (NFLDAT) 96 | Default: 0 ! NFLDAT = 0 ! 97 | 98 | Number of ROAD source files (RDEMARB.DAT) 99 | with time-varying data (NRDDAT) 100 | Default: 0 ! NRDDAT = 0 ! 101 | 102 | Number of SPRAY source files (SPEMARB.DAT) 103 | with time-varying data (NSPDAT) 104 | Default: 0 ! NSPDAT = 0 ! 105 | 106 | Number of BUOYANT LINE source files (LNEMARB.DAT) 107 | with time-varying data (NLNDAT) 108 | Default: 0 ! NLNDAT = 0 ! 109 | Note: Only 1 BUOYANT LINE source file is allowed 110 | ----- 111 | 112 | !END! 113 | 114 | >>>>>> Added by Pavinberg >>>>>> 115 | According to CALPUFF_Version6_UserInstructions.pdf page 485: 116 | "Subgroup 0a~0d are only needed when more than one CALMET or variable emissions 117 | files are used in the simulation." 118 | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 119 | ------------- 120 | Subgroup (0a) 121 | ------------- 122 | 123 | Provide a name for each CALMET domain if NMETDOM > 1 124 | Enter NMETDOM lines. 125 | a,b 126 | Default Name Domain Name 127 | ------------ ------------ 128 | none # DOMAIN1= # #END# 129 | none # DOMAIN2= # #END# 130 | none # DOMAIN3= # #END# 131 | 132 | 133 | The following CALMET.DAT filenames are processed in sequence 134 | if NMETDAT > 1 135 | 136 | Enter NMETDAT lines, 1 line for each file name. 137 | 138 | a,c,d 139 | Default Name Type File Name 140 | ------------ ---- --------- 141 | none input # METDAT1= # #END# 142 | none input # METDAT2= # #END# 143 | none input # METDAT3= # #END# 144 | 145 | ------------- 146 | a 147 | The name for each CALMET domain and each CALMET.DAT file is treated 148 | as a separate input subgroup and therefore must end with an input 149 | group terminator. 150 | b 151 | Use DOMAIN1= to assign the name for the outermost CALMET domain. 152 | Use DOMAIN2= to assign the name for the next inner CALMET domain. 153 | Use DOMAIN3= to assign the name for the next inner CALMET domain, etc. 154 | -------------------------------------------------------------------- 155 | | When inner domains with equal resolution (grid-cell size) | 156 | | overlap, the data from the FIRST such domain in the list will | 157 | | be used if all other criteria for choosing the controlling | 158 | | grid domain are inconclusive. | 159 | -------------------------------------------------------------------- 160 | c 161 | Use METDAT1= to assign the file names for the outermost CALMET domain. 162 | Use METDAT2= to assign the file names for the next inner CALMET domain. 163 | Use METDAT3= to assign the file names for the next inner CALMET domain, etc. 164 | d 165 | The filenames for each domain must be provided in sequential order 166 | 167 | 168 | ------------- 169 | Subgroup (0b) � PTEMARB.DAT files 170 | ------------- 171 | 172 | POINT Source File Names 173 | The following PTEMARB.DAT filenames are processed if NPTDAT>0 174 | A total of NPTDAT lines is expected with one file name assigned per line 175 | Each line is treated as an input group and must terminate with END 176 | (surrounded by delimiters) 177 | (Each file contains emissions parameters for the entire period modeled 178 | for 1 or more sources) 179 | 180 | Default Name Type File Name 181 | ------------ ---- --------- 182 | none input # PTDAT= ../data/source/PTEMARB.DAT # #END# 183 | 184 | 185 | ------------- 186 | Subgroup (0c) � BAEMARB.DAT files 187 | ------------- 188 | 189 | BUOYANT AREA Source File Names 190 | The following BAEMARB.DAT filenames are processed if NARDAT>0 191 | A total of NARDAT lines is expected with one file name assigned per line 192 | Each line is treated as an input group and must terminate with END 193 | (surrounded by delimiters) 194 | (Each file contains emissions parameters for the entire period modeled 195 | for 1 or more sources) 196 | 197 | Default Name Type File Name 198 | ------------ ---- --------- 199 | none input # ARDAT= # #END# 200 | 201 | 202 | ------------- 203 | Subgroup (0d) � VOLEMARB.DAT files 204 | ------------- 205 | 206 | VOLUME Source File Names 207 | The following VOLEMARB.DAT filenames are processed if NVOLDAT>0 208 | A total of NVOLDAT lines is expected with one file name assigned per line 209 | Each line is treated as an input group and must terminate with END 210 | (surrounded by delimiters) 211 | (Each file contains emissions parameters for the entire period modeled 212 | for 1 or more sources) 213 | 214 | Default Name Type File Name 215 | ------------ ---- --------- 216 | none input # VOLDAT= # #END# 217 | 218 | 219 | ------------- 220 | Subgroup (0e) � FLEMARB.DAT files 221 | ------------- 222 | 223 | FLARE Source File Names 224 | The following FLEMARB.DAT filenames are processed if NFLDAT>0 225 | A total of NFLDAT lines is expected with one file name assigned per line 226 | Each line is treated as an input group and must terminate with END 227 | (surrounded by delimiters) 228 | (Each file contains emissions parameters for the entire period modeled 229 | for 1 or more sources) 230 | 231 | Default Name Type File Name 232 | ------------ ---- --------- 233 | none input # FLDAT= # #END# 234 | 235 | 236 | ------------- 237 | Subgroup (0f) � RDEMARB.DAT files 238 | ------------- 239 | 240 | ROAD Source File Names 241 | The following RDEMARB.DAT filenames are processed if NRDDAT>0 242 | A total of NRDDAT lines is expected with one file name assigned per line 243 | Each line is treated as an input group and must terminate with END 244 | (surrounded by delimiters) 245 | (Each file contains emissions parameters for the entire period modeled 246 | for 1 or more sources) 247 | 248 | Default Name Type File Name 249 | ------------ ---- --------- 250 | none input # RDDAT= # #END# 251 | 252 | ------------- 253 | Subgroup (0g) � SPEMARB.DAT files 254 | ------------- 255 | 256 | SPRAY Source File Names 257 | The following SPEMARB.DAT filenames are processed if NRDDAT>0 258 | A total of NSPDAT lines is expected with one file name assigned per line 259 | Each line is treated as an input group and must terminate with END 260 | (surrounded by delimiters) 261 | (Each file contains emissions parameters for the entire period modeled 262 | for 1 or more sources) 263 | 264 | Default Name Type File Name 265 | ------------ ---- --------- 266 | none input # SPDAT= # #END# 267 | 268 | 269 | ------------- 270 | Subgroup (0h) � LNEMARB.DAT file 271 | ------------- 272 | 273 | BUOYANT LINE Source File Name (not more than 1) 274 | the following LNEMARB.DAT filename is processed if NLNDAT>0 275 | The assignment is treated as an input group and must terminate with END 276 | (surrounded by delimiters) 277 | 278 | Default Name Type File Name 279 | ------------ ---- --------- 280 | LNEMARB.DAT input # LNDAT= # #END# 281 | 282 | 283 | -------------------------------------------------------------------------------- 284 | 285 | INPUT GROUP: 1 -- General run control parameters 286 | -------------- 287 | 288 | Option to run all periods found 289 | in the met. file (METRUN) Default: 0 ! METRUN = 0 ! 290 | 291 | METRUN = 0 - Run period explicitly defined below 292 | METRUN = 1 - Run all periods in met. file 293 | 294 | Starting date: Year (IBYR) -- No default ! IBYR = 2019 ! 295 | Month (IBMO) -- No default ! IBMO = 1 ! 296 | Day (IBDY) -- No default ! IBDY = 23 ! 297 | Starting time: Hour (IBHR) -- No default ! IBHR = 0 ! 298 | Minute (IBMIN) -- No default ! IBMIN = 0 ! 299 | Second (IBSEC) -- No default ! IBSEC = 0 ! 300 | 301 | Ending date: Year (IEYR) -- No default ! IEYR = 2019 ! 302 | Month (IEMO) -- No default ! IEMO = 1 ! 303 | Day (IEDY) -- No default ! IEDY = 23 ! 304 | Ending time: Hour (IEHR) -- No default ! IEHR = 12 ! 305 | Minute (IEMIN) -- No default ! IEMIN = 0 ! 306 | Second (IESEC) -- No default ! IESEC = 0 ! 307 | 308 | (These are only used if METRUN = 0) 309 | 310 | Base time zone: (ABTZ) -- No default ! ABTZ= UTC+0000 ! 311 | (character*8) 312 | The modeling domain may span multiple time zones. ABTZ defines the 313 | base time zone used for the entire simulation. This must match the 314 | base time zone of the meteorological data. 315 | Examples: 316 | Greenwich Mean Time (GMT) = UTC+0000 317 | EST = UTC-0500 318 | CST = UTC-0600 319 | MST = UTC-0700 320 | PST = UTC-0800 321 | Los Angeles, USA = UTC-0800 322 | New York, USA = UTC-0500 323 | Santiago, Chile = UTC-0400 324 | UK = UTC+0000 325 | Western Europe = UTC+0100 326 | Rome, Italy = UTC+0100 327 | Cape Town, S.Africa = UTC+0200 328 | Sydney, Australia = UTC+1000 329 | 330 | Length of modeling time-step (seconds) 331 | Equal to update period in the primary 332 | meteorological data files, or an 333 | integer fraction of it (1/2, 1/3 ...) 334 | Must be no larger than 1 hour 335 | (NSECDT) Default:3600 ! NSECDT = 3600 ! 336 | Units: seconds 337 | 338 | Number of chemical species (NSPEC) 339 | Default: 5 ! NSPEC = 0 ! 340 | 341 | Number of chemical species 342 | to be emitted (NSE) Default: 3 ! NSE = 0 ! 343 | 344 | Flag to stop run after 345 | SETUP phase (ITEST) Default: 2 ! ITEST = 2 ! 346 | (Used to allow checking 347 | of the model inputs, files, etc.) 348 | ITEST = 1 - STOPS program after SETUP phase 349 | ITEST = 2 - Continues with execution of program 350 | after SETUP 351 | 352 | Restart Configuration: 353 | 354 | Control flag (MRESTART) Default: 0 ! MRESTART = 0 ! 355 | 356 | 0 = Do not read or write a restart file 357 | 1 = Read a restart file at the beginning of 358 | the run 359 | 2 = Write a restart file during run 360 | 3 = Read a restart file at beginning of run 361 | and write a restart file during run 362 | 363 | Number of periods in Restart 364 | output cycle (NRESPD) Default: 0 ! NRESPD = 0 ! 365 | 366 | 0 = File written only at last period 367 | >0 = File updated every NRESPD periods 368 | 369 | Meteorological Data Format (METFM) 370 | Default: 1 ! METFM = 1 ! 371 | 372 | METFM = 1 - CALMET binary file (CALMET.MET) 373 | METFM = 2 - ISC ASCII file (ISCMET.MET) 374 | METFM = 3 - AUSPLUME ASCII file (PLMMET.MET) 375 | METFM = 4 - CTDM plus tower file (PROFILE.DAT) and 376 | surface parameters file (SURFACE.DAT) 377 | METFM = 5 - AERMET tower file (PROFILE.DAT) and 378 | surface parameters file (SURFACE.DAT) 379 | 380 | Meteorological Profile Data Format (MPRFFM) 381 | (used only for METFM = 1, 2, 3) 382 | Default: 1 ! MPRFFM = 1 ! 383 | 384 | MPRFFM = 1 - CTDM plus tower file (PROFILE.DAT) 385 | MPRFFM = 2 - AERMET tower file (PROFILE.DAT) 386 | 387 | 388 | Sigma-y is adjusted by the factor (AVET/PGTIME)**0.2 to either 389 | decrease it if the averaging time selected is less than the base 390 | averaging time, or increase it if the averaging time is greater. 391 | The base averaging time is denoted as PGTIME due to historical 392 | reasons as this adjustment was originally applied to the PG sigma 393 | option. It is now applied to all dispersion options. 394 | The factor is applied to the ambient turbulence sigma-v (m/s) and 395 | does not alter buoyancy enhancement or far-field Heffter growth. 396 | 397 | Averaging Time (minutes) (AVET) 398 | Default: 60.0 ! AVET = 60. ! 399 | Base Averaging Time (minutes) (PGTIME) 400 | Default: 60.0 ! PGTIME = 60. ! 401 | 402 | 403 | Output units for binary concentration and flux files 404 | written in Dataset v2.2 or later formats 405 | (IOUTU) Default: 1 ! IOUTU = 1 ! 406 | 1 = mass - g/m3 (conc) or g/m2/s (dep) 407 | 2 = odour - odour_units (conc) 408 | 3 = radiation - Bq/m3 (conc) or Bq/m2/s (dep) 409 | 410 | 411 | !END! 412 | 413 | 414 | ------------------------------------------------------------------------------- 415 | 416 | INPUT GROUP: 2 -- Technical options 417 | -------------- 418 | 419 | 420 | Vertical distribution used in the 421 | near field (MGAUSS) Default: 1 ! MGAUSS = 1 ! 422 | 0 = uniform 423 | 1 = Gaussian 424 | 425 | Terrain adjustment method 426 | (MCTADJ) Default: 3 ! MCTADJ = 3 ! 427 | 0 = no adjustment 428 | 1 = ISC-type of terrain adjustment 429 | 2 = simple, CALPUFF-type of terrain 430 | adjustment 431 | 3 = partial plume path adjustment 432 | 433 | Subgrid-scale complex terrain 434 | flag (MCTSG) Default: 0 ! MCTSG = 0 ! 435 | 0 = not modeled 436 | 1 = modeled 437 | 438 | Near-field puffs modeled as 439 | elongated slugs? (MSLUG) Default: 0 ! MSLUG = 0 ! 440 | 0 = no 441 | 1 = yes (slug model used) 442 | 443 | Transitional plume rise modeled? 444 | (MTRANS) Default: 1 ! MTRANS = 1 ! 445 | 0 = no (i.e., final rise only) 446 | 1 = yes (i.e., transitional rise computed) 447 | 448 | Stack tip downwash? (MTIP) Default: 1 ! MTIP = 1 ! 449 | 0 = no (i.e., no stack tip downwash) 450 | 1 = yes (i.e., use stack tip downwash) 451 | 452 | Method used to compute plume rise for 453 | point sources not subject to building 454 | downwash? (MRISE) Default: 1 ! MRISE = 1 ! 455 | 1 = Briggs plume rise 456 | 2 = Numerical plume rise 457 | 458 | Apply stack-tip downwash to FLARE sources? 459 | (MTIP_FL) Default: 0 ! MTIP_FL = 0 ! 460 | 0 = no (no stack-tip downwash) 461 | 1 = yes (apply stack-tip downwash) 462 | 463 | Plume rise module for FLARE sources 464 | (MRISE_FL) Default: 2 ! MRISE_FL = 2 ! 465 | 1 = Briggs module 466 | 2 = Numerical rise module 467 | 468 | Method used to simulate building 469 | downwash? (MBDW) Default: 1 ! MBDW = 1 ! 470 | 1 = ISC method 471 | 2 = PRIME method 472 | 473 | Vertical wind shear modeled above 474 | stack top (modified Briggs plume rise)? 475 | (MSHEAR) Default: 0 ! MSHEAR = 0 ! 476 | 0 = no (i.e., vertical wind shear not modeled) 477 | 1 = yes (i.e., vertical wind shear modeled) 478 | 479 | Puff splitting allowed? (MSPLIT) Default: 0 ! MSPLIT = 0 ! 480 | 0 = no (i.e., puffs not split) 481 | 1 = yes (i.e., puffs are split) 482 | 483 | Chemical mechanism flag (MCHEM) Default: 1 ! MCHEM = 0 ! 484 | 0 = chemical transformation not 485 | modeled 486 | 1 = transformation rates computed 487 | internally (MESOPUFF II scheme) 488 | 2 = user-specified transformation 489 | rates used 490 | 3 = transformation rates computed 491 | internally (RIVAD/ARM3 scheme) 492 | 4 = secondary organic aerosol formation 493 | computed (MESOPUFF II scheme for OH) 494 | 5 = user-specified half-life with or 495 | without transfer to child species 496 | 6 = transformation rates computed 497 | internally (Updated RIVAD scheme with 498 | ISORROPIA equilibrium) 499 | 7 = transformation rates computed 500 | internally (Updated RIVAD scheme with 501 | ISORROPIA equilibrium and CalTech SOA) 502 | 503 | Aqueous phase transformation flag (MAQCHEM) 504 | (Used only if MCHEM = 6, or 7) Default: 0 ! MAQCHEM = 0 ! 505 | 0 = aqueous phase transformation 506 | not modeled 507 | 1 = transformation rates and wet 508 | scavenging coefficients adjusted 509 | for in-cloud aqueous phase reactions 510 | (adapted from RADM cloud model 511 | implementation in CMAQ/SCICHEM) 512 | 513 | Liquid Water Content flag (MLWC) 514 | (Used only if MAQCHEM = 1) Default: 1 ! MLWC = 1 ! 515 | 0 = water content estimated from cloud cover 516 | and presence of precipitation 517 | 1 = gridded cloud water data read from CALMET 518 | water content output files (filenames are 519 | the CALMET.DAT names PLUS the extension 520 | AUXEXT provided in Input Group 0) 521 | 522 | Wet removal modeled ? (MWET) Default: 1 ! MWET = 1 ! 523 | 0 = no 524 | 1 = yes 525 | 526 | Dry deposition modeled ? (MDRY) Default: 1 ! MDRY = 0 ! 527 | 0 = no 528 | 1 = yes 529 | (dry deposition method specified 530 | for each species in Input Group 3) 531 | 532 | Evaporation modeled ? (MEVAP) Default: 0 ! MEVAP = 0 ! 533 | 0 = no 534 | 1 = yes (evaporation rates specified for each species in Input Group 11 -[not active]) 535 | 2 = yes (internally calculated -[not currently available]) 536 | 537 | Gravitational settling (plume tilt) 538 | modeled ? (MTILT) Default: 0 ! MTILT = 0 ! 539 | 0 = no 540 | 1 = yes 541 | (puff center falls at the gravitational 542 | settling velocity for 1 particle species) 543 | 544 | Restrictions: 545 | - MDRY = 1 546 | - NSPEC = 1 (must be particle species as well) 547 | - sg = 0 GEOMETRIC STANDARD DEVIATION in Group 8 is 548 | set to zero for a single particle diameter 549 | 550 | Method used to compute dispersion 551 | coefficients (MDISP) Default: 3 ! MDISP = 3 ! 552 | 553 | 1 = dispersion coefficients computed from measured values 554 | of turbulence, sigma v, sigma w 555 | 2 = dispersion coefficients from internally calculated 556 | sigma v, sigma w using micrometeorological variables 557 | (u*, w*, L, etc.) 558 | 3 = PG dispersion coefficients for RURAL areas (computed using 559 | the ISCST multi-segment approximation) and MP coefficients in 560 | urban areas 561 | 4 = same as 3 except PG coefficients computed using 562 | the MESOPUFF II eqns. 563 | 5 = CTDM sigmas used for stable and neutral conditions. 564 | For unstable conditions, sigmas are computed as in 565 | MDISP = 3, described above. MDISP = 5 assumes that 566 | measured values are read 567 | 568 | Sigma-v/sigma-theta, sigma-w measurements used? (MTURBVW) 569 | (Used only if MDISP = 1 or 5) Default: 3 ! MTURBVW = 3 ! 570 | 1 = use sigma-v or sigma-theta measurements 571 | from PROFILE.DAT to compute sigma-y 572 | (valid for METFM = 1, 2, 3, 4, 5) 573 | 2 = use sigma-w measurements 574 | from PROFILE.DAT to compute sigma-z 575 | (valid for METFM = 1, 2, 3, 4, 5) 576 | 3 = use both sigma-(v/theta) and sigma-w 577 | from PROFILE.DAT to compute sigma-y and sigma-z 578 | (valid for METFM = 1, 2, 3, 4, 5) 579 | 4 = use sigma-theta measurements 580 | from PLMMET.DAT to compute sigma-y 581 | (valid only if METFM = 3) 582 | 583 | Back-up method used to compute dispersion 584 | when measured turbulence data are 585 | missing (MDISP2) Default: 3 ! MDISP2 = 3 ! 586 | (used only if MDISP = 1 or 5) 587 | 2 = dispersion coefficients from internally calculated 588 | sigma v, sigma w using micrometeorological variables 589 | (u*, w*, L, etc.) 590 | 3 = PG dispersion coefficients for RURAL areas (computed using 591 | the ISCST multi-segment approximation) and MP coefficients in 592 | urban areas 593 | 4 = same as 3 except PG coefficients computed using 594 | the MESOPUFF II eqns. 595 | 596 | [DIAGNOSTIC FEATURE] 597 | Method used for Lagrangian timescale for Sigma-y 598 | (used only if MDISP=1,2 or MDISP2=1,2) 599 | (MTAULY) Default: 0 ! MTAULY = 0 ! 600 | 0 = Draxler default 617.284 (s) 601 | 1 = Computed as Lag. Length / (.75 q) -- after SCIPUFF 602 | 10 < Direct user input (s) -- e.g., 306.9 603 | 604 | 605 | [DIAGNOSTIC FEATURE] 606 | Method used for Advective-Decay timescale for Turbulence 607 | (used only if MDISP=2 or MDISP2=2) 608 | (MTAUADV) Default: 0 ! MTAUADV = 0 ! 609 | 0 = No turbulence advection 610 | 1 = Computed (OPTION NOT IMPLEMENTED) 611 | 10 < Direct user input (s) -- e.g., 800 612 | 613 | 614 | Method used to compute turbulence sigma-v & 615 | sigma-w using micrometeorological variables 616 | (Used only if MDISP = 2 or MDISP2 = 2) 617 | (MCTURB) Default: 1 ! MCTURB = 1 ! 618 | 1 = Standard CALPUFF subroutines 619 | 2 = AERMOD subroutines 620 | 621 | PG sigma-y,z adj. for roughness? Default: 0 ! MROUGH = 0 ! 622 | (MROUGH) 623 | 0 = no 624 | 1 = yes 625 | 626 | Partial plume penetration of Default: 1 ! MPARTL = 1 ! 627 | elevated inversion modeled for 628 | point sources? 629 | (MPARTL) 630 | 0 = no 631 | 1 = yes 632 | 633 | Partial plume penetration of Default: 1 ! MPARTLBA = 1 ! 634 | elevated inversion modeled for 635 | buoyant area sources? 636 | (MPARTLBA) 637 | 0 = no 638 | 1 = yes 639 | 640 | Strength of temperature inversion Default: 0 ! MTINV = 0 ! 641 | provided in PROFILE.DAT extended records? 642 | (MTINV) 643 | 0 = no (computed from measured/default gradients) 644 | 1 = yes 645 | 646 | PDF used for dispersion under convective conditions? 647 | Default: 0 ! MPDF = 0 ! 648 | (MPDF) 649 | 0 = no 650 | 1 = yes 651 | 652 | Sub-Grid TIBL module used for shore line? 653 | Default: 0 ! MSGTIBL = 0 ! 654 | (MSGTIBL) 655 | 0 = no 656 | 1 = yes 657 | 658 | Boundary conditions (concentration) modeled? 659 | Default: 0 ! MBCON = 0 ! 660 | (MBCON) 661 | 0 = no 662 | 1 = yes, using formatted BCON.DAT file 663 | 2 = yes, using unformatted CONC.DAT file 664 | 665 | Note: MBCON > 0 requires that the last species modeled 666 | be 'BCON'. Mass is placed in species BCON when 667 | generating boundary condition puffs so that clean 668 | air entering the modeling domain can be simulated 669 | in the same way as polluted air. Specify zero 670 | emission of species BCON for all regular sources. 671 | 672 | Individual source contributions saved? 673 | Default: 0 ! MSOURCE = 1 ! 674 | (MSOURCE) 675 | 0 = no 676 | 1 = yes 677 | 678 | 679 | Analyses of fogging and icing impacts due to emissions from 680 | arrays of mechanically-forced cooling towers can be performed 681 | using CALPUFF in conjunction with a cooling tower emissions 682 | processor (CTEMISS) and its associated postprocessors. Hourly 683 | emissions of water vapor and temperature from each cooling tower 684 | cell are computed for the current cell configuration and ambient 685 | conditions by CTEMISS. CALPUFF models the dispersion of these 686 | emissions and provides cloud information in a specialized format 687 | for further analysis. Output to FOG.DAT is provided in either 688 | 'plume mode' or 'receptor mode' format. 689 | 690 | Configure for FOG Model output? 691 | Default: 0 ! MFOG = 0 ! 692 | (MFOG) 693 | 0 = no 694 | 1 = yes - report results in PLUME Mode format 695 | 2 = yes - report results in RECEPTOR Mode format 696 | 697 | 698 | Test options specified to see if 699 | they conform to regulatory 700 | values? (MREG) Default: 1 ! MREG = 0 ! 701 | 702 | 0 = NO checks are made 703 | 1 = Technical options must conform to USEPA 704 | Long Range Transport (LRT) guidance 705 | METFM 1 or 2 706 | AVET 60. (min) 707 | PGTIME 60. (min) 708 | MGAUSS 1 709 | MCTADJ 3 710 | MTRANS 1 711 | MTIP 1 712 | MRISE 1 713 | MCHEM 1 or 3 (if modeling SOx, NOx) 714 | MWET 1 715 | MDRY 1 716 | MDISP 2 or 3 717 | MPDF 0 if MDISP=3 718 | 1 if MDISP=2 719 | MROUGH 0 720 | MPARTL 1 721 | MPARTLBA 0 722 | SYTDEP 550. (m) 723 | MHFTSZ 0 724 | SVMIN 0.5 (m/s) 725 | 726 | 727 | !END! 728 | 729 | 730 | ------------------------------------------------------------------------------- 731 | 732 | INPUT GROUP: 3a, 3b -- Species list 733 | ------------------- 734 | 735 | ------------ 736 | Subgroup (3a) 737 | ------------ 738 | 739 | The following species are modeled: 740 | 741 | ! CSPEC = SO2 ! !END! 742 | # CSPEC = SO4 # #END# 743 | # CSPEC = NO # #END# 744 | ! CSPEC = NO2 ! !END! 745 | # CSPEC = HNO3 # #END# 746 | # CSPEC = NO3 # #END# 747 | # CSPEC = PM10 # #END# 748 | 749 | OUTPUT GROUP 750 | SPECIES MODELED EMITTED DEPOSITED Droplets NUMBER 751 | NAME (0=NO, 1=YES) (0=NO, 1=YES) (0=NO, (0=NO, 1=YES) (0=NONE, 752 | (Limit: 12 1=COMPUTED-GAS 1=1st CGRUP, 753 | Characters 2=COMPUTED-PARTICLE 2=2nd CGRUP, 754 | in length) 3=USER-SPECIFIED) 3= etc.) 755 | 756 | ! SO2 = 1, 1, 1, 0, 0 ! 757 | # SO4 = 1, 0, 2, 0, 0 # 758 | # NO = 1, 1, 1, 0, 0 # 759 | ! NO2 = 1, 1, 1, 0, 0 ! 760 | # HNO3 = 1, 0, 1, 0, 0 # 761 | # NO3 = 1, 0, 2, 0, 0 # 762 | # PM10 = 1, 1, 2, 0, 0 # 763 | 764 | !END! 765 | 766 | Note: The last species in (3a) must be 'BCON' when using the 767 | boundary condition option (MBCON > 0). Species BCON should 768 | typically be modeled as inert (no chem transformation or 769 | removal). 770 | 771 | 772 | ------------- 773 | Subgroup (3b) 774 | ------------- 775 | The following names are used for Species-Groups in which results 776 | for certain species are combined (added) prior to output. The 777 | CGRUP name will be used as the species name in output files. 778 | Use this feature to model specific particle-size distributions 779 | by treating each size-range as a separate species. 780 | Order must be consistent with 3(a) above. 781 | 782 | 783 | 784 | ------------------------------------------------------------------------------- 785 | 786 | 787 | INPUT GROUP: 4 -- Map Projection and Grid control parameters 788 | -------------- 789 | 790 | Projection for all (X,Y): 791 | ------------------------- 792 | 793 | Map projection 794 | (PMAP) Default: UTM ! PMAP = LCC ! 795 | 796 | UTM : Universal Transverse Mercator 797 | TTM : Tangential Transverse Mercator 798 | LCC : Lambert Conformal Conic 799 | PS : Polar Stereographic 800 | EM : Equatorial Mercator 801 | LAZA : Lambert Azimuthal Equal Area 802 | 803 | False Easting and Northing (km) at the projection origin 804 | (Used only if PMAP= TTM, LCC, or LAZA) 805 | (FEAST) Default=0.0 ! FEAST = 0.0 ! 806 | (FNORTH) Default=0.0 ! FNORTH =0.0 ! 807 | 808 | UTM zone (1 to 60) 809 | (Used only if PMAP=UTM) 810 | (IUTMZN) No Default ! IUTMZN = ! 811 | 812 | Hemisphere for UTM projection? 813 | (Used only if PMAP=UTM) 814 | (UTMHEM) Default: N ! UTMHEM = N ! 815 | N : Northern hemisphere projection 816 | S : Southern hemisphere projection 817 | 818 | Latitude and Longitude (decimal degrees) of projection origin 819 | (Used only if PMAP= TTM, LCC, PS, EM, or LAZA) 820 | (RLAT0) No Default ! RLAT0 = 31.40N ! 821 | (RLON0) No Default ! RLON0 = 120.52E ! 822 | 823 | TTM : RLON0 identifies central (true N/S) meridian of projection 824 | RLAT0 selected for convenience 825 | LCC : RLON0 identifies central (true N/S) meridian of projection 826 | RLAT0 selected for convenience 827 | PS : RLON0 identifies central (grid N/S) meridian of projection 828 | RLAT0 selected for convenience 829 | EM : RLON0 identifies central meridian of projection 830 | RLAT0 is REPLACED by 0.0N (Equator) 831 | LAZA: RLON0 identifies longitude of tangent-point of mapping plane 832 | RLAT0 identifies latitude of tangent-point of mapping plane 833 | 834 | Matching parallel(s) of latitude (decimal degrees) for projection 835 | (Used only if PMAP= LCC or PS) 836 | (XLAT1) No Default ! XLAT1 = 25N ! 837 | (XLAT2) No Default ! XLAT2 = 40N ! 838 | 839 | LCC : Projection cone slices through Earth's surface at XLAT1 and XLAT2 840 | PS : Projection plane slices through Earth at XLAT1 841 | (XLAT2 is not used) 842 | 843 | ---------- 844 | Note: Latitudes and longitudes should be positive, and include a 845 | letter N,S,E, or W indicating north or south latitude, and 846 | east or west longitude. For example, 847 | 35.9 N Latitude = 35.9N 848 | 118.7 E Longitude = 118.7E 849 | 850 | 851 | Datum-region 852 | ------------ 853 | 854 | The Datum-Region for the coordinates is identified by a character 855 | string. Many mapping products currently available use the model of the 856 | Earth known as the World Geodetic System 1984 (WGS-84). Other local 857 | models may be in use, and their selection in CALMET will make its output 858 | consistent with local mapping products. The list of Datum-Regions with 859 | official transformation parameters is provided by the National Imagery and 860 | Mapping Agency (NIMA). 861 | 862 | NIMA Datum - Regions(Examples) 863 | ------------------------------------------------------------------------------ 864 | WGS-84 WGS-84 Reference Ellipsoid and Geoid, Global coverage (WGS84) 865 | NAS-C NORTH AMERICAN 1927 Clarke 1866 Spheroid, MEAN FOR CONUS (NAD27) 866 | NAR-C NORTH AMERICAN 1983 GRS 80 Spheroid, MEAN FOR CONUS (NAD83) 867 | NWS-84 NWS 6370KM Radius, Sphere 868 | ESR-S ESRI REFERENCE 6371KM Radius, Sphere 869 | 870 | Datum-region for output coordinates 871 | (DATUM) Default: WGS-84 ! DATUM = WGS-84 ! 872 | 873 | 874 | METEOROLOGICAL Grid (outermost if nested CALMET grids are used): 875 | 876 | Rectangular grid defined for projection PMAP, 877 | with X the Easting and Y the Northing coordinate 878 | 879 | No. X grid cells (NX) No default ! NX = 60 ! 880 | No. Y grid cells (NY) No default ! NY = 60 ! 881 | No. vertical layers (NZ) No default ! NZ = 11 ! 882 | 883 | Grid spacing (DGRIDKM) No default ! DGRIDKM = 0.1 ! 884 | Units: km 885 | 886 | Cell face heights 887 | (ZFACE(nz+1)) No defaults 888 | Units: m 889 | ! ZFACE = 0,20,40,80,160,320,640,1000,1500,2000,2500,3000 ! 890 | 891 | Reference Coordinates 892 | of SOUTHWEST corner of 893 | grid cell(1, 1): 894 | 895 | X coordinate (XORIGKM) No default ! XORIGKM = -4.0 ! 896 | Y coordinate (YORIGKM) No default ! YORIGKM = -4.0 ! 897 | Units: km 898 | 899 | 900 | COMPUTATIONAL Grid: 901 | 902 | The computational grid is identical to or a subset of the MET. grid. 903 | The lower left (LL) corner of the computational grid is at grid point 904 | (IBCOMP, JBCOMP) of the MET. grid. The upper right (UR) corner of the 905 | computational grid is at grid point (IECOMP, JECOMP) of the MET. grid. 906 | The grid spacing of the computational grid is the same as the MET. grid. 907 | 908 | X index of LL corner (IBCOMP) No default ! IBCOMP = 1 ! 909 | (1 <= IBCOMP <= NX) 910 | 911 | Y index of LL corner (JBCOMP) No default ! JBCOMP = 1 ! 912 | (1 <= JBCOMP <= NY) 913 | 914 | 915 | X index of UR corner (IECOMP) No default ! IECOMP = 60 ! 916 | (1 <= IECOMP <= NX) 917 | 918 | Y index of UR corner (JECOMP) No default ! JECOMP = 60 ! 919 | (1 <= JECOMP <= NY) 920 | 921 | 922 | 923 | SAMPLING Grid (GRIDDED RECEPTORS): 924 | 925 | The lower left (LL) corner of the sampling grid is at grid point 926 | (IBSAMP, JBSAMP) of the MET. grid. The upper right (UR) corner of the 927 | sampling grid is at grid point (IESAMP, JESAMP) of the MET. grid. 928 | The sampling grid must be identical to or a subset of the computational 929 | grid. It may be a nested grid inside the computational grid. 930 | The grid spacing of the sampling grid is DGRIDKM/MESHDN. 931 | 932 | Logical flag indicating if gridded 933 | receptors are used (LSAMP) Default: T ! LSAMP = T ! 934 | (T=yes, F=no) 935 | 936 | X index of LL corner (IBSAMP) No default ! IBSAMP = 1 ! 937 | (IBCOMP <= IBSAMP <= IECOMP) 938 | 939 | Y index of LL corner (JBSAMP) No default ! JBSAMP = 1 ! 940 | (JBCOMP <= JBSAMP <= JECOMP) 941 | 942 | 943 | X index of UR corner (IESAMP) No default ! IESAMP = 60 ! 944 | (IBCOMP <= IESAMP <= IECOMP) 945 | 946 | Y index of UR corner (JESAMP) No default ! JESAMP = 60 ! 947 | (JBCOMP <= JESAMP <= JECOMP) 948 | 949 | 950 | Nesting factor of the sampling 951 | grid (MESHDN) Default: 1 ! MESHDN = 1 ! 952 | (MESHDN is an integer >= 1) 953 | 954 | !END! 955 | 956 | 957 | ------------------------------------------------------------------------------- 958 | 959 | 960 | INPUT GROUP: 5 -- Output Options 961 | -------------- 962 | * * 963 | FILE DEFAULT VALUE VALUE THIS RUN 964 | ---- ------------- -------------- 965 | 966 | Concentrations (ICON) 1 ! ICON = 1 ! 967 | Dry Fluxes (IDRY) 1 ! IDRY = 0 ! 968 | Wet Fluxes (IWET) 1 ! IWET = 0 ! 969 | 2D Temperature (IT2D) 0 ! IT2D = 0 ! 970 | 2D Density (IRHO) 0 ! IRHO = 0 ! 971 | Relative Humidity (IVIS) 1 ! IVIS = 0 ! 972 | (relative humidity file is 973 | required for visibility 974 | analysis) 975 | Use data compression option in output file? 976 | (LCOMPRS) Default: T ! LCOMPRS = T ! 977 | 978 | * 979 | 0 = Do not create file, 1 = create file 980 | 981 | 982 | QA PLOT FILE OUTPUT OPTION: 983 | 984 | Create a standard series of output files (e.g. 985 | locations of sources, receptors, grids ...) 986 | suitable for plotting? 987 | (IQAPLOT) Default: 1 ! IQAPLOT = 1 ! 988 | 0 = no 989 | 1 = yes 990 | 991 | DIAGNOSTIC PUFF-TRACKING OUTPUT OPTION: 992 | 993 | Puff locations and properties reported to 994 | PFTRAK.DAT file for postprocessing? 995 | (IPFTRAK) Default: 0 ! IPFTRAK = 1 ! 996 | 0 = no 997 | 1 = yes, update puff output at end of each timestep 998 | 2 = yes, update puff output at end of each sampling step 999 | 1000 | DIAGNOSTIC MASS FLUX OUTPUT OPTIONS: 1001 | 1002 | Mass flux across specified boundaries 1003 | for selected species reported? 1004 | (IMFLX) Default: 0 ! IMFLX = 0 ! 1005 | 0 = no 1006 | 1 = yes (FLUXBDY.DAT and MASSFLX.DAT filenames 1007 | are specified in Input Group 0) 1008 | 1009 | Mass balance for each species 1010 | reported? 1011 | (IMBAL) Default: 0 ! IMBAL = 0 ! 1012 | 0 = no 1013 | 1 = yes (MASSBAL.DAT filename is 1014 | specified in Input Group 0) 1015 | 1016 | 1017 | NUMERICAL RISE OUTPUT OPTION: 1018 | 1019 | Create a file with plume properties for each rise 1020 | increment, for each model timestep? 1021 | This applies to sources modeled with numerical rise 1022 | and is limited to ONE source in the run. 1023 | (INRISE) Default: 0 ! INRISE = 0 ! 1024 | 0 = no 1025 | 1 = yes (RISE.DAT filename is 1026 | specified in Input Group 0) 1027 | 1028 | 1029 | LINE PRINTER OUTPUT OPTIONS: 1030 | 1031 | Print concentrations (ICPRT) Default: 0 ! ICPRT = 1 ! 1032 | Print dry fluxes (IDPRT) Default: 0 ! IDPRT = 0 ! 1033 | Print wet fluxes (IWPRT) Default: 0 ! IWPRT = 0 ! 1034 | (0 = Do not print, 1 = Print) 1035 | 1036 | Concentration print interval 1037 | (ICFRQ) in timesteps Default: 1 ! ICFRQ = 1 ! 1038 | Dry flux print interval 1039 | (IDFRQ) in timesteps Default: 1 ! IDFRQ = 1 ! 1040 | Wet flux print interval 1041 | (IWFRQ) in timesteps Default: 1 ! IWFRQ = 1 ! 1042 | 1043 | Units for Line Printer Output 1044 | (IPRTU) Default: 1 ! IPRTU = 3 ! 1045 | for for 1046 | Concentration Deposition 1047 | 1 = g/m**3 g/m**2/s 1048 | 2 = mg/m**3 mg/m**2/s 1049 | 3 = ug/m**3 ug/m**2/s 1050 | 4 = ng/m**3 ng/m**2/s 1051 | 5 = Odour Units 1052 | 6 = TBq/m**3 TBq/m**2/s TBq=terabecquerel 1053 | 7 = GBq/m**3 GBq/m**2/s GBq=gigabecquerel 1054 | 8 = Bq/m**3 Bq/m**2/s Bq=becquerel (disintegrations/s) 1055 | 1056 | Messages tracking progress of run 1057 | written to the screen ? 1058 | (IMESG) Default: 2 ! IMESG = 2 ! 1059 | 0 = no 1060 | 1 = yes (advection step, puff ID) 1061 | 2 = yes (YYYYJJJHH, # old puffs, # emitted puffs) 1062 | 1063 | 1064 | SPECIES (or GROUP for combined species) LIST FOR OUTPUT OPTIONS 1065 | 1066 | ---- CONCENTRATIONS ---- ------ DRY FLUXES ------ ------ WET FLUXES ------ -- MASS FLUX -- 1067 | SPECIES 1068 | /GROUP PRINTED? SAVED ON DISK? PRINTED? SAVED ON DISK? PRINTED? SAVED ON DISK? SAVED ON DISK? 1069 | ------- ------------------------ ------------------------ ------------------------ --------------- 1070 | # SO2 = 1, 1, 0, 1, 0, 1, 0 # 1071 | # SO4 = 0, 1, 0, 1, 0, 1, 0 # 1072 | # NO = 0, 1, 0, 1, 0, 1, 0 # 1073 | # NO2 = 1, 1, 0, 1, 0, 1, 0 ! 1074 | # HNO3 = 0, 1, 0, 1, 0, 1, 0 # 1075 | # NO3 = 0, 1, 0, 1, 0, 1, 0 # 1076 | # PM10 = 0, 1, 0, 1, 0, 1, 0 # 1077 | 1078 | 1079 | Note: Species BCON (for MBCON > 0) does not need to be saved on disk. 1080 | 1081 | 1082 | OPTIONS FOR PRINTING "DEBUG" QUANTITIES (much output) 1083 | 1084 | Logical for debug output 1085 | (LDEBUG) Default: F ! LDEBUG = F ! 1086 | 1087 | First puff to track 1088 | (IPFDEB) Default: 1 ! IPFDEB = 1 ! 1089 | 1090 | Number of puffs to track 1091 | (NPFDEB) Default: 1 ! NPFDEB = 1 ! 1092 | 1093 | Met. period to start output 1094 | (NN1) Default: 1 ! NN1 = 1 ! 1095 | 1096 | Met. period to end output 1097 | (NN2) Default: 10 ! NN2 = 10 ! 1098 | 1099 | !END! 1100 | 1101 | 1102 | ------------------------------------------------------------------------------- 1103 | 1104 | 1105 | INPUT GROUP: 6a, 6b, & 6c -- Subgrid scale complex terrain inputs 1106 | ------------------------- 1107 | 1108 | --------------- 1109 | Subgroup (6a) 1110 | --------------- 1111 | Number of terrain features (NHILL) Default: 0 ! NHILL = 0 ! 1112 | 1113 | Number of special complex terrain 1114 | receptors (NCTREC) Default: 0 ! NCTREC = 0 ! 1115 | 1116 | Terrain and CTSG Receptor data for 1117 | CTSG hills input in CTDM format ? 1118 | (MHILL) No Default ! MHILL = 2 ! 1119 | 1 = Hill and Receptor data created 1120 | by CTDM processors & read from 1121 | HILL.DAT and HILLRCT.DAT files 1122 | 2 = Hill data created by OPTHILL & 1123 | input below in Subgroup (6b); 1124 | Receptor data in Subgroup (6c) 1125 | 1126 | Factor to convert horizontal dimensions Default: 1.0 ! XHILL2M = 1.0 ! 1127 | to meters (MHILL=1) 1128 | 1129 | Factor to convert vertical dimensions Default: 1.0 ! ZHILL2M = 1.0 ! 1130 | to meters (MHILL=1) 1131 | 1132 | X-origin of CTDM system relative to No Default ! XCTDMKM = 0 ! 1133 | CALPUFF coordinate system, in Kilometers (MHILL=1) 1134 | 1135 | Y-origin of CTDM system relative to No Default ! YCTDMKM = 0 ! 1136 | CALPUFF coordinate system, in Kilometers (MHILL=1) 1137 | 1138 | ! END ! 1139 | 1140 | --------------- 1141 | Subgroup (6b) 1142 | --------------- 1143 | 1144 | 1 ** 1145 | HILL information 1146 | 1147 | 1148 | HILL XC YC THETAH ZGRID RELIEF EXPO 1 EXPO 2 SCALE 1 SCALE 2 AMAX1 AMAX2 1149 | NO. (km) (km) (deg.) (m) (m) (m) (m) (m) (m) (m) (m) 1150 | ---- ---- ---- ------ ----- ------ ------ ------ ------- ------- ----- ----- 1151 | 1152 | --------------- 1153 | Subgroup (6c) 1154 | --------------- 1155 | 1156 | COMPLEX TERRAIN RECEPTOR INFORMATION 1157 | 1158 | XRCT YRCT ZRCT XHH 1159 | (km) (km) (m) 1160 | ------ ----- ------ ---- 1161 | 1162 | 1163 | ------------------- 1164 | 1 1165 | Description of Complex Terrain Variables: 1166 | XC, YC = Coordinates of center of hill 1167 | THETAH = Orientation of major axis of hill (clockwise from 1168 | North) 1169 | ZGRID = Height of the 0 of the grid above mean sea 1170 | level 1171 | RELIEF = Height of the crest of the hill above the grid elevation 1172 | EXPO 1 = Hill-shape exponent for the major axis 1173 | EXPO 2 = Hill-shape exponent for the major axis 1174 | SCALE 1 = Horizontal length scale along the major axis 1175 | SCALE 2 = Horizontal length scale along the minor axis 1176 | AMAX = Maximum allowed axis length for the major axis 1177 | BMAX = Maximum allowed axis length for the major axis 1178 | 1179 | XRCT, YRCT = Coordinates of the complex terrain receptors 1180 | ZRCT = Height of the ground (MSL) at the complex terrain 1181 | Receptor 1182 | XHH = Hill number associated with each complex terrain receptor 1183 | (NOTE: MUST BE ENTERED AS A REAL NUMBER) 1184 | 1185 | ** 1186 | NOTE: DATA for each hill and CTSG receptor are treated as a separate 1187 | input subgroup and therefore must end with an input group terminator. 1188 | 1189 | ------------------------------------------------------------------------- 1190 | 1191 | INPUT GROUP: 7 -- Chemical parameters for dry deposition of gases 1192 | -------------- 1193 | 1194 | SPECIES DIFFUSIVITY ALPHA STAR REACTIVITY MESOPHYLL RESISTANCE HENRY'S LAW COEFFICIENT 1195 | NAME (cm**2/s) (s/cm) (dimensionless) 1196 | ------- ----------- ---------- ---------- -------------------- ----------------------- 1197 | # SO2 = .1509, 1000.0, 8.0, .0, .04 # 1198 | # NO = .1345, 1.0, 2.0, 25.0, 18.0 # 1199 | # NO2 = .1656, 1.0, 8.0, 5.0, 3.5 # 1200 | # HNO3 = .1628, 1.0, 18.0, .0, .0000001 # 1201 | 1202 | !END! 1203 | 1204 | ------------------------------------------------------------------------------- 1205 | 1206 | 1207 | INPUT GROUP: 8 -- Size parameters for dry deposition of particles 1208 | -------------- 1209 | 1210 | For SINGLE SPECIES, the mean and standard deviation are used to 1211 | compute a deposition velocity for NINT (see group 9) size-ranges, 1212 | and these are then averaged to obtain a mean deposition velocity. 1213 | 1214 | For GROUPED SPECIES, the size distribution should be explicitly 1215 | specified (by the 'species' in the group), and the standard deviation 1216 | for each should be entered as 0. The model will then use the 1217 | deposition velocity for the stated mean diameter. 1218 | 1219 | For DROPLET species, the GEOMETRIC MASS MEAN DIAMETER is included 1220 | in the external variable emission sfile. Values should not be 1221 | reported here for droplet species 1222 | 1223 | SPECIES GEOMETRIC MASS MEAN GEOMETRIC STANDARD 1224 | NAME DIAMETER DEVIATION 1225 | (microns) (microns) 1226 | ------- ------------------- ------------------ 1227 | # SO4 = .48, 2.0 # 1228 | # NO3 = .48, 2.0 # 1229 | # PM10 = .48, 2.0 # 1230 | 1231 | !END! 1232 | 1233 | 1234 | ------------------------------------------------------------------------------- 1235 | 1236 | 1237 | INPUT GROUP: 9 -- Miscellaneous dry deposition parameters 1238 | -------------- 1239 | 1240 | Reference cuticle resistance (s/cm) 1241 | (RCUTR) Default: 30 ! RCUTR = 30.0 ! 1242 | Reference ground resistance (s/cm) 1243 | (RGR) Default: 10 ! RGR = 10.0 ! 1244 | Reference pollutant reactivity 1245 | (REACTR) Default: 8 ! REACTR = 8.0 ! 1246 | 1247 | Number of particle-size intervals used to 1248 | evaluate effective particle deposition velocity 1249 | (NINT) Default: 9 ! NINT = 9 ! 1250 | 1251 | Vegetation state in unirrigated areas 1252 | (IVEG) Default: 1 ! IVEG = 1 ! 1253 | IVEG=1 for active and unstressed vegetation 1254 | IVEG=2 for active and stressed vegetation 1255 | IVEG=3 for inactive vegetation 1256 | 1257 | !END! 1258 | 1259 | 1260 | ------------------------------------------------------------------------------- 1261 | 1262 | 1263 | INPUT GROUP: 10a, 10b -- Wet Deposition Parameters 1264 | --------------- 1265 | 1266 | --------------- 1267 | Subgroup (10a) 1268 | --------------- 1269 | Scavenging Coefficient -- Units: (sec)**(-1) 1270 | 1271 | Pollutant Liquid Precip. Frozen Precip. 1272 | --------- -------------- -------------- 1273 | # SO2 = 3.0E-05, 0.0E00 # 1274 | # SO4 = 1.0E-04, 3.0E-05 # 1275 | # HNO3 = 6.0E-05, 0.0E00 # 1276 | # NO3 = 1.0E-04, 3.0E-05 # 1277 | # PM10 = 1.0E-04, 3.0E-05 # 1278 | 1279 | !END! 1280 | 1281 | --------------- 1282 | Subgroup (10b) 1283 | --------------- 1284 | 1285 | Scavenging Coefficient for droplet species 1286 | All species contained in a drop will have 1287 | common scavenging coefficients based on the 1288 | droplet. 1289 | (SCSPRAY) 1290 | 1291 | Scavenging Coefficient -- Units: (sec)**(-1) 1292 | 1293 | Liquid Precip. Frozen Precip. 1294 | -------------- -------------- 1295 | ! SCSPRAY = 1.0E-04, 3.0E-5 ! 1296 | 1297 | 1298 | !END! 1299 | 1300 | ------------------------------------------------------------------------------- 1301 | 1302 | 1303 | INPUT GROUP: 11a, 11b, 11c -- Chemistry Parameters 1304 | --------------------- 1305 | 1306 | --------------- 1307 | Subgroup (11a) 1308 | --------------- 1309 | 1310 | Several parameters are needed for one or more of the chemical transformation 1311 | mechanisms. Those used for each mechanism are: 1312 | S 1313 | M B R O 1314 | A B R R R C H 4 B N 1315 | B V C N N N M K - - C O D 1316 | C M G K I I I H H I I K F V E 1317 | M K N N N T T T 2 2 S S P R C C 1318 | O O H H H E E E O O R R M A N A 1319 | Mechanism (MCHEM) Z 3 3 3 3 1 2 3 2 2 P P F C X Y 1320 | -------------------- -------------------------------------------------- 1321 | 0 None . . . . . . . . . . . . . . . . 1322 | 1 MESOPUFF II X X . . X X X X . . . . . . . . 1323 | 2 User Rates . . . . . . . . . . . . . . . . 1324 | 3 RIVAD X X . . X . . . . . . . . . . . 1325 | 4 SOA X X . . . . . . . . . . X X X . 1326 | 5 Radioactive Decay . . . . . . . . . . . . . . . X 1327 | 6 RIVAD/ISORRPIA X X X X X X . . X X X X . . . . 1328 | 7 RIVAD/ISORRPIA/SOA X X X X X X . . X X X X X X . . 1329 | 1330 | 1331 | Ozone data input option (MOZ) Default: 1 ! MOZ = 1 ! 1332 | 1333 | 0 = use a monthly background ozone value 1334 | 1 = read hourly ozone concentrations from 1335 | the OZONE.DAT data file 1336 | 1337 | Monthly ozone concentrations in ppb (BCKO3) 1338 | (Used only if MCHEM = 1,3,4,6, or 7 and either 1339 | MOZ = 0, or 1340 | MOZ = 1 and all hourly O3 data missing) 1341 | Default: 12*80. 1342 | ! BCKO3 = 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00, 40.00 ! 1343 | 1344 | Ammonia data option (MNH3) Default: 0 ! MNH3 = 0 ! 1345 | (Used only if MCHEM = 6 or 7) 1346 | 0 = use monthly background ammonia values (BCKNH3) - no vertical variation 1347 | 1 = read monthly background ammonia values for each layer from 1348 | the NH3Z.DAT data file 1349 | 1350 | Ammonia vertical averaging option (MAVGNH3) 1351 | (Used only if MCHEM = 6 or 7, and MNH3 = 1) 1352 | 0 = use NH3 at puff center height (no averaging is done) 1353 | 1 = average NH3 values over vertical extent of puff 1354 | Default: 1 ! MAVGNH3 = 0 ! 1355 | 1356 | Monthly ammonia concentrations in ppb (BCKNH3) 1357 | (Used only if MCHEM = 1 or 3, or 1358 | if MCHEM = 6 or 7, and MNH3 = 0) 1359 | Default: 12*10. 1360 | ! BCKNH3 = 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00 ! 1361 | 1362 | Nighttime SO2 loss rate in %/hour (RNITE1) 1363 | (Used only if MCHEM = 1, 6 or 7) 1364 | This rate is used only at night for MCHEM=1 1365 | and is added to the computed rate both day 1366 | and night for MCHEM=6,7 (heterogeneous reactions) 1367 | Default: 0.2 ! RNITE1 = .2 ! 1368 | 1369 | Nighttime NOx loss rate in %/hour (RNITE2) 1370 | (Used only if MCHEM = 1) 1371 | Default: 2.0 ! RNITE2 = 2.0 ! 1372 | 1373 | Nighttime HNO3 formation rate in %/hour (RNITE3) 1374 | (Used only if MCHEM = 1) 1375 | Default: 2.0 ! RNITE3 = 2.0 ! 1376 | 1377 | H2O2 data input option (MH2O2) Default: 1 ! MH2O2 = 1 ! 1378 | (Used only if MCHEM = 6 or 7, and MAQCHEM = 1) 1379 | 0 = use a monthly background H2O2 value 1380 | 1 = read hourly H2O2 concentrations from 1381 | the H2O2.DAT data file 1382 | 1383 | Monthly H2O2 concentrations in ppb (BCKH2O2) 1384 | (Used only if MQACHEM = 1 and either 1385 | MH2O2 = 0 or 1386 | MH2O2 = 1 and all hourly H2O2 data missing) 1387 | Default: 12*1. 1388 | ! BCKH2O2 = 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 ! 1389 | 1390 | 1391 | --- Data for ISORROPIA Option 1392 | (used only if MCHEM = 6 or 7) 1393 | 1394 | Minimum relative humidity used in ISORROPIA computations (RH_ISRP) 1395 | Default: 50. ! RH_ISRP = 50.0 ! 1396 | Units: % 1397 | 1398 | Minimum SO4 used in ISORROPIA computations (SO4_ISRP) 1399 | Default: 0.4 ! SO4_ISRP = .4 ! 1400 | Units: ug/m3 1401 | 1402 | 1403 | --- Data for SECONDARY ORGANIC AEROSOL (SOA) Options 1404 | (used only if MCHEM = 4 or 7) 1405 | 1406 | The MCHEM = 4 SOA module uses monthly values of: 1407 | Fine particulate concentration in ug/m^3 (BCKPMF) 1408 | Organic fraction of fine particulate (OFRAC) 1409 | VOC / NOX ratio (after reaction) (VCNX) 1410 | 1411 | The MCHEM = 7 SOA module uses monthly values of: 1412 | Fine particulate concentration in ug/m^3 (BCKPMF) 1413 | Organic fraction of fine particulate (OFRAC) 1414 | 1415 | These characterize the air mass when computing 1416 | the formation of SOA from VOC emissions. 1417 | Typical values for several distinct air mass types are: 1418 | 1419 | Month 1 2 3 4 5 6 7 8 9 10 11 12 1420 | Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1421 | 1422 | Clean Continental 1423 | BCKPMF 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1424 | OFRAC .15 .15 .20 .20 .20 .20 .20 .20 .20 .20 .20 .15 1425 | VCNX 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 1426 | 1427 | Clean Marine (surface) 1428 | BCKPMF .5 .5 .5 .5 .5 .5 .5 .5 .5 .5 .5 .5 1429 | OFRAC .25 .25 .30 .30 .30 .30 .30 .30 .30 .30 .30 .25 1430 | VCNX 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 50. 1431 | 1432 | Urban - low biogenic (controls present) 1433 | BCKPMF 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 30. 1434 | OFRAC .20 .20 .25 .25 .25 .25 .25 .25 .20 .20 .20 .20 1435 | VCNX 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 1436 | 1437 | Urban - high biogenic (controls present) 1438 | BCKPMF 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 60. 1439 | OFRAC .25 .25 .30 .30 .30 .55 .55 .55 .35 .35 .35 .25 1440 | VCNX 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 1441 | 1442 | Regional Plume 1443 | BCKPMF 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 1444 | OFRAC .20 .20 .25 .35 .25 .40 .40 .40 .30 .30 .30 .20 1445 | VCNX 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 15. 1446 | 1447 | Urban - no controls present 1448 | BCKPMF 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 100. 1449 | OFRAC .30 .30 .35 .35 .35 .55 .55 .55 .35 .35 .35 .30 1450 | VCNX 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 1451 | 1452 | Default: Clean Continental 1453 | ! BCKPMF = 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 ! 1454 | ! OFRAC = 0.15, 0.15, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15 ! 1455 | ! VCNX = 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00, 50.00 ! 1456 | 1457 | --- End Data for SECONDARY ORGANIC AEROSOL (SOA) Options 1458 | 1459 | 1460 | Number of half-life decay specification blocks provided in Subgroup 11b 1461 | (Used only if MCHEM = 5) 1462 | (NDECAY) >>>>MARK<<<< Default: 0 ! NDECAY = 0 ! 1463 | 1464 | !END! 1465 | 1466 | 1467 | -------------- 1468 | Subgroup (11b) 1469 | -------------- 1470 | 1471 | Each species modeled may be assigned a decay half-life (sec), and the associated 1472 | mass lost may be assigned to one or more other modeled species using a mass yield 1473 | factor. This information is used only for MCHEM=5. 1474 | 1475 | Provide NDECAY blocks assigning the half-life for a parent species and mass yield 1476 | factors for each child species (if any) produced by the decay. 1477 | Set HALF_LIFE=0.0 for NO decay (infinite half-life). 1478 | 1479 | a b 1480 | SPECIES Half-Life Mass Yield 1481 | NAME (sec) Factor 1482 | ------- --------- ---------- 1483 | 1484 | # SPEC1 = 3600., -1.0 # (Parent) 1485 | # SPEC2 = -1.0, 0.0 # (Child) 1486 | *END* 1487 | 1488 | -------- 1489 | a 1490 | Specify a half life that is greater than or equal to zero for 1 parent species 1491 | in each block, and set the yield factor for this species to -1 1492 | b 1493 | Specify a yield factor that is greater than or equal to zero for 1 or more child 1494 | species in each block, and set the half-life for each of these species to -1 1495 | 1496 | NOTE: Assignments in each block are treated as a separate input 1497 | subgroup and therefore must end with an input group terminator. 1498 | If NDECAY=0, no assignments and input group terminators should appear. 1499 | 1500 | -------------- 1501 | Subgroup (11c) 1502 | -------------- 1503 | 1504 | Each species modeled as evaporating in Input Group 3a 1505 | should have an evaporation rate set here for their carrier species. 1506 | (Option currently not active.) 1507 | 1508 | Evaporation Rates -- Units: (um2/deg C/sec) 1509 | 1510 | Pollutant Evaporation Rate 1511 | --------- -------------- 1512 | # Active = 84.76 # 1513 | 1514 | !END! 1515 | 1516 | ------------------------------------------------------------------------------- 1517 | 1518 | 1519 | INPUT GROUP: 12 -- Misc. Dispersion and Computational Parameters 1520 | --------------- 1521 | 1522 | Horizontal size of puff (m) beyond which 1523 | time-dependent dispersion equations (Heffter) 1524 | are used to determine sigma-y and 1525 | sigma-z (SYTDEP) Default: 550. ! SYTDEP = 5.5E02 ! 1526 | 1527 | Switch for using Heffter equation for sigma z 1528 | as above (0 = Not use Heffter; 1 = use Heffter 1529 | (MHFTSZ) Default: 0 ! MHFTSZ = 0 ! 1530 | 1531 | Stability class used to determine plume 1532 | growth rates for puffs above the boundary 1533 | layer (JSUP) Default: 5 ! JSUP = 5 ! 1534 | 1535 | Vertical dispersion constant for stable 1536 | conditions (k1 in Eqn. 2.7-3) (CONK1) Default: 0.01 ! CONK1 = .01 ! 1537 | 1538 | Vertical dispersion constant for neutral/ 1539 | unstable conditions (k2 in Eqn. 2.7-4) 1540 | (CONK2) Default: 0.1 ! CONK2 = .1 ! 1541 | 1542 | Factor for determining Transition-point from 1543 | Schulman-Scire to Huber-Snyder Building Downwash 1544 | scheme (SS used for Hs < Hb + TBD * HL) 1545 | (TBD) Default: 0.5 ! TBD = .5 ! 1546 | TBD < 0 ==> always use Huber-Snyder 1547 | TBD = 1.5 ==> always use Schulman-Scire 1548 | TBD = 0.5 ==> ISC Transition-point 1549 | 1550 | Range of land use categories for which 1551 | urban dispersion is assumed 1552 | (IURB1, IURB2) Default: 10 ! IURB1 = 10 ! 1553 | 19 ! IURB2 = 19 ! 1554 | 1555 | Site characterization parameters for single-point Met data files --------- 1556 | (needed for METFM = 2,3,4,5) 1557 | 1558 | Land use category for modeling domain 1559 | (ILANDUIN) Default: 20 ! ILANDUIN = 20 ! 1560 | 1561 | Roughness length (m) for modeling domain 1562 | (Z0IN) Default: 0.25 ! Z0IN = .25 ! 1563 | 1564 | Leaf area index for modeling domain 1565 | (XLAIIN) Default: 3.0 ! XLAIIN = 3.0 ! 1566 | 1567 | Elevation above sea level (m) 1568 | (ELEVIN) Default: 0.0 ! ELEVIN = .0 ! 1569 | 1570 | Latitude (degrees) for met location 1571 | (XLATIN) Default: -999. ! XLATIN = -999.0 ! 1572 | 1573 | Longitude (degrees) for met location 1574 | (XLONIN) Default: -999. ! XLONIN = -999.0 ! 1575 | 1576 | Specialized information for interpreting single-point Met data files ----- 1577 | 1578 | Anemometer height (m) (Used only if METFM = 2,3) 1579 | (ANEMHT) Default: 10. ! ANEMHT = 10.0 ! 1580 | 1581 | Form of lateral turbulance data in PROFILE.DAT file 1582 | (Used only if METFM = 4,5 or MTURBVW = 1 or 3) 1583 | (ISIGMAV) Default: 1 ! ISIGMAV = 1 ! 1584 | 0 = read sigma-theta 1585 | 1 = read sigma-v 1586 | 1587 | Choice of mixing heights (Used only if METFM = 4) 1588 | (IMIXCTDM) Default: 0 ! IMIXCTDM = 0 ! 1589 | 0 = read PREDICTED mixing heights 1590 | 1 = read OBSERVED mixing heights 1591 | 1592 | Maximum length of a slug (met. grid units) 1593 | (XMXLEN) Default: 1.0 ! XMXLEN = 1.0 ! 1594 | 1595 | Maximum travel distance of a puff/slug (in 1596 | grid units) during one sampling step 1597 | (XSAMLEN) Default: 1.0 ! XSAMLEN = 1.0 ! 1598 | 1599 | Maximum Number of slugs/puffs release from 1600 | one source during one time step 1601 | (MXNEW) Default: 99 ! MXNEW = 99 ! 1602 | 1603 | Maximum Number of sampling steps for 1604 | one puff/slug during one time step 1605 | (MXSAM) Default: 99 ! MXSAM = 99 ! 1606 | 1607 | Number of iterations used when computing 1608 | the transport wind for a sampling step 1609 | that includes gradual rise (for CALMET 1610 | and PROFILE winds) 1611 | (NCOUNT) Default: 2 ! NCOUNT = 2 ! 1612 | 1613 | Minimum sigma y for a new puff/slug (m) 1614 | (SYMIN) Default: 1.0 ! SYMIN = 1.0 ! 1615 | 1616 | Minimum sigma z for a new puff/slug (m) 1617 | (SZMIN) Default: 1.0 ! SZMIN = 1.0 ! 1618 | 1619 | Maximum sigma z (m) allowed to avoid 1620 | numerical problem in calculating virtual 1621 | time or distance. Cap should be large 1622 | enough to have no influence on normal events. 1623 | Enter a negative cap to disable. 1624 | (SZCAP_M) Default: 5.0e06 ! SZCAP_M = 5.0E06 ! 1625 | 1626 | 1627 | Default minimum turbulence velocities sigma-v and sigma-w 1628 | for each stability class over land and over water (m/s) 1629 | (SVMIN(12) and SWMIN(12)) 1630 | 1631 | ---------- LAND ---------- --------- WATER ---------- 1632 | Stab Class : A B C D E F A B C D E F 1633 | --- --- --- --- --- --- --- --- --- --- --- --- 1634 | Default SVMIN : .50, .50, .50, .50, .50, .50, .37, .37, .37, .37, .37, .37 1635 | Default SWMIN : .20, .12, .08, .06, .03, .016, .20, .12, .08, .06, .03, .016 1636 | 1637 | ! SVMIN = 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.370, 0.370, 0.370, 0.370, 0.370, 0.370! 1638 | ! SWMIN = 0.200, 0.120, 0.080, 0.060, 0.030, 0.016, 0.200, 0.120, 0.080, 0.060, 0.030, 0.016! 1639 | 1640 | Divergence criterion for dw/dz across puff 1641 | used to initiate adjustment for horizontal 1642 | convergence (1/s) 1643 | Partial adjustment starts at CDIV(1), and 1644 | full adjustment is reached at CDIV(2) 1645 | (CDIV(2)) Default: 0.0,0.0 ! CDIV = .01, .01 ! 1646 | 1647 | Search radius (number of cells) for nearest 1648 | land and water cells used in the subgrid 1649 | TIBL module 1650 | (NLUTIBL) Default: 4 ! NLUTIBL = 4 ! 1651 | 1652 | Minimum wind speed (m/s) allowed for 1653 | non-calm conditions. Also used as minimum 1654 | speed returned when using power-law 1655 | extrapolation toward surface 1656 | (WSCALM) Default: 0.5 ! WSCALM = .5 ! 1657 | 1658 | Maximum mixing height (m) 1659 | (XMAXZI) Default: 3000. ! XMAXZI = 3000.0 ! 1660 | 1661 | Minimum mixing height (m) 1662 | (XMINZI) Default: 50. ! XMINZI = 50.0 ! 1663 | 1664 | 1665 | Temperatures (K) used for defining upper bound of 1666 | categories for emissions scale-factors 1667 | 11 upper bounds (K) are entered; the 12th class has no upper limit 1668 | (TKCAT(11)) 1669 | Default : 265., 270., 275., 280., 285., 290., 295., 300., 305., 310., 315. (315.+) 1670 | < < < < < < < < < < < 1671 | Temperature Class : 1 2 3 4 5 6 7 8 9 10 11 (12) 1672 | ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 1673 | ! TKCAT = 265., 270., 275., 280., 285., 290., 295., 300., 305., 310., 315. ! 1674 | 1675 | Wind Speeds (m/s) used for defining upper bound of 1676 | categories for emissions scale-factors 1677 | 5 upper bounds (m/s) are entered; the 6th class has no upper limit 1678 | (WSCAT(5)) Default : 1679 | ISC RURAL : 1.54, 3.09, 5.14, 8.23, 10.8 (10.8+) 1680 | 1681 | Wind Speed Class : 1 2 3 4 5 1682 | --- --- --- --- --- 1683 | ! WSCAT = 1.54, 3.09, 5.14, 8.23, 10.80 ! 1684 | 1685 | Default wind speed profile power-law 1686 | exponents for stabilities 1-6 1687 | (PLX0(6)) Default : ISC RURAL values 1688 | ISC RURAL : .07, .07, .10, .15, .35, .55 1689 | ISC URBAN : .15, .15, .20, .25, .30, .30 1690 | 1691 | Stability Class : A B C D E F 1692 | --- --- --- --- --- --- 1693 | ! PLX0 = 0.07, 0.07, 0.10, 0.15, 0.35, 0.55 ! 1694 | 1695 | Default potential temperature gradient 1696 | for stable classes E, F (degK/m) 1697 | (PTG0(2)) Default: 0.020, 0.035 1698 | ! PTG0 = 0.020, 0.035 ! 1699 | 1700 | Default plume path coefficients for 1701 | each stability class (used when option 1702 | for partial plume height terrain adjustment 1703 | is selected -- MCTADJ=3) 1704 | (PPC(6)) Stability Class : A B C D E F 1705 | Default PPC : .50, .50, .50, .50, .35, .35 1706 | --- --- --- --- --- --- 1707 | ! PPC = 0.50, 0.50, 0.50, 0.50, 0.35, 0.35 ! 1708 | 1709 | Slug-to-puff transition criterion factor 1710 | equal to sigma-y/length of slug 1711 | (SL2PF) Default: 10. ! SL2PF = 5.0 ! 1712 | 1713 | Receptor-specific puff/slug properties (e.g., sigmas and height above 1714 | ground at the time when the trajectory is nearest the receptor) may be 1715 | extrapolated forward or backward in time along the current step using 1716 | the current dispersion, for receptors that lie upwind of the puff/slug 1717 | position at the start of a step, or downwind at the end of a step. 1718 | Specify the upwind/downwind extrapolation zone in sigma-y units. 1719 | Using FCLIP=1.0 clips the the upwind zone at one sigma-y at the start 1720 | of the step and the downwind zone at one sigma-y at the end of the step. 1721 | This is consistent with the sampling done in CALPUFF versions through 1722 | v6.42 prior to the introduction of the FCLIP option. 1723 | The default is No Extrapolation, FCLIP=0.0. 1724 | (FCLIP) Default: 0.0 ! FCLIP = 0.0 ! 1725 | 1726 | Puff-splitting control variables ------------------------ 1727 | 1728 | VERTICAL SPLIT 1729 | -------------- 1730 | 1731 | Number of puffs that result every time a puff 1732 | is split - nsplit=2 means that 1 puff splits 1733 | into 2 1734 | (NSPLIT) Default: 3 ! NSPLIT = 3 ! 1735 | 1736 | Time(s) of a day when split puffs are eligible to 1737 | be split once again; this is typically set once 1738 | per day, around sunset before nocturnal shear develops. 1739 | 24 values: 0 is midnight (00:00) and 23 is 11 PM (23:00) 1740 | 0=do not re-split 1=eligible for re-split 1741 | (IRESPLIT(24)) Default: Hour 17 = 1 1742 | ! IRESPLIT = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 ! 1743 | 1744 | Split is allowed only if last hour's mixing 1745 | height (m) exceeds a minimum value 1746 | (ZISPLIT) Default: 100. ! ZISPLIT = 100.0 ! 1747 | 1748 | Split is allowed only if ratio of last hour's 1749 | mixing ht to the maximum mixing ht experienced 1750 | by the puff is less than a maximum value (this 1751 | postpones a split until a nocturnal layer develops) 1752 | (ROLDMAX) Default: 0.25 ! ROLDMAX = 0.25 ! 1753 | 1754 | 1755 | HORIZONTAL SPLIT 1756 | ---------------- 1757 | 1758 | Number of puffs that result every time a puff 1759 | is split - nsplith=5 means that 1 puff splits 1760 | into 5 1761 | (NSPLITH) Default: 5 ! NSPLITH = 5 ! 1762 | 1763 | Minimum sigma-y (Grid Cells Units) of puff 1764 | before it may be split 1765 | (SYSPLITH) Default: 1.0 ! SYSPLITH = 1.0 ! 1766 | 1767 | Minimum puff elongation rate (SYSPLITH/hr) due to 1768 | wind shear, before it may be split 1769 | (SHSPLITH) Default: 2. ! SHSPLITH = 2.0 ! 1770 | 1771 | Minimum concentration (g/m^3) of each 1772 | species in puff before it may be split 1773 | Enter array of NSPEC values; if a single value is 1774 | entered, it will be used for ALL species 1775 | (CNSPLITH) Default: 1.0E-07 ! CNSPLITH = 1.0E-07 ! 1776 | 1777 | Integration control variables ------------------------ 1778 | 1779 | Fractional convergence criterion for numerical SLUG 1780 | sampling integration 1781 | (EPSSLUG) Default: 1.0e-04 ! EPSSLUG = 1.0E-04 ! 1782 | 1783 | Fractional convergence criterion for numerical AREA 1784 | source integration 1785 | (EPSAREA) Default: 1.0e-06 ! EPSAREA = 1.0E-06 ! 1786 | 1787 | Trajectory step-length (m) used for numerical rise 1788 | integration 1789 | (DSRISE) Default: 1.0 ! DSRISE = 1.0 ! 1790 | 1791 | Boundary Condition (BC) Puff control variables ------------------------ 1792 | 1793 | Minimum height (m) to which BC puffs are mixed as they are emitted 1794 | (MBCON=2 ONLY). Actual height is reset to the current mixing height 1795 | at the release point if greater than this minimum. 1796 | (HTMINBC) Default: 500. ! HTMINBC = 500.0 ! 1797 | 1798 | Search radius (km) about a receptor for sampling nearest BC puff. 1799 | BC puffs are typically emitted with a spacing of one grid cell 1800 | length, so the search radius should be greater than DGRIDKM. 1801 | (RSAMPBC) Default: 10. ! RSAMPBC = 15.0 ! 1802 | 1803 | Near-Surface depletion adjustment to concentration profile used when 1804 | sampling BC puffs? 1805 | (MDEPBC) Default: 1 ! MDEPBC = 0 ! 1806 | 0 = Concentration is NOT adjusted for depletion 1807 | 1 = Adjust Concentration for depletion 1808 | 1809 | !END! 1810 | 1811 | 1812 | ------------------------------------------------------------------------------- 1813 | 1814 | 1815 | INPUT GROUPS: 13a, 13b, 13c, 13d -- Point source parameters 1816 | -------------------------------- 1817 | 1818 | --------------- 1819 | Subgroup (13a) 1820 | --------------- 1821 | 1822 | Number of point sources with 1823 | parameters provided below (NPT1) No default ! NPT1 = 0 ! 1824 | 1825 | Units used for point source 1826 | emissions below (IPTU) Default: 1 ! IPTU = 1 ! 1827 | 1 = g/s 1828 | 2 = kg/hr 1829 | 3 = lb/hr 1830 | 4 = tons/yr 1831 | 5 = Odour Unit * m**3/s (vol. flux of odour compound) 1832 | 6 = Odour Unit * m**3/min 1833 | 7 = metric tons/yr 1834 | 8 = Bq/s (Bq = becquerel = disintegrations/s) 1835 | 9 = GBq/yr 1836 | 1837 | 1838 | Number of source-species 1839 | combinations with variable 1840 | emissions scaling factors 1841 | provided below in (13d) (NSPT1) Default: 0 ! NSPT1 = 0 ! 1842 | 1843 | Number of point sources with 1844 | variable emission parameters 1845 | provided in external file (NPT2) No default ! NPT2 = 0 ! 1846 | 1847 | (If NPT2 > 0, these point 1848 | source emissions are read from 1849 | the file: PTEMARB.DAT) 1850 | 1851 | !END! 1852 | 1853 | --------------- 1854 | Subgroup (13b) 1855 | --------------- 1856 | a 1857 | POINT SOURCE: CONSTANT DATA 1858 | ----------------------------- 1859 | b c 1860 | Source X Y Stack Base Stack Exit Exit Bldg. Emission 1861 | No. Coordinate Coordinate Height Elevation Diameter Vel. Temp. Dwash Rates 1862 | (km) (km) (m) (m) (m) (m/s) (deg. K) 1863 | ------ ---------- ---------- ------ ------ -------- ----- -------- ----- -------- 1864 | 1 # SRCNAM = STK1 # 1865 | 1 # X = 1.5, 0.5, 20.0, 4.0, 0.8, 8.5, 291.0, .0, 1866 | 1.0E01, 4.0E00 # 1867 | 1 # ZPLTFM = .0 # 1868 | 1 # FMFAC = 1.0 # #END# 1869 | 1870 | 2 # SRCNAM = STK2 # 1871 | 2 # X = 323.6, 4833.1, 33.0, 241.0, 3.5, 10.0, 330.0, .0, 1872 | 1.5E01, 0.0E00, 6.0E00, 1.5E00, 0.0E00, 0.0E00, 1.5E01 # 1873 | 2 # ZPLTFM = .0 # 1874 | 2 # FMFAC = 1.0 # #END# 1875 | 1876 | 3 # SRCNAM = STK3 # 1877 | 3 # X = 367.2, 4871.8, 43.0, 121.5, 3.1, 7.6, 340.0, .0, 1878 | 1.1E01, 0.0E00, 5.0E00, 1.1E00, 0.0E00, 0.0E00, 1.1E01 # 1879 | 3 # ZPLTFM = .0 # 1880 | 3 # FMFAC = 1.0 # #END# 1881 | 1882 | -------- 1883 | 1884 | a 1885 | Data for each source are treated as a separate input subgroup 1886 | and therefore must end with an input group terminator. 1887 | 1888 | SRCNAM is a 12-character name for a source 1889 | (No default) 1890 | X is an array holding the source data listed by the column headings 1891 | (No default) 1892 | SIGYZI is an array holding the initial sigma-y and sigma-z (m) 1893 | (Default: 0.,0.) 1894 | FMFAC is a vertical momentum flux factor (0. or 1.0) used to represent 1895 | the effect of rain-caps or other physical configurations that 1896 | reduce momentum rise associated with the actual exit velocity. 1897 | (Default: 1.0 -- full momentum used) 1898 | ZPLTFM is the platform height (m) for sources influenced by an isolated 1899 | structure that has a significant open area between the surface 1900 | and the bulk of the structure, such as an offshore oil platform. 1901 | The Base Elevation is that of the surface (ground or ocean), 1902 | and the Stack Height is the release height above the Base (not 1903 | above the platform). Building heights entered in Subgroup 13c 1904 | must be those of the buildings on the platform, measured from 1905 | the platform deck. ZPLTFM is used only with MBDW=1 (ISC 1906 | downwash method) for sources with building downwash. 1907 | (Default: 0.0) 1908 | 1909 | b 1910 | 0. = No building downwash modeled 1911 | 1. = Downwash modeled for buildings resting on the surface 1912 | 2. = Downwash modeled for buildings raised above the surface (ZPLTFM > 0.) 1913 | NOTE: must be entered as a REAL number (i.e., with decimal point) 1914 | 1915 | c 1916 | An emission rate must be entered for every pollutant modeled. 1917 | Enter emission rate of zero for secondary pollutants that are 1918 | modeled, but not emitted. Units are specified by IPTU 1919 | (e.g. 1 for g/s). 1920 | 1921 | --------------- 1922 | Subgroup (13c) 1923 | --------------- 1924 | 1925 | BUILDING DIMENSION DATA FOR SOURCES SUBJECT TO DOWNWASH 1926 | ------------------------------------------------------- 1927 | Source a 1928 | No. Effective building height, width, length and X/Y offset (in meters) 1929 | every 10 degrees. LENGTH, XBADJ, and YBADJ are only needed for 1930 | MBDW=2 (PRIME downwash option) 1931 | ------ -------------------------------------------------------------------- 1932 | 1 # SRCNAM = STK1 # 1933 | 1 # HEIGHT = 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 1934 | 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 1935 | 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 1936 | 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 1937 | 50.0, 50.0, 50.0, 50.0, 50.0, 50.0, 1938 | 50.0, 50.0, 50.0, 50.0, 50.0, 50.0 # 1939 | 1 # WIDTH = 62.26, 72.64, 80.8, 86.51, 89.59, 89.95, 1940 | 87.58, 82.54, 75.0, 82.54, 87.58, 89.95, 1941 | 89.59, 86.51, 80.8, 72.64, 62.26, 50.0, 1942 | 62.26, 72.64, 80.8, 86.51, 89.59, 89.95, 1943 | 87.58, 82.54, 75.0, 82.54, 87.58, 89.95, 1944 | 89.59, 86.51, 80.8, 72.64, 62.26, 50.0 # 1945 | 1 # LENGTH = 82.54, 87.58, 89.95, 89.59, 86.51, 80.80, 1946 | 72.64, 62.26, 50.00, 62.26, 72.64, 80.80, 1947 | 86.51, 89.59, 89.95, 87.58, 82.54, 75.00, 1948 | 82.54, 87.58, 89.95, 89.59, 86.51, 80.80, 1949 | 72.64, 62.26, 50.00, 62.26, 72.64, 80.80, 1950 | 86.51, 89.59, 89.95, 87.58, 82.54, 75.00 # 1951 | 1 # XBADJ = -47.35, -55.76, -62.48, -67.29, -70.07, -70.71, 1952 | -69.21, -65.60, -60.00, -65.60, -69.21, -70.71, 1953 | -70.07, -67.29, -62.48, -55.76, -47.35, -37.50, 1954 | -35.19, -31.82, -27.48, -22.30, -16.44, -10.09, 1955 | -3.43, 3.34, 10.00, 3.34, -3.43, -10.09, 1956 | -16.44, -22.30, -27.48, -31.82, -35.19, -37.50 # 1957 | 1 # YBADJ = 34.47, 32.89, 30.31, 26.81, 22.50, 17.50, 1958 | 11.97, 6.08, 0.00, -6.08, -11.97, -17.50, 1959 | -22.50, -26.81, -30.31, -32.89, -34.47, -35.00, 1960 | -34.47, -32.89, -30.31, -26.81, -22.50, -17.50, 1961 | -11.97, -6.08, 0.00, 6.08, 11.97, 17.50, 1962 | 22.50, 26.81, 30.31, 32.89, 34.47, 35.00 # 1963 | #END# 1964 | 1965 | 1966 | -------- 1967 | 1968 | a 1969 | Building height, width, length, and X/Y offset from the source are treated 1970 | as a separate input subgroup for each source and therefore must end with 1971 | an input group terminator. The X/Y offset is the position, relative to the 1972 | stack, of the center of the upwind face of the projected building, with the 1973 | x-axis pointing along the flow direction. 1974 | 1975 | --------------- 1976 | Subgroup (13d) 1977 | --------------- 1978 | a 1979 | POINT SOURCE: EMISSION-RATE SCALING FACTORS 1980 | ------------------------------------------- 1981 | 1982 | Use this subgroup to identify temporal variations in the emission 1983 | rates given in 13b. Factors assigned multiply the rates in 13b. 1984 | Skip sources here that have constant emissions. For more elaborate 1985 | variation in source parameters, use PTEMARB.DAT and NPT2 > 0. 1986 | 1987 | Sets of emission-rate scale factors are defined in Input Group 19, and 1988 | are referenced by the FACTORNAME. Provide NSPT1 lines that identify the 1989 | emission-rate scale factor table for each source-species combination that 1990 | uses the scaling option. Note that a scale-factor table can be used with 1991 | more than one source-species combination so a FACTORNAME can be repeated. 1992 | 1993 | 1994 | Source- Source Species Scale-factor table 1995 | Species Name b Name c Name d 1996 | No. (SRCNAM) (CSPEC) (FACTORNAME) 1997 | ------ ------------ ------------ --------------------- 1998 | 1999 | 1 # SCALEFACTOR = STK1, SO2, POINTS1 # #END# 2000 | 2 # SCALEFACTOR = STK1, PM10, POINTS_DIURNAL # #END# 2001 | 3 # SCALEFACTOR = STK3, SO2, MONTHLY_HEATING # #END# 2002 | 4 # SCALEFACTOR = STK2, SO2, MONTHLY_HEATING # #END# 2003 | 2004 | -------- 2005 | a 2006 | Assignment for each source-specie is treated as a separate input subgroup 2007 | and therefore must end with an input group terminator. 2008 | b 2009 | Source name must match one of the SRCNAM names defined in Input Group 13b 2010 | c 2011 | Species name must match one of the CSPEC names of emitted species defined in Input Group 3 2012 | d 2013 | Scale-factor name must match one of the FACTORNAME names defined in Input Group 19 2014 | 2015 | 2016 | ------------------------------------------------------------------------------- 2017 | 2018 | 2019 | INPUT GROUPS: 14a, 14b, 14c, 14d -- Area source parameters 2020 | -------------------------------- 2021 | 2022 | --------------- 2023 | Subgroup (14a) 2024 | --------------- 2025 | 2026 | Number of polygon area sources with 2027 | parameters specified below (NAR1) No default ! NAR1 = 0 ! 2028 | 2029 | Units used for area source 2030 | emissions below (IARU) Default: 1 ! IARU = 1 ! 2031 | 1 = g/m**2/s 2032 | 2 = kg/m**2/hr 2033 | 3 = lb/m**2/hr 2034 | 4 = tons/m**2/yr 2035 | 5 = Odour Unit * m/s (vol. flux/m**2 of odour compound) 2036 | 6 = Odour Unit * m/min 2037 | 7 = metric tons/m**2/yr 2038 | 8 = Bq/m**2/s (Bq = becquerel = disintegrations/s) 2039 | 9 = GBq/m**2/yr 2040 | 2041 | Number of source-species 2042 | combinations with variable 2043 | emissions scaling factors 2044 | provided below in (14d) (NSAR1) Default: 0 ! NSAR1 = 0 ! 2045 | 2046 | Number of buoyant polygon area sources 2047 | with variable location and emission 2048 | parameters (NAR2) No default ! NAR2 = 0 ! 2049 | (If NAR2 > 0, ALL parameter data for 2050 | these sources are read from the file: BAEMARB.DAT) 2051 | 2052 | !END! 2053 | 2054 | --------------- 2055 | Subgroup (14b) 2056 | --------------- 2057 | a 2058 | AREA SOURCE: CONSTANT DATA 2059 | ---------------------------- 2060 | b 2061 | Source Effect. Base Initial Emission 2062 | No. Height Elevation Sigma z Rates 2063 | (m) (m) (m) 2064 | ------- ------ ------ -------- --------- 2065 | 2066 | 2067 | -------- 2068 | a 2069 | Data for each source are treated as a separate input subgroup 2070 | and therefore must end with an input group terminator. 2071 | b 2072 | An emission rate must be entered for every pollutant modeled. 2073 | Enter emission rate of zero for secondary pollutants that are 2074 | modeled, but not emitted. Units are specified by IARU 2075 | (e.g. 1 for g/m**2/s). 2076 | 2077 | --------------- 2078 | Subgroup (14c) 2079 | --------------- 2080 | 2081 | COORDINATES (km) FOR EACH VERTEX(4) OF EACH POLYGON 2082 | -------------------------------------------------------- 2083 | Source a 2084 | No. Ordered list of X followed by list of Y, grouped by source 2085 | ------ ------------------------------------------------------------ 2086 | 2087 | 2088 | -------- 2089 | a 2090 | Data for each source are treated as a separate input subgroup 2091 | and therefore must end with an input group terminator. 2092 | 2093 | 2094 | --------------- 2095 | Subgroup (14d) 2096 | --------------- 2097 | a 2098 | AREA SOURCE: EMISSION-RATE SCALING FACTORS 2099 | ------------------------------------------- 2100 | 2101 | Use this subgroup to identify temporal variations in the emission 2102 | rates given in 14b. Factors assigned multiply the rates in 14b. 2103 | Skip sources here that have constant emissions. For more elaborate 2104 | variation in source parameters, use BAEMARB.DAT and NAR2 > 0. 2105 | 2106 | Sets of emission-rate scale factors are defined in Input Group 19, and 2107 | are referenced by the FACTORNAME. Provide NSAR1 lines that identify the 2108 | emission-rate scale factor table for each source-species combination that 2109 | uses the scaling option. Note that a scale-factor table can be used with 2110 | more than one source-species combination so a FACTORNAME can be repeated. 2111 | 2112 | 2113 | Source- Source Species Scale-factor table 2114 | Species Name b Name c Name d 2115 | No. (SRCNAM) (CSPEC) (FACTORNAME) 2116 | ------ ------------ ------------ --------------------- 2117 | 2118 | 1 # SCALEFACTOR = 1, SO2, AREAS # #END# 2119 | 2120 | -------- 2121 | a 2122 | Assignment for each source-specie is treated as a separate input subgroup 2123 | and therefore must end with an input group terminator. 2124 | b 2125 | Source name must match one of the SRCNAM names defined in Input Group 14b 2126 | c 2127 | Species name must match one of the CSPEC names of emitted species defined in Input Group 3 2128 | d 2129 | Scale-factor name must match one of the FACTORNAME names defined in Input Group 19 2130 | 2131 | 2132 | ------------------------------------------------------------------------------- 2133 | 2134 | INPUT GROUPS: 15a, 15b, 15c -- Line source parameters 2135 | --------------------------- 2136 | 2137 | --------------- 2138 | Subgroup (15a) 2139 | --------------- 2140 | 2141 | Number of buoyant line sources 2142 | with variable location and emission 2143 | parameters (NLN2) No default ! NLN2 = 0 ! 2144 | 2145 | (If NLN2 > 0, ALL parameter data for 2146 | these sources are read from the file: LNEMARB.DAT) 2147 | 2148 | Number of buoyant line sources (NLINES) No default ! NLINES = 0 ! 2149 | 2150 | Units used for line source 2151 | emissions below (ILNU) Default: 1 ! ILNU = 1 ! 2152 | 1 = g/s 2153 | 2 = kg/hr 2154 | 3 = lb/hr 2155 | 4 = tons/yr 2156 | 5 = Odour Unit * m**3/s (vol. flux of odour compound) 2157 | 6 = Odour Unit * m**3/min 2158 | 7 = metric tons/yr 2159 | 8 = Bq/s (Bq = becquerel = disintegrations/s) 2160 | 9 = GBq/yr 2161 | 2162 | Number of source-species 2163 | combinations with variable 2164 | emissions scaling factors 2165 | provided below in (15c) (NSLN1) Default: 0 ! NSLN1 = 0 ! 2166 | 2167 | Maximum number of segments used to model 2168 | each line (MXNSEG) Default: 7 ! MXNSEG = 7 ! 2169 | 2170 | The following variables are required only if NLINES > 0. They are 2171 | used in the buoyant line source plume rise calculations. 2172 | 2173 | Number of distances at which Default: 6 ! NLRISE = 6 ! 2174 | transitional rise is computed 2175 | 2176 | Average building length (XL) No default ! XL = .0 ! 2177 | (in meters) 2178 | 2179 | Average building height (HBL) No default ! HBL = .0 ! 2180 | (in meters) 2181 | 2182 | Average building width (WBL) No default ! WBL = .0 ! 2183 | (in meters) 2184 | 2185 | Average line source width (WML) No default ! WML = .0 ! 2186 | (in meters) 2187 | 2188 | Average separation between buildings (DXL) No default ! DXL = .0 ! 2189 | (in meters) 2190 | 2191 | Average buoyancy parameter (FPRIMEL) No default ! FPRIMEL = .0 ! 2192 | (in m**4/s**3) 2193 | 2194 | !END! 2195 | 2196 | --------------- 2197 | Subgroup (15b) 2198 | --------------- 2199 | 2200 | BUOYANT LINE SOURCE: CONSTANT DATA 2201 | ---------------------------------- 2202 | a 2203 | Source Beg. X Beg. Y End. X End. Y Release Base Emission 2204 | No. Coordinate Coordinate Coordinate Coordinate Height Elevation Rates 2205 | (km) (km) (km) (km) (m) (m) 2206 | ------ ---------- ---------- --------- ---------- ------- --------- --------- 2207 | 2208 | -------- 2209 | 2210 | a 2211 | Data for each source are treated as a separate input subgroup 2212 | and therefore must end with an input group terminator. 2213 | 2214 | b 2215 | An emission rate must be entered for every pollutant modeled. 2216 | Enter emission rate of zero for secondary pollutants that are 2217 | modeled, but not emitted. Units are specified by ILNTU 2218 | (e.g. 1 for g/s). 2219 | 2220 | --------------- 2221 | Subgroup (15c) 2222 | --------------- 2223 | a 2224 | BUOYANT LINE SOURCE: EMISSION-RATE SCALING FACTORS 2225 | -------------------------------------------------- 2226 | 2227 | Use this subgroup to identify temporal variations in the emission 2228 | rates given in 15b. Factors assigned multiply the rates in 15b. 2229 | Skip sources here that have constant emissions. For more elaborate 2230 | variation in source parameters, use LNEMARB.DAT and NLN2 > 0. 2231 | 2232 | Sets of emission-rate scale factors are defined in Input Group 19, and 2233 | are referenced by the FACTORNAME. Provide NSLN1 lines that identify the 2234 | emission-rate scale factor table for each source-species combination that 2235 | uses the scaling option. Note that a scale-factor table can be used with 2236 | more than one source-species combination so a FACTORNAME can be repeated. 2237 | 2238 | 2239 | Source- Source Species Scale-factor table 2240 | Species Name b Name c Name d 2241 | No. (SRCNAM) (CSPEC) (FACTORNAME) 2242 | ------ ------------ ------------ --------------------- 2243 | 2244 | 1 # SCALEFACTOR = 1, SO2, LINES # #END# 2245 | 2246 | -------- 2247 | a 2248 | Assignment for each source-specie is treated as a separate input subgroup 2249 | and therefore must end with an input group terminator. 2250 | b 2251 | Source name must match one of the SRCNAM names defined in Input Group 15b 2252 | c 2253 | Species name must match one of the CSPEC names of emitted species defined in Input Group 3 2254 | d 2255 | Scale-factor name must match one of the FACTORNAME names defined in Input Group 19 2256 | 2257 | 2258 | ------------------------------------------------------------------------------- 2259 | 2260 | 2261 | INPUT GROUPS: 16a, 16b, 16c -- Volume source parameters 2262 | --------------------------- 2263 | 2264 | --------------- 2265 | Subgroup (16a) 2266 | --------------- 2267 | 2268 | Number of volume sources with 2269 | parameters provided in 16b,c (NVL1) No default ! NVL1 = 0 ! 2270 | 2271 | Units used for volume source 2272 | emissions below in 16b (IVLU) Default: 1 ! IVLU = 1 ! 2273 | 1 = g/s 2274 | 2 = kg/hr 2275 | 3 = lb/hr 2276 | 4 = tons/yr 2277 | 5 = Odour Unit * m**3/s (vol. flux of odour compound) 2278 | 6 = Odour Unit * m**3/min 2279 | 7 = metric tons/yr 2280 | 8 = Bq/s (Bq = becquerel = disintegrations/s) 2281 | 9 = GBq/yr 2282 | 2283 | Number of source-species 2284 | combinations with variable 2285 | emissions scaling factors 2286 | provided below in (16c) (NSVL1) Default: 0 ! NSVL1 = 0 ! 2287 | 2288 | Number of volume sources with 2289 | variable location and emission 2290 | parameters (NVL2) No default ! NVL2 = 0 ! 2291 | 2292 | (If NVL2 > 0, ALL parameter data for 2293 | these sources are read from the VOLEMARB.DAT file(s) ) 2294 | 2295 | !END! 2296 | 2297 | --------------- 2298 | Subgroup (16b) 2299 | --------------- 2300 | a 2301 | VOLUME SOURCE: CONSTANT DATA 2302 | ------------------------------ 2303 | b 2304 | Source X Y Effect. Base Initial Initial Emission 2305 | No. Coordinate Coordinate Height Elevation Sigma y Sigma z Rates 2306 | (km) (km) (m) (m) (m) (m) 2307 | ------ ---------- ---------- ------ ------ -------- -------- -------- 2308 | 2309 | 2310 | -------- 2311 | a 2312 | Data for each source are treated as a separate input subgroup 2313 | and therefore must end with an input group terminator. 2314 | 2315 | b 2316 | An emission rate must be entered for every pollutant modeled. 2317 | Enter emission rate of zero for secondary pollutants that are 2318 | modeled, but not emitted. Units are specified by IVLU 2319 | (e.g. 1 for g/s). 2320 | 2321 | --------------- 2322 | Subgroup (16c) 2323 | --------------- 2324 | a 2325 | VOLUME SOURCE: EMISSION-RATE SCALING FACTORS 2326 | -------------------------------------------- 2327 | 2328 | Use this subgroup to identify temporal variations in the emission 2329 | rates given in 16b. Factors assigned multiply the rates in 16b. 2330 | Skip sources here that have constant emissions. For more elaborate 2331 | variation in source parameters, use VOLEMARB.DAT and NVL2 > 0. 2332 | 2333 | Sets of emission-rate scale factors are defined in Input Group 19, and 2334 | are referenced by the FACTORNAME. Provide NSVL1 lines that identify the 2335 | emission-rate scale factor table for each source-species combination that 2336 | uses the scaling option. Note that a scale-factor table can be used with 2337 | more than one source-species combination so a FACTORNAME can be repeated. 2338 | 2339 | 2340 | Source- Source Species Scale-factor table 2341 | Species Name b Name c Name d 2342 | No. (SRCNAM) (CSPEC) (FACTORNAME) 2343 | ------ ------------ ------------ --------------------- 2344 | 2345 | 1 # SCALEFACTOR = 1, SO2, VOLS_SO2 # #END# 2346 | 2347 | -------- 2348 | a 2349 | Assignment for each source-specie is treated as a separate input subgroup 2350 | and therefore must end with an input group terminator. 2351 | b 2352 | Source name must match one of the SRCNAM names defined in Input Group 16b 2353 | c 2354 | Species name must match one of the CSPEC names of emitted species defined in Input Group 3 2355 | d 2356 | Scale-factor name must match one of the FACTORNAME names defined in Input Group 19 2357 | 2358 | 2359 | ------------------------------------------------------------------------------- 2360 | 2361 | INPUT GROUP: 17 -- FLARE source control parameters (variable emissions file) 2362 | --------------- 2363 | 2364 | Number of flare sources defined in FLEMARB.DAT file(s) 2365 | ! NFL1 = 0 ! 2366 | (NFL2) Default: 0 ! NFL2 = 0 ! 2367 | 2368 | (At least 1 FLEMARB.DAT file is needed if NFL2 > 0) 2369 | 2370 | !END! 2371 | 2372 | 2373 | ------------------------------------------------------------------------------- 2374 | 2375 | 2376 | INPUT GROUPS: 18a, 18b, 18c, 18d -- Road Emissions parameters 2377 | --------------------------- 2378 | 2379 | --------------- 2380 | Subgroup (18a) 2381 | --------------- 2382 | 2383 | Emissions from roads are generated from individual line segments defined 2384 | by a sequence of coordinates provided for each road-link. Each link 2385 | is entered as a discrete source and is defined as a section of the road 2386 | for which emissions are uniform. 2387 | 2388 | A long, winding isolated road might be characterized by a single link made 2389 | up of many coordinate triples (x,y,z) that describe its pathway. These 2390 | points should be sufficient to resolve curves, but need not have uniform 2391 | spacing. For example, a straight flat segment can be defined by 2 points, 2392 | regardless of the distance covered. Long line segments are automatically 2393 | divided further within the model into segments that are limited by the 2394 | grid-cell boundaries (no segment may extend across multiple cells). 2395 | One emission rate (g/m/s) for each species is used for the entire road. 2396 | 2397 | Near a congested intersection, many short links may be required to resolve 2398 | the spatial and temporal distribution of emissions. Each is entered and 2399 | modeled as a discrete source. 2400 | 2401 | Number of road-links with emission parameters 2402 | provided in Subgroup 18b (NRD1) No default ! NRD1 = 0 ! 2403 | 2404 | Number of road-links with arbitrarily time-varying 2405 | emission parameters (NRD2) No default ! NRD2 = 0 ! 2406 | (If NRD2 > 0, ALL variable road data 2407 | are read from the file: RDEMARB.DAT) 2408 | 2409 | 2410 | Emissions from one or more of the roads presented in Subgroup 18b 2411 | may vary over time-based cycles or by meteorology. This variability 2412 | is modeled by applying an emission-rate scale factor specified for 2413 | particular road links and species in Subgroup 18c. 2414 | 2415 | Number of road links and species combinations 2416 | with variable emission-rate scale-factors 2417 | (NSFRDS) Default: 0 ! NSFRDS = 0 ! 2418 | 2419 | !END! 2420 | 2421 | --------------- 2422 | Subgroup (18b) 2423 | --------------- 2424 | a 2425 | DATA FOR ROADS WITH CONSTANT OR SCALED EMISSION PARAMETERS 2426 | ----------------------------------------------------------- 2427 | b 2428 | Road Effect. Initial Initial Emission 2429 | No. Height Sigma z Sigma y Rates 2430 | (mAGL) (m) (m) (g/s/m) 2431 | ------- ------ ------ -------- --------- 2432 | c 2433 | 1 #SRCNAM = MAIN_ST_32 # 2434 | 1 # X = 2.0, 3.0, 4.2, 0.1 # #END# 2435 | 2436 | 2 #SRCNAM = CENTRAL # 2437 | 2 # X = 1.0, 1.5, 3.5, 0.03 # #END# 2438 | 2439 | -------- 2440 | a 2441 | Data for each of the NRD1 roads are treated as a separate input subgroup 2442 | and therefore must end with an input group terminator. 2443 | b 2444 | NSPEC Emission rates must be entered (one for every pollutant modeled). 2445 | Enter emission rate of zero for secondary pollutants. 2446 | c 2447 | Road-source names are entered without spaces, and may be 16 characters long. 2448 | 2449 | 2450 | --------------- 2451 | Subgroup (18c) 2452 | --------------- 2453 | a 2454 | EMISSION-RATE SCALING FACTORS 2455 | ------------------------------ 2456 | 2457 | Use this subgroup to identify temporal variations in the emission 2458 | rates given in 18b. Factors assigned multiply the rates in 18b. 2459 | Skip sources here that have constant emissions. For more elaborate 2460 | variation in source parameters, use RDEMARB.DAT and NRD2 > 0. 2461 | 2462 | Sets of emission-rate scale factors are defined in Input Group 19, and 2463 | are referenced by the FACTORNAME. Provide NSFRDS lines that identify the 2464 | emission-rate scale factor table for each source-species combination that 2465 | uses the scaling option. Note that a scale-factor table can be used with 2466 | more than one source-species combination so a FACTORNAME can be repeated. 2467 | 2468 | 2469 | Source- Source Species Scale-factor table 2470 | Species Name b Name c Name d 2471 | No. (SRCNAM) (CSPEC) (FACTORNAME) 2472 | ------ ------------ ------------ --------------------- 2473 | 2474 | 1 # SCALEFACTOR = 1, PM2.5, MAJOR_HIGHWAY_004 # #END# 2475 | 2476 | -------- 2477 | a 2478 | Assignment for each source-specie is treated as a separate input subgroup 2479 | and therefore must end with an input group terminator. 2480 | b 2481 | Source name must match one of the SRCNAM names defined in Input Group 18b 2482 | c 2483 | Species name must match one of the CSPEC names of emitted species defined in Input Group 3 2484 | d 2485 | Scale-factor name must match one of the FACTORNAME names defined in Input Group 19 2486 | 2487 | --------------- 2488 | Subgroup (18d) 2489 | --------------- 2490 | a 2491 | COORDINATES FOR EACH NAMED ROAD 2492 | ------------------------------- 2493 | 2494 | X Y Ground 2495 | Coordinate Coordinate Coordinate Elevation 2496 | No. (km) (km) (m) 2497 | ---------- ---------- ---------- --------- 2498 | 2499 | #SRCNAM = MAIN_ST_32 # 2500 | #NPTROAD = 2 # 2501 | #END# 2502 | 2503 | 1 # XYZ = 340.000, 4875.500, 101.000 # #END# 2504 | 2 # XYZ = 342.087, 4875.492, 100.500 # #END# 2505 | 2506 | #SRCNAM = CENTRAL # 2507 | #NPTROAD = 2 # 2508 | #END# 2509 | 1 # XYZ = 339.000, 4879.500, 96.000 # #END# 2510 | 2 # XYZ = 334.021, 4876.600, 101.000 # #END# 2511 | 2512 | -------- 2513 | a 2514 | Each line of coordinates is treated as a separate input subgroup 2515 | and therefore must end with an input group terminator. 2516 | 2517 | 2518 | ------------------------------------------------------------------------------- 2519 | INPUT GROUPS: 19 -- Spray Emissions parameters 2520 | --------------------------- 2521 | 2522 | --------------- 2523 | Subgroup (19) 2524 | --------------- 2525 | 2526 | Emissions from spray lines are generated from individual line segments defined 2527 | by a sequence of coordinates provided for each spray-link. Each link 2528 | is entered as a discrete source and is defined as a section of the spray 2529 | line for which emissions are uniform. 2530 | 2531 | Long spray line segments are automatically 2532 | divided further within the model into segments that are limited by the 2533 | grid-cell boundaries (no segment may extend across multiple cells). 2534 | One emission rate (g/m/s) for each species is used for the entire line. 2535 | 2536 | Number of spray-lines with emission parameters 2537 | provided in Subgroup 20b (NSP1) No default ! NSP1 = 0 ! 2538 | 2539 | Number of spray-lines with arbitrarily time-varying 2540 | emission parameters (NSP2) No default ! NSP2 = 0 ! 2541 | (If NSP2 > 0, ALL variable road data 2542 | are read from the file: SPEMARB.DAT) 2543 | 2544 | !END! 2545 | 2546 | ------------------------------------------------------------------------------- 2547 | INPUT GROUPS: 20a, 20b -- Emission rate scale-factor tables 2548 | ---------------------- 2549 | 2550 | Use this group to enter variation factors applied to emission rates for any 2551 | source-specie combinations that use this feature. The tables of emission-rate 2552 | scale factors are referenced by the name assigned to FACTORNAME. These names 2553 | do not need to include specific source or species names used in the simulation, 2554 | particularly if one factor table is used for many types of sources and species, 2555 | but should be descriptive. But if a factor table applies to just one source, 2556 | the reference name for it should generally contain that source-name. 2557 | FACTORNAME must NOT include spaces. 2558 | 2559 | The FACTORTYPE for each table must be one of the following: 2560 | 2561 | CONSTANT1 1 scaling factor 2562 | MONTH12 12 scaling factors: months 1-12 2563 | DAY7 7 scaling factors: days 1-7 2564 | [SUNDAY,MONDAY, ... FRIDAY,SATURDAY] 2565 | HOUR24 24 scaling factors: hours 1-24 2566 | HOUR24_DAY7 168 scaling factors: hours 1-24, 2567 | repeated 7 times: SUNDAY, MONDAY, ... SATURDAY 2568 | HOUR24_MONTH12 288 scaling factors: hours 1-24, 2569 | repeated 12 times: months 1-12 2570 | WSP6 6 scaling factors: wind speed classes 1-6 2571 | [speed classes (WSCAT) defined in Group 12] 2572 | WSP6_PGCLASS6 36 scaling factors: wind speed classes 1-6 2573 | repeated 6 times: PG classes A,B,C,D,E,F 2574 | [speed classes (WSCAT) defined in Group 12] 2575 | TEMPERATURE12 12 scaling factors: temperature classes 1-12 2576 | [temperature classes (TKCAT) defined in Group 12] 2577 | 2578 | The number of tables defined may exceed the number of tables referenced in the 2579 | input groups for each source type above (for convenience), but tables for all 2580 | FACTORNAME names referenced must be present here. 2581 | 2582 | --------------- 2583 | Subgroup (20a) 2584 | --------------- 2585 | 2586 | Number of Emission Scale-Factor 2587 | tables (NSFTAB) Default: 0 ! NSFTAB = 0 ! 2588 | 2589 | !END! 2590 | 2591 | 2592 | --------------- 2593 | Subgroup (20b) 2594 | --------------- 2595 | a,b,c 2596 | Enter factors for NSFTAB Emission Scale-Factor tables 2597 | 2598 | 2599 | 2600 | 2601 | -------- 2602 | a 2603 | Assignments for each table are treated as a separate input subgroup 2604 | and therefore must end with an input group terminator. 2605 | b 2606 | FACTORNAME must be no longer than 40 characters 2607 | c 2608 | Spaces are NOT allowed in any FACTORNAME or FACTORTYPE assignment, 2609 | and the names are NOT case-sensitive 2610 | 2611 | 2612 | 2613 | ------------------------------------------------------------------------------- 2614 | 2615 | INPUT GROUPS: 21a, 21b, 21c -- Non-gridded (discrete) receptor information 2616 | --------------------------- 2617 | 2618 | --------------- 2619 | Subgroup (21a) 2620 | --------------- 2621 | 2622 | Number of non-gridded receptors (NREC) No default ! NREC = 0 ! 2623 | 2624 | 2625 | Group names can be used to assign receptor locations in 2626 | Subgroup 20c and thereby provide an identification that 2627 | can be referenced when postprocessing receptors. The 2628 | default assignment name X is used when NRGRP = 0. 2629 | 2630 | Number of receptor group names (NRGRP) Default: 0 ! NRGRP = 0 ! 2631 | 2632 | !END! 2633 | 2634 | --------------- 2635 | Subgroup (21b) 2636 | --------------- 2637 | 2638 | Provide a name for each receptor group if NRGRP>0. 2639 | Enter NRGRP lines. 2640 | a,b 2641 | Group Name 2642 | ---------- 2643 | 2644 | ------------- 2645 | a 2646 | Each group name provided is treated as a separate input subgroup 2647 | and therefore must end with an input group terminator. 2648 | b 2649 | Receptor group names must not include blanks. 2650 | 2651 | 2652 | --------------- 2653 | Subgroup (21c) 2654 | --------------- 2655 | a 2656 | NON-GRIDDED (DISCRETE) RECEPTOR DATA 2657 | ------------------------------------ 2658 | 2659 | c X Y Ground Height b 2660 | Receptor Group Coordinate Coordinate Elevation Above Ground 2661 | No. Name (km) (km) (m) (m) 2662 | -------- ----- ---------- ---------- --------- ------------ 2663 | 2664 | ------------- 2665 | a 2666 | Data for each receptor are treated as a separate input subgroup 2667 | and therefore must end with an input group terminator. 2668 | b 2669 | Receptor height above ground is optional. If no value is entered, 2670 | the receptor is placed on the ground. 2671 | c 2672 | Receptors can be assigned using group names provided in 20b. If no 2673 | group names are used (NRGRP=0) then the default assignment name X 2674 | must be used. 2675 | 2676 | 2677 | 2678 | --------------------------------------------------------------------------------