Alternative small scale meteorology input to a chemical transport ...
Alternative small scale meteorology input to a chemical transport ...
Alternative small scale meteorology input to a chemical transport ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Alternative</strong> Small Scale Meteorology Input <strong>to</strong> a Chemical Transport Model<br />
A Thesis<br />
Submitted <strong>to</strong> the Faculty<br />
of<br />
Drexel University<br />
by<br />
Krassimira Ilieva Lazarova<br />
in partial fulfillment of the<br />
requirements for the degree<br />
of<br />
Doc<strong>to</strong>r of Philosophy<br />
June 2001
ACKNOWLEDGMENTS<br />
I am grateful <strong>to</strong> my advisor, Dr. Kreitzberg, for his patience and support throughout the<br />
years of my study and research. I want <strong>to</strong> express my sincere gratitude <strong>to</strong> the person that made my<br />
ideas happen - Dr. Daewon Byun, researcher in the Office of Research and Development,<br />
Research Triangle Park, NC, who devoted his precious time and knowledge <strong>to</strong> help me realize this<br />
project. I am thankful also <strong>to</strong> the whole MODELS-3 development team in RTP, NC, and in<br />
particular, Alfreida Torian, who was always there for me, ready <strong>to</strong> help me communicate with the<br />
right people. The MODELS-3 research team are not only knowledgeable scientists, but they are<br />
also great people. They always offered me a hand when I needed it. I also want <strong>to</strong> thank Joe Scire<br />
in Earth Tech, Inc, Bos<strong>to</strong>n, MA for his help with the CALMET runs - it usually takes a long time <strong>to</strong><br />
become an expert in a field and relying on his expertise helped me concentrate on my main goal<br />
instead of getting lost in the woods. I’m grateful <strong>to</strong> Al Cimorelli in Region III, EPA - the person that<br />
started it all. When I was wandering about and looking for the big project of my life, he offered me<br />
<strong>to</strong> become a part of his team and work with MODELS-3. If it was not for him, this project would<br />
not have come <strong>to</strong> my mind at all.<br />
Finally, I would like <strong>to</strong> thank my husband Guenadiy and my kids S<strong>to</strong>yan and Boyan for<br />
their patience and constant support throughout the years of my study. They were with me when I<br />
most needed them. When <strong>to</strong>ugh choices had <strong>to</strong> be made, we were always <strong>to</strong>gether.<br />
ii
TABLE OF CONTENTS<br />
LIST OF TABLES............................................................................................................v<br />
LIST OF FIGURES.........................................................................................................vi<br />
ABSTRACT..................................................................................................................viii<br />
CHAPTER 1. INTRODUCTION......................................................................................1<br />
CHAPTER 2. BACKGROUND INFORMATION...........................................................5<br />
2.1. His<strong>to</strong>rical remarks...........................................................................................5<br />
2.2. The “one atmosphere” perspective.................................................................5<br />
2.3. The latest state-of-the-science <strong>chemical</strong> <strong>transport</strong> model CMAQ.................7<br />
2.4. Use of a meteorological model with MODELS-3/CMAQ............................9<br />
2.5. Compatibility of meteorological modeling with air quality modeling..........9<br />
2.5.1. The mass conservation problem....................................................11<br />
2.6. Current meteorological data <strong>input</strong> <strong>to</strong> CMAQ system in MODELS-3..........11<br />
CHAPTER 3. APPROACH...........................................................................................13<br />
3.1. <strong>Alternative</strong> meteorological data <strong>to</strong> CMAQ..................................................13<br />
3.2. Advantages and disadvantages of the alternative<br />
meteorological data......................................................................................16<br />
3.3. Concepts ......................................................................................................18<br />
3.4. Details ..........................................................................................................19<br />
3.4.1. Episode..........................................................................................19<br />
3.4.2. Pollutant.........................................................................................20<br />
iii
3.4.3. Emissions inven<strong>to</strong>ry......................................................................21<br />
3.4.4. Domain..........................................................................................21<br />
3.4.5 Investigation on the linkage of CALMET data with CMAQ.........23<br />
3.4.6. Compilation...................................................................................29<br />
3.4.7. Analysis and comparison of the meteorological<br />
<strong>input</strong>s <strong>to</strong> CMAQ............................................................................29<br />
3.4.8. Analysis and comparison of the ozone fields................................30<br />
3.4.9. Obtaining CALMET meteorological fields...................................30<br />
CHAPTER 4. RESULTS AND DISCUSSIONS............................................................32<br />
4.1. Comparison of meteorological data..............................................................32<br />
4.2. Compatibility of CALMET data for <strong>input</strong> <strong>to</strong> CMAQ..................................52<br />
CHAPTER 5. FUTURE DEVELOPMENT....................................................................60<br />
LIST OF REFERENCES ...............................................................................................62<br />
APPENDIX A: NEW INTERFACE CODES.................................................................64<br />
APPENDIX B: INPUT FILE TO CALMET................................................................111<br />
VITA.............................................................................................................................127<br />
iv
LIST OF TABLES<br />
1. Transformation chart between CMAQ and CALMET land use codes<br />
for mid-summer...............................................................................................................25<br />
v
LIST OF FIGURES<br />
1. Flow chart of the experiment.......................................................................................14<br />
2. MCIP domain, as created by Science Manager in MODELS-3..................................22<br />
3. Simplified MCIP structure..........................................................................................24<br />
4. Computational Grid Points used in MCIP..................................................................27<br />
5a. Surface wind fields on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP..................................................................34<br />
5b. Wind fields at 0.5km on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................35<br />
5c. Wind fields at 1.5km on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................36<br />
6a. Air temperature at surface on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................37<br />
6b. Air temperature at 0.5km on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................38<br />
7a. Surface air pressure on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP..................................................................39<br />
7b. Air pressure at 0.5km on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................40<br />
8. Friction velocity (u*) on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP..................................................................41<br />
9. Convective velocity <strong>scale</strong> (w*) on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP..................................................................42<br />
10. Mixing (PBL) heights on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................43<br />
vi
11. Inverse Monin-Obukhov length on July 12, 1995, 19Z<br />
from MM5 and CALMET data, processed through MCIP.......................................44<br />
12. Surface heat flux on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................45<br />
13. Moisture flux on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................46<br />
14. Roughness length on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................47<br />
15. Ground temperature on July 12, 1995, 19Z from MM5 and<br />
CALMET data, processed through MCIP.................................................................48<br />
16. Modeled maximum ozone concentration with MM5 <strong>meteorology</strong> <strong>input</strong>..................55<br />
17. Modeled maximum ozone concentration with CALMET <strong>meteorology</strong> <strong>input</strong>..........56<br />
18. Relative difference between maximum ozone concentrations modeled by CMAQ<br />
with MM5 and CALMET <strong>meteorology</strong> <strong>input</strong>s..........................................................57<br />
19. Two sample QQ plot of maximum ozone concentrations modeled by CMAQ<br />
with MM5 and CALMET <strong>meteorology</strong> <strong>input</strong>s.........................................................58<br />
vii
ABSTRACT<br />
<strong>Alternative</strong> Small Scale Meteorology Input <strong>to</strong> a Chemical Transport Model<br />
Krassimira Lazarova<br />
Dr. Carl Kreitzberg Supervisor<br />
In order <strong>to</strong> respond <strong>to</strong> the increasing demand for better understanding of the<br />
environment, air quality studies at different <strong>scale</strong>s are required. The Community Multi-<strong>scale</strong> Air<br />
Quality Model (CMAQ) <strong>chemical</strong> <strong>transport</strong> model is designed <strong>to</strong> handle all major <strong>scale</strong>s of<br />
interest. However, the <strong>meteorology</strong> <strong>input</strong> <strong>to</strong> the model has <strong>to</strong> represent adequately the<br />
atmospheric conditions at these <strong>scale</strong>s. So far, the meteorological <strong>input</strong> <strong>to</strong> CMAQ has been<br />
supplied by the Fifth-Generation Pennsylvania State University / National Center for<br />
Atmospheric Research (NCAR) Meso<strong>scale</strong> Model (MM5).<br />
This research suggests another way <strong>to</strong> obtain <strong>small</strong> <strong>scale</strong> meteorological data from<br />
coarse resolution MM5 data instead of further running MM5 at fine resolution - a “prognostic-<br />
diagnostic mix” approach. We propose <strong>to</strong> use a diagnostic model <strong>to</strong> supply the meteorological<br />
data from coarse resolution MM5 data. The challenges of the linking process as well as air<br />
quality results from CMAQ are investigated. A proof of concept is presented.<br />
viii
CHAPTER 1. INTRODUCTION<br />
In recent years, adequate modeling of <strong>transport</strong>, diffusion and <strong>chemical</strong> transformation<br />
of air pollutants became more and more important. In order <strong>to</strong> respond <strong>to</strong> this demand, the air<br />
quality modeling community has searched for the most complete and advanced air quality<br />
models incorporating more sophisticated data. The latest state-of-the-science system, that<br />
represents a powerful air quality modeling and assessment <strong>to</strong>ol, is the Community Multi<strong>scale</strong> Air<br />
Quality (CMAQ) Modeling system (Byun et al., 1999). It is designed <strong>to</strong> support air quality<br />
modeling applications ranging from regula<strong>to</strong>ry issues <strong>to</strong> science inquiries on atmospheric<br />
processes.<br />
The CMAQ system can address tropospheric ozone, acid deposition, visibility, fine<br />
particulate and other air pollutant issues in the context of “one atmosphere” perspective, where<br />
complex interactions between atmospheric pollutants on different <strong>scale</strong>s (continental, regional,<br />
urban) take place. The CMAQ system is the core of the high performance computational<br />
MODELS-3 framework, designed <strong>to</strong> manage air quality simulations.<br />
The MODELS-3 framework is an advanced computational platform that provides a<br />
sophisticated and powerful modeling environment for the science and regula<strong>to</strong>ry communities.<br />
The framework provides <strong>to</strong>ols <strong>to</strong> develop and analyze emission control options, integrate<br />
related science components in<strong>to</strong> a state-of-the-art air quality modeling system and apply<br />
graphical and analytical <strong>to</strong>ols for facilitating model applications and evaluations. Descriptions of<br />
the MODELS-3 architecture and CMAQ modeling system are provided in US EPA, 1999 or<br />
1
at http://www.epa.gov/asmdnerl/models3/index.html. The MODELS-3 framework allows<br />
management of the following major components: <strong>meteorology</strong>-chemistry preprocessing<br />
(providing sophisticated meteorological data <strong>to</strong> the CMAQ), emissions preprocessing<br />
(providing detailed gridded emissions <strong>to</strong> the CMAQ), <strong>chemical</strong> <strong>transport</strong> process (the CMAQ<br />
itself), visualization manager (<strong>to</strong>ols for visualizing results), program or dataset managers (<strong>to</strong>ols<br />
for registering programs or datasets in the framework).<br />
In this study, the focus will be mainly on the <strong>meteorology</strong>-chemistry preprocessor. In<br />
order <strong>to</strong> properly run an air quality simulation, the <strong>chemical</strong> <strong>transport</strong> model requires a<br />
consistent meteorological description of the atmosphere. In the past, the <strong>meteorology</strong> was<br />
provided through 12-hour upper air analyses and hourly surface analyses. However, more local<br />
(higher resolution) effects must be captured by air quality modeling efforts. One way <strong>to</strong> “fill the<br />
gap” is <strong>to</strong> use a meteorological model as a “dynamic analysis <strong>to</strong>ol”. In the current release of<br />
MODELS-3 as of June 1999, the fifth generation Pennsylvania State University / National<br />
Center for Atmospheric Research Meso<strong>scale</strong> Model (MM5) is used as the provider of<br />
meteorological data <strong>to</strong> CMAQ.<br />
MM5 is a complex, state-of-the-science prognostic meteorological model, used <strong>to</strong><br />
forecast the atmospheric conditions, based on the primitive equations of momentum,<br />
thermodynamics and moisture for the variables temperature, specific moisture, wind<br />
components and pressure. Detailed description and further references can be found at<br />
http://www.mmm.ucar.edu/mm5/mm5-home.html. Meteorological models like MM5 can add<br />
scientific credibility <strong>to</strong> the air quality simulations through the use of advanced theory and<br />
2
techniques (Otte, 1999). It must be acknowledged, though, that better science does not always<br />
lead <strong>to</strong> a better solution. There are cases when diagnostic analyses are more realistic<br />
representations of the atmosphere than the prognostic meteorological model. For example, the<br />
prognostic meteorological models performance is best on regional or continental <strong>scale</strong>s (coarse<br />
resolution data), but it is very difficult <strong>to</strong> run a prognostic meteorological model at higher<br />
resolutions. For fine <strong>scale</strong>s (e.g. urban <strong>scale</strong>s) more realistic data could be supplied by<br />
diagnostic models. Diagnostic meteorological models use observational meteorological data<br />
and/or prognostic coarse resolution meteorological data and compute meteorological<br />
parameters using objective analysis techniques without having <strong>to</strong> solve the prognostic equations<br />
of motion. The diagnostic models do not predict future developments of the atmosphere, they<br />
just assess its current condition. Thus, the diagnostic meteorological description of the<br />
atmosphere would be closer <strong>to</strong> observations, especially when local effects might be important<br />
(e.g. fine resolutions and <strong>small</strong> domains).<br />
The purpose of this research is <strong>to</strong> provide diagnostic meteorological data <strong>to</strong> CMAQ for<br />
high resolution studies, test the adequacy of the results and assess the advantages and<br />
disadvantages of this alternative source of meteorological data for air quality models like<br />
CMAQ. This attempt was never previously attempted for two reasons:<br />
· Air quality models have not demanded advanced meteorological description of the<br />
atmosphere in the past: Until recently, air quality models have represented a simplified<br />
<strong>transport</strong> and transformation of atmospheric pollutants. These models have not<br />
demanded very complicated meteorological description of the atmosphere.<br />
3
· Air quality models that demanded sophisticated meteorological data have not been run<br />
on <strong>small</strong> <strong>scale</strong>s. Small <strong>scale</strong> studies with sophisticated Eulerian models became possible<br />
with the introduction of the CMAQ air quality modeling system. There are still venues <strong>to</strong><br />
be investigated in this area.<br />
Providing high resolution meteorological data allows air quality modeling <strong>to</strong> explore<br />
urban and <strong>small</strong>er <strong>scale</strong>s, since no restrictions are imposed on the air quality models in terms of<br />
spatial resolution. Providing diagnostic meteorological data could make this task easier without<br />
involving additional computer and human resources. The validity of this approach will be tested<br />
by comparing air quality results from CMAQ with MM5 data against CMAQ results with<br />
diagnostic data.<br />
A list of the most used abbreviations throughout the text follows:<br />
MODELS-3 Computational platform for air quality modeling, includes CMAQ<br />
CMAQ Community Multi<strong>scale</strong> Air Quality modeling system<br />
MM5 Prognostic Meso<strong>scale</strong> Meteorological Model<br />
CALMET Diagnostic Meteorological Model<br />
MCIP Meteorology - Chemistry Interface Processor<br />
4
2.1. His<strong>to</strong>rical remarks<br />
CHAPTER 2. BACKGROUND INFORMATION<br />
Ambient air composition over the Earth has undergone several changes throughout the<br />
years. Anthropogenic activities, especially since the 17-th century, when coal began <strong>to</strong> replace<br />
wood as the primary source of energy, have played a significant role in the earth’s atmosphere<br />
balance. These anthropogenic pollutants have often generated locally unhealthful air quality with<br />
short term episodic effects or difficult <strong>to</strong> predict adverse effects. The emergence of petroleum<br />
products in the twentieth century has characterized a new industrial revolution and the<br />
recognition that petroleum products are responsible for the so called “pho<strong>to</strong><strong>chemical</strong>” summer<br />
smog, like the smog in the Los Angeles area. The last decades of the twentieth century have<br />
been characterized by a growing interest in long range air pollution <strong>transport</strong> phenomena and<br />
global effects.<br />
These days, the society is showing increasing interest <strong>to</strong>wards the air quality and the<br />
environment. In response, air quality modeling has increasingly become a more important part of<br />
the study of the environment. Modeling, like moni<strong>to</strong>ring, is not the solution <strong>to</strong> the air pollution<br />
problem. But modeling provides a powerful <strong>to</strong>ol for studying the environment and, with the<br />
advance of science, <strong>to</strong> better represent the real processes in the atmosphere.<br />
2.2. The “one atmosphere” perspective<br />
Comprehensive air quality modeling of large domains started in the late 1970's. The<br />
5
major modeling systems from this period were the Sulfur Transport and Emissions Model<br />
(STEM) (Carmichael and Peters, 1984a, 1984b), the Regional Acid Deposition Model<br />
(RADM) (Chang et al., 1987), the Acid Deposition and Oxidant Model (ADOM) (Venkatram<br />
et al., 1988), the Urban Airshed Model (UAM) (Morris and Meyers, 1990). These models<br />
were designed <strong>to</strong> address specific air pollution issues such as ozone or acid deposition and <strong>to</strong><br />
be applied under relatively prescriptive implementation guidance strategies. Thus, flexibility <strong>to</strong><br />
deal with other issues, such as particulate matter or <strong>to</strong>xics, was very limited.<br />
Additional air pollution issues were identified, including visibility, fine and coarse<br />
particles, semi-volatile organic species, and nutrient deposition <strong>to</strong> water bodies. The direct<br />
response approach was <strong>to</strong> modify, adapt or extend current models <strong>to</strong> handle more complex<br />
implementations. This approach was both cumbersome and limiting. Seeking a more strategic<br />
approach <strong>to</strong> handle the increased modeling requirements, more comprehensive modeling<br />
approaches were needed. With increasing computer capabilities, the opportunity arose for<br />
design of a system that would both meet and keep pace with the increasing requirements on air<br />
quality modeling and incorporating advances in state-of-science descriptions of the atmospheric<br />
processes.<br />
To simulate the air quality and weather phenomena realistically, adaptation of the “one<br />
atmosphere” perspective is necessary. This perspective is based on “first principles” description<br />
of the atmosphere and emphasizes that the influence of interactions at different dynamic <strong>scale</strong>s<br />
and among multi-pollutants cannot be ignored. For example, descriptions of processes critical <strong>to</strong><br />
producing oxidants, acid and nutrient depositions, and fine particles are <strong>to</strong>o closely related <strong>to</strong><br />
6
treat independently. Proper modeling of these air pollutants requires that the broad range of<br />
temporal and spatial <strong>scale</strong>s of multi-pollutant interactions be considered simultaneously. Another<br />
key aspect of the “one atmosphere” perspective is the dynamic description of the atmospheric<br />
processes.<br />
Previously, many meteorological models have been built with limited atmospheric<br />
dynamics assumptions. To simplify the model development process, the governing equations<br />
were first simplified <strong>to</strong> match the target problems, then computer codes were developed. This<br />
approach enabled rapid development of models. However, <strong>to</strong> provide the scalability in<br />
describing atmospheric dynamics, a fully compressible governing set of equations is preferable.<br />
For successful “one atmosphere” simulations, it is imperative <strong>to</strong> also have a constant algorithmic<br />
linkage between meteorological and <strong>chemical</strong> <strong>transport</strong> models.<br />
2.3. The latest state-of-the-science <strong>chemical</strong> <strong>transport</strong> model CMAQ<br />
The result of six years devotion and scientific efforts <strong>to</strong> accomplish the “one<br />
atmosphere” goal is the Community Multi-<strong>scale</strong> Air Quality Model (CMAQ), called also<br />
CMAQ Chemical Transport Model (CCTM).<br />
The most important requirement of the CMAQ modeling system is <strong>to</strong> maintain a<br />
consistent description of the atmosphere for different meteorological and <strong>chemical</strong> <strong>transport</strong><br />
models. Various coordinate systems are used in the meteorological models. Selection of a<br />
suitable coordinate system is an important step of model formulation. If a Chemical Transport<br />
Model (CTM) can be formulated and coded using a generalized coordinate system, it would be<br />
7
easy <strong>to</strong> switch from one coordinate <strong>to</strong> another depending on the application. This way a single<br />
CTM formulation can adapt <strong>to</strong> any of the coordinates commonly used in meteorological models.<br />
Unlike a model with a fixed coordinate system, a generalized coordinate system allows use of<br />
generic coordinates for the specific science processes within a model. That means each science<br />
process can utilize the parameterizations based on the best coordinates <strong>to</strong> represent the<br />
problem. For example, the planetary boundary layer (PBL) parameterizations can be expressed<br />
in terms of geometric height, or dimensionless height <strong>scale</strong>d with PBL height, or in terms of<br />
pressure for cloud physics.<br />
The linkages between the generic coordinate parameterizations in the science processes<br />
and the governing equations in the generalized coordinates are established through the<br />
application of appropriate coordinate transformation rules. The derivation of the governing<br />
equations in the generalized coordinates for the CMAQ and the assumptions for that derivation<br />
are presented in detail in Chapter 6 of Byun et al., 1999.<br />
Chemical transformations are another important part of the CMAQ system. In this study<br />
ozone formation and distribution is used as a testing <strong>to</strong>ol. Ozone is not emitted directly in the<br />
atmosphere, but is formed through a set of pho<strong>to</strong><strong>chemical</strong> reactions of nitric oxides (NOx) and<br />
volatile organic compounds (VOCs) emitted by anthropogenic and natural sources. The sun<br />
light provides the necessary energy <strong>to</strong> break the <strong>chemical</strong> bounds in the molecules and produce<br />
a<strong>to</strong>mic oxigen, which in turn reacts with molecular oxigen <strong>to</strong> form ozone. The pho<strong>to</strong><strong>chemical</strong><br />
mechanism of ozone production and loss is quite complex and the reaction rates depend on<br />
amount of solar radiation and air temperature.<br />
8
2.4. Use of a meteorological model with MODELS-3/CMAQ<br />
In order <strong>to</strong> properly run an air quality modeling simulation, the chemistry model needs a<br />
proper meteorological characterization of the atmosphere. With the simpler air quality models,<br />
the <strong>meteorology</strong> was provided through a series of diagnostic analyses that typically included 12-<br />
hourly upper-air soundings and hourly surface analyses. However, more local effects have <strong>to</strong> be<br />
captured by air quality models. The observational network (sparse at its best), can not resolve<br />
features of the order of 20 kilometers and several hours, particularly close <strong>to</strong> the surface. One<br />
way <strong>to</strong> provide the required data is <strong>to</strong> use a meteorological model as a “dynamic analysis” <strong>to</strong>ol.<br />
A meteorological model can provide a dynamically consistent evolution of the atmosphere at<br />
more frequent time intervals and higher resolutions than observations.<br />
2.5. Compatibility of meteorological modeling with air quality modeling<br />
Air quality modeling should be viewed as an integral part of atmospheric modeling. The<br />
governing equations and computational algorithms should be consistent and compatible.<br />
Previously, many atmospheric models have been built with limited atmospheric dynamics<br />
assumptions. However, the dynamic assumptions and choice of coordinates should not precede<br />
the computational structure of the modeling system.<br />
The characteristics of an air quality model simulations are heavily dependent on the<br />
9
quality of meteorological data. Meteorological data for air quality models can be provided either<br />
by diagnostic models, which analyze observations at surface meteorological sites and upper air<br />
soundings, or by dynamic meteorological models. Development of a fully coupled chemistry<br />
<strong>transport</strong> model <strong>to</strong> a meteorological modeling system should satisfy the following requirements<br />
(Byun et al, 1999):<br />
(i) Scalable dynamics and thermodynamics: Use of fully compressible form of governing<br />
equations and flexible coordinate system that can deal with multi<strong>scale</strong> dynamics;<br />
(ii) Unified governing set of equations: Not only the weather forecasting, dynamics and<br />
thermodynamics research, but also the air quality studies should rely on the same<br />
general governing set of equations describing the atmosphere;<br />
(iii) Cell based mass conservation: As opposed <strong>to</strong> the simple conservation of domain<br />
<strong>to</strong>tal mass, cell based conservation of the scalar (conserving) quantities is needed. Use<br />
of proper thermodynamic variables, such as density instead of pressure and<br />
temperature, and representation of governing equations in the conservation form rather<br />
than in the advective form are recommended;<br />
(iv) State-of-the-art data assimilation method: Not only the surface measurements and<br />
upper air soundings, but also other observation data obtained through remote sensing<br />
and other in situ means must be included for the data assimilation;<br />
(v) Multi-<strong>scale</strong> physics descriptions: It has been known that certain parameterizations of<br />
physical processes, including clouds, used in present weather forecasting models are<br />
<strong>scale</strong> dependent. General parameterization schemes capable of dealing with a wide<br />
10
spectrum of spatial and temporal <strong>scale</strong>s are needed.<br />
2.5.1. The mass conservation problem<br />
For air quality simulations, mass conservation is the most important physical constraint.<br />
This is because it is unrealistic <strong>to</strong> have injection of pollutant mass through any other means than a<br />
real source emission process. Therefore, conserving mass of a passive trace pollutant is a<br />
necessary property of an air quality model.<br />
On the other hand, the main objective of many meteorological models has been <strong>to</strong><br />
predict synoptic or meso<strong>scale</strong> weather phenomena. Therefore, major design considerations are<br />
focused on issues, such as energy conservation, or energy cascade under non-linear wave-wave<br />
interactions. Conservation of mass is not usually as emphasized as the other constraints. Also,<br />
the predictive quantities are generally thermodynamic variables, such as temperature and<br />
pressure. The conservation equation for air density is rarely solved directly in the meteorological<br />
models because it is considered inappropriate in hydrostatic models. Usually air density is<br />
computed from the equation for the state of ideal gas. Also, the predictive equations for the<br />
moisture variables are often written in an advective form, rather than a continuity equation form.<br />
However, air quality simulations rely mostly on the continuity equation. The success of a<br />
simulation is heavily dependent on the consistency of air density and wind data (i.e. how well<br />
they satisfy the continuity equation).<br />
11
2.6. Current meteorological data <strong>input</strong> <strong>to</strong> the CMAQ system in MODELS-3<br />
Meteorological data <strong>input</strong> <strong>to</strong> air quality studies is the scope of this research.<br />
Meteorological data are important in many of the processes simulated in the CMAQ system<br />
included in MODELS-3. The <strong>meteorology</strong> model that has been selected and evaluated with<br />
CMAQ is the Fifth-Generation Pennsylvania State University / National Center for Atmospheric<br />
Research (NCAR) Meso<strong>scale</strong> Model (MM5). MM5 is based on primitive physical equations<br />
of momentum, thermodynamics and moisture for the variables temperature, specific humidity,<br />
wind components, and pressure. MM5 can be run either as a hydrostatic or non-hydrostatic<br />
model. In the hydrostatic model, the variables are explicitly predicted. In the non-hydrostatic<br />
model, pressure, temperature and density are defined in terms of a reference state and<br />
perturbations from the reference state. MM5 is non-mass conserving in the non-hydrostatic<br />
mode (Otte, 1999). The vertical (sigma_p) coordinate is defined as a function of pressure. The<br />
model’s prognostic equations are thoroughly discussed in Grell et al. (1994) and Dudhia et al.<br />
(1998). MM5 is designed for forecasts at different spatial <strong>scale</strong>s - grid dimensions from<br />
hundreds of kilometers down <strong>to</strong> 4 km. or even less. Different physical processes are important<br />
at different <strong>scale</strong>s and MM5 users are allowed <strong>to</strong> choose from alternative schemes for them.<br />
MM5 users are also allowed <strong>to</strong> use a four-dimensional data assimilation (FDDA) throughout the<br />
simulations where artificial (non-physical) forcing functions are added <strong>to</strong> the model’s prognostic<br />
equations <strong>to</strong> nudge the solutions <strong>to</strong>wards either a verifying analysis or observations. MM5<br />
documentation, along with other publications, is also available at<br />
http://www.mmm.ucar.edu/mm5/mm5-home.html.<br />
12
CHAPTER 3. APPROACH<br />
3.1. <strong>Alternative</strong> meteorological data <strong>to</strong> CMAQ<br />
In order <strong>to</strong> respond <strong>to</strong> the increasing demand for better understanding of the<br />
environment, air quality studies at different <strong>scale</strong>s are required. For example, regional <strong>scale</strong> air<br />
quality studies are needed for multi-state ozone <strong>transport</strong>, while <strong>small</strong> <strong>scale</strong> studies would<br />
answer specific questions concerning domains on the size of metropolitan areas. The CMAQ<br />
<strong>chemical</strong> <strong>transport</strong> model is designed <strong>to</strong> handle these <strong>scale</strong>s of interest. However, the<br />
<strong>meteorology</strong> <strong>input</strong> <strong>to</strong> the model have <strong>to</strong> adequately represent the atmospheric conditions at<br />
these <strong>scale</strong>s. This research is focused on providing an adequate alternative meteorological<br />
<strong>input</strong> <strong>to</strong> the chemistry-<strong>transport</strong> model at <strong>small</strong> <strong>scale</strong>s. So far, the meteorological <strong>input</strong> <strong>to</strong><br />
CMAQ has been supplied by MM5. MM5 simulations require highly skilled analysts which are<br />
not generally available among the air quality modelers working in the regula<strong>to</strong>ry community.<br />
MM5 always has <strong>to</strong> be run separately by a meteorological team. As a matter of fact, coarse<br />
resolution meteorological data are available in the meteorological research community and can<br />
easily be provided for almost all episodes of interest. However, fine resolution data are not<br />
widely available because of the computer time and resources involved.<br />
This research suggests another way <strong>to</strong> obtain <strong>small</strong> <strong>scale</strong> meteorological data from<br />
coarse resolution MM5 data instead of further running MM5 at fine resolution - a “prognostic-<br />
diagnostic mix” approach (see Figure 1). We propose <strong>to</strong> use a “smart interpola<strong>to</strong>r” <strong>to</strong> diagnose<br />
the meteorological data from coarse resolution MM5 data. This process could save computer<br />
13
CHAPTER 4. RESULTS AND DISCUSSIONS<br />
4.1. Comparison of meteorological data<br />
The meteorological data that is provided <strong>to</strong> CMAQ, undergoes preprocessing in<br />
MCIP. An investigation of possible ways <strong>to</strong> process CALMET data in MCIP was made. The<br />
results revealed two options, summarized below:<br />
(i) MCIP can accept meteorological parameters, such as air temperature, pressure,<br />
density and wind fields, and can diagnose atmospheric characteristics necessary for CMAQ,<br />
such as PBL <strong>scale</strong>s and surface layer fluxes.<br />
(ii) MCIP can be redesigned <strong>to</strong> accept from CALMET not only the basic<br />
meteorological parameters mentioned above, but also surface layer and PBL characteristics<br />
available from CALMET instead of re-diagnosing them.<br />
The first option was explored with the assumption that the temperature of earth’s<br />
surface (ground temperature) is the same as the temperature of the air just above it. After<br />
processing the meteorological data and running CMAQ with it, the results showed a high<br />
sensitivity of MCIP <strong>to</strong> ground temperature. Ground temperature appears <strong>to</strong> be a critical<br />
parameter for computation of all PBL and surface layer characteristics. MCIP uses the<br />
difference between surface air temperature and ground temperature <strong>to</strong> compute practically all<br />
surface layer parameters. Therefore, alternative ways need <strong>to</strong> be investigated further for proper<br />
modeling of ground temperature.<br />
The second option allows the use of additional CALMET data directly in MCIP. This<br />
32
educes eventual inconsistencies in the meteorological data <strong>input</strong> <strong>to</strong> CMAQ. An additional<br />
subroutine was included in the package <strong>to</strong> bypass the unnecessary computations of PBL and<br />
surface layer parameters. This alternative way uses PBL height, friction velocity, Monin-<br />
Obukhov length, and land use data from CALMET <strong>to</strong> compute other necessary parameters,<br />
such as sensible heat flux, moisture flux, albedo, roughness length, convective velocity <strong>scale</strong>, net<br />
radiation. A prin<strong>to</strong>ut of the code PBLSUP.F can be found in Appendix A.<br />
A comparison between the two meteorological data <strong>input</strong>s <strong>to</strong> CMAQ was made. To<br />
illustrate the similarities and differences between the two meteorological <strong>input</strong>s, one snapshot<br />
was chosen in the four-day scenario - July 12, 1995, 19Z (or 2:00 pm EST).This time was<br />
selected for the following reasons:<br />
(i) Early afternoons (around 2pm local solar time) are times of great contrasts and if any<br />
major differences occur, they should be most pronounced during these times;<br />
(ii) Early afternoons are also times of maximum observed and modeled ozone<br />
concentrations;<br />
(iii) Other snapshots at night, early morning, and late evening were compared and no<br />
substantially different information was drawn from these comparisons.<br />
33
LIST OF REFERENCES<br />
1. Byun, Daewon W., J. K. Ching (eds.),1999, Science Algorithms of the EPA Models-3<br />
Community Multi<strong>scale</strong> Air Quality (CMAQ) Modeling System, EPA/600/R-99/030<br />
2. Carmichael G.R. and L.K. Peters 1984a, An Eulerian <strong>transport</strong> /transformation/ removal<br />
model for SO2 and sulfate I. Model development, Atmos. Environ. 18:937-952<br />
3.Carmichael G.R.and L.K. Peters 1984b, An Eulerian <strong>transport</strong>/transformation/removal model<br />
for SO2 and sulfate II. Model calculation of Sox <strong>transport</strong> in the Eastern United States, Atmos.<br />
Environ. 20:173-188<br />
4. Chang,J.S., R.A. Brost, I.S.A. Isaksen, S. Madronich, P.B .Middle<strong>to</strong>n, W.R. S<strong>to</strong>ckwell,<br />
and C.J. Walcek, 1987, A three-dimensional Eulerian acid deposition model: Physical<br />
Concepts and Formulation, J. Geophy. Res. 92: 14681-14700<br />
5. Dudhia, J., D. Grill, Y.R. Guo, D. Hansen, K. Manning, W. Wang, 1998,: PSU/NCAR<br />
meso<strong>scale</strong> modeling system tu<strong>to</strong>rial class notes (MM5 modeling system version 2) - Available<br />
from the National Center for Atmospheric Research, P.O. Box 3000, Boulder, CO 80307<br />
6. Grell, G.A., J. Dudhia, and D.R. Stauffer, 1994, A description of the fifth-generation Penn<br />
State / NCAR meso<strong>scale</strong> model (MM5). NCAR Tech. Note NCAR/TN-398+STR, 117pp. -<br />
Available from the National Center for Atmospheric Research, P.O. Box 3000, Boulder, CO<br />
80307<br />
7. MODELS-3 User’s Guide, U.S. EPA, 1998, EPA Third Generation Air Quality Modeling<br />
System, EPA 600/R98/069(b), U.S. Environmental Protection Agency<br />
8. Morris, R.E. and T.C. Meyers, 1990, User’s Guide for the Urban Airshed Model, Volume1:<br />
User’s Manual for UAM(CB-IV). EPA-450/4-90-007A. US Environmental Protection<br />
Agency, Research Triangle Park, NC<br />
9. Otte, Tanya L., 1999, Using MM5 Version 2 with Models-3/CMAQ: A User’s guide and<br />
Tu<strong>to</strong>rial, EPA-600/R99/065<br />
10. Schichtel, Bret A., R. B. Husar,1997, A Graphical Explanation of a Regional Ozone<br />
Episode, http://capita.wusl.edu/otag/reports/o3epi95/o3epi95.html<br />
62
11. Scire, J. S., F. R. Robe, M. E. Fernau, R. J. Yamartino, 1999, A User’s guide for the<br />
Calmet Meteorological Model (Version 5.0), Concord, MA: Earth Tech Inc.<br />
12. Venkatram, A.K. and P.K. Karamchandani, 1998, The ADOM II Scavenging Module.<br />
ENSR Consulting and Engineering Report 0780-004-205, Camarillo, CA<br />
63
APPENDIX A: NEW INTERFACE CODES<br />
C SUBROUTINE GETMET_CALMET<br />
SUBROUTINE GETMET ( SDATE, STIME, ISTAT, ISESN, MOUTFRQ)<br />
C***********************************************************************<br />
C FUNCTION:<br />
C CALMET version<br />
C read the met header info and met arrays from the<br />
C archived meteorological simulation output file<br />
C on the <strong>meteorology</strong> model domain and resolution<br />
C<br />
C (1) calls READCM <strong>to</strong> <strong>input</strong> met header info<br />
C and met arrays;<br />
C (2) checks the starting date and time<br />
C (3) converts met landuse categories in<strong>to</strong> ctm ones<br />
C (4) extracts CTM-relevant meteorological and physical<br />
C fields from met arrays ("F_" arrays at met grid)<br />
C in<strong>to</strong> ctm arrays ("X" arrays at extended ctm grid)<br />
C (5) performs necessary horizontal interpolation on<br />
C the "X" arrays<br />
C (6) calls otther routines <strong>to</strong> compute<br />
C supplementary "X" arrays.<br />
C<br />
C NOTE: FOR THE TIME BEING ONLY NTHIK=0 IS OPERATIONAL!!!!!<br />
C<br />
C DEPENDENT UPON: 'CMINPUT.EXT' for dimension parameters<br />
C<br />
C INPUT:<br />
C CALMET FILE, REQUIRED by MCIP<br />
C CALMET DATA AVAILABLE THROUGH 'CMINPUT.EXT'<br />
C<br />
C OUTPUT:<br />
C 'X-Arrays' defined in 'MCIPCOM.EXT'<br />
C Units for output ---> in m, s, kg, K, pa, etc. (MKS)<br />
C<br />
C REVISION HISTORY:<br />
C CREATED January 20, 2001 by Krassi & Daewon<br />
C***********************************************************************<br />
IMPLICIT NONE<br />
C** I/O API include files<br />
INCLUDE SUBST_IOPARMS<br />
INCLUDE SUBST_IOFDESC<br />
INCLUDE SUBST_IODECL<br />
C<br />
64
C** Set up includes for grid & universal constants<br />
C<br />
INCLUDE SUBST_HGRD_ID<br />
INCLUDE SUBST_VGRD_ID<br />
INCLUDE SUBST_COORD_ID<br />
INCLUDE SUBST_CONST<br />
INCLUDE 'MCIPPARM.EXT' ! params for mcip<br />
INCLUDE 'MCIPCOM.EXT' ! commons for mcip<br />
INCLUDE 'LRADMDAT.EXT'<br />
C<br />
C** Set up includes and array dimensions for CALMET<br />
INCLUDE 'CMINPUT.EXT'<br />
C ------------------------------------------------------------------<br />
C<br />
C<br />
C** LOCAL INDICES<br />
C for setting Coarse domain wind <strong>to</strong> satisfy fine grid domain<br />
C<br />
INTEGER NCG_I, NCG_J ! window size in terms of MET grid<br />
SAVE NCG_I, NCG_J ! keep in the memory<br />
INTEGER NITER, ILU<br />
C<br />
C** Local scratch variables<br />
C<br />
INTEGER SDATE ! TIMESTEP'S START DATE<br />
INTEGER STIME ! TIMESTEP'S START TIME<br />
INTEGER ISTAT ! STATUS RETURNED FROM SANITY CHECKS<br />
INTEGER ISESN ! season of year code<br />
C<br />
INTEGER NSTEPS ! run duration: number of output time steps<br />
INTEGER NREPS ! number of model time steps per output step<br />
INTEGER ISTEP ! current output time step number<br />
INTEGER IREP ! model step number within this output step<br />
REAL*8 XCENT_M<br />
REAL*8 YCENT_M<br />
REAL*8 XORIG_M<br />
REAL*8 YORIG_M<br />
REAL*8 XCELL_M<br />
REAL*8 YCELL_M<br />
REAL VGTOP_M<br />
REAL MOUTFRQ ! Output frequency of MET data in min.<br />
REAL MET_RESOL ! Resolution of met. model in meters<br />
REAL RNDX ! real NDX<br />
REAL RNTHIK<br />
REAL XORIG_W<br />
65
C<br />
C<br />
C<br />
C<br />
REAL YORIG_W<br />
REAL XORIG_X<br />
REAL YORIG_X<br />
REAL XORIG_CTM<br />
REAL YORIG_CTM<br />
INTEGER J0_CTM, I0_CTM<br />
INTEGER I, J, K, L, LP1<br />
INTEGER COL, ROW<br />
REAL TSFC, TS0, TEMPM, TEMPF ! scratch for temperature<br />
REAL PRESS, PRESM, PRESF ! scratch for pressure<br />
REAL P00, RH00, GAMMA, PWR<br />
SAVE P00, RH00<br />
REAL AA, BB, CC, LNP ! scratch for Po coord.<br />
SAVE AA, BB, CC, LNP<br />
INTEGER LVL, NCELLS<br />
INTEGER C, R<br />
INTEGER II, JJ, KK, IW, JW, IIL, JJL<br />
INTEGER LAY0, LAY1, ROW0, ROW1, ROW2, COL0, COL1, COL2<br />
SAVE LAY0, LAY1, ROW0, ROW1, ROW2, COL0, COL1, COL2<br />
CHARACTER*16 PNAME<br />
DATA PNAME / 'GETMET_CALMET' /<br />
LOGICAL FIRST<br />
SAVE FIRST<br />
DATA FIRST / .TRUE. /<br />
LOGICAL SECOND<br />
SAVE SECOND<br />
LOGICAL COLFLAG, ROWFLAG<br />
DATA COLFLAG /.TRUE./, ROWFLAG /.TRUE./<br />
REAL AMISS ! missing data<br />
DATA AMISS /-9.00E36/<br />
REAL EPSILON, AMOLMIN, AMOLMAX<br />
DATA EPSILON/1.E-10/, AMOLMIN/4.0/, AMOLMAX/1000.0/<br />
C IF FIRST RUN - READ HEADER<br />
IF (FIRST) THEN<br />
C OPEN CALMET FILE & READ HEADER RECORDS<br />
CALL READCM<br />
C Compute latitude, longitude, map <strong>scale</strong> fac<strong>to</strong>rs<br />
CALL CAL_LATLON<br />
C YYYY, DDD, HH ready from readcm.F-no conversion needed<br />
C Read 2D and 3D data from the CALMET file first time<br />
66
SDATE = YYYY*1000 + DDD ! YYYYDDD<br />
STIME = HH*10000 + MINS*100 ! HHMMSS (SS = 00)<br />
MOUTFRQ = TAPFRQ/60. ! sec -> mins<br />
IF (JUDATE.NE.YYYY*1000+DDD .OR. HSTRT.NE.HH) THEN<br />
WRITE (*,*) ' Starting date or time of Met. domain file'<br />
WRITE (*,*) ' does not agree with user <strong>input</strong> on unit 9.'<br />
WRITE (*,*) JUDATE, SDATE, HSTRT, HH<br />
GOTO 1010<br />
ENDIF ! JUDATE & HSTRT are defined in MCIPPARM.EXT common<br />
C NOTE: For now, X3TOP is supposed <strong>to</strong> be in Pa and mean pressure<br />
C at <strong>to</strong>p of model. The following is computation of reference<br />
C X3TOP for mid summer. Further generalization is needed.<br />
P00 = 100000.0 ! 1000 mb = 100000 Pa<br />
PWR = 3.42/0.65 ! Gamma_a/gamma<br />
GAMMA = 0.0065 ! temperature lapse rate (deg/m)<br />
TS0 = 290.0 ! reference temp. in mid-summer<br />
X3TOP = P00*(1.0-GAMMA*F_ZTOP/TS0)**PWR ! pressure at <strong>to</strong>p<br />
write(*,*) 'X3TOP=',X3TOP<br />
RNDX = REAL( NDX )<br />
X_RESOL = RESOLN / RNDX<br />
C** if the difference of the finer grid resolution computed from<br />
C MET data and provided in COORD.EXT are different more than 1.0m,<br />
C s<strong>to</strong>p calculation<br />
C<br />
IF ( ABS( X_RESOL - XCELL_GD) .GT. 1.0 ) THEN<br />
WRITE (*,*)' Resol. for fine MET grid and CTM do not match'<br />
WRITE (*,*)' Reset either XCELL_GD in COORD.EXT with ', X_RESOL<br />
WRITE (*,*)' Or, NDX in MCIPPARM.EXT with ',INT(RESOLN/XCELL_GD)<br />
GOTO 1010<br />
END IF<br />
NCG_J = 1 + INT( ( NCOLS + 2 * NTHIK - 1) / RNDX )<br />
NCG_I = 1 + INT( ( NROWS + 2 * NTHIK - 1) / RNDX )<br />
C<br />
C** check origins of CTM domain and CALMET from offsets<br />
C (J0, I0) = (COL_OFFSET, ROW_OFFSET)<br />
C take in<strong>to</strong> account resolution of MET, CTM and NTHIK<br />
XCENT_M = XCENT_D<br />
YCENT_M = YCENT_D<br />
C<br />
XORIG_M = XORIGR<br />
YORIG_M = YORIGR<br />
C<br />
XORIG_W = XORIG_M + REAL(J0) * RESOLN<br />
67
C<br />
YORIG_W = YORIG_M + REAL(I0) * RESOLN<br />
XCELL_M = RESOLN<br />
YCELL_M = RESOLN<br />
print *, 'XORIG_W = ', XORIG_W<br />
C ** assume NDX = power of 3<br />
NITER=NINT(LOG(RNDX)/LOG(3.0))<br />
C<br />
C<br />
XORIG_X = XORIG_W<br />
YORIG_X = YORIG_W<br />
IF (NITER.GE.1) THEN<br />
DO I = 1, NITER<br />
XORIG_X = XORIG_X + RESOLN / 3**I<br />
YORIG_X = YORIG_X + RESOLN / 3**I<br />
END DO<br />
END IF<br />
write(*,*) ' XORIG_X, YORIG_X = ', XORIG_X, YORIG_X<br />
RNTHIK = REAL( NTHIK )<br />
XORIG_CTM = XORIG_X + RNTHIK * XCELL_GD<br />
YORIG_CTM = YORIG_X + RNTHIK * YCELL_GD<br />
write(*,*) ' XORIG_CTM, YORIG_CTM = ', XORIG_CTM, YORIG_CTM<br />
J0_CTM = NINT ( (XORIG_GD-(RNTHIK+0.5*(RNDX-1.0))*XCELL_GD<br />
& - XORIG_M) / XCELL_M )<br />
I0_CTM = NINT ( (YORIG_GD-(RNTHIK+0.5*(RNDX-1.0))*YCELL_GD<br />
& - YORIG_M) / YCELL_M )<br />
C<br />
C** if the difference of the origins computed and provided<br />
C in COORD.EXT is more than 1.0 m, s<strong>to</strong>p calculation<br />
C<br />
IF ( ABS( XORIG_CTM - XORIG_GD) .GT. 1.0 ) THEN<br />
WRITE (*,*)' Origins of domain for CTM do not match'<br />
WRITE (*,*)' Reset either XORIG_GD in COORD.EXT with ',XORIG_CTM<br />
WRITE (*,*)' Or, COL_OFFSET (J0) with ', J0_CTM<br />
COLFLAG = .FALSE.<br />
END IF<br />
C<br />
IF ( ABS( YORIG_CTM - YORIG_GD) .GT. 1.0 ) THEN<br />
WRITE (*,*)' Origins of domain for CTM do not match'<br />
WRITE (*,*)' Reset either YORIG_GD in COORD.EXT with ',YORIG_CTM<br />
WRITE (*,*)' Or, ROW_OFFSET (I0) with ', I0_CTM<br />
ROWFLAG = .FALSE.<br />
END IF<br />
68
IF ( .NOT. COLFLAG ) GOTO 1010<br />
IF ( .NOT. ROWFLAG ) GOTO 1010<br />
C Vertical grid type definition and sigf information<br />
VGTYP3D = 6 !VGHVAL3 - meters above ground for CALMET<br />
C** Layer definition for MET coordinate<br />
C (mono<strong>to</strong>nic increase with height)<br />
C compute XX3FACE & XX3MIDL (layer face & middle coord. definitions)<br />
C XX3FACE & XX3MIDL arrays are dimensioned in MCIPCOM.EXT and<br />
C mono<strong>to</strong>nically increasing with height<br />
C<br />
C<br />
C<br />
C<br />
DO K = 0, METLAY<br />
XX3FACE (K) = F_ZFACE(K) - F_ZFACE(0)<br />
END DO<br />
DO K = 1, METLAY<br />
XX3MIDL (K) = 0.5 * ( XX3FACE (K-1) + XX3FACE (K) )<br />
END DO<br />
write(*,*) ' METROW, METCOL, LURADM = ', METROW, METCOL, LURADM<br />
write(*,*) 'lutype=',LUTYPE<br />
IF(LUTYPE .EQ. 3) THEN<br />
C<br />
C Translation of CALMET landuse category <strong>to</strong> RADM LU<br />
write(*,*) 'Landuse 14-category <strong>to</strong> 11-category translation'<br />
C<br />
C------------------------------------------------------------------<br />
C Change CALMET 14 landuse categories <strong>to</strong> RADM 11 categories<br />
C Also, change percentages <strong>to</strong> fractions<br />
C ----------------------------------------------------------<br />
C MM5 CATEGORIES RADM CALMET<br />
C ----------------------------------------------------------<br />
C 1 URBAN LAND 1 10<br />
C 2 AGRICULTURE LAND 2 20,-20<br />
C 3 RANGE-GRASSLAND 3 30<br />
C 4 DECIDUOUS FOREST 4 40<br />
C 5 CONIFEROUS FOREST 5 61<br />
C 6 MIXED FOREST AND WET LAND 6 62<br />
C 7 WATER 7 50,51,55<br />
C 8 MARSH OR WET LAND 9 60<br />
C 9 DESERT 8 70<br />
C 10 TUNDRA 10 80<br />
C 11 PERMANENT ICE 11 90<br />
C 12 TROPICAL FOREST 5 61<br />
C 13 SAVANNAH 10 80<br />
C ? MIXED AGRICULTURE/RANGELAND 3 30<br />
C ---------------------------------------------------------<br />
69
C<br />
write(*,*) 'LANDUSE CATEGORIES CONVERSION'<br />
DO J = 1,METCOL<br />
DO I = 1,METROW<br />
DO L = 1, LURADM<br />
F_XLUSE (I,J,L) = 0.<br />
ENDDO<br />
ILU = INT(ABS(F_LANDUSE(I,J)/10.))<br />
IF ( ILU .EQ. 1 ) F_XLUSE(I,J, 1) = 1.0<br />
IF ( ILU .EQ. 2 ) F_XLUSE(I,J, 2) = 1.0<br />
IF ( ILU .EQ. 3 ) F_XLUSE(I,J, 3) = 1.0<br />
IF ( ILU .EQ. 4 ) F_XLUSE(I,J, 4) = 1.0<br />
IF ( ILU .EQ. 5 ) F_XLUSE(I,J, 7) = 1.0<br />
IF ( ILU .EQ. 7 ) F_XLUSE(I,J, 8) = 1.0<br />
IF ( ILU .EQ. 8 ) F_XLUSE(I,J, 10) = 1.0<br />
IF ( ILU .EQ. 9 ) F_XLUSE(I,J, 11) = 1.0<br />
IF ( F_LANDUSE(I,J).EQ. 60 ) F_XLUSE(I,J, 9) = 1.0<br />
IF ( F_LANDUSE(I,J).EQ. 61 ) F_XLUSE(I,J, 5) = 1.0<br />
IF ( F_LANDUSE(I,J).EQ. 62 ) F_XLUSE(I,J, 6) = 1.0<br />
ENDDO<br />
ENDDO<br />
C<br />
END IF<br />
C<br />
C** fill out for dot point interpolation<br />
C<br />
DO JW = 1,NCG_J<br />
c JJ = J0 + JW - 1<br />
JJ = J0 + JW<br />
COL = (JW-1)*NDX + 1<br />
DO IW = 1,NCG_I<br />
c II = I0 + IW - 1<br />
II = I0 + IW<br />
ROW = (IW-1)*NDX + 1<br />
XLATD(COL,ROW) = 0.25*( F_LATC(II-1,JJ-1) + F_LATC(II,JJ)<br />
& + F_LATC(II-1,JJ) + F_LATC(II,JJ-1) )<br />
XLOND(COL,ROW) = 0.25*( F_LONC(II-1,JJ-1) + F_LONC(II,JJ)<br />
& + F_LONC (II-1,JJ) + F_LONC(II,JJ-1) )<br />
XMAPD(COL,ROW) = F_DOTMAP (II,JJ)<br />
END DO<br />
END DO<br />
C<br />
C** fill out for cross point interpolation<br />
C<br />
DO JW = 1,NCG_J ! y-window size for MET<br />
c JJ = J0 + JW - 1 ! coarse y-grid index for MET<br />
70
JJ = J0 + JW ! coarse y-grid index for MET<br />
COL = (JW-1)*NDX + 1 ! extended CTM grid index<br />
DO IW = 1,NCG_I ! x-window size<br />
c II = I0 + IW - 1 ! coarse x-grid index<br />
II = I0 + IW ! coarse x-grid index<br />
ROW = (IW-1)*NDX + 1 ! extended CTM grid index<br />
XLATC (COL,ROW) = F_LATC (II,JJ)<br />
XLONC (COL,ROW) = F_LONC (II,JJ)<br />
XMAPC (COL,ROW) = F_CROMAP (II,JJ)<br />
XTOPO (COL,ROW) = F_ELEV (II,JJ)<br />
END DO<br />
END DO<br />
C<br />
C** Interpolate 2D constant fields for high resolution grid<br />
C<br />
C<br />
write(*,*) ' interpolate if NDX larger than 1 '<br />
IF (NDX .GT. 1) THEN<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XLATD )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XLOND )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XMAPD )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XLATC )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XLONC )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XMAPC )<br />
CALL BILIN2D ( NDX,NCOLS_X,NROWS_X, XTOPO )<br />
END IF<br />
XFLAGS (LXX3FACE,2) = 'YES'<br />
XFLAGS (LXX3FACE,3) = PNAME<br />
XFLAGS (LXX3MIDL,2) = 'YES'<br />
XFLAGS (LXX3MIDL,3) = PNAME<br />
XFLAGS (LXLATD,2) = 'YES'<br />
XFLAGS (LXLATD,3) = PNAME<br />
XFLAGS (LXLOND,2) = 'YES'<br />
XFLAGS (LXLOND,3) = PNAME<br />
XFLAGS (LXMAPD,2) = 'YES'<br />
XFLAGS (LXMAPD,3) = PNAME<br />
XFLAGS (LXLATC,2) = 'YES'<br />
XFLAGS (LXLATC,3) = PNAME<br />
XFLAGS (LXLONC,2) = 'YES'<br />
XFLAGS (LXLONC,3) = PNAME<br />
XFLAGS (LXMAPC,2) = 'YES'<br />
XFLAGS (LXMAPC,3) = PNAME<br />
XFLAGS (LXTOPO,2) = 'YES'<br />
XFLAGS (LXTOPO,3) = PNAME<br />
71
C** Fill out additional 2D constant fields<br />
C<br />
C for given surface <strong>to</strong>pography, compute reference pressure<br />
C based on seasonal TOS (reference temp at sea level) used by MM5<br />
C<br />
C 270 K - Polar<br />
C 280 K - midlatitude winter<br />
C 290 K - midlatitude summer<br />
C 300 K - tropics<br />
C<br />
C The temp. difference for the e-folding depth is set <strong>to</strong> be A=50K<br />
C Reference pressure = 1000 mb = 100000 Pa.<br />
C<br />
!!!! note that following procedure is used just <strong>to</strong> create a<br />
!!! reference temperature, pressure and density distribution<br />
!!! at time step 0.<br />
!!! For real simulation, this information may not be used.<br />
C<br />
C<br />
IF ( ABS( YCENT_M ) .LT. 15.0 ) THEN<br />
TS0 = 300.0 ! tropics<br />
ELSE IF ( ABS( YCENT_M ) .GT. 75.0 ) THEN<br />
TS0 = 270.0 ! polar<br />
ELSE IF ( ISESN .EQ. 3 ) THEN<br />
TS0 = 280.0 ! midlatitude winter<br />
ELSE IF ( ISESN .EQ. 1 ) THEN<br />
TS0 = 290.0 ! midlatitude summer<br />
ELSE<br />
TS0 = 285.0 ! otherwise<br />
END IF<br />
AA = 50.0<br />
P00 = 100000.0 ! 1000 mb = 100000 Pa<br />
RH00 = P00 / ( RDGAS * STDTEMP )<br />
LNP = LOG( P00 )<br />
BB = TS0 - AA * LNP<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
CC = XTOPO (C,R) * GRAV/RDGAS -<br />
& ( 0.5 * AA * LNP + BB) * LNP<br />
PRESS = EXP( ( -BB + SQRT( BB*BB-2.0*AA*CC ) ) / AA )<br />
XPRESF (C,R,0) = PRESS<br />
TSFC = TS0 + AA * LOG( PRESS / P00 )<br />
XDENSS (C,R) = PRESS / ( RDGAS * TSFC)<br />
XDENSAF (C,R,0) = XDENSS (C,R)<br />
XDENSAF_REF (C,R,0) = XDENSAF (C,R,0)<br />
72
C<br />
ENDDO<br />
ENDDO<br />
X3JACOBF(C,R,0) = 1.0 ! independent of height<br />
XFLAGS (LXDENSS,2) = 'YES'<br />
XFLAGS (LXDENSS,3) = PNAME<br />
write(*,*) ' compute density, jacobian, METLAY= ', METLAY<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
DO L = 1, METLAY<br />
CC = ( XTOPO (C,R) + XX3MIDL (L) ) * GRAV/RDGAS -<br />
& ( 0.5 * AA * LNP + BB) * LNP<br />
PRESM = EXP( ( -BB + SQRT( BB*BB-2.0*AA*CC ) ) / AA )<br />
CC = ( XTOPO (C,R) + XX3FACE (L) ) * GRAV/RDGAS -<br />
& ( 0.5 * AA * LNP + BB) * LNP<br />
PRESF = EXP( ( -BB + SQRT( BB*BB-2.0*AA*CC ) ) / AA )<br />
!---------------------------------------------------------------------<br />
C<br />
C<br />
XPRESM (C,R,L) = PRESM ! XPRESM in Pascal<br />
TEMPM = TS0 + AA * LOG( PRESM / P00 )<br />
XTEMPM (C,R,L) = TEMPM<br />
TEMPF = TS0 + AA * LOG( PRESF / P00 )<br />
XDENSAM (C,R,L) = PRESM / ( RDGAS * TEMPM)<br />
XDENSAM_REF (C,R,L) = XDENSAM (C,R,L)<br />
XDENSAF (C,R,L) = PRESF / ( RDGAS * TEMPF)<br />
XDENSAF_REF (C,R,L) = XDENSAF (C,R,L)<br />
X3JACOBF(C,R,L) = 1.0 ! independent of height<br />
X3JACOBM(C,R,L) = 1.0 ! independent of height<br />
XENTRP (C,R,L) =<br />
& XDENSAM (C,R,L) * CVD<br />
& * LOG( XTEMPM (C,R,L) / STDTEMP )<br />
& - RDGAS * XDENSAM (C,R,L)<br />
& * LOG( XDENSAM (C,R,L) / RH00 )<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
XFLAGS (LXDENSAM, 2) = 'YES'<br />
73
XFLAGS (LXDENSAM, 3) = PNAME<br />
XFLAGS (LXDENSAF, 2) = 'YES'<br />
XFLAGS (LXDENSAF, 3) = PNAME<br />
XFLAGS (LX3JACOBM,2) = 'YES'<br />
XFLAGS (LX3JACOBM,3) = PNAME<br />
XFLAGS (LX3JACOBF,2) = 'YES'<br />
XFLAGS (LX3JACOBF,3) = PNAME<br />
C compute layer heights above ground - no change with CALMET vgrid<br />
DO K = 1, METLAY<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
X3HTF (C,R,K) = XTOPO(C,R) + XX3FACE (K)<br />
X3HTM (C,R,K) = XTOPO(C,R) + XX3MIDL (K)<br />
XDX3HTF(C,R,K) = X3HTF (C,R,K) - X3HTF (C,R,K-1)<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
write(*,*) ' X3(1) in getmet = ', X3HTF (1,1,1), X3HTM(1,1,1)<br />
C<br />
SECOND = .TRUE.<br />
FIRST = .FALSE.<br />
write(*,*) ' end of first time getmet_calmet call'<br />
RETURN<br />
END IF ! of first time<br />
C<br />
C-----------------------------------------------------------------------<br />
C<br />
IF( SECOND ) THEN<br />
SECOND = .FALSE.<br />
ELSE<br />
CALL READCM<br />
ENDIF<br />
write(*,*) ' processing getmet_calmet ... wait '<br />
C<br />
C-----------------------------------------------------------------------<br />
C<br />
C *** Loop over read timestep starts here<br />
C<br />
C MAPPING F_ARRAYS INTO X-ARRYAS ON ALL COINCIDING GRID POINTS<br />
C EXTRACTING INFO FROM THE MM DOMAIN FOR THE EXTENDED CTM domain<br />
C<br />
DO JW = 1,NCG_J<br />
74
c JJ = J0 + JW - 1<br />
JJ = J0 + JW<br />
COL = (JW-1)*NDX + 1<br />
DO IW = 1,NCG_I<br />
c II = I0 + IW - 1<br />
II = I0 + IW<br />
ROW = (IW-1)*NDX + 1<br />
XTEMPG (COL,ROW) = F_TSFC (II,JJ)<br />
c XRAINN (COL,ROW) = F_RMM (II,JJ) !!! fix later !!!<br />
XRAINN (COL,ROW) = 0.0<br />
XRAINC (COL,ROW) = 0.0<br />
C<br />
C<br />
XEMISS (COL,ROW) = AMISS<br />
XGLW (COL,ROW) = AMISS<br />
XGSW (COL,ROW) = AMISS<br />
XHFX (COL,ROW) = AMISS<br />
XQFX (COL,ROW) = AMISS<br />
XUSTAR (COL,ROW,0) = F_USTAR(II,JJ) ! Grid Avearge<br />
XPBL (COL,ROW) = F_ZI (II,JJ)<br />
XMOL (COL,ROW) = F_EL (II,JJ)<br />
IF(ABS(XMOL(COL,ROW)).GT.AMOLMAX)<br />
& XMOL(COL,ROW) = SIGN(AMOLMAX,XMOL(COL,ROW))<br />
IF(ABS(XMOL(COL,ROW)).LT.AMOLMIN)<br />
& XMOL(COL,ROW) = SIGN(AMOLMIN,XMOL(COL,ROW))<br />
XCAPG (COL,ROW) = AMISS<br />
XRGRND (COL,ROW) = AMISS<br />
XRNET (COL,ROW) = AMISS<br />
XFSOIL (COL,ROW) = 0.0 !!! fix later !!!<br />
XCFRACH(COL,ROW) = AMISS<br />
XCFRACM(COL,ROW) = AMISS<br />
XCFRACL(COL,ROW) = AMISS<br />
XPRSFC (COL,ROW) = F_PSFC(II,JJ)<br />
XPRESF (COL,ROW,0) = XPRSFC(COL,ROW)<br />
DO L = 1,METLAY<br />
LP1 = MIN(L+1, METLAY)<br />
XUU (COL,ROW,L) = F_UU(II,JJ,L)<br />
XVV (COL,ROW,L) = F_VV(II,JJ,L)<br />
XTEMPM (COL,ROW,L) = F_TT(II,JJ,L)<br />
XPRESM (COL,ROW,L) = F_PP(II,JJ,L)<br />
XDENSAM (COL,ROW,L) = XPRESM(COL,ROW,L)<br />
& / ( RDGAS * XTEMPM(COL,ROW,L) )<br />
XDENSAF (COL,ROW,L)=(XPRESM(COL,ROW,L)+XPRESM(COL,ROW,LP1))<br />
& / ( RDGAS * ( XTEMPM(COL,ROW,L) + XTEMPM(COL,ROW,LP1) ) )<br />
XWVAPOR(COL,ROW,L) = F_QQ(II,JJ,L)<br />
75
XDENSWM(COL,ROW,L) = XWVAPOR(COL,ROW,L)*XDENSAM(COL,ROW,L)<br />
XCLDWTR(COL,ROW,L) = 0.0<br />
XRANWTR(COL,ROW,L) = 0.0<br />
ENDDO<br />
XDENSAF(COL,ROW,0)=XPRESF(COL,ROW,0)/(RDGAS*XTEMPM(COL,ROW,1))<br />
DO L = 0,METLAY<br />
XWWIND (COL,ROW,L) = F_WW(II,JJ,L)<br />
ENDDO<br />
C ------------------------------------------------------<br />
C FILL-UP THE landuse X-ARRAYS by populating<br />
C<br />
IF(LUTYPE .EQ. 3) THEN<br />
C<br />
DO JJL = 1,NDX<br />
DO IIL = 1,NDX<br />
DO ILU = 1,LURADM<br />
XLUSE(COL+IIL-1,ROW+JJL-1,ILU) = F_XLUSE(COL,ROW,ILU)<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C<br />
END IF<br />
C<br />
ENDDO<br />
ENDDO<br />
C-------------------------------------------------------------------<br />
C FILL-UP THE X-ARRAYS BY EITHER INTERPOLATION OR POPULATING<br />
IF (NDX .GT. 1) THEN<br />
C FIRST, BI-LINEAR INTERPOLATION OF 2-D FIELDS<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XLATC)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XLONC)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XMAPC)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XMAPD)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XTOPO)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XPRSFC)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XTEMPG)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XRAINC)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XRAINN)<br />
IF (.NOT.LCALCPBL .OR. .NOT.LCALCCLD) THEN<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XEMISS)<br />
76
ENDIF<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XGLW)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XGSW)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XHFX)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XQFX)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XPBL)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XZRUF)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XCAPG)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XMOL)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XRGRND)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XRNET)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XFSOIL)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XCFRACH)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XCFRACM)<br />
CALL BILIN2D (NDX,NCOLS_X,NROWS_X,XCFRACL)<br />
C SECOND, BI-LINEAR INTERPOLATION OF 3-D FIELDS<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,0,LURADM, XUSTAR)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XUU)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XVV)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,0,METLAY, XWWIND)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XPRESM)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XTEMPM)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XWVAPOR)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XCLDWTR)<br />
CALL BILIN3D (NDX,NCOLS_X,NROWS_X,1,METLAY, XRANWTR)<br />
ENDIF<br />
C-----------------------------------------------------------------------<br />
C<br />
C CALCULATE DERIVED QUANTITIES SUCH AS LAYER HEIGHTS, DENSITY, etc.<br />
c write(*,*) ' calling DERIVED '<br />
c CALL DERIVED<br />
DO R = 1, NROWS_X<br />
DO C = 1, NCOLS_X<br />
XDENSS(C, R) = XDENSAF(C, R, 0)<br />
XDLUSE(C, R) = 1.<br />
DO ILU = 2, LURADM<br />
IF(XLUSE(C, R,ILU).GT.XLUSE(C, R,ILU-1)) XDLUSE(C, R) = ILU<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C----------------------------------------------------------------------<br />
77
C<br />
write(*,*) ' X3(1) in getmet = ', X3HTF (1,1,1), X3HTM(1,1,1)<br />
c write(*,*) ' Computing contravariant wind components ..'<br />
C** Compute necessary 3-D met parameters using 'X' arrays<br />
C compute arrays such as density<br />
! CALL MET3DSUP ( SDATE, STIME, ISTAT, MOUTFRQ, INHYD )<br />
C<br />
C** Set up contravariant velocity components<br />
C<br />
C U- & V- Component<br />
C (Note: XUU and XVV correspond <strong>to</strong> actual wind components at DOT)<br />
C<br />
DO K = 1, METLAY<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
C<br />
XUHAT (C,R,K) = XMAPD (C,R) * XUU (C,R,K)<br />
XVHAT (C,R,K) = XMAPD (C,R) * XVV (C,R,K)<br />
XWHAT (C,R,K) = XWWIND(C,R,K) ! JACOBIAN = 1.0 here<br />
END DO<br />
END DO<br />
END DO<br />
XFLAGS (LXUHAT, 2) = 'YES'<br />
XFLAGS (LXUHAT, 3) = PNAME<br />
XFLAGS (LXVHAT, 2) = 'YES'<br />
XFLAGS (LXVHAT, 3) = PNAME<br />
WRITE(*,*) 'RETURNING TO MCIP from GETMET_CALMET'<br />
RETURN<br />
C<br />
1010 CONTINUE<br />
C--------------------------------------------------------------<br />
WRITE(*,*) 'TERMINATION OF GETMET_CALMET'<br />
STOP<br />
END<br />
78
C<br />
SUBROUTINE READCM<br />
C***********************************************************************<br />
C FUNCTION:<br />
C CALMET version<br />
C read the met header info and met arrays from the<br />
C archived meteorological simulation output file 1<br />
C on the <strong>meteorology</strong> model domain and resolution<br />
C<br />
C INPUT:<br />
C CALMET FILE, REQUIRED by MCIP<br />
C<br />
C OUTPUT:<br />
C Arrays defined in 'CMINPUT.EXT'<br />
C Units for output ---> in m, s, kg, K, pa, etc. (MKS)<br />
C<br />
C REVISION HISTORY:<br />
C CREATED February 20, 2001 by Krassi & Daewon<br />
C***********************************************************************<br />
IMPLICIT NONE<br />
C MM INPUT DATA Definition<br />
INCLUDE SUBST_HGRD_ID<br />
INCLUDE SUBST_VGRD_ID<br />
C INCLUDE SUBST_COORD_ID<br />
C INCLUDE SUBST_MPARM<br />
INCLUDE 'MCIPPARM.EXT' ! params for mcip<br />
INCLUDE 'MCIPCOM.EXT' ! commons for mcip<br />
INCLUDE 'LRADMDAT.EXT'<br />
INCLUDE 'CMINPUT.EXT' ! params for calmet<br />
C LOCAL VARIABLES SUCH AS LOOP INDICE<br />
CHARACTER*256 CMFILE ! Filename for CALMET datafile<br />
CHARACTER*16 PNAME<br />
CHARACTER*8 ID<br />
INTEGER IERR ! STATUS RETURN FROM I/O REQUESTS<br />
INTEGER IN,I,J,K ! LOOP INDICES (CALMET ROW,COL)<br />
INTEGER IZ,M<br />
INTEGER NCOL1,NROW1 ! LOOP INDICES (CTM COL,ROW)<br />
INTEGER IM1,JM1 ! INDICES USED FOR LOADING CTM ARRAYS<br />
INTEGER INDEX,ILEVMET<br />
INTEGER NUM3D<br />
INTEGER NUM2D<br />
INTEGER NUM1D<br />
INTEGER NUM0D<br />
INTEGER IDOT,IDUM<br />
INTEGER NDATHR ! Date and time of data (YYJJJHH)<br />
INTEGER MXDAYS<br />
79
REAL EPSILON ! SMALL NUMBER<br />
LOGICAL FIRST<br />
LOGICAL LLCONF<br />
SAVE FIRST<br />
SAVE NUM3D, NUM2D, NUM1D, NUM0D<br />
DATA PNAME / 'READCM' /<br />
DATA EPSILON/ 1.E-30 /<br />
DATA FIRST / .TRUE. /<br />
C***********************************************************************<br />
C EXECUTABLE CODE STARTS HERE<br />
C***********************************************************************<br />
IF(FIRST) THEN<br />
CALL ENVSTR( 'CMFILE',<br />
& 'Filename for CALMET data',<br />
& 'CMFILE', CMFILE, IERR )<br />
C<br />
IF (IERR .NE. 0) THEN<br />
CALL ERRMSG (PNAME,<br />
& 'Error reading CALMET file from environment.')<br />
GOTO 99<br />
ENDIF<br />
C Open <strong>meteorology</strong> files<br />
C BINARY FILE CONTAINING GRIDDED MET. ARRAYS FROM CALMET<br />
C M1UNIT = GETEFILE( CMFILE, .TRUE., .FALSE., 'MCIP' )<br />
C<br />
OPEN(19, FILE=CMFILE,FORM='UNFORMATTED')<br />
M1UNIT=19<br />
IF(IERR.NE.0) THEN<br />
CALL ERRMSG (PNAME, 'Error opening grid domain CALMET file')<br />
GOTO 99<br />
ENDIF<br />
ENDIF<br />
C----------------------------------------------------------------------<br />
C start READ in CALMET meteorological fields<br />
C get record header information<br />
C<br />
IF ( FIRST ) THEN<br />
C READ CALMET HEADER RECORDS<br />
C RECORD #1 - RUN TITLE -- 60 WORDS<br />
READ(M1UNIT)TITLE<br />
C<br />
C RECORD #2 - RUN CONTROL PARAMETERS -- 26 WORDS<br />
C (VERMET, LEVMET ARE BOTH 8 BYTES)<br />
READ(M1UNIT)VERMET,LEVMET,IBYR,IBMO,IBDY,IBHR,IBTZ,IRLG,IRTYPE,<br />
1 NX, NY, NZ, DGRID, XORIGR, YORIGR, IUTMZN, IWFCOD, NSSTA,<br />
2 NUSTA, NPSTA, NOWSTA, NLU, IWAT1, IWAT2, LCALGRD<br />
C<br />
80
C NEW RECORD -- #3 - ADDITIONAL RUN CONTROL DATA -- 8 WORDS<br />
READ(LEVMET(1:6),'(I6)') ILEVMET<br />
IF(ILEVMET.GE.980304) THEN<br />
C NEW HEADER RECORD FORMAT<br />
READ(M1UNIT)XLAT0M,XLON0M,LLCONFM,CONECM,XLAT1M,XLAT2M,<br />
& RLAT0M,RLON0M<br />
ENDIF<br />
C<br />
C CHECK THAT ARRAY MAX DIMENSIONS HAVE BEEN SIZED PROPERLY<br />
IF ( NX.GT.MAXI.OR.NY.GT.MAXJ.OR.NZ.GT.MAXK.OR.<br />
& NSSTA.GT.MAXSS.OR.NUSTA.GT.MAXUS.OR.NPSTA.GT.MAXPS)THEN<br />
WRITE(*,2354)NX,MAXI,NY,MAXJ,NZ,MAXK,NSSTA,MAXSS,<br />
& NUSTA,MAXUS,NPSTA,MAXPS<br />
2354 FORMAT(/1X,'ERROR -- ARRAY DIMENSIONS ARE TOO SMALL FOR ',<br />
& 'THE DATA IN THE CALMET.DAT FILE'/<br />
& 5X,'NX = ',I5,4X,'MAXI = ',I5/<br />
& 5X,'NY = ',I5,4X,'MAXJ = ',I5/<br />
& 5X,'NZ = ',I5,4X,'MAXK = ',I5/<br />
& 5X,'NSSTA = ',I5,4X,'MAXSS = ',I5/<br />
& 5X,'NUSTA = ',I5,4X,'MAXUS = ',I5/<br />
& 5X,'NPSTA = ',I5,4X,'MAXPS = ',I5)<br />
GOTO 99 ! STOP<br />
ENDIF<br />
C<br />
C RECORD #4 - CELL FACE HEIGHTS (NZ + 1 WORDS)<br />
NZP1=NZ+1<br />
CALL RDR1D(M1UNIT,ZFACE,NZP1,CLABEL,IDUM)<br />
C<br />
C RECORDS #5 & 6 - X, Y COORDINATES OF SURFACE STATIONS<br />
C RELATIVE TO SW CORNER OF DOMAIN IN METERS<br />
C CONVERT TO ABSOLUTE COORDINATES:<br />
C X/Y(ORIGINAL)=X/Y(RELATIVE)+XORIGR/YORIGR<br />
C (NSSTA WORDS EACH RECORD)<br />
IF(NSSTA.GT.0)THEN<br />
CALL RDR1D(M1UNIT,XSSTA,NSSTA,CLABXS,IDUM)<br />
CALL RDR1D(M1UNIT,YSSTA,NSSTA,CLABYS,IDUM)<br />
DO M=1,NSSTA<br />
XSSTA(M) = XSSTA(M) + XORIGR<br />
YSSTA(M) = YSSTA(M) + YORIGR<br />
ENDDO<br />
ENDIF<br />
C<br />
C RECORDS #7 & 8 - X, Y COORDINATES OF UPPER AIR STATIONS<br />
C (NUSTA WORDS EACH RECORD)<br />
IF(NUSTA.GT.0)THEN<br />
CALL RDR1D(M1UNIT,XUSTA,NUSTA,CLABXU,IDUM)<br />
CALL RDR1D(M1UNIT,YUSTA,NUSTA,CLABYU,IDUM)<br />
ENDIF<br />
C<br />
C RECORDS #9 & 10 - X, Y COORDINATES OF PRECIPITATION STATIONS<br />
81
C (NPSTA WORDS EACH RECORD)<br />
IF(NPSTA.GT.0)THEN<br />
CALL RDR1D(M1UNIT,XPSTA,NPSTA,CLABXP,IDUM)<br />
CALL RDR1D(M1UNIT,YPSTA,NPSTA,CLABYP,IDUM)<br />
ENDIF<br />
C<br />
C RECORD #11 - SURFACE ROUGHNESS LENGTHS (NX * NY WORDS)<br />
CALL RDR2D(M1UNIT,Z0,XBUF,MAXI,MAXJ,NX,NY,CLABZ0,IDUM)<br />
C<br />
C RECORD #12 - LAND USE CATEGORIES (NX * NY WORDS)<br />
CALL RDI2D(M1UNIT,ILANDU,XBUF,MAXI,MAXJ,NX,NY,CLABLU,IDUM)<br />
C<br />
C RECORD #13 - ELEVATIONS (NX * NY WORDS)<br />
CALL RDR2D(M1UNIT,ELEV,XBUF,MAXI,MAXJ,NX,NY,CLABTE,IDUM)<br />
C<br />
C RECORD #14 - LEAF AREA INDEX (NX * NY WORDS)<br />
CALL RDR2D(M1UNIT,XLAI,XBUF,MAXI,MAXJ,NX,NY,CLABLAI,IDUM)<br />
C<br />
C RECORD #15 - NEAREST SURFACE STATION TO EACH GRID POINT<br />
C (NX * NY WORDS)<br />
CALL RDI2D(M1UNIT,NEARS,XBUF,MAXI,MAXJ,NX,NY,CLABNSS,IDUM)<br />
C<br />
C ASSIGN HEADER INFO TO MCIP VARIABLES<br />
IF(LLCONF) THEN<br />
MAPPRO = 1<br />
ELSE<br />
MAPPRO = 3<br />
ENDIF ! PROJECTION: 1=LAMBERT,3=MERCATOR<br />
METCOL = NX ! CALMET GRID X DIMENSION<br />
METROW = NY ! CALMET GRID Y DIMENSION<br />
METLAY = NZ ! CALMET GRID Z DIMENSION<br />
C ! START JULIAN DATE(YYYY,DDD,HH(GMT),MINS)<br />
YYYY = IBYR<br />
DDD = JULDAY(YYYY,IBMO,IBDY)<br />
HH = IBHR + IBTZ<br />
IF (HH.GT.24) THEN<br />
HH = HH -24<br />
DDD = DDD +1<br />
ENDIF<br />
IF (MOD(YYYY,4).EQ.0) THEN<br />
MXDAYS = 366<br />
ELSE<br />
MXDAYS = 365<br />
ENDIF<br />
IF (DDD.GT.MXDAYS) THEN<br />
DDD = DDD - MXDAYS<br />
YYYY = YYYY + 1<br />
ENDIF<br />
MINS = 0<br />
INAV = 0 ! 1=TURBULENT KINETIC ENERGY<br />
82
! 0=NO TURBULENT KINETIC ENERGY<br />
! FROM CALMET - INAV MUST = 0<br />
YCENT_D= RLAT0M ! MET. DOMAIN CENTER LATITUDE<br />
XCENT_D= -RLON0M ! MET. DOMAIN CENTER LONGITUDE<br />
C ! (negative in Western Hemisphere)<br />
P_BET_D= XLAT2M ! TRUE LATITUDE 1 (DEGREES)<br />
P_ALP_D= XLAT1M ! TRUE LATITUDE 2 (DEGREES)<br />
P_GAM_D= 90. ! POLE POSITION IN DEGREES LATITUDE???????<br />
C<br />
INHYD = 0 ! 1=NONHYDROSTATIC RUN, 0=HYDOSTATIC<br />
C<br />
RESOLN = DGRID ! DOMAIN GRID RESOLUTION IN METERS<br />
I_11 = 1 ! I LOC. IN COARSE DOMAIN OF POINT (1,1)<br />
J_11 = 1 ! J LOC. IN COARSE DOMAIN OF POINT (1,1)<br />
C<br />
C<br />
F_ZTOP = ZFACE(NZP1) ! HEIGHT OF THE MODEL TOP (METERS)<br />
TAPFRQ = 60.*60. ! TIME INTERVAL FOR DATA OUTPUT (MINS->S)<br />
! CALMET.DAT OUTPUT FREQUENCY MUST BE 60min.<br />
IF (METCOL.LT.(NROWS+2) .OR. METROW.LT.(NCOLS+2)<br />
& .OR. METLAY.LT.NLAYS) THEN<br />
CALL ERRMSG (PNAME,<br />
& 'Met. data actual dimensions disagree with MCIPPARM')<br />
WRITE(*,*)' Actual are ',METCOL,' * ',METROW,' * ',METLAY<br />
WRITE(*,*)' MCIPPARM include file specifies NROWS,NCOLS,NLAYS',<br />
& 'as', NROWS,' * ',NCOLS,' * ',NLAYS<br />
WRITE(*,*)' To process met. data correctly, we should have '<br />
WRITE(*,*)' METCOL >= NROWS+2, METROW >= NCOLS+2, and',<br />
& ' METLAY >= NLAYS '<br />
GOTO 99<br />
ENDIF<br />
NROW1 = NROWS<br />
NCOL1 = NCOLS<br />
IF(NDX.GT.1) NROW1 = NROW1 + 2<br />
IF(NDX.GT.1) NCOL1 = NCOL1 + 2<br />
IF (NROW1/NDX+2*NTHIK+1.GT.METCOL .OR.<br />
& NCOL1/NDX+2*NTHIK+1.GT.METROW .OR.<br />
& NLAYS.GT.METLAY) THEN<br />
CALL ERRMSG (PNAME,<br />
& 'Requested CTM dim. are larger than the actual Met. dim.')<br />
WRITE(*,*)' Requested CTM dim.: ',NROWS,' x ',NCOLS,' x ',NLAYS<br />
WRITE(*,*)' Met. dim.: ', METCOL,' x ',METROW,' x ',METLAY<br />
WRITE(*,*)' Max. allowable dim.: ',METCOL-2*NTHIK-1,' x ',<br />
& METROW-2*NTHIK-1,' x ',NLAYS<br />
GOTO 99<br />
ENDIF<br />
FIRST = .FALSE.<br />
83
ENDIF ! of first<br />
C-----------------------------------------------------------------------<br />
C start <strong>to</strong> process <strong>input</strong> data arrays below<br />
C-----------------------------------------------------------------------<br />
C Initialize CALMET 2D-arrays<br />
C<br />
DO J = 1,MAXJ ! for initialization, it is OK<br />
DO I = 1,MAXI<br />
F_PSFC (I,J) = 0.0<br />
F_TSFC (I,J) = 0.0<br />
F_RMM (I,J) = 0.0<br />
F_ELEV (I,J) = 0.0<br />
F_ZI (I,J) = 0.0<br />
F_EL (I,J) = 0.0<br />
F_USTAR (I,J) = 0.0<br />
F_WSTAR (I,J) = 0.0<br />
F_DENSS (I,J) = 0.0<br />
F_Z0 (I,J) = 0.0<br />
F_LANDUSE(I,J) = 0.0<br />
ENDDO<br />
ENDDO<br />
DO I = 1,MAXI<br />
DO J = 1,MAXJ<br />
DO K = 1,MAXK<br />
F_UU (I,J,K) = 0.0<br />
F_VV (I,J,K) = 0.0<br />
F_TT (I,J,K) = 0.0<br />
F_QQ (I,J,K) = 0.0<br />
F_PP (I,J,K) = 0.0<br />
ENDDO<br />
DO K = 0,MAXK<br />
F_WW (I,J,K) = 0.0<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C--------------------------------------------------------------<br />
C --- READ IN U, V, W WIND COMPONENTS FROM CALMET.DAT<br />
DO 10 IZ=1,NZ<br />
CALL RDR2D(M1UNIT,U(1,1,IZ),XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
CALL RDR2D(M1UNIT,V(1,1,IZ),XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
IF(LCALGRD)CALL RDR2D(M1UNIT,W(1,1,IZ),XBUF,MAXI,MAXJ,NX,NY,<br />
& CLABEL,NDATHR)<br />
10 CONTINUE<br />
C<br />
C --- READ THE 3-D TEMPERATURE FIELDS FROM CALMET.DAT<br />
IF(LCALGRD.AND.IRTYPE.EQ.1)THEN<br />
DO 12 IZ=1,NZ<br />
CALL RDR2D(M1UNIT,ZTEMP(1,1,IZ),XBUF,MAXI,MAXJ,NX,NY,<br />
1 CLABEL,NDATHR)<br />
12 CONTINUE<br />
ENDIF<br />
84
C<br />
C --- READ THE 2-D METEOROLOGICAL FIELDS FROM CALMET.DAT<br />
C - PGT STABILITY CLASS,<br />
C - FRICTION VELOCITY (M/S),<br />
C - MIXING HEIGHT (M),<br />
C - MONIN-OBUKHOV LENGTH (M),<br />
C - CONVECTIVE VELOCITY SCALE (M/S),<br />
C - PRECIPITATION RATE (MM/HR)<br />
C --- (IF RUN TYPE NOT=0,I.E.,ONLY WINDS COMPUTED & STORED ON DISK)<br />
IF(IRTYPE.EQ.1)THEN<br />
CALL RDI2D(M1UNIT,IPGT,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
CALL RDR2D(M1UNIT,USTR,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
CALL RDR2D(M1UNIT,ZI,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
CALL RDR2D(M1UNIT,EL,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
CALL RDR2D(M1UNIT,WSTR,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
IF(NPSTA.GT.0)CALL RDR2D(M1UNIT,RMM,XBUF,MAXI,MAXJ,NX,NY,CLABEL<br />
& ,NDATHR)<br />
C<br />
C --- READ THE 1-D METEOROLOGICAL FIELDS FROM CALMET.DAT<br />
C - AIR TEMPERATURE (DEG. K),<br />
C - AIR DENSITY (KG/M**3),<br />
C - SHORT-WAVE SOLAR RADIATION (W/M**2),<br />
C - RELATIVE HUMIDITY (PERCENT),<br />
C - PRECIPITATION CODE<br />
CALL RDR1D(M1UNIT,TEMPK,NSSTA,CLABEL,NDATHR)<br />
CALL RDR1D(M1UNIT,RHO,NSSTA,CLABEL,NDATHR)<br />
CALL RDR1D(M1UNIT,QSW,NSSTA,CLABEL,NDATHR)<br />
CALL RDI1D(M1UNIT,IRH,NSSTA,CLABEL,NDATHR)<br />
IF(NPSTA.GT.0)CALL RDI1D(M1UNIT,IPCODE,NSSTA,CLABEL,NDATHR)<br />
ENDIF<br />
C Compute 2d-pressure, 2d-density, 3d-specific humidity<br />
CALL INTCAL(nssta,xssta,yssta,rho,irh,tempk,<br />
& elev,zface,ztemp,RHO_GRD,PSFC,PPRES,QQ)<br />
C----------------------------------------------------------------------<br />
C FILL UP THE ARRAYS FOR WHICH WE HAVE INFORMATION.<br />
C NOTE: IN ORDER TO HAVE CALMET VARIABLES AGREE WITH THE WAY MCIP<br />
C HANDLES I,J,K, WE NEED TO FLIP THEM !!!!!!!!! THIS IS DONE<br />
C FOR ZTEMP,U,V,W,Z0,ELEV,ZI,EL,USTR,PSFC,RHO_GRD,PPRES<br />
C ASSIGN 2D AND 3D PREDICTED FIELDS<br />
DO J = 1, METCOL<br />
DO I = 1, METROW<br />
DO K = 1, METLAY<br />
F_QQ (I,J,K) = QQ(J,I,K) ! from INTCAL subroutine<br />
F_PP (I,J,K) = PPRES(J,I,K) ! from INTCAL subroutine<br />
F_TT (I,J,K) = ZTEMP(J,I,K) ! from calmet.dat<br />
ENDDO<br />
85
DO K = 0, METLAY<br />
F_WW (I,J,K) = W(J,I,K+1)<br />
ENDDO<br />
F_TSFC(I,J) = ZTEMP (J,I,1) ! Read from calmet<br />
F_ELEV(I,J) = ELEV (J,I) ! elevation in M<br />
F_Z0 (I,J) = Z0 (J,I) ! roughness length in m<br />
F_LANDUSE(I,J) = FLOAT(ILANDU(J,I)) ! land use categories<br />
F_RMM (I,J) = RMM (J,I) ! precip. rate in mm/hr<br />
F_ZI (I,J) = ZI (J,I) ! PBL heigth in m<br />
F_EL (I,J) = EL (J,I) ! Monin-Obukhov length<br />
F_USTAR(I,J) = USTR (J,I) ! Ustar<br />
F_WSTAR(I,J) = WSTR (J,I) ! Wstar<br />
F_PSFC(I,J) = PSFC (J,I) ! In Pascals from INTCAL<br />
F_DENSS(I,J) = RHO_GRD(J,I) ! surface density<br />
ENDDO<br />
ENDDO<br />
C ASSIGN ZFACE FOR FUTURE USE<br />
DO K=0,METLAY<br />
F_ZFACE(K) = ZFACE(K+1)<br />
ENDDO<br />
C<br />
C CALMET wind components are defined at the CMAQ CROSS<br />
C POINTS - interpolate them <strong>to</strong> DOT PONTS from CALMET data<br />
C by directional averaging <strong>to</strong> preserve wind divergence<br />
DO K = 1, METLAY<br />
DO I = 1, METROW<br />
IM1 = MAX(1, I-1)<br />
DO J = 1, METCOL<br />
JM1 = MAX(1, J-1)<br />
F_UU(I,J,K) = (U(JM1,I,K) + U(J,I,K))/2.<br />
F_VV(I,J,K) = (V(J,IM1,K) + V(J,I,K))/2.<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C<br />
C---------------------------------------------------------------------<br />
RETURN<br />
99 STOP 'ABNORMAL TERMINATION IN READCM'<br />
END<br />
C----------------------------------------------------------------------<br />
SUBROUTINE RDI1D(IOMET,IDAT,NWORDS,CLABEL,NDATHR)<br />
86
C----------------------------------------------------------------------<br />
C --- PURPOSE: READ "NWORDS" OF A ONE-DIMENSIONAL INTEGER ARRAY<br />
C<br />
C --- INPUTS:<br />
C IOMET - INTEGER - FORTRAN UNIT NUMBER OF INPUT FILE<br />
C<br />
C --- OUTPUT:<br />
C IDAT(NWORDS) - INTEGER ARRAY - ARRAY READ FROM FILE<br />
C NWORDS - INTEGER - NUMBER OF WORDS TO READ<br />
C CLABEL - CHARACTER*8 - VARIABLE NAME<br />
C NDATHR - INTEGER - DATE AND TIME OF DATA (YYJJJHH)<br />
C<br />
C --- RDI1D CALLED BY: MAIN<br />
C --- RDI1D CALLS: NONE<br />
C----------------------------------------------------------------------<br />
C<br />
INTEGER IDAT(NWORDS)<br />
CHARACTER*8 CLABEL<br />
C<br />
READ(IOMET)CLABEL,NDATHR,IDAT<br />
RETURN<br />
END<br />
C----------------------------------------------------------------------<br />
SUBROUTINE RDR1D(IOMET,X,NWORDS,CLABEL,NDATHR)<br />
C----------------------------------------------------------------------<br />
C --- PURPOSE: READ "NWORDS" OF A ONE-DIMENSIONAL REAL ARRAY<br />
C<br />
C --- INPUTS:<br />
C IOMET - INTEGER - FORTRAN UNIT NUMBER OF INPUT FILE<br />
C<br />
C --- OUTPUT:<br />
C X(NWORDS) - REAL ARRAY - ARRAY READ FROM FILE<br />
C NWORDS - INTEGER - NUMBER OF WORDS TO READ<br />
C CLABEL - CHARACTER*8 - VARIABLE NAME<br />
C NDATHR - INTEGER - DATE AND TIME OF DATA (YYJJJHH)<br />
C<br />
C --- RDR1D CALLED BY: MAIN<br />
C --- RDR1D CALLS: NONE<br />
C----------------------------------------------------------------------<br />
REAL X(NWORDS)<br />
CHARACTER*8 CLABEL<br />
C<br />
READ(IOMET)CLABEL,NDATHR,X<br />
RETURN<br />
END<br />
C----------------------------------------------------------------------<br />
SUBROUTINE RDR2D(IOMET,X,XBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
C----------------------------------------------------------------------<br />
C --- PURPOSE: READ NX * NY WORDS OF A 2-D REAL ARRAY<br />
C<br />
C --- INPUTS:<br />
87
C IOMET - INTEGER - FORTRAN UNIT NUMBER OF INPUT FILE<br />
C XBUF(NX,NY) - REAL ARRAY - BUFFER TO HOLD INPUT DATA<br />
C MAXI,MAXJ - INTEGERS - DIMENSIONS OF DATA ARRAY<br />
C NX,NY - INTEGERS - ACTUAL SIZE OF GRID TO READ<br />
C CLABEL - CHARACTER*8 - VARIABLE NAME<br />
C NDATHR - INTEGER - DATE AND TIME OF DATA (YYJJJHH)<br />
C<br />
C --- OUTPUT:<br />
C X(MAXI,MAXJ) - REAL ARRAY - INPUT DATA ARRAY (PADDED IF NEC.)<br />
C<br />
C --- RDR2D CALLED BY: MAIN<br />
C --- RDR2D CALLS: NONE<br />
C----------------------------------------------------------------------<br />
REAL X(MAXI,MAXJ),XBUF(NX,NY)<br />
CHARACTER*8 CLABEL<br />
C<br />
IF(NX.EQ.MAXI.AND.NY.EQ.MAXJ)THEN<br />
C<br />
C --- ENTIRE ARRAY IS BEING USED -- READ FULL GRID<br />
READ(IOMET)CLABEL,NDATHR,X<br />
ELSE<br />
C<br />
C --- ONLY A PORTION OF GRID BEING USED -- READ AND<br />
C --- TRANSFER FROM BUFFER<br />
READ(IOMET)CLABEL,NDATHR,XBUF<br />
C<br />
DO 10 I=1,NX<br />
DO 10 J=1,NY<br />
X(I,J)=XBUF(I,J)<br />
10 CONTINUE<br />
ENDIF<br />
C<br />
RETURN<br />
END<br />
C<br />
C----------------------------------------------------------------------<br />
SUBROUTINE RDI2D(IOMET,IDAT,IBUF,MAXI,MAXJ,NX,NY,CLABEL,NDATHR)<br />
C----------------------------------------------------------------------<br />
C --- PURPOSE: READ NX * NY WORDS OF A 2-D INTEGER ARRAY<br />
C<br />
C --- INPUTS:<br />
C IOMET - INTEGER - FORTRAN UNIT NUMBER OF INPUT<br />
C FILE<br />
C IBUF(NX,NY) - INTEGER ARRAY - BUFFER TO HOLD INPUT DATA<br />
C MAXI,MAXJ - INTEGERS - DIMENSIONS OF DATA ARRAY<br />
C NX,NY - INTEGERS - ACTUAL SIZE OF GRID TO READ<br />
C<br />
C --- OUTPUT:<br />
C IDAT(MAXI,MAXJ) - INTEGER ARRAY - INPUT DATA ARRAY (PADDED IF<br />
C NECESSARY)<br />
C CLABEL - CHARACTER*8 - VARIABLE NAME<br />
88
C NDATHR - INTEGER - DATE AND TIME OF DATA (YYJJJHH)<br />
C<br />
C --- RDI2D CALLED BY: MAIN<br />
C --- RDI2D CALLS: NONE<br />
C----------------------------------------------------------------------<br />
INTEGER IDAT(MAXI,MAXJ),IBUF(NX,NY)<br />
CHARACTER*8 CLABEL<br />
C<br />
IF(NX.EQ.MAXI.AND.NY.EQ.MAXJ)THEN<br />
C<br />
C --- ENTIRE ARRAY IS BEING USED -- READ FULL GRID<br />
READ(IOMET)CLABEL,NDATHR,IDAT<br />
ELSE<br />
C<br />
C --- ONLY A PORTION OF GRID BEING USED -- READ AND<br />
C --- TRANSFER FROM BUFFER<br />
C<br />
READ(IOMET)CLABEL,NDATHR,IBUF<br />
C<br />
DO 10 I=1,NX<br />
DO 10 J=1,NY<br />
IDAT(I,J)=IBUF(I,J)<br />
10 CONTINUE<br />
ENDIF<br />
C<br />
RETURN<br />
END<br />
C----------------------------------------------------------------------<br />
SUBROUTINE INITAR(XVALUE,NWORDS,XARR)<br />
C----------------------------------------------------------------------<br />
C --- PURPOSE: INITIALIZE AN ARRAY WITH A CONSTANT VALUE<br />
C<br />
C --- INPUTS:<br />
C<br />
C XVALUE - REAL - VALUE TO USED FOR INITIALIZATION<br />
C NWORDS - INTEGER - LENGTHS OF THE DATA ARRAY (WORDS)<br />
C<br />
C --- OUTPUT:<br />
C<br />
C XARR(NWORDS) - REAL ARRAY - ARRAY INITIALIZED<br />
C<br />
C --- INITAR CALLED BY: MAIN<br />
C --- INITAR CALLS: NONE<br />
C<br />
C----------------------------------------------------------------------<br />
C<br />
REAL XARR(NWORDS)<br />
C<br />
X=XVALUE<br />
89
DO 10 I=1,NWORDS<br />
XARR(I)=X<br />
10 CONTINUE<br />
C<br />
RETURN<br />
END<br />
c----------------------------------------------------------------------<br />
FUNCTION JULDAY(iyear,imonth,iiday)<br />
c----------------------------------------------------------------------<br />
c --- PURPOSE: Compute the Julian day number from the Gregorian date<br />
c (month, day)<br />
c<br />
c --- INPUTS:<br />
c IYEAR - integer - Year (YYYY)<br />
c IMONTH - integer - Month (MM)<br />
c IDAY - integer - Day (DD)<br />
c<br />
c --- OUTPUT:<br />
c JULDAY - integer - Julian day (DDD)<br />
c<br />
c --- JULDAY called by: MAIN<br />
c --- JULDAY calls: none<br />
c---------------------------------------------------------------------<br />
integer iyear ! Year (YYYY)<br />
integer imonth ! Month (MM)<br />
integer iiday ! Day (DD)<br />
c<br />
integer kday(12)<br />
data kday/0,31,59,90,120,151,181,212,243,273,304,334/<br />
if(imonth.lt.1.or.imonth.gt.12.or.iiday.gt.31)then<br />
write(*,10)imonth<br />
10 format(//2x,'ERROR in SUBR. JULDAY -- invalid date - imonth =<br />
',<br />
1 i8,5x,'iiday = ',i8)<br />
s<strong>to</strong>p<br />
endif<br />
c<br />
JULDAY=kday(imonth)+iiday<br />
if(imonth.le.2) return<br />
if(mod(iyear,4).EQ.0) JULDAY=JULDAY+1<br />
c<br />
return<br />
end function JULDAY<br />
90
C ----------------------------------------------------------<br />
SUBROUTINE INTCAL(NSSTA,XSSTA,YSSTA,RHO,IRH,TEMPK,<br />
& ELEV,ZFACE,ZTEMP,RHO_GRD,PSFC,PPRES,QQ)<br />
C ----------------------------------------------------------<br />
C FUNCTION:<br />
C CALMET version<br />
C Given air density at surface stations,<br />
C returns the 2D gridded air density and pressure.<br />
C Given Relative Humidity at surface stations,<br />
C returns the 3D gridded Specific humidity<br />
C at terrain following coordinates.<br />
C<br />
C APPROACH:<br />
C For PSFC: Convert available calmet RHO <strong>to</strong> sea level,<br />
C interpolate with inverse sq. distanse objective analysis<br />
C and convert back <strong>to</strong> air density at terrain following<br />
C coordinates, sfc layer. Compute surface pressure<br />
C using the ideal gas law<br />
C For QQ: Interpolate RH <strong>to</strong> surface grid points<br />
C with inverse distanse objective analysis.<br />
C Assume RH does not change with height and compute<br />
C 3D specific humidity from RH and Temperature<br />
C<br />
C INPUT:<br />
C Data read in CALMET.DAT file<br />
C<br />
C OUTPUT:<br />
C QQ(I,J,K) - 3D specific humididy in g/kg of water<br />
C PSFC - interpolated surface pressure in Pascals<br />
C RHO_GRD - interpolated surface density in kg/m3<br />
C<br />
C REVISION HISTORY:<br />
C January 2001 - created by Krassi Lazarova<br />
C ------------------------------------------------------------<br />
IMPLICIT NONE<br />
C MET INPUT DATA Definition<br />
INCLUDE SUBST_HGRD_ID<br />
INCLUDE SUBST_VGRD_ID<br />
INCLUDE 'MCIPPARM.EXT' ! params for mcip<br />
INCLUDE 'MCIPCOM.EXT' ! commons for mcip<br />
INCLUDE 'LRADMDAT.EXT'<br />
INCLUDE 'CMINPUT.EXT' ! params for calmet<br />
INCLUDE 'CONST.EXT' ! constants for calculation<br />
INTEGER IMIN, JMIN, I, J, K, M<br />
REAL X_CROSS(MAXI,MAXJ), Y_CROSS(MAXI,MAXJ)<br />
REAL RHO_0(MAXI,MAXJ)<br />
REAL RSTA_0(MAXSS)<br />
REAL RH_GRD(MAXI,MAXJ)<br />
91
REAL ELEV_STA(MAXSS), ZMID(MAXK)<br />
REAL DIST2<br />
REAL X0, Y0<br />
REAL SUM_DIST2,D2<br />
REAL DELTA(MAXI,MAXJ), DELTAMIN<br />
REAL DELTAX2, DELTAY2<br />
REAL TEMP_0(MAXI,MAXJ)<br />
REAL ESAT(MAXI,MAXJ,MAXK), QQSAT(MAXI,MAXJ,MAXK)<br />
REAL T0(MAXSS)<br />
REAL PWR, GAMMA_A, GAMMA, RDGASS<br />
REAL PWR1, AA,BB,CC,TS0,P00,LNP<br />
DATA GAMMA_A /0.0342/ !deg./m - adiabatic lapse rate<br />
DATA GAMMA /0.0065/ !deg./m - lapse rate<br />
C ------------------------------------------------------------<br />
C SINCE WE DON'T HAVE THE ELEVATIONS OF SURFACE STATIONS,<br />
C WE NEED TO FIND THE CLOSEST GRID POINT TO THEIR COORDINATES<br />
C AND ASSIGN ITS ELEVATION AS AN ELEVATION OF THE SFC. STATION<br />
C ------------------------------------------------------------<br />
X0 = XORIGR - 0.5*RESOLN !The point <strong>to</strong> the west of i=1<br />
Y0 = YORIGR - 0.5*RESOLN !The point <strong>to</strong> the south of j=1<br />
C Initialize PSFC(i,j), RHO_GRD(i,j) and RH_GRD(i,j)<br />
DO J=1,NY<br />
DO I=1,NX<br />
PSFC(I,J) = 0.0<br />
RHO_GRD(I,J) = 0.0<br />
RH_GRD(I,J) = 0.0<br />
ENDDO<br />
ENDDO<br />
C Initialize qq(i,j,k)<br />
DO J=1,NY<br />
DO I=1,NX<br />
DO K=1,NZ<br />
QQ(I,J,K) = 0.0<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C Find grid coordinates closest <strong>to</strong> station coordinates<br />
DO M = 1,NSSTA<br />
C Set 'deltamin' <strong>to</strong> maximum distance in domain<br />
DELTAMIN = (FLOAT(MAXI)*RESOLN)**2 +<br />
& (FLOAT(MAXJ)*RESOLN)**2<br />
IMIN = -999<br />
JMIN = -999<br />
DO J = 1,NY<br />
DO I = 1,NX<br />
92
X_CROSS(I,J) = X0 + FLOAT(I)*RESOLN !x of cross points<br />
Y_CROSS(I,J) = Y0 + FLOAT(J)*RESOLN !y of cross points<br />
DELTA(I,J) = (XSSTA(M) - X_CROSS(I,J))**2 !all in meters<br />
& + (YSSTA(M) - Y_CROSS(I,J))**2<br />
C Find the minimum distance from station <strong>to</strong> x/y grid<br />
IF(DELTA(I,J).LT.DELTAMIN) THEN<br />
DELTAMIN = DELTA(I,J)<br />
IMIN = I<br />
JMIN = J<br />
ENDIF<br />
ENDDO<br />
ENDDO<br />
C Assign grid elevation <strong>to</strong> station elevation<br />
ELEV_STA(M) = ELEV(IMIN,JMIN)<br />
ENDDO<br />
C Convert station density <strong>to</strong> sea level<br />
PWR = (GAMMA_A/GAMMA - 1.) !the fac<strong>to</strong>r (gamma_a/gamma-1.)<br />
DO M=1,NSSTA<br />
T0(M) = TEMPK(M) + GAMMA*ELEV_STA(M)<br />
RSTA_0(M)=RHO(M)*((1.-GAMMA*ELEV_STA(M)/T0(M))**(-1.*PWR))<br />
ENDDO<br />
C Inverse squared distance objective analysis<br />
C Loop over the grid points<br />
C Note: X_CROSS(I,J) and Y_CROSS(I,J) already computed above<br />
DO J=1,NY<br />
DO I=1,NX<br />
SUM_DIST2 = 0.0 !Set <strong>to</strong> zero for each cycle<br />
RHO_0(I,J) = 0.0 !Set <strong>to</strong> zero for each cycle<br />
RH_GRD(I,J) = 0.0 !Set <strong>to</strong> zero for each cycle<br />
C Internal loop over the stations<br />
C XSSTA(m),YSSTA(m) are the coordinates of sfc stations<br />
DO M=1,NSSTA<br />
DELTAX2 = (X_CROSS(I,J)-XSSTA(M))*<br />
& (X_CROSS(I,J)-XSSTA(M))<br />
DELTAY2 = (Y_CROSS(I,J)-YSSTA(M))*<br />
& (Y_CROSS(I,J)-YSSTA(M))<br />
D2 = (DELTAX2 + DELTAY2)<br />
C Set minimum squared distance of 0.001<br />
IF (D2.LE.0.001) D2 = 0.001<br />
C Inverse square distance<br />
DIST2 = 1./D2<br />
SUM_DIST2 = SUM_DIST2 + DIST2<br />
RHO_0(I,J) = RHO_0(I,J) + RSTA_0(M)*DIST2<br />
RH_GRD(I,J) = RH_GRD(I,J)+FLOAT(IRH(M))*DIST2<br />
ENDDO<br />
RHO_0(I,J) = RHO_0(I,J)/SUM_DIST2<br />
93
ENDDO<br />
ENDDO<br />
RH_GRD(I,J) = RH_GRD(I,J)/SUM_DIST2<br />
C Convert sea level density back <strong>to</strong> surface<br />
C Compute surface pressure (PWR is already computed above)<br />
DO I = 1, NX<br />
DO J = 1, NY<br />
TEMP_0(I,J) = ZTEMP(I,J,1) + GAMMA*ELEV(I,J)<br />
RHO_GRD(I,J) = RHO_0(I,J)*(1. - GAMMA*ELEV(I,J)<br />
& /TEMP_0(I,J))**PWR<br />
PSFC(I,J) = RHO_GRD(I,J)*RDGAS*ZTEMP(I,J,1)<br />
ENDDO<br />
ENDDO<br />
C End of SFC PRESSURE and DENSITY calculations<br />
C ----------------------------------------------<br />
C RH and QQ:<br />
C Assume that Relative humidity does not change with height<br />
C (Good assumption in layers with vertical mixing)<br />
C Assume also that specific humidity is equal <strong>to</strong> mixing ratio<br />
C Set PPRES(i,j,k) = exp(-b+sqrt(b^2-2*A*c)/A)<br />
C page 12-18 - Science algorithms of Models3<br />
C (SAMPLE UNTIL I GET THE REAL PRESSURE)<br />
DO J = 1,NY<br />
DO I = 1,NX<br />
DO K = 1,NZ<br />
P00 = PSFC(I,J)<br />
LNP = LOG( P00 )<br />
TS0 = ZTEMP(I,J,1)<br />
AA = 50.0<br />
BB = TS0 - AA * LNP<br />
ZMID(K) = (ZFACE(K) + ZFACE(K+1))/2.0<br />
CC = ZMID (K) * GRAV/RDGAS -<br />
& ( 0.5 * AA * LNP + BB) * LNP<br />
PPRES(I,J,K)=EXP((-BB + SQRT( BB*BB-2.0*AA*CC ) )/AA)<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
DO J = 1,NY<br />
DO I = 1,NX<br />
DO K = 1,NZ<br />
C Compute saturation vapor pressure from Clausius-Clapeyron eq.<br />
C !ZTEMP is in Kelvin, ESAT is in mb.<br />
PWR1 = 9.4041 - 2.354*1000./<br />
& ZTEMP(I,J,K)<br />
ESAT(I,J,K) = (10**PWR1)*100. !converted <strong>to</strong> Pascals<br />
C Compute saturation specific humidity<br />
QQSAT(I,J,K) = ESAT(I,J,K)*0.622/PPRES(I,J,K)<br />
94
C Compute actual specific humidity<br />
QQ(I,J,K) = QQSAT(I,J,K)*RH_GRD(I,J)/100.<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
RETURN<br />
END<br />
C ----------------------------------------------------------------<br />
C subroutine CAL_LATLON - computes latitude/longitude<br />
C from CALMET Lambert coordinates<br />
C Note: Point (1,1) in CALMET.DAT in at Southwest corner of domain<br />
C -----------------------------------------------------------------<br />
SUBROUTINE CAL_LATLON<br />
IMPLICIT NONE<br />
C** I/O API include files<br />
INCLUDE SUBST_IOPARMS<br />
INCLUDE SUBST_IOFDESC<br />
INCLUDE SUBST_IODECL<br />
C<br />
C** Set up includes for grid & Models-3 I/O API (output files)<br />
C<br />
INCLUDE SUBST_HGRD_ID<br />
INCLUDE SUBST_VGRD_ID<br />
INCLUDE SUBST_COORD_ID<br />
INCLUDE SUBST_CONST<br />
INCLUDE 'MCIPPARM.EXT'<br />
INCLUDE 'MCIPCOM.EXT'<br />
INCLUDE 'LRADMDAT.EXT'<br />
INCLUDE 'CMINPUT.EXT'<br />
REAL X0_CROSS,Y0_CROSS,X_CROSS,Y_CROSS<br />
REAL XORIG,YORIG,X_DOT,Y_DOT<br />
REAL N_FACTOR, A, B, C<br />
INTEGER I,J<br />
A = P_ALP_D<br />
B = P_BET_D<br />
C = -P_GAM_D<br />
X = XCENT_D<br />
Y = YCENT_D<br />
CALL SETLAM( A, B, C, X, Y )<br />
C Compute the cross point <strong>to</strong> the southwest of SW-origin<br />
X0_CROSS = XORIGR - 0.5*RESOLN<br />
Y0_CROSS = YORIGR - 0.5*RESOLN<br />
95
C Compute constants needed for map <strong>scale</strong> fac<strong>to</strong>rs<br />
N_FACTOR=LOG( SIN(PI/2.-P_BET_D*PI180)/SIN(PI/2.-P_ALP_D*PI180) )/<br />
& LOG(TAN(PI/4.-P_BET_D*PI180/2.)/TAN(PI/4. - P_ALP_D*PI180/2.))<br />
A = SIN(PI/2. - P_ALP_D*PI180)<br />
B = (TAN(PI/4. - P_ALP_D*PI180/2.))**N_FACTOR<br />
C Compute cross points of cells and convert <strong>to</strong> lat/lon.<br />
C Compute map-<strong>scale</strong> fac<strong>to</strong>r for cross points<br />
c write (*,*) ' Processing lat-long cross point i,j '<br />
DO J = 1, METCOL !1 more cross point <strong>to</strong> the east of last cell<br />
DO I = 1, METROW !1 more cross point <strong>to</strong> the north of last cell<br />
X_CROSS = X0_CROSS + FLOAT(J)*RESOLN<br />
Y_CROSS = Y0_CROSS + FLOAT(I)*RESOLN<br />
CALL LAM2LL(X_CROSS,Y_CROSS,F_LONC(I,J),F_LATC(I,J))<br />
F_CROMAP(I,J)=(A/B)*(TAN(PI/4.-F_LATC(I,J)*PI180/2.)**N_FACTOR)/<br />
& SIN(PI/2. - F_LATC(I,J)*PI180)<br />
ENDDO<br />
ENDDO<br />
C Compute dot points of cells and convert <strong>to</strong> lat/lon.<br />
C Compute map-<strong>scale</strong> fac<strong>to</strong>r for dot points<br />
C Compute coriolis parameter for dot points<br />
write (*,*) ' Processing lat-long dot point i,j '<br />
DO J = 1, METCOL<br />
DO I = 1, METROW<br />
X_DOT = XORIGR + FLOAT(J-1)*RESOLN !include first col<br />
Y_DOT = YORIGR + FLOAT(I-1)*RESOLN !include first row<br />
CALL LAM2LL(X_DOT,Y_DOT,F_LOND(I,J),F_LATD(I,J))<br />
F_DOTMAP(I,J)=(A/B)*(TAN(PI/4-F_LATD(I,J)*PI180/2.)**N_FACTOR)/<br />
& SIN(PI/2. - F_LATD(I,J)*PI180)<br />
! DOTCOR(I,J) = 2.*EOMEGA*SIN(F_LATD(I,J)*PI180)<br />
ENDDO<br />
ENDDO<br />
RETURN<br />
END<br />
96
C********************************************************************<br />
C Significant portions of Models-3/CMAQ software were developed by<br />
C Government employees and under a United States Government contract.<br />
C Portions of the software were also based on information from non-<br />
C Federal sources,including software developed by research institutions<br />
C through jointly funded cooperative agreements.These research institu-<br />
C tions have given the Government permission <strong>to</strong> use, prepare derivative<br />
C works, and distribute copies of their work <strong>to</strong> the public within the<br />
C Models-3/CMAQ software release and <strong>to</strong> permit others <strong>to</strong> do so. EPA<br />
C therefore grants similar permissions for use of Models3/CMAQsoftware,<br />
C but users are requested <strong>to</strong> provide copies of derivative works <strong>to</strong> the<br />
C Government without re-strictions as <strong>to</strong> use by others. Users are<br />
C responsible for acquiring their own copies of commercial software<br />
C associated with the Models-3/CMAQ release and are also responsible<br />
C <strong>to</strong> those vendors for complying with any of the vendors' copyright and<br />
C license restrictions.In particular users must obtain a Runtimelicense<br />
C for Orbix from IONA Technologies for each CPU used in Models-3/CMAQ<br />
C applications.<br />
C<br />
C Portions of I/O API, PAVE, and the model builder are Copyrighted<br />
C 1993-1997 by MCNC--North Carolina Supercomputing Center and are<br />
C used with their permissions subject <strong>to</strong> the above restrictions.<br />
C*********************************************************************<br />
C RCS file, release, date & time of last delta, author, state<br />
C<br />
SUBROUTINE PBLSUP ( ISESN, GMT )<br />
C<br />
C***********************************************************************<br />
C FUNCTION:<br />
C<br />
C PBLSUB computes the 2-D parameters for describing PBL and<br />
97
C met. given simplified <strong>input</strong>s such as USTAR, M-O Length, PBL height<br />
C<br />
C INPUTS:<br />
C ><br />
C ISESN ! season index for table<br />
C SDATE ! starting date, format YYYYDDD<br />
C STIME ! starting time, format HHMMSS<br />
C ISESN ! season code<br />
C GMT !G.M. TIME in hours (e.g., 10.75 = 10:45 GMT)<br />
C<br />
C ><br />
C NDEP<br />
C INPUTS:<br />
C ><br />
C XLUSE (NCOLS_X,NROWS_X,LURADM)!landuse fractions<br />
C X3HTF (NCOLS_X,NROWS_X,0:MAXK)!height at model layerface<br />
C X3HTM (NCOLS_X,NROWS_X, MAXK) ! height at layer middle<br />
C XTEMPM (NCOLS_X,NROWS_X, MAXK) ! temperature profiles<br />
C XDENSAM (NCOLS_X,NROWS_X, MAXK) ! air density (kg/m^3)<br />
C XDENSWM (NCOLS_X,NROWS_X, MAXK) ! vapor density (kg/m^3)<br />
C XTEMPG (NCOLS_X,NROWS_X) ! temperature at ground<br />
C XRAINN (NCOLS_X,NROWS_X) ! accumulated nonc. rain<br />
C XRAINC (NCOLS_X,NROWS_X) ! accumulated conv. rain<br />
C XUSTAR (NCOLS_X,NROWS_X,0) ! ustar (cell avg) (m/s)<br />
C XMOL (NCOLS_X,NROWS_X) ! MONIN-OBUKHOV length<br />
C XPBL (NCOLS_X,NROWS_X) ! PBL height (m)<br />
C<br />
C OUTPUT:<br />
C Compute following<br />
C XUSTAR (NCOLS_X,NROWS_X,0:LURADM)! 0 = avg,<br />
C others = LUSE specific<br />
C XRIB (NCOLS_X,NROWS_X)<br />
C XHFX (NCOLS_X,NROWS_X)<br />
C XQFX (NCOLS_X,NROWS_X)<br />
C XWSTAR (NCOLS_X,NROWS_X,0) ! ustar (cell avg) (m/s)<br />
C XRADYN (NCOLS_X,NROWS_X,0:LURADM)! 0 = avg,<br />
C others = LUSE specific<br />
C XRBNDY (NCOLS_X,NROWS_X,0:LURADM) ! 0 = avg,<br />
C others = LUSE specific<br />
C XRSTOM (NCOLS_X,NROWS_X,0:LURADM)<br />
C XTEMP10 (NCOLS_X,NROWS_X)<br />
C useful <strong>to</strong> compute following if possible<br />
C ??? XSURF1 (NCOLS_X,NROWS_X)<br />
C ??? XSURF2 (NCOLS_X,NROWS_X)<br />
C ??? XFSOIL (NCOLS_X,NROWS_X)<br />
C Now, from solar.F routine XALBEDO (NCOLS_X,NROWS_X)<br />
C Now, from solar.F routine XGLW (NCOLS_X,NROWS_X)<br />
C Now, from solar.F routine XGSW (NCOLS_X,NROWS_X)<br />
C Now, from solar.F routine XRGRND (NCOLS_X,NROWS_X)<br />
C Now, from solar.F routine XRNET (NCOLS_X,NROWS_X)<br />
C ISTAT ! error status for sanity check<br />
98
C<br />
C***********************************************************************<br />
C PRECONDITIONS REQUIRED<br />
C SUBROUTINES AND FUNCTIONS CALLED:<br />
C<br />
C REVISION HISTORY:<br />
C<br />
C Jan 17, 2001 Daewon W. Byun: Created<br />
C May 30, 2001 Krassi Lazarova: Changed heat and moisture flux comp.<br />
C Debugged ribulk.F and pblsup_gen.F<br />
C***********************************************************************<br />
IMPLICIT NONE<br />
C INCLUDE FILES<br />
C** I/O API include files (included for grid/coord magic numbers)<br />
INCLUDE SUBST_IOPARMS<br />
INCLUDE SUBST_IOFDESC<br />
INCLUDE SUBST_IODECL<br />
C<br />
C** Set up includes for grid & universal constants<br />
INCLUDE SUBST_HGRD_ID<br />
INCLUDE SUBST_VGRD_ID<br />
INCLUDE SUBST_COORD_ID<br />
INCLUDE SUBST_CONST<br />
INCLUDE 'CONST_mete.EXT'<br />
INCLUDE 'CONST_pbl.EXT'<br />
C<br />
C** Set up other includes<br />
INCLUDE 'MCIPPARM.EXT' ! params for mcip (TBD)<br />
INCLUDE 'MCIPCOM.EXT' ! commons for mcip (TBD)<br />
INCLUDE 'LRADMDAT.EXT' ! RADM landuse dependent parameters<br />
C<br />
C***********************************************************************<br />
C** Cray vec<strong>to</strong>r merge function<br />
REAL CVMGZ<br />
REAL CVMGP<br />
c EXTERNAL CVMGZ, CVMGP<br />
C***********************************************************************<br />
C LOCAL VARIABLES<br />
LOGICAL FIRST<br />
DATA FIRST / .TRUE. /<br />
SAVE FIRST<br />
C<br />
REAL GMT<br />
C<br />
CHARACTER*16 PNAME<br />
DATA PNAME / 'PBLSUP' /<br />
C SEASONS<br />
C NOTE THAT THE SEASONS ARE DEFINED AS FOLLOWS:<br />
C INDEX SEASON MONTHS ------<br />
99
C 3: winter dec, jan, feb<br />
C 5: spring mar, apr, may ! season index 4 not used in PBLPKG<br />
C 1: summer jun, jul, aug<br />
C 2: autumn sep, oct, nov<br />
C<br />
C** local indices<br />
INTEGER ISESN ! season #<br />
INTEGER IP1, JP1, L ! loop indices<br />
INTEGER C, R, K<br />
INTEGER ILU, IZ, IW<br />
C<br />
C ------------------------------------------------------------------<br />
C For "MAXK" layer <strong>meteorology</strong><br />
C new method for the estimation of surface fluxes<br />
C a la Byun (Nov 1990, Jan 1997)<br />
C-- NDEP: number of mm5 layers averaged in<strong>to</strong> the lowest ctm layer<br />
C-- <strong>to</strong> compute deposition velocities.<br />
C<br />
C** local arrays<br />
C 2-D/3-D<br />
REAL DTMPV (NCOLS_X,NROWS_X) ! virt pot. temp. difference<br />
REAL FCORIS (NCOLS_X,NROWS_X) ! Coriolis fac<strong>to</strong>r<br />
REAL TSURF (NCOLS_X,NROWS_X) ! surface temperature used<br />
REAL QSURF (NCOLS_X,NROWS_X) ! mixing ratio at surface<br />
REAL QRATIO (NCOLS_X,NROWS_X) ! mixing ratio at layer 1<br />
c REAL RADIAT (NCOLS_X,NROWS_X) ! radiation<br />
REAL WSPEED (NCOLS_X,NROWS_X,MAXK) ! wind speed<br />
REAL UUSTC (NCOLS_X,NROWS_X) ! SPEED * USTAR = constant<br />
REAL VPTEMP (NCOLS_X,NROWS_X) ! virt. pot. temperature<br />
C<br />
REAL PPSAVE (NCOLS_X,NROWS_X) ! array for saving PBL power<br />
REAL RRSAVE (NCOLS_X,NROWS_X) ! array for saving PBL power<br />
REAL Z0B1 (NCOLS_X,NROWS_X) ! temp. array for roughness<br />
REAL Z0 (NCOLS_X,NROWS_X,LURADM) ! landuse dependent roughness<br />
REAL BRATIO (NCOLS_X,NROWS_X) ! Estimate of Bowen Ratio<br />
C 1-D<br />
C<br />
INTEGER ILANDU (MAXI,MAXJ) ! landuse from calmet<br />
REAL WSTR (MAXI,MAXJ) ! wstar from calmet<br />
COMMON ILANDU ! directly from calmet<br />
COMMON WSTR ! directly from calmet<br />
REAL RIBK ( MAXK )<br />
REAL VPTEMPK( MAXK )<br />
REAL ZL(MAXK), ZR(MAXK+1), UL(MAXK), DTHDZ(MAXK)<br />
REAL ZTOP(MAXK), TL(MAXK)<br />
REAL ZF(0:MAXK), QL(MAXK), PL(MAXK)<br />
C<br />
C** local scalar variables<br />
REAL UNS, VNS ! wind component<br />
100
C<br />
REAL VSAT, VPRESS ! saturation and current vepor pressures<br />
REAL DENSW ! density of water vapor<br />
REAL DENSD ! density of dry air<br />
REAL PSURF ! surface pressure<br />
REAL VPTSURF ! surface virtual potential temperature<br />
REAL RHUMID ! relative humidity<br />
REAL THREF ! reference potential temperature<br />
REAL QVREF ! reference vapor mixing ratio<br />
REAL ZF1 ! height of <strong>to</strong>p of layer 1 at a point<br />
REAL ZMEAN1 ! height of first layer middle at a cell<br />
REAL ZRUF ! surface roughness length at a cell<br />
REAL HFXMAX ! maximum heat flux value (used for QA)<br />
REAL UST ! friction velocity at a cell<br />
REAL RIB ! bulk Richardson number<br />
REAL THSTAR ! temperature <strong>scale</strong> at a cell<br />
REAL QVSTAR ! vapor mixing ratio <strong>scale</strong> at a cell<br />
REAL ARGCH ! an argument scratch variable<br />
REAL ZTEMP ! height scratch variable<br />
REAL DTEMP ! temperature difference at a point<br />
REAL PTEMP ! atmospheric pressure at a point<br />
REAL RADIAT ! radiation<br />
REAL THETA1, THETA2 ! scratch potential temperatures<br />
REAL U1, U2 ! scratch wind speeds<br />
REAL ALATDEG ! latitude in degree<br />
REAL ANG1 ! an angle scratch variable<br />
REAL ALBEDO ! rough estimation of earth's albedo<br />
REAL ARG ! tmporary variable for a function argument<br />
REAL ZENITH ! zenith angle in degree<br />
REAL COSZEN ! cos(zenith)<br />
REAL DRIB<br />
REAL CPAIR !<br />
REAL FINT ! scratch variable for interpolation<br />
REAL ZSL ! surface layer height<br />
REAL HPBL ! PBL height<br />
REAL HTMAX ! max height of each layer<br />
REAL TSFC, PSFC ! scratch for temp and press at surface<br />
REAL UHT, THT, QHT ! scratch for wind, temp, m. ratio at ZTEMP<br />
INTEGER IFLAG ! scratch flag<br />
REAL ZU1, ZU2, Z1<br />
C integration limits for aerodynamic resistance computation<br />
C<br />
REAL SMALL, AIRDENS<br />
DATA<br />
& SMALL / 1.E-04 /,<br />
& AIRDENS / 1.2250 / ! kg/m**3<br />
101
C<br />
REAL DTEMPMAX ! maximum sfc_T - air_T<br />
REAL DTEMPMIN ! minimum sfc_T - air_T<br />
DATA DTEMPMAX / 5.0 /, DTEMPMIN / -3.0 /<br />
INTEGER ITER, IWAT<br />
DATA ITER / 6 /, IWAT / 6 /<br />
C****************************************<br />
C WESELY RADM LAND-USE TYPES<br />
c 1. urban land<br />
c 2. agriculture<br />
c 3. range<br />
c 4. deciduous forest<br />
c 5. coniferous forest<br />
c 6. mixed forest wetland<br />
c 7. water<br />
c 8. barren land<br />
c 9. non-forested wetland<br />
c 10. mixed agriculture/rangeland<br />
c 11. rocky open areas with low shrubs<br />
C***********************************************************************<br />
C **************** STATEMENT FUNCTIONS *****************<br />
C** FOR PBL<br />
REAL RASP ! aerodynamic resistance function for stable PBL<br />
REAL RASS ! aerodynamic resistance function for stable sfc layer<br />
REAL RAUS ! aerodynamic resistance function - unstable sfc layer<br />
REAL RAUM ! aerodynamic resistance function for mixed layer<br />
C<br />
C** for moisture & virtual temperature<br />
REAL E_AERK<br />
REAL F_VTEMP<br />
REAL F_PTEMP<br />
C ------------------------------------------------------------------<br />
C variables used in the function definitions<br />
REAL DD ! displacement height<br />
REAL ZU ! upper limit of integration<br />
REAL AMOL ! Monin-Obukhov length<br />
REAL CKUST ! VKAR*USTAR<br />
REAL A1 ! 9.*ZU/ABS(MOL)<br />
REAL B1 ! 9.*D /ABS(MOL)<br />
REAL X1,X2 ! Z1/PBLHT, Z2/PBLHT<br />
REAL BETAB ! (4.7/0.74)*PBLHT/MOL<br />
REAL CKWST ! VKAR*WSTAR<br />
REAL ZETA<br />
C<br />
REAL D, TEMP, TEMPC, QMIX, PRESS<br />
C ------------------------------------------------------------------<br />
C aerodynamic resistance for a stable surface layer<br />
RASS( D, ZU, AMOL, CKUST ) = ( PRO * LOG( ZU / D )<br />
& + BETAM * (ZU-D) / AMOL ) / CKUST<br />
C<br />
C aerodynamic resistance for an unstable surface layer<br />
102
RAUS( A1, B1, CKUST ) = PRO * LOG(<br />
& ( ( 2.0 + A1 ) - 2.0 * SQRT( 1.0 + A1 ) ) *<br />
* ( ( 2.0 + B1 ) + 2.0 * SQRT( 1.0 + B1 ) ) /<br />
& ( A1 * B1 ) ) / CKUST<br />
C<br />
C aerodynamic resistance for a stable pbl<br />
RASP( X1, X2, BETAB, CKUST ) = PRO * ( 2.0 * ( BETAB + 1.0 ) *<br />
& ( 1.0 / SQRT( 1.0 - X2 ) - 1.0 / SQRT( 1.0 - X1 ) ) +<br />
& LOG( ABS( ( -1.0 + SQRT( 1.0 - X2 ) )<br />
& * ( 1.0 + SQRT( 1.0 - X1 ) ) /<br />
& ( ( 1.0 + SQRT( 1.0 - X2 ) )<br />
& * ( -1.0 + SQRT( 1.0 - X1 ) ) ) ) ) ) / CKUST<br />
C<br />
C aerodynamic resistance for a strongly stable PBL<br />
C?? do we need a new formula??? - may be not??<br />
C aerodynamic resistance for a mixed layer<br />
RAUM( X1, X2, CKWST ) = LOG( X2 * ( 1.0 - X1 ) /<br />
& ( X1 * ( 1.0 - X2 ) ) ) / CKWST<br />
C ------------------------------------------------------------------<br />
C saturation vapor pressure in pascal ! VP0 = 611.29<br />
C TEMPC in C<br />
E_AERK( TEMPC ) = VP0 *<br />
& EXP( 17.625 * TEMPC / ( 243.04 + TEMPC ) )<br />
C virtual temperature<br />
C TEMP in K, QMIX is specific humidity<br />
F_VTEMP( TEMP, QMIX ) = TEMP * ( 1.0 + 0.6077 * QMIX )<br />
C ! where do we get 0.6077?<br />
C potential temperature<br />
C TEMP in K, PRESS is in Pascal<br />
F_PTEMP( TEMP, PRESS ) = TEMP * ( 100000.0 / PRESS )**(2.0/7.0)<br />
C<br />
C***********************************************************************<br />
C EXECUTABLE CODE STARTS HERE<br />
C***********************************************************************<br />
C ------------------------------------------------------------------<br />
C<br />
C INITIALIZE SOME VARIABLES<br />
C<br />
C ------------------------------------------------------------------<br />
C<br />
C** Compute wind speed profile from true horizontal wind data<br />
DO K = 1, NLAYS<br />
DO C = 1, NCOLS_X<br />
IP1 = MIN( C+1, NCOLS_X )<br />
DO R = 1,NROWS_X<br />
JP1 = MIN( R+1, NROWS_X )<br />
UNS = 0.25 * ( XUU(C, R,K) + XUU(IP1, R,K)<br />
& + XUU(C,JP1,K) + XUU(IP1,JP1,K) )<br />
103
C<br />
C<br />
VNS = 0.25 * ( XVV(C, R,K) + XVV(IP1, R,K)<br />
& + XVV(C,JP1,K) + XVV(IP1,JP1,K) )<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
WSPEED (C, R, K) = MAX( 0.5, SQRT( UNS**2 + VNS**2 ) )<br />
C<br />
DO C = 1, NCOLS_X<br />
DO R = 1,NROWS_X<br />
C<br />
C saturation vapor pressure (mb) over water<br />
C Estimating water vapor at surface with TSURF = 0.5*(TEMPM(1)+TEMPG)<br />
C assuming it has the same relative humidity as the layer 1 air,<br />
C but at the reference temperature<br />
C<br />
C R.H = vapor_press / sat_vapor_press<br />
C Use AERK formula<br />
C<br />
TSURF (C,R) = XTEMPM (C,R,1) ! test<br />
VSAT = E_AERK( TSURF (C,R) - STDTEMP ) ! in Pascal<br />
VPRESS = XDENSWM (C,R,1) * RWVAP * XTEMPM (C,R,1)<br />
RHUMID = VPRESS / VSAT<br />
PSURF = XPRESM(C,R,1) + GRAV*XDENSAM(C,R,1)*X3HTM(C,R,1)<br />
VPRESS = VSAT * RHUMID<br />
DENSW = VPRESS / ( RWVAP * XTEMPM (C,R,1) )<br />
DENSD = XDENSAF(C,R,0)<br />
QSURF (C,R) = DENSW / DENSD<br />
C<br />
C virtual temperature of ground and air above ground<br />
VPTSURF = F_VTEMP( TSURF (C,R), QSURF (C,R) )<br />
VPTSURF = F_PTEMP( VPTSURF, PSURF )<br />
C<br />
QRATIO(C,R) = XDENSWM (C,R,1) /<br />
& ( XDENSAM (C,R,1) - XDENSWM (C,R,1) )<br />
VPTEMP(C,R) = F_VTEMP( XTEMPM (C,R,1), QRATIO(C,R) ) !<br />
VPTEMP(C,R) = F_PTEMP( VPTEMP (C,R), XPRESM (C,R,1) ) !<br />
DTMPV (C,R) = VPTSURF - VPTEMP (C,R)<br />
IF ( DTMPV(C,R) .LT. DTEMPMIN ) DTMPV (C,R) = DTEMPMIN<br />
IF ( DTMPV(C,R) .GT. DTEMPMAX ) DTMPV (C,R) = DTEMPMAX<br />
C ! limit for stable & unstable case differently<br />
DTMPV (C,R) = CVMGZ( 1.E-10, DTMPV (C,R), DTMPV (C,R) )<br />
ENDDO<br />
ENDDO<br />
104
C** compute tstar and bulk Richardson number<br />
DO C = 1, NCOLS_X<br />
DO R = 1,NROWS_X<br />
AMOL = XMOL (C,R)<br />
UST = XUSTAR(C,R,0)<br />
Z1 = X3HTF (C,R,1)<br />
THREF = TSURF (C,R)<br />
ZRUF = XZRUF (C,R)<br />
CALL RIBULK( UST, AMOL, Z1, ZRUF, THREF , RIB)<br />
XRIB(C,R) = RIB<br />
ENDDO<br />
ENDDO<br />
XFLAGS (LXRIB, 2) = 'YES'<br />
XFLAGS (LXRIB, 3) = PNAME<br />
C<br />
C** Compute non-PBL parameters needed for CROSS point<br />
C** Albedo (time independent) & Moisture availability<br />
C<br />
C<br />
C<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XALBEDO(C,R) = 0.0<br />
XMAVAIL(C,R) = 0.0<br />
DO ILU = 1, LURADM<br />
XALBEDO(C,R) = XALBEDO (C,R) +<br />
& ALBTABL (ILU,ISESN) * XLUSE (C,R,ILU)<br />
XMAVAIL(C,R) = XMAVAIL (C,R) +<br />
& MAVTABL (ILU,ISESN) * XLUSE (C,R,ILU)<br />
ENDDO<br />
ENDDO<br />
END DO<br />
CALL SOLAR ( GMT )<br />
XFLAGS (LXALBEDO,2) = 'YES'<br />
XFLAGS (LXALBEDO,3) = PNAME<br />
XFLAGS (LXMAVAIL,2) = 'YES'<br />
XFLAGS (LXMAVAIL,3) = PNAME<br />
XFLAGS (LXRGRND, 2) = 'YES'<br />
XFLAGS (LXRGRND, 3) = PNAME<br />
XFLAGS (LXGSW, 2) = 'YES'<br />
XFLAGS (LXGSW, 3) = PNAME<br />
XFLAGS (LXGLW, 2) = 'YES'<br />
XFLAGS (LXGLW, 3) = PNAME<br />
105
C<br />
XFLAGS (LXRNET, 2) = 'YES'<br />
XFLAGS (LXRNET, 3) = PNAME<br />
DO ILU = 1, LURADM<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
Z0 (C,R,ILU) = Z00 (ILU,ISESN)<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C<br />
C Compute the logarithmic average surface roughness for each grid area<br />
C Byun and Wesley's formula (in preparation)<br />
DO 500 IZ=1, ITER ! ITER = 6<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XZRUF (C,R) = 0.0<br />
Z0B1 (C,R) = 0.0<br />
C XRADYN (C,R,0) = 1.0/SMALL ! initially, for avg<br />
XRADYN (C,R,0) = 0.0 ! for inverse !<br />
ENDDO<br />
ENDDO<br />
C<br />
DO ILU = 1, LURADM<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
Z0B1 (C,R) = Z0B1 (C,R) + XLUSE (C,R,ILU) *<br />
& SQRT( LOG( ZREF / Z0 (C,R,ILU) ) )<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XZRUF (C,R) = ZREF * EXP( -Z0B1 (C,R)**2 )<br />
ENDDO<br />
ENDDO<br />
C<br />
C Now, XZRUF (C,R) contains regular roughness length in m<br />
C Recompute sea-surface rougness using Charnock's relation<br />
C Recompute cell-average surface fluxes<br />
C --- this part is not land use dependent ---<br />
C --- except for adjusting for water ---<br />
C<br />
C Rough estimate of Bowen Ratio for computation of XQFX<br />
DO C=1, NCOLS_X<br />
DO R=1,NROWS_X<br />
BRATIO (C,R) = 0.10<br />
IF(ILANDU(C,R).EQ.70) BRATIO(C,R) = 0.03<br />
IF(ILANDU(C,R).GE.49.AND.ILANDU(C,R).LE.56) BRATIO(C,R)=0.15<br />
ENDDO<br />
106
ENDDO<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
UUSTC(C,R) = XUSTAR (C,R,0) * WSPEED (C,R,1)<br />
THREF = DTMPV (C,R) + VPTEMP (C,R)<br />
XHFX (C,R) = -CPD*AIRDENS*TSURF(C,R)*XUSTAR(C,R,0)**3.0<br />
& / ( 0.4 * GRAV * XMOL(C,R) )<br />
C For XQFX we need Bowen Ratio<br />
XQFX(C,R) = BRATIO (C,R) * XHFX (C,R)<br />
ENDDO<br />
ENDDO<br />
XFLAGS (LXHFX, 2) = 'YES'<br />
XFLAGS (LXHFX, 3) = PNAME<br />
XFLAGS (LXQFX, 2) = 'YES'<br />
XFLAGS (LXQFX, 3) = PNAME<br />
C --- THIS PART IS LAND USE DEPENDENT ---<br />
C** Landuse dependent value<br />
DO ILU = 1, LURADM<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XUSTAR ( C,R,ILU ) = SQRT( VKAR * UUSTC (C,R)<br />
& / LOG( ZREF / Z0 (C,R,ILU) ) )<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
C Ocean/water roughness is computed from friction velocity<br />
C Charnock's relation a = 0.0185 (Wu, 1982)<br />
C Charnock, h. (1955) wind stress on a water surface.<br />
C Q.J.R.M. Soc.81, 639-640.<br />
C Wu, j. (1982) wind-stress coefficients over sea surface<br />
C from breeze <strong>to</strong> huricane. J. Geophys. Res. 87,9704-9706.<br />
C<br />
C** Adjustment of surface roughness for water surface where ustar is<br />
C modified according <strong>to</strong> UUST = const and roughness adjusts accordingly<br />
C Since we just care how the friction velocity will be modified<br />
C for the different surface roughness for each landuse,<br />
C just use neutral formula <strong>to</strong> update landuse dependent friction<br />
C velocity: this is the same as assuming that stability and PBL height<br />
C over different landuse is the same as for the cell average values.<br />
C (Since sfc temp, profiles are cell averaged values, we cannot do<br />
C any better) Next eq. for USTAR is from Byun and Wesley<br />
C (in preparation)<br />
DO IW = 1, IWAT<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
107
C<br />
XUSTAR(C,R,LWATER) = SQRT( VKAR * UUSTC (C,R)<br />
& / LOG( ZREF / Z0 (C,R,LWATER) ) )<br />
Z0 (C,R,7) = 0.0185 * XUSTAR(C,R,LWATER)**2 / GRAV<br />
& + .0001<br />
ENDDO<br />
ENDDO<br />
ENDDO<br />
500 CONTINUE<br />
XFLAGS (LXUSTAR,2) = 'YES'<br />
XFLAGS (LXUSTAR,3) = PNAME<br />
C<br />
C compute aerodynamic resistance<br />
C*** Routine <strong>to</strong> segregate resistance in<strong>to</strong> each LU components<br />
DO 600 ILU = 1, LURADM<br />
DO 640 C = 1, NCOLS_X<br />
DO 640 R = 1, NROWS_X<br />
ZSL = 0.1 * XPBL (C,R)<br />
ZTEMP = MIN( X3HTM (C,R,NDEP), ZSL )<br />
ZU1 = MAX( XZRUF (C,R), ZTEMP )<br />
c when setting integration limits, we need <strong>to</strong> avoid singular<br />
c points: minimum ht is set <strong>to</strong> Z0 and maximum ht. is set <strong>to</strong><br />
c 0.9*PBLHT + 0.05 (m)<br />
ZU2 = MAX( MIN( X3HTM(C,R,NDEP),XPBL (C,R) ),ZU1)+0.05<br />
X1 = MIN( 0.9, ZU1 / XPBL (C,R) )<br />
X2 = MIN( 0.9 + 0.05 / XPBL (C,R), ZU2 / XPBL (C,R) )<br />
BETAB = 6.345 * XPBL (C,R) / XMOL (C,R)<br />
A1 = 9.0 * ZU1 / ABS( XMOL (C,R) )<br />
B1 = 9.0 * XZRUF (C,R) / ABS( XMOL (C,R) )<br />
C protect against x2 being .ge. than 1.0<br />
IF (X2 .GE. 0.9999) X2 = 0.9999<br />
XWSTAR (C,R) = XUSTAR (C,R,0) * ( XPBL (C,R)<br />
& / ( VKAR * ABS( XMOL (C,R) ) ) )**0.3333333<br />
c XWSTAR (C,R) = WSTR (C,R) ! directly from CALMET<br />
XWSTAR (C,R) = CVMGP(1.0E-20, XWSTAR (C,R), XMOL (C,R) )<br />
C<br />
XRADYN (C,R,ILU) = CVMGP(<br />
& ( RASS( XZRUF (C,R), ZU1, XMOL (C,R),<br />
& VKAR * XUSTAR (C,R,ILU) )<br />
& + RASP( X1, X2, BETAB, VKAR * XUSTAR (C,R,ILU) ) ),<br />
& ( RAUS( A1, B1, 0.4 * XUSTAR (C,R,ILU) )<br />
& + RAUM( X1, X2, VKAR * XWSTAR (C,R) ) ),<br />
& XMOL (C,R) )<br />
C<br />
C compute sub-layer resistance<br />
C XRBNDY (C,R,0) = 2.83 / ( VKAR * XUSTAR (C,R,0) )<br />
108
C<br />
640 CONTINUE<br />
C<br />
C** compute cell average (using inverse directly)<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XRADYN (C,R,0) = XRADYN (C,R,0) +<br />
& XLUSE (C,R,ILU) / XRADYN (C,R,ILU)<br />
END DO<br />
END DO<br />
600 CONTINUE ! end of 'DO 600' landuse loop<br />
C** now XRADYN has real dynamic resistance<br />
C** ?? probably, we do not want <strong>to</strong> replace the original value ??<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
XRADYN (C,R,0) = 1. / XRADYN (C,R,0)<br />
END DO<br />
END DO<br />
XFLAGS (LXWSTAR,2) = 'YES'<br />
XFLAGS (LXWSTAR,3) = PNAME<br />
XFLAGS (LXRADYN,2) = 'YES'<br />
XFLAGS (LXRADYN,3) = PNAME<br />
C** Estimate temperatures at 1.5 m and 10 m<br />
DO C = 1, NCOLS_X<br />
DO R = 1, NROWS_X<br />
ZF(0) = X3HTF(C,R,0)<br />
C<br />
DO K = 1, NLAYS<br />
ZL (K) = X3HTM (C,R,K)<br />
ZF (K) = X3HTF (C,R,K)<br />
UL (K) = WSPEED (C,R,K)<br />
TL (K) = XTEMPM (C,R,K)<br />
QL (K) = XDENSWM (C,R,K) /<br />
& ( XDENSAM (C,R,K) - XDENSWM (C,R,K) )<br />
PL (K) = XPRESM (C,R,K) / 100.0 ! in hPascal = mb<br />
END DO<br />
C TSFC = 0.5 * ( XTEMPM (C,R,1) + XTEMPG (C,R) ) ! test<br />
AMOL = XMOL (C,R)<br />
ZRUF = XZRUF (C,R)<br />
HPBL = XPBL (C,R)<br />
C*bdx CPAIR = 1004.67 * (1.0 + 0.84 * QL(1)) ! J/(K KG)<br />
CPAIR = CPD * (1.0 + 0.84 * QL(1)) ! J/(K KG)<br />
UST = XUSTAR (C,R,0)<br />
CBDX120197 PSFC = ( XPSTAR (C,R) + X3TOP ) / 100.0 !in hPascal=mb<br />
PSURF=XPRESM(C,R,1)+GRAV*XDENSAM(C,R,1)*X3HTM(C,R,1)<br />
C ! in Pascal<br />
PSFC = PSURF / 100. ! in hPascal= mb<br />
THETA1 = TL(1) *(1000.0/PL(1))**.286<br />
109
C<br />
C<br />
C<br />
C<br />
ZTEMP = 10.0 ! 10 meter<br />
PTEMP = PL(1)+GRAV*XDENSAM(C,R,1)*(ZL(1)-ZTEMP)/100. !mb<br />
CALL INTSFC ( UST, AMOL, THETA1,ZRUF, ZL(1),UL(1), THETA1<br />
& ,ZTEMP, U2, THETA2)<br />
XTEMP10(C,R) = THETA2*(PTEMP/1000.0)**.286<br />
XSURF2 (C,R) = U2 ! for reference<br />
ZTEMP = 1.5 ! 1.5 meter<br />
PTEMP = PL(1)+GRAV*XDENSAM(C,R,1)*(ZL(1)-ZTEMP)/100. !mb<br />
ZTEMP = 10.0 ! 10 meter<br />
CALL INTSFC ( UST, AMOL, THETA1,ZRUF, ZL(1),UL(1), THETA1<br />
& ,ZTEMP, U2, THETA2)<br />
END DO<br />
END DO<br />
XSURF1 (C,R) = THETA2*(PTEMP/1000.0)**.286<br />
C--- Compute W-Star<br />
DO C = 1, NCOLS_X<br />
DO R = 1,NROWS_X<br />
XWSTAR (C,R) = XUSTAR (C,R,0) * ( XPBL (C,R)<br />
& / ( VKAR * ABS( XMOL (C,R) ) ) )**0.3333333<br />
c XWSTAR (C,R) = WSTR (C,R) ! directly from CALMET<br />
XWSTAR (C,R) = CVMGP( 0.0, XWSTAR (C,R), XMOL (C,R) )<br />
C<br />
C--- Compute ALBEDO from MM5 values of incident and absorbed SW rad<br />
IF(XRGRND(C,R).GT.0.) THEN<br />
c XALBEDO(C,R) = 1. - XGSW(C,R) / XRGRND(C,R)<br />
XALBEDO(C,R) = XALBEDO(C,R) ! from solar<br />
ELSE<br />
XALBEDO(C,R) = 0.<br />
ENDIF<br />
END DO<br />
END DO<br />
C<br />
write(*,*) 'PBLSUP - RETURNING TO MCIP'<br />
RETURN<br />
C<br />
1010 CONTINUE<br />
STOP 'ABNORMAL TERMINATION IN PBLSUP'<br />
END<br />
110
APPENDIX B: INPUT FILE TO CALMET<br />
4 km resolution CALMET simulation for 4 days from July 10, 1995<br />
with MM5 data, 10 surface met stations, no overwater station,<br />
4 upper air met stations, and no precip stations<br />
---------------- Run title (3 lines) ------------------------------------------<br />
CALMET MODEL CONTROL FILE<br />
--------------------------<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 0 -- Input and Output File Names<br />
Subgroup (a)<br />
------------<br />
Default Name Type File Name<br />
------------ ---- ---------<br />
GEO.DAT <strong>input</strong> ! GEODAT=geo4km.dat !<br />
SURF.DAT <strong>input</strong> ! SRFDAT=surf.dat !<br />
CLOUD.DAT <strong>input</strong> * CLDDAT= *<br />
PRECIP.DAT <strong>input</strong> * PRCDAT= *<br />
MM4.DAT <strong>input</strong> ! MM4DAT=mm4.dat !<br />
WT.DAT <strong>input</strong> * WTDAT= *<br />
CALMET.LST output ! METLST=calmet.lst !<br />
CALMET.DAT output ! METDAT=calmetnew.dat !<br />
PACOUT.DAT output * PACDAT= *<br />
All file names will be converted <strong>to</strong> lower case if LCFILES = T<br />
Otherwise, if LCFILES = F, file names will be converted <strong>to</strong> UPPER CASE<br />
T = lower case ! LCFILES = T !<br />
F = UPPER CASE<br />
NUMBER OF UPPER AIR & OVERWATER STATIONS:<br />
Number of upper air stations (NUSTA) No default ! NUSTA = 4 !<br />
Number of overwater met stations<br />
(NOWSTA) No default ! NOWSTA = 0 !<br />
!END!<br />
--------------------------------------------------------------------------------<br />
111
Subgroup (b)<br />
---------------------------------<br />
Upper air files (one per station)<br />
---------------------------------<br />
Default Name Type File Name<br />
------------ ---- ---------<br />
UP1.DAT <strong>input</strong> 1 ! UPDAT=up_95.wal! !END!<br />
UP2.DAT <strong>input</strong> 2 ! UPDAT=up_95.alb! !END!<br />
UP3.DAT <strong>input</strong> 3 ! UPDAT=up_95.okx! !END!<br />
UP4.DAT <strong>input</strong> 4 ! UPDAT=up_95.iad! !END!<br />
--------------------------------------------------------------------------------<br />
Subgroup (c)<br />
-----------------------------------------<br />
Overwater station files (one per station)<br />
-----------------------------------------<br />
Default Name Type File Name<br />
------------ ---- ---------<br />
SEA1.DAT <strong>input</strong> 1 * SEADAT= *<br />
--------------------------------------------------------------------------------<br />
Subgroup (d)<br />
----------------<br />
Other file names<br />
----------------<br />
Default Name Type File Name<br />
------------ ---- ---------<br />
DIAG.DAT <strong>input</strong> * DIADAT= *<br />
PROG.DAT <strong>input</strong> * PRGDAT= *<br />
TEST.PRT output * TSTPRT= *<br />
TEST.OUT output * TSTOUT= *<br />
TEST.KIN output * TSTKIN= *<br />
TEST.FRD output * TSTFRD= *<br />
TEST.SLP output * TSTSLP= *<br />
--------------------------------------------------------------------------------<br />
NOTES: (1) File/path names can be up <strong>to</strong> 70 characters in length<br />
(2) Subgroups (a) and (d) must have ONE 'END' (surround by<br />
delimiters) at the end of the group<br />
(3) Subgroups (b) and (c) must have an 'END' (surround by<br />
delimiters) at the end of EACH LINE<br />
!END!<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 1 -- General run control parameters<br />
--------------<br />
112
Starting date: Year (IBYR) -- No default ! IBYR= 1995 !<br />
Month (IBMO) -- No default ! IBMO= 07 !<br />
Day (IBDY) -- No default ! IBDY= 10 !<br />
Hour (IBHR) -- No default ! IBHR= 00 !<br />
Base time zone (IBTZ) -- No default ! IBTZ= 5 !<br />
PST = 08, MST = 07<br />
CST = 06, EST = 05<br />
Length of run (hours) (IRLG) -- No default ! IRLG= 94 !<br />
Run type (IRTYPE) -- Default: 1 ! IRTYPE= 1 !<br />
0 = Computes wind fields only<br />
1 = Computes wind fields and micrometeorological variables<br />
(u*, w*, L, zi, etc.)<br />
(IRTYPE must be 1 <strong>to</strong> run CALPUFF or CALGRID)<br />
Compute special data fields required<br />
by CALGRID (i.e., 3-D fields of W wind<br />
components and temperature)<br />
in additional <strong>to</strong> regular Default: T ! LCALGRD = T !<br />
fields ? (LCALGRD)<br />
(LCALGRD must be T <strong>to</strong> run CALGRID)<br />
Flag <strong>to</strong> s<strong>to</strong>p run after<br />
SETUP phase (ITEST) Default: 2 ! ITEST= 2 !<br />
(Used <strong>to</strong> allow checking<br />
of the model <strong>input</strong>s, files, etc.)<br />
ITEST = 1 - STOPS program after SETUP phase<br />
ITEST = 2 - Continues with execution of<br />
COMPUTATIONAL phase after SETUP<br />
!END!<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 2 -- Grid control parameters<br />
--------------<br />
HORIZONTAL GRID DEFINITION:<br />
No. X grid cells (NX) No default ! NX = 87 !<br />
No. Y grid cells (NY) No default ! NY = 84 !<br />
GRID SPACING (DGRIDKM) No default ! DGRIDKM = 4. !<br />
Units: km<br />
REFERENCE COORDINATES<br />
of SOUTHWEST corner of grid cell (1,1)<br />
113
X coordinate (XORIGKM) No default ! XORIGKM = 996.000 !<br />
Y coordinate (YORIGKM) No default ! YORIGKM = -120.000 !<br />
Units: km<br />
Latitude (XLAT0) No default ! XLAT0 = 38.2120 !<br />
Longitude (XLON0) No default ! XLON0 = 78.2487 !<br />
UTM ZONE (IUTMZN) Default: 0 ! IUTMZN = 18 !<br />
LAMBERT CONFORMAL PARAMETERS<br />
Rotate <strong>input</strong> winds from true north <strong>to</strong><br />
map north using a Lambert conformal<br />
projection? (LLCONF) Default: F ! LLCONF = T !<br />
Latitude of 1st standard parallel Default: 30. ! XLAT1 = 30.000 !<br />
Latitude of 2nd standard parallel Default: 60. ! XLAT2 = 60.000 !<br />
(XLAT1 and XLAT2; + in NH, - in SH)<br />
Longitude (RLON0) Default = 90. ! RLON0 = 90.000 !<br />
(used only if LLCONF = T)<br />
(Positive = W. Hemisphere;<br />
Negative = E. Hemisphere)<br />
Origin Latitude (RLAT0) Default = 40. ! RLAT0 = 40.000 !<br />
(used only if IPROG > 2)<br />
(Positive = N. Hemisphere;<br />
Negative = S. Hemisphere)<br />
Vertical grid definition:<br />
!END!<br />
No. of vertical layers (NZ) No default ! NZ = 15 !<br />
Cell face heights in arbitrary<br />
vertical grid (ZFACE(NZ+1)) No defaults<br />
Units: m<br />
! ZFACE = 0.,22.,76.,114.,152.,230.,307.,425.,544.,705.,868.,1289.,1818.,2550.,3600.,4754. !<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 3 -- Output Options<br />
--------------<br />
DISK OUTPUT OPTION<br />
Save met. fields in an unformatted<br />
output file ? (LSAVE) Default: T ! LSAVE = T !<br />
(F = Do not save, T = Save)<br />
114
Type of unformatted output file:<br />
(IFORMO) Default: 1 ! IFORMO = 1 !<br />
1 = CALPUFF/CALGRID type file (CALMET.DAT)<br />
2 = MESOPUFF-II type file (PACOUT.DAT)<br />
LINE PRINTER OUTPUT OPTIONS:<br />
Print met. fields ? (LPRINT) Default: F ! LPRINT = F !<br />
(F = Do not print, T = Print)<br />
(NOTE: parameters below control which<br />
met. variables are printed)<br />
Print interval<br />
(IPRINF) in hours Default: 1 ! IPRINF = 1 !<br />
(Meteorological fields are printed<br />
every 1 hours)<br />
Specify which layers of U, V wind component<br />
<strong>to</strong> print (IUVOUT(NZ)) -- NOTE: NZ values must be entered<br />
(0=Do not print, 1=Print)<br />
(used only if LPRINT=T) Defaults: NZ*0<br />
! IUVOUT = 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 !<br />
-----------------------<br />
Specify which levels of the W wind component <strong>to</strong> print<br />
(NOTE: W defined at TOP cell face -- 10 values)<br />
(IWOUT(NZ)) -- NOTE: NZ values must be entered<br />
(0=Do not print, 1=Print)<br />
(used only if LPRINT=T & LCALGRD=T)<br />
-----------------------------------<br />
Defaults: NZ*0<br />
! IWOUT = 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 !<br />
Specify which levels of the 3-D temperature field <strong>to</strong> print<br />
(ITOUT(NZ)) -- NOTE: NZ values must be entered<br />
(0=Do not print, 1=Print)<br />
(used only if LPRINT=T & LCALGRD=T)<br />
-----------------------------------<br />
Defaults: NZ*0<br />
! ITOUT = 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 !<br />
Specify which meteorological fields<br />
<strong>to</strong> print<br />
(used only if LPRINT=T) Defaults: 0 (all variables)<br />
-----------------------<br />
115
Variable Print ?<br />
(0 = do not print,<br />
1 = print)<br />
-------- ------------------<br />
! STABILITY = 1 ! - PGT stability class<br />
! USTAR = 1 ! - Friction velocity<br />
! MONIN = 1 ! - Monin-Obukhov length<br />
! MIXHT = 1 ! - Mixing height<br />
! WSTAR = 1 ! - Convective velocity <strong>scale</strong><br />
! PRECIP = 1 ! - Precipitation rate<br />
! SENSHEAT = 1 ! - Sensible heat flux<br />
! CONVZI = 1 ! - Convective mixing ht.<br />
Testing and debug print options for micrometeorological module<br />
Print <strong>input</strong> meteorological data and<br />
internal variables (LDB) Default: F ! LDB = F !<br />
(F = Do not print, T = print)<br />
(NOTE: this option produces large amounts of output)<br />
First time step for which debug data<br />
are printed (NN1) Default: 1 ! NN1 = 1 !<br />
Last time step for which debug data<br />
are printed (NN2) Default: 1 ! NN2 = 2 !<br />
Testing and debug print options for wind field module<br />
(all of the following print options control output <strong>to</strong><br />
wind field module's output files: TEST.PRT, TEST.OUT,<br />
TEST.KIN, TEST.FRD, and TEST.SLP)<br />
Control variable for writing the test/debug<br />
wind fields <strong>to</strong> disk files (IOUTD)<br />
(0=Do not write, 1=write) Default: 0 ! IOUTD = 0 !<br />
Number of levels, starting at the surface,<br />
<strong>to</strong> print (NZPRN2) Default: 1 ! NZPRN2 = 0 !<br />
Print the INTERPOLATED wind components ?<br />
(IPR0) (0=no, 1=yes) Default: 0 ! IPR0 = 0 !<br />
Print the TERRAIN ADJUSTED surface wind<br />
components ?<br />
(IPR1) (0=no, 1=yes) Default: 0 ! IPR1 = 0 !<br />
Print the SMOOTHED wind components and<br />
the INITIAL DIVERGENCE fields ?<br />
116
!END!<br />
(IPR2) (0=no, 1=yes) Default: 0 ! IPR2 = 0 !<br />
Print the FINAL wind speed and direction<br />
fields ?<br />
(IPR3) (0=no, 1=yes) Default: 0 ! IPR3 = 0 !<br />
Print the FINAL DIVERGENCE fields ?<br />
(IPR4) (0=no, 1=yes) Default: 0 ! IPR4 = 0 !<br />
Print the winds after KINEMATIC effects<br />
are added ?<br />
(IPR5) (0=no, 1=yes) Default: 0 ! IPR5 = 0 !<br />
Print the winds after the FROUDE NUMBER<br />
adjustment is made ?<br />
(IPR6) (0=no, 1=yes) Default: 0 ! IPR6 = 0 !<br />
Print the winds after SLOPE FLOWS<br />
are added ?<br />
(IPR7) (0=no, 1=yes) Default: 0 ! IPR7 = 0 !<br />
Print the FINAL wind field components ?<br />
(IPR8) (0=no, 1=yes) Default: 0 ! IPR8 = 0 !<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 4 -- Meteorological data options<br />
--------------<br />
NUMBER OF SURFACE & PRECIP. METEOROLOGICAL STATIONS<br />
Number of surface stations (NSSTA) No default ! NSSTA = 10 !<br />
Number of precipitation stations<br />
(NPSTA) No default ! NPSTA = 0 !<br />
CLOUD DATA OPTIONS<br />
Griddid cloud fields:<br />
(ICLOUD) Default: 0 ! ICLOUD = 0 !<br />
ICLOUD = 0 - Gridded clouds not used<br />
ICLOUD = 1 - Gridded CLOUD.DAT generated as OUTPUT<br />
ICLOUD = 2 - Gridded CLOUD.DAT read as INPUT<br />
FILE FORMATS<br />
Surface meteorological data file format<br />
(IFORMS) Default: 2 ! IFORMS = 2 !<br />
(1 = unformatted (e.g., SMERGE output))<br />
(2 = formatted (free-formatted user <strong>input</strong>))<br />
117
!END!<br />
Precipitation data file format<br />
(IFORMP) Default: 2 ! IFORMP = 2 !<br />
(1 = unformatted (e.g., PMERGE output))<br />
(2 = formatted (free-formatted user <strong>input</strong>))<br />
Cloud data file format<br />
(IFORMC) Default: 2 ! IFORMC = 2 !<br />
(1 = unformatted - CALMET unformatted output)<br />
(2 = formatted - free-formatted CALMET output or user <strong>input</strong>)<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 5 -- Wind Field Options and Parameters<br />
--------------<br />
WIND FIELD MODEL OPTIONS<br />
Model selection variable (IWFCOD) Default: 1 ! IWFCOD = 1 !<br />
0 = Objective analysis only<br />
1 = Diagnostic wind module<br />
Compute Froude number adjustment<br />
effects ? (IFRADJ) Default: 1 ! IFRADJ = 1 !<br />
(0 = NO, 1 = YES)<br />
Compute kinematic effects ? (IKINE) Default: 1 ! IKINE = 0 !<br />
(0 = NO, 1 = YES)<br />
Use O'Brien procedure for adjustment<br />
of the vertical velocity ? (IOBR) Default: 0 ! IOBR = 0 !<br />
(0 = NO, 1 = YES)<br />
Compute slope flow effects ? (ISLOPE) Default: 1 ! ISLOPE = 1 !<br />
(0 = NO, 1 = YES)<br />
Extrapolate surface wind observations<br />
<strong>to</strong> upper layers ? (IEXTRP) Default: -4 ! IEXTRP = -4 !<br />
(1 = no extrapolation is done,<br />
2 = power law extrapolation used,<br />
3 = user <strong>input</strong> multiplicative fac<strong>to</strong>rs<br />
for layers 2 - NZ used (see FEXTRP array)<br />
4 = similarity theory used<br />
-1, -2, -3, -4 = same as above except layer 1 data<br />
at upper air stations are ignored<br />
Extrapolate surface winds even<br />
if calm? (ICALM) Default: 0 ! ICALM = 0 !<br />
118
(0 = NO, 1 = YES)<br />
Layer-dependent biases modifying the weights of<br />
surface and upper air stations (BIAS(NZ))<br />
-1
the wind field interpolation (RMIN) Default: 0.1 ! RMIN = .1 !<br />
Units: km<br />
Radius of influence of terrain<br />
features (TERRAD) No default ! TERRAD = 12. !<br />
Units: km<br />
Relative weighting of the first<br />
guess field and observations in the<br />
SURFACE layer (R1) No default ! R1 = 2. !<br />
(R1 is the distance from an Units: km<br />
observational station at which the<br />
observation and first guess field are<br />
equally weighted)<br />
Relative weighting of the first<br />
guess field and observations in the<br />
layers ALOFT (R2) No default ! R2 = 4. !<br />
(R2 is applied in the upper layers Units: km<br />
in the same manner as R1 is used in<br />
the surface layer).<br />
Relative weighting parameter of the<br />
prognostic wind field data (RPROG) No default ! RPROG = 0. !<br />
(Used only if IPROG = 1) Units: km<br />
------------------------<br />
Maximum acceptable divergence in the<br />
divergence minimization procedure<br />
(DIVLIM) Default: 5.E-6 ! DIVLIM= 5.0E-06 !<br />
Maximum number of iterations in the<br />
divergence min. procedure (NITER) Default: 50 ! NITER = 50 !<br />
Number of passes in the smoothing<br />
procedure (NSMTH(NZ))<br />
NOTE: NZ values must be entered<br />
Default: 2,(mxnz-1)*4 ! NSMTH =<br />
2 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 !<br />
Maximum number of stations used in<br />
each layer for the interpolation of<br />
data <strong>to</strong> a grid point (NINTR2(NZ))<br />
NOTE: NZ values must be entered Default: 99. ! NINTR2 =<br />
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 !<br />
Critical Froude number (CRITFN) Default: 1.0 ! CRITFN = 1. !<br />
Empirical fac<strong>to</strong>r controlling the<br />
influence of kinematic effects<br />
(ALPHA) Default: 0.1 ! ALPHA = 0.1 !<br />
120
Multiplicative scaling fac<strong>to</strong>r for<br />
extrapolation of surface observations<br />
<strong>to</strong> upper layers (FEXTR2(NZ)) Default: NZ*0.0<br />
! FEXTR2 = 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.!<br />
(Used only if IEXTRP = 3 or -3)<br />
BARRIER INFORMATION<br />
Number of barriers <strong>to</strong> interpolation<br />
of the wind fields (NBAR) Default: 0 ! NBAR = 0 !<br />
THE FOLLOWING 4 VARIABLES ARE INCLUDED<br />
ONLY IF NBAR > 0<br />
NOTE: NBAR values must be entered No defaults<br />
for each variable Units: km<br />
X coordinate of BEGINNING<br />
of each barrier (XBBAR(NBAR)) ! XBBAR = 0. !<br />
Y coordinate of BEGINNING<br />
of each barrier (YBBAR(NBAR)) ! YBBAR = 0. !<br />
X coordinate of ENDING<br />
of each barrier (XEBAR(NBAR)) ! XEBAR = 0. !<br />
Y coordinate of ENDING<br />
of each barrier (YEBAR(NBAR)) ! YEBAR = 0. !<br />
DIAGNOSTIC MODULE DATA INPUT OPTIONS<br />
Surface temperature (IDIOPT1) Default: 0 ! IDIOPT1 = 0 !<br />
0 = Compute internally from<br />
hourly surface observations<br />
1 = Read preprocessed values from<br />
a data file (DIAG.DAT)<br />
Surface met. station <strong>to</strong> use for<br />
the surface temperature (ISURFT) No default ! ISURFT = 9 !<br />
(Must be a value from 1 <strong>to</strong> NSSTA)<br />
(Used only if IDIOPT1 = 0)<br />
--------------------------<br />
Domain-averaged temperature lapse<br />
rate (IDIOPT2) Default: 0 ! IDIOPT2 = 0 !<br />
0 = Compute internally from<br />
twice-daily upper air observations<br />
1 = Read hourly preprocessed values<br />
from a data file (DIAG.DAT)<br />
Upper air station <strong>to</strong> use for<br />
the domain-<strong>scale</strong> lapse rate (IUPT) No default ! IUPT = 1 !<br />
121
(Must be a value from 1 <strong>to</strong> NUSTA)<br />
(Used only if IDIOPT2 = 0)<br />
--------------------------<br />
Depth through which the domain-<strong>scale</strong><br />
lapse rate is computed (ZUPT) Default: 200. ! ZUPT = 200. !<br />
(Used only if IDIOPT2 = 0) Units: meters<br />
--------------------------<br />
Domain-averaged wind components<br />
(IDIOPT3) Default: 0 ! IDIOPT3 = 0 !<br />
0 = Compute internally from<br />
twice-daily upper air observations<br />
1 = Read hourly preprocessed values<br />
a data file (DIAG.DAT)<br />
Upper air station <strong>to</strong> use for<br />
the domain-<strong>scale</strong> winds (IUPWND) Default: -1 ! IUPWND = 1 !<br />
(Must be a value from -1 <strong>to</strong> NUSTA)<br />
(Used only if IDIOPT3 = 0)<br />
--------------------------<br />
Bot<strong>to</strong>m and <strong>to</strong>p of layer through<br />
which the domain-<strong>scale</strong> winds<br />
are computed<br />
(ZUPWND(1), ZUPWND(2)) Defaults: 1., 1000. ! ZUPWND= 1., 1000. !<br />
(Used only if IDIOPT3 = 0) Units: meters<br />
--------------------------<br />
Observed surface wind components<br />
for wind field module (IDIOPT4) Default: 0 ! IDIOPT4 = 0 !<br />
0 = Read WS, WD from a surface<br />
data file (SURF.DAT)<br />
1 = Read hourly preprocessed U, V from<br />
a data file (DIAG.DAT)<br />
Observed upper air wind components<br />
for wind field module (IDIOPT5) Default: 0 ! IDIOPT5 = 0 !<br />
0 = Read WS, WD from an upper<br />
air data file (UP1.DAT, UP2.DAT, etc.)<br />
1 = Read hourly preprocessed U, V from<br />
a data file (DIAG.DAT)<br />
LAKE BREEZE INFORMATION<br />
Use Lake Breeze Module (LLBREZE)<br />
Default: F ! LLBREZE = F !<br />
Number of lake breeze regions (NBOX) ! NBOX = 0 !<br />
X Grid line 1 defining the region of interest<br />
122
!END!<br />
! XG1 = 0. !<br />
X Grid line 2 defining the region of interest<br />
! XG2 = 0. !<br />
Y Grid line 1 defining the region of interest<br />
! YG1 = 0. !<br />
Y Grid line 2 defining the region of interest<br />
! YG2 = 0. !<br />
X Point defining the coastline (Straight line)<br />
(XBCST) (KM) Default: none ! XBCST = 0. !<br />
Y Point defining the coastline (Straight line)<br />
(YBCST) (KM) Default: none ! YBCST = 0. !<br />
X Point defining the coastline (Straight line)<br />
(XECST) (KM) Default: none ! XECST = 0. !<br />
Y Point defining the coastline (Straight line)<br />
(YECST) (KM) Default: none ! YECST = 0. !<br />
Number of stations in the region Default: none ! NLB = 0 !*<br />
(Surface stations + upper air stations)<br />
Station ID's in the region (METBXID(NLB))<br />
(Surface stations first, then upper air stations)<br />
! METBXID = 0 !*<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 6 -- Mixing Height, Temperature and Precipitation Parameters<br />
--------------<br />
EMPIRICAL MIXING HEIGHT CONSTANTS<br />
Neutral, mechanical equation<br />
(CONSTB) Default: 1.41 ! CONSTB = 1.41 !<br />
Convective mixing ht. equation<br />
(CONSTE) Default: 0.15 ! CONSTE = 0.15 !<br />
Stable mixing ht. equation<br />
(CONSTN) Default: 2400. ! CONSTN = 2400.!<br />
Overwater mixing ht. equation<br />
(CONSTW) Default: 0.16 ! CONSTW = 0.16 !<br />
Absolute value of Coriolis<br />
parameter (FCORIOL) Default: 1.E-4 ! FCORIOL = 1.0E-04!<br />
Units: (1/s)<br />
SPATIAL AVERAGING OF MIXING HEIGHTS<br />
123
Conduct spatial averaging<br />
(IAVEZI) (0=no, 1=yes) Default: 1 ! IAVEZI = 1 !<br />
Max. search radius in averaging<br />
process (MNMDAV) Default: 1 ! MNMDAV = 10 !<br />
Units: Grid<br />
cells<br />
Half-angle of upwind looking cone<br />
for averaging (HAFANG) Default: 30. ! HAFANG = 30. !<br />
Units: deg.<br />
Layer of winds used in upwind<br />
averaging (ILEVZI) Default: 1 ! ILEVZI = 1 !<br />
(must be between 1 and NZ)<br />
OTHER MIXING HEIGHT VARIABLES<br />
Minimum potential temperature lapse<br />
rate in the stable layer above the<br />
current convective mixing ht. Default: 0.001 ! DPTMIN = 0.001 !<br />
(DPTMIN) Units: deg. K/m<br />
Depth of layer above current conv.<br />
mixing height through which lapse Default: 200. ! DZZI = 200. !<br />
rate is computed (DZZI) Units: meters<br />
Minimum overland mixing height Default: 50. ! ZIMIN = 50. !<br />
(ZIMIN) Units: meters<br />
Maximum overland mixing height Default: 3000. ! ZIMAX = 3000. !<br />
(ZIMAX) Units: meters<br />
Minimum overwater mixing height Default: 50. ! ZIMINW = 50. !<br />
(ZIMINW) -- (Not used if observed Units: meters<br />
overwater mixing hts. are used)<br />
Maximum overwater mixing height Default: 3000. ! ZIMAXW = 3000. !<br />
(ZIMAXW) -- (Not used if observed Units: meters<br />
overwater mixing hts. are used)<br />
TEMPERATURE PARAMETERS<br />
Interpolation type<br />
(1 = 1/R ; 2 = 1/R**2) Default:1 ! IRAD = 1 !<br />
Radius of influence for temperature<br />
interpolation (TRADKM) Default: 500. ! TRADKM = 500. !<br />
Units: km<br />
Maximum Number of stations <strong>to</strong> include<br />
in temperature interpolation (NUMTS) Default: 5 ! NUMTS = 5 !<br />
Conduct spatial averaging of temp -<br />
eratures (IAVET) (0=no, 1=yes) Default: 1 ! IAVET = 1 !<br />
124
(will use mixing ht MNMDAV,HAFANG<br />
so make sure they are correct)<br />
Default temperature gradient Default: -.0098 ! TGDEFB = -0.0098 !<br />
below the mixing height over<br />
water (K/m) (TGDEFB)<br />
Default temperature gradient Default: -.0045 ! TGDEFA = -0.0045 !<br />
above the mixing height over<br />
water (K/m) (TGDEFA)<br />
Beginning (JWAT1) and ending (JWAT2)<br />
land use categories for temperature ! JWAT1 = 59 !<br />
interpolation over water -- Make ! JWAT2 = 59 !<br />
bigger than largest land use <strong>to</strong> disable<br />
PRECIP INTERPOLATION PARAMETERS<br />
Method of interpolation (NFLAGP) Default = 2 ! NFLAGP = 2 !<br />
(1=1/R,2=1/R**2,3=EXP/R**2)<br />
Radius of Influence (km) (SIGMAP) Default = 100.0 ! SIGMAP = 50. !<br />
(0.0 => use half dist. btwn<br />
nearest stns w & w/out<br />
precip when NFLAGP = 3)<br />
Minimum Precip. Rate Cu<strong>to</strong>ff (mm/hr) Default = 0.01 ! CUTP = 0.01 !<br />
(values < CUTP = 0.0 mm/hr)<br />
!END!<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 7 -- Surface meteorological station parameters<br />
--------------<br />
SURFACE STATION VARIABLES<br />
(One record per station -- 10 records in all)<br />
1 2<br />
Name ID X coord. Y coord. Time Anem.<br />
(km) (km) zone Ht.(m)<br />
----------------------------------------------------------<br />
! SS1 ='PHL ' 13739 1214.3036 99.5401 5 10 !<br />
! SS2 ='WDC ' 13743 1086.8796 -35.9799 5 10 !<br />
! SS3 ='ILG ' 13781 1189.9744 71.3613 5 10 !<br />
! SS4 ='HBG ' 14711 1085.0775 111.4466 5 10 !<br />
! SS5 ='NEW ' 14734 1285.0319 202.9350 5 10 !<br />
! SS6 ='ABE ' 14737 1184.4426 178.1201 5 10 !<br />
! SS7 ='BWI ' 93721 1111.3125 4.5453 5 10 !<br />
! SS8 ='ACY ' 93730 1278.8019 64.2651 5 10 !<br />
! SS9 ='IAD ' 93738 1048.5636 -27.5736 5 10 !<br />
125
! SS10 ='JFK ' 94789 1316.8600 203.8930 5 10 !<br />
-------------------<br />
1<br />
Four character string for station name<br />
(MUST START IN COLUMN 9)<br />
!END!<br />
2<br />
Five digit integer for station ID<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 8 -- Upper air meteorological station parameters<br />
--------------<br />
UPPER AIR STATION VARIABLES<br />
(One record per station -- 1 record in all)<br />
1 2<br />
Name ID X coord. Y coord. Time zone<br />
(km) (km)<br />
-----------------------------------------------<br />
! US1 ='WAL ' 93739 1235.1540 -120.1510 5 !<br />
! US2 ='ALB ' 14735 1270.2840 425.0700 5 !<br />
! US3 ='OKX ' 94703 1384.1110 241.9860 5 !<br />
! US4 ='IAD ' 93734 1050.5308 -30.8736 5 !<br />
-------------------<br />
1<br />
Four character string for station name<br />
(MUST START IN COLUMN 9)<br />
!END!<br />
2<br />
Five digit integer for station ID<br />
-------------------------------------------------------------------------------<br />
INPUT GROUP: 9 -- Precipitation station parameters<br />
--------------<br />
PRECIPITATION STATION VARIABLES<br />
(One record per station -- 16 records in all)<br />
(NOT INCLUDED IF NPSTA = 0)<br />
!END!<br />
126
EDUCATION<br />
VITA<br />
Krassimira Ilieva Lazarova<br />
DOB 31 January 1969, Doupnitza, Bulgaria<br />
Citizen of Bulgaria<br />
June, 2001<br />
Ph.D., Drexel University, Philadelphia, PA, USA<br />
Dissertation: “<strong>Alternative</strong> Small Scale Meteorology Input <strong>to</strong> a Chemical Transport Model”<br />
November 1993<br />
M.Sc. in physics and atmospheric science, Sofia State University, Sofia, Bulgaria<br />
Thesis: “Atmospheric Stability from the perspective of air quality modeling”<br />
June 1987<br />
High School with specialization in chemistry “A. Zlatarov”, Sofia, Bulgaria<br />
Senior project: “Industrial production of insulin”<br />
WORK RELATED EXPERIENCE<br />
1999-2001 - US EPA, Region III<br />
Air quality modeling, MODELS-3 framework and standalone version<br />
1996-2001 - Drexel University<br />
Teaching Atmospheric Science - lectures and recitations<br />
Introduction <strong>to</strong> computer programing - recitations<br />
Classical physics - recitations<br />
1993-1995 - National Institute of Meteorology, Sofia, Bulgaria<br />
Air quality modeling, Gausian models<br />
AWARDS AND FELLOWSHIPS<br />
Graduate fellowship 1987-1992, Sofia State University, Sofia, Bulgaria<br />
127