01.12.2012 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!