From 0ece95127ceb2ac2d0d6d53b24302f330cc36ea0 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sun, 3 Jul 2011 23:39:01 +0200 Subject: [PATCH] Thorsten Renk: local weather 1.18 fixes for a couple of issues, some improved textures/cloud model changes, smooth instead of hard visibility transitions, updated documentation. Also removed 'Test' entries from the menu. (ThorstenB: Also cleaned-up Docs/ folder, moving local weather documentation images to sub folder). --- Docs/README.local_weather | 20 --- Docs/README.local_weather.html | 152 +++++++++------- Docs/{ => img}/KLSV-10_00.jpg | Bin Docs/{ => img}/KLSV-12_00.jpg | Bin Docs/{ => img}/KLSV-15_00.jpg | Bin Docs/{ => img}/KLSV-17_30.jpg | Bin Docs/{ => img}/KLSV-19_00.jpg | Bin Docs/{ => img}/KLSV-5_00.jpg | Bin Docs/{ => img}/KLSV-7_00.jpg | Bin Docs/{ => img}/barrier.jpg | Bin Docs/{ => img}/carrier-ops08.jpg | Bin Docs/{ => img}/cloud_altitude_01.jpg | Bin Docs/{ => img}/cloud_altitude_02.jpg | Bin Docs/{ => img}/cloud_altitude_03.jpg | Bin Docs/{ => img}/cloud_altitude_04.jpg | Bin Docs/{ => img}/clouds-cumulus_afternoon.jpg | Bin Docs/{ => img}/clouds-detailed01.jpg | Bin Docs/{ => img}/clouds-incoming-rainfront1.jpg | Bin Docs/{ => img}/clouds-lpb01.jpg | Bin Docs/{ => img}/clouds-nimbostratus.jpg | Bin Docs/{ => img}/clouds-static.jpg | Bin Docs/{ => img}/clouds-summer-rain.jpg | Bin Docs/{ => img}/clouds-tropical02.jpg | Bin Docs/{ => img}/detailed_clouds04.jpg | Bin Docs/{ => img}/detailed_clouds05.jpg | Bin Docs/{ => img}/effect_nesting.gif | Bin Docs/{ => img}/high_pressure_border.jpg | Bin Docs/img/light_model.gif | Bin 0 -> 6021 bytes Docs/img/lightning-gloom.jpg | Bin 0 -> 33283 bytes Docs/{ => img}/low_pressure.jpg | Bin Docs/{ => img}/menu1.jpg | Bin Docs/{ => img}/menu2.jpg | Bin Docs/{ => img}/menu3.jpg | Bin Docs/img/menu4.jpg | Bin 0 -> 29547 bytes Docs/{ => img}/terrain1.jpg | Bin Docs/{ => img}/thermal_lift.gif | Bin Docs/{ => img}/thermal_lift_time.gif | Bin Docs/{ => img}/tiles.gif | Bin Docs/{ => img}/weather_patterns.jpg | Bin Docs/menu4.jpg | Bin 28507 -> 0 bytes Nasal/local_weather/compat_layer.nas | 100 ++++++++++- Nasal/local_weather/local_weather.nas | 166 +++++++----------- Nasal/local_weather/weather_tiles.nas | 131 +++++++++----- gui/dialogs/local_weather.xml | 4 +- gui/dialogs/local_weather_tiles.xml | 2 +- 45 files changed, 345 insertions(+), 230 deletions(-) delete mode 100644 Docs/README.local_weather rename Docs/{ => img}/KLSV-10_00.jpg (100%) rename Docs/{ => img}/KLSV-12_00.jpg (100%) rename Docs/{ => img}/KLSV-15_00.jpg (100%) rename Docs/{ => img}/KLSV-17_30.jpg (100%) rename Docs/{ => img}/KLSV-19_00.jpg (100%) rename Docs/{ => img}/KLSV-5_00.jpg (100%) rename Docs/{ => img}/KLSV-7_00.jpg (100%) rename Docs/{ => img}/barrier.jpg (100%) rename Docs/{ => img}/carrier-ops08.jpg (100%) rename Docs/{ => img}/cloud_altitude_01.jpg (100%) rename Docs/{ => img}/cloud_altitude_02.jpg (100%) rename Docs/{ => img}/cloud_altitude_03.jpg (100%) rename Docs/{ => img}/cloud_altitude_04.jpg (100%) rename Docs/{ => img}/clouds-cumulus_afternoon.jpg (100%) rename Docs/{ => img}/clouds-detailed01.jpg (100%) rename Docs/{ => img}/clouds-incoming-rainfront1.jpg (100%) rename Docs/{ => img}/clouds-lpb01.jpg (100%) rename Docs/{ => img}/clouds-nimbostratus.jpg (100%) rename Docs/{ => img}/clouds-static.jpg (100%) rename Docs/{ => img}/clouds-summer-rain.jpg (100%) rename Docs/{ => img}/clouds-tropical02.jpg (100%) rename Docs/{ => img}/detailed_clouds04.jpg (100%) rename Docs/{ => img}/detailed_clouds05.jpg (100%) rename Docs/{ => img}/effect_nesting.gif (100%) rename Docs/{ => img}/high_pressure_border.jpg (100%) create mode 100644 Docs/img/light_model.gif create mode 100644 Docs/img/lightning-gloom.jpg rename Docs/{ => img}/low_pressure.jpg (100%) rename Docs/{ => img}/menu1.jpg (100%) rename Docs/{ => img}/menu2.jpg (100%) rename Docs/{ => img}/menu3.jpg (100%) create mode 100644 Docs/img/menu4.jpg rename Docs/{ => img}/terrain1.jpg (100%) rename Docs/{ => img}/thermal_lift.gif (100%) rename Docs/{ => img}/thermal_lift_time.gif (100%) rename Docs/{ => img}/tiles.gif (100%) rename Docs/{ => img}/weather_patterns.jpg (100%) delete mode 100644 Docs/menu4.jpg diff --git a/Docs/README.local_weather b/Docs/README.local_weather deleted file mode 100644 index 9fdaca5fc..000000000 --- a/Docs/README.local_weather +++ /dev/null @@ -1,20 +0,0 @@ - - -This package contains the local weather AI scenarios 'local_weather_thunderstorm' and 'local_weather_cirrus'. Currently they populate the sky over San Francisco either with a thunderstorm or a Cirrus/Cirrocumulus sky. The thunderstorm comes with dynamical weather effects - rain, snow, turbulence and lightning inside the cloud tower. The packages contain more cloud models and textures than are actually needed in the scenarios, the scenarios are just to demonstrate what can be done using local weather AI models. - -Known issues: - -* AI model clouds seem to interfere with the standard layered clouds, thus for best effect any layered clouds need to be off - a low 3-d Cumulus layer on the other hand works well. - -* Currently, the Cirrus and Cirrocumulus cloud models use the Aircraft AI system. Presumably, this (dependent on visibility) leads to their sudden (dis-)appearance, and a better solution should be found. - -* The shading of the Cirrus clouds is imperfect - real Cirrus clouds appear to glow when the sund shines through them, caused by the dominance of forward scattering of light on the ice crystals of the cloud. This can be modelled setting emis 1 1 1 in the materials section of the 3-d model, however then the clouds also shine white at night. I have no good solution at present. - -* The Nasal script of the thunderstorm sometimes crashes for no reason I could reproduce - pointers to fix that are welcome! - - -The package should be extracted in the Flightgear root directory. - -The package is developed and tested using Flightgear 1.9.1, it may or may not work properly on other versions. - -Thorsten Renk, Feb. 2010 diff --git a/Docs/README.local_weather.html b/Docs/README.local_weather.html index f5a945c5e..325e32e6d 100644 --- a/Docs/README.local_weather.html +++ b/Docs/README.local_weather.html @@ -1,13 +1,13 @@ - - - -Local Weather - - - + + + +Local Weather + + + -

Local Weather Package - v1.1

+

Local Weather Package - v1.18

1. Introduction

@@ -15,20 +15,20 @@ The aim of a local weather system is to simulate weather phenomena tied to speci This is in contrast to the current (v.2.0.0) global weather system of Flightgear where weather changes affect the weather everywhere in the simulated world and are (with few exceptions) not tied to specific locations. In such a system, it is impossible to observe e.g. the approach of a rainfront while flying in sunshine.

-The local weather package aims to provide the functionality to simulate such local phenomena. In version 1.1, the package supplies various cloud placement algorithms, as well as local control over most major weather parameters (wind, visibility, pressure, temperature, rain, snow, thermal lift, turbulence...) through interpolation routines and effect volumes. The dynamics of the different systems is tied together - for instance clouds and weather effects drift in the specified wind field. The package also contains a fairly detailed algorithm to generate convective clouds and thermals with a realistic distribution over the various terrain types. There is a simulation of the interaction of the convective cloud system with the terrain as a function of time. Clouds drifting in the wind flow over obstacles, i.e. they change their altitude dynamically. Convection is implemented with a life cycle model of Cumulus clouds - they are generated, evolve for a given lifetime dependent on the underlying terrain and decay at the end of their life cycle. Thermals associated with the clouds follow the same pattern. In particular, in the presence of wind favourable spots for convection generate 'alleys' of dense cloud cover downwind, or thermals and clouds generated over land decay rapidly once they reach open water.

+The local weather package aims to provide the functionality to simulate such local phenomena. In version 1.18, the package supplies various cloud placement algorithms, as well as local control over most major weather parameters (wind, visibility, pressure, temperature, rain, snow, thermal lift, turbulence...) through interpolation routines and effect volumes. The dynamics of the different systems is tied together - for instance clouds and weather effects drift in the specified wind field. The package also contains a fairly detailed algorithm to generate convective clouds and thermals with a realistic distribution over the various terrain types. There is a simulation of the interaction of the convective cloud system with the terrain as a function of time. Clouds drifting in the wind flow over obstacles, i.e. they change their altitude dynamically. Convection is implemented with a life cycle model of Cumulus clouds - they are generated, evolve for a given lifetime dependent on the underlying terrain and decay at the end of their life cycle. Thermals associated with the clouds follow the same pattern. In particular, in the presence of wind favourable spots for convection generate 'alleys' of dense cloud cover downwind, or thermals and clouds generated over land decay rapidly once they reach open water.

For long-range flights, the system provides an offline weather system with plausible transitions between different large-scale weather patterns like fronts and low and high pressure areas, as well as the optional use of live METAR data.

2. Installation

-The package needs to be unpacked in the Flightgear root directory. It writes content into the Nasal/, gui/, gui/dialogs/, Shaders, Effects/, Docs/, Environment/ and Models/Weather/ subdirectories. The installation does not overwrite any of the default Flightgear files, but to be accessible from the menu for Flightgear 2.0.0, one must copy gui/menubar.xml.alt to the default menubar.xml or copy the three lines of the environemnt menu calling local_weather, local_weather_tiles and local_weather_config into the default file. More recent versions of Flightgear already provide the necessary menu items. In order to read in the default menu entries, the line <local-weather include="Environment/local-weather-defaults.xml"/> needs to be added to the file preferences.xml.

+The package needs to be unpacked in the Flightgear root directory. It writes content into the Nasal/local_weather/, gui/, gui/dialogs/, Shaders, Effects/, Docs/, Environment/ and Models/Weather/ subdirectories. The package requires run-time loadable Nasal submodule functionality and is not compatible with 2.0.0.

-This adds the items Local Weather, Local Weather Tiles and Local Weather Config to the Environment menu when Flightgear is up. Most of the basic functionality is contained in local_weather.nas which is loaded at startup and identifies itself with a message. A compatibility layer (compat_layer.nas) tests for hard-coded support and ensures that, dependent on the version, hard-coded or Nasal-coded fallback functions are used.

+This adds the items Local Weather and Local Weather Settings to the Environment and Local Weather (test) to the Debug menu when Flightgear is up. Most of the basic functionality is contained in local_weather.nas which is loaded at startup and identifies itself with a message. A compatibility layer (compat_layer.nas) tests for hard-coded support and ensures that, dependent on the version, hard-coded or Nasal-coded fallback functions are used.

+ +The Local Weather Nasal modules need to be loaded at runtime using the checkbox in Environment/Local Weather Settings, but once this is specified, the setting is remembered and the package will be automatically loaded upon startup. Unless asked to do so from the menu, Local Weather does not run any process in the background. Upon loading, the package does not set any properties already existing, but only generates properties necessary for the menu entries in its own subdirectory /local-weather/ in the tree. The package also does a features check on startup if particular functions are available in hard-coded form. If the features are not present, the package will largely still function properly using slower Nasal fallback code.

-Unless asked to do so from the menu, local weather does not run any process in the background. Upon loading, the package does not set any properties already existing, but only generates properties necessary for the menu entries in its own subdirectory /local-weather/ in the tree. The package also does a features check on startup if particular functions are available in hard-coded form. If the features are not present, the package will largely still function properly using slower Nasal fallback code.

-In order to use the hard-coded terrain presampling routines, it is currently necessary to add the line --prop:/environment/terrain/area[0]/enabled=1 to the Flightgear commandline. If this is not done, the system will use the slower fallback routines.

3. Functionality

@@ -36,10 +36,10 @@ The general rule is that the gui is not hardened against problematic user input, Cloud placement calls may sometimes take a significant time to execute especially for large numbers of clouds tied in a complicated way to the terrain. Placing 500 barrier clouds against a small barrier may take a minute to compute. During this time, a reduced framerate is to be expected

-The first menu Local Weather contains the low level cloud placement functions. Its purpose is mainly for developing cloud patterns without having to resort to re-type the underlying Nasal code every time. Currently five options are supported: Place a single cloud, Place a cloud streak, Start the convective system, Create barrier clouds , Place a cloud layer and Make a cloudbox.

+The menu item Debug/Local Weather (Test) contains the low level cloud placement functions. Its purpose is mainly for developing cloud patterns without having to resort to re-type the underlying Nasal code every time. Currently five options are supported: Place a single cloud, Place a cloud streak, Start the convective system, Create barrier clouds , Place a cloud layer and Make a cloudbox.

- +

Single cloud placement

@@ -59,7 +59,7 @@ The pattern can then be randomized in x, y and altitude. Basically, specifying n The convective system places Cumulus clouds centered on the current position based on the underlying terrain. Currently it models daily variation of convective strength and the latitude variation based on a simple sinusoidal model (i.e. it produces different results when called in the morning than at noon), but it does not take into account seasonal variation (i.e. it assumes the date to be the equinox). The actual placement is chosen based on the type of the underlying terrain, with Cumulus development more likely over city areas than on water. Details of the algorithm are described in the appendix. The parameters for this need some fine-tuning and are currently rather rough, but they lead for example to pronounced differences between land and sea in coastal regions. The following picture shows the result of a call of the system in the afternoon over TNCM.

- +

Unless 'Terrain presampling' is active, clouds are placed in a constant altitude alt in a tile with given size where the size measures the distance to the tile border, i.e. a size parameter of 15 km corresponds to a 30x30 km region. When 'Terrain presampling' is selected, the distribution of clouds in altitude is determined by a more complicated algorithm described in the appendix. Clouds are placed with constant density for given terrain type, so be careful with large area placements! strength is an overall multiplicative factor to fine-tune the amount of cloud generation. @@ -69,7 +69,7 @@ Unless 'Terrain presampling' is active, clouds are placed in a constant altitude The barrier cloud system places a cloud at a random point within the region centered around the current position given by size with some probability if there is a terrain barrier downwind with the elevation alt within a distance dist or less. Cloud placement probability is larger for small distances to the barrier. The system tries to place number clouds and assumes that the wind comes from direction wind. If clouds cannot be placed (because there is no barrier within the specified altitude) the algorithm exits with a warning. The picture illustrates the result for the mountains above Las Vegas.

- +

Currently, the algorithm does not check for a barrier upstream - this may change in future versions. The ufo is a good way to explore the results of the algorithm by simply flying to a suitable location and calling it there for a relatively small region. Due to its large performance use, the barrier cloud system is currently not part of the large-scale weather generating system. @@ -83,7 +83,7 @@ If rainflag is set to 1, the system will also place external precipitatio The picture illustrates the result of a layer generation call for Nimbostratus clouds with precipitation models.

- +

Cloudbox

@@ -93,10 +93,10 @@ The cloudbox placement is an experimental routine allowing to define a cloud cor

Tile placement

-The second menu is used to place complete weather patterns based on low-level calls. It is intended for the user to automatically create the various weather development during flight. Unless stated otherwise, all parameters in this menu are parsed at startup time of local weather only (i.e. when the user selects the OK button, but not while the system runs.

+The second menu Environment/Local Weather is used to place complete weather patterns based on low-level calls. It is intended for the user to automatically create the various weather development during flight. Unless stated otherwise, all parameters in this menu are parsed at startup time of Local Weather only (i.e. when the user selects the OK button, but not while the system runs.

- +

Weather is created in a series of 40x40 km squares, called tiles. Tiles are classified by airmass, such that the sequence of tiles can describe for example the transition from a high pressure area to a low pressure area. The dropdown menu is used to select the type of weather tile to build initially and to determine the rules according to which subsequent tiles are generated.

@@ -129,13 +129,13 @@ The slider Thermal properties is mainly relevant for soaring scenarios. I The difference is apparent from the following pictures: Smooth and well-formed clouds characteristic of a calm day:

- +

Rough clouds characteristic of windshear and more turbulent conditions:

- +

As for the buttons, OK starts the local weather system with the selected options (note that almost all options in this menu are startup-time options, they are read once and changing them without restarting the system will not affect the behaviour of the system). Clear/End clears all clouds and ends all local weather functionality - the button brings the system back into the state before it was started. No loops or other subroutines are executed after the button is pressed. Close closes the dialog without starting the system.

@@ -143,7 +143,7 @@ As for the buttons, OK starts the local weather system with the selected The button Show winds brings up the detailed wind menu which is needed for the wind models aloft interpolated and aloft waypoints when not in METAR mode:

- +

For aloft interpolated, the menu is used by inserting wind direction and speed for all given altitudes. After OK, the specified values are used. For aloft waypoints, the same info must be supplied for a series of waypoints. First, the latitude and longitude has to be inserted, afterwards the aloft winds for that point below. The button Set waypoint commits the windfield as specified in the menu for this position into memory. For orientation, the number of points inserted is counted on the lower right. Clear Waypoints removes all information entered so far. Note that OK does not commit the data for a waypoint. Entering a windfield in this way by hand is rather cumbersome, but may be useful occasionally - the main purpose of the wind model however is to work with live weather data.

@@ -154,11 +154,11 @@ For aloft interpolated, the menu is used by inserting wind direction and The following pictures show possible results of tile setups 'High-pressure-border' and 'Low-pressure':

- +

- +

Performance settings

@@ -166,14 +166,16 @@ The following pictures show possible results of tile setups 'High-pressure-borde The performance setting menu is available from the main menubar. It controls the allocation of system resources to the various tasks, as well as the behaviour of the offline weather system.

+The upper checkbox determines if the Nasal modules corresponding to Local Weather are loaded. Unless this box is checked, no Local Weather code is available and the corresponding other menu items are not functional.

+

- +

The first part controls the creation of new weather tiles, the second part controls the ranges up to which clouds inside a generated weather tile are shown as part of the scenery (clouds created but not shown are stored and processed in a buffer array). Clouds are visible if and only if they are 1) part of a created tile and 2) closer than the buffering range. This is illustrated in the following figure: Tiles are only created if their center is within range, clouds are only visible if the cloud model itself is within range, the resulting region dependent on the two ranges in which clouds are displayed is shown in red.

- +

From this, it is apparent that the two ranges should not be drastically different. Setting tile creation range to 55 km implies lots of work trying to asses the properties of faraway terrain to generate suitable cloud distributions, setting the buffering range to 15 km means that most of these clouds are never visible. Note that in low visibility, a large tile creation range can be problematic, as Flightgear may not have loaded the terrain. Note also that setting the tile creation range above 40 km means a slow startup of the system, as it needs to create 5 tiles on startup instead of just a single one.

@@ -192,19 +194,19 @@ Inside each tile, there are typically 4-8 different basic cloud patterns (distri

4. Cloud models

-The package contains a number of different cloud models, both static ones for Cirrus and Cirrocumulus clouds as well as rotated ones for Altocumulus, Cirrostratus, Cumulus, Cumulonimbus, Stratus and Nimbostratus cloudlet models. Neither the cloud textures, nor the models nor the transformations are perfected, and any aspect can be improved, albeit at the cost of performance consumption.

+The package contains a number of different cloud models, both static ones for Cirrus and Cirrocumulus clouds as well as rotated ones for Altocumulus, Cirrostratus, Cumulus, Cumulonimbus, Stratus and Nimbostratus cloudlet models. Thin high-altitude haze such as characteristic for Cirrostratus or Altostratus clouds is approximated by colouring the skydome as a function of altitude. Neither the cloud textures, nor the models nor the transformations are perfected, and any aspect can be improved, albeit at the cost of performance consumption.

Static clouds project textures onto curved sheets into the sky. The advantage of the technique is that cloud layers consisting of thousands of cloudlets with different sizes can be modelled. However, the sheets do not look equally well from all perspectives and somewhat unrealistic from close up.

- +

Rotated cloud models have the advantage that they look much better from close up and hardly unrealistic from any perspective, but the size distribution of cloudlets is somewhat restricted and they use a lot more performance than static clouds.

- +

These are rendered by different techniques. While the default Cumulus models consist of multiple layers rotated around the center of the model, the detailed Cumulus clouds consist of multiple (up to 24) individual cloudlets, rotating each around its own center, randomly distributed into a box with different texture types used for the cloud bottom. This not only improves the visual appearance, but also leads to a more realistic distribution of cloud sizes and shapes in the sky. In addition, when circling below the cloud (as done when soaring) the effect of the cloudlet rotation is less pronounced. The price to pay is that rendering detailed clouds costs more performance, so they may not be suitable for all systems.

@@ -212,7 +214,7 @@ These are rendered by different techniques. While the default Cumulus models co More complex clouds are rendered in sandwitched layers of several different textures. An example are Cumulonimbus towers, which use diffuse textures on the bottom, changing to more structured textures in the upper part of the cloud. With up to 2000 cloudlets, skies with multiple thunderstorms may not render with sufficient framerates on every system.

- +

The general problem is finding a good balance between spending a lot of CPU time to make a single cloud model appear perfect, and the performance degradation that occurs if hundreds of clouds are placed in the sky. The basic aim is to provide realistic appearance for clouds from a standard view position (in cockpit looking forward), to retain acceptable appearance from other positions and to allow large cloud layers.

@@ -235,6 +237,14 @@ While the station concept is designed to support easy connection with weather up Technically, the structure of the interpolation system means that while it is running, neither setting weather parameters in the GUI menu nor changing visibility using the z-key will have an effect - any setting made there will be overwritten by the interpolation loop periodically, and local weather needs to be stopped before such changes have an effect.

+In addition to true weather parameters, Local Weather 1.18 also has a model for the light propagation in the atmosphere which is handled by the same interpolation routines. This model determines the amount of light reaching the current altitude and the amount of thin haze above the current position. The first property affects to what color distant objects fade - when there is lots of light available, faraway objects appear white, however in the presence of cloud layers casting shadows, distant objects fade into dark shapes. The following screenshot illustrates the effect: + +

+ +

+ +The second property is used to simulate diffuse structureless Cirrostratus and Altostratus clouds. Details of the modelling are given in the appendix. +

Weather parameters in effect volumes

Effect volumes are 3-dim regions in space in which the weather is not set by the interpolation system but by a specific prescription. This can be to either set a parameter to a constant value inside the volume, or to specify it as a function inside the volume. Effect volume settings always override information from the interpolation subsystem.

@@ -242,7 +252,7 @@ Effect volumes are 3-dim regions in space in which the weather is not set by the Effect volumes may be nested, and they may overlap. The rules determining their behaviour can be summarized as follows: 1) there is no cross-talk between weather parameters, i.e. an effect volume specifying visibility is never influenced by one specifying pressure, regardless if they overlap or not. 2) when an effect volume is entered, its settings overwrite all previous settings 3) when an effect volume is left, the settings are restored to what the interpolation routine specifies if no other effect volumes influence the weather parameter, to the values as they were on entering the volume when the number of active volumes has not changed between entering and leaving the volume (i.e. when volumes are nested) or nothing happens if the number of active volumes has increased (i.e. when volumes form a chain). This is illustrated in the following figure:

- +

Volumes 2 and 3 are nested inside volume 1, therefore all settings of 2 overwrite those of 1 when 2 is entered and are restored to 1 when region 2 is left directly into 1. Region 4 is a chain, and as such ill defined: When one leaves 2 into 4, the settings of volume 3 are used (because later definitions overwrite earlier ones). When one now leaves 4 into 3 (and hence leaves 2), it would be wrong to restore to the values on entry of 2 (i.e. the properties of 1), as 3 is still active. But the active volume count has changed, so leaving 4 into 3 does not lead to any changes. The reason why 4 is still ill-defined is that what weather is encountered in 4 depends on the direction from which it is entered - when it is entered from 2, it has the properties of 3, whereas when it is entered from 3, it has the properties of 2.

@@ -253,7 +263,7 @@ Effect volumes are always specified between a minimum and a maximum altitude, an where geometry is a flag (1: circular, 2: elliptical and 3: rectangular), lat and lon are the latitude and longitude, r1 and r2 are the two size parameters for the elliptic or rectangular shape (for the circular shape, only the first is used), phi is the rotation angle of the shape (not used for circular shape), alt_low and alt_high are the altitude boundaries, vis, rain, snow, turb and lift are weather parameters which are either set to the value they should assume, or to -1 if they are not to be used, or to -2 if a function instead of a parameter is to be used and -3 if a function for wave lift is used. Since thermal lift can be set to negative values in a sink, a separate flag is provided in this case. sat finally determines the light saturation, a parameter between 0 (dark) and 1 (normal light) - it can be used to dim the light beneath cloud layers (which is not done automatically as objects don't cast shades in Flightgear, and given that most cloud models are rotated, their shade would look rather odd on any case).

-In version 1.1, thermal lift and wave lift are implemented by function (wave lift is not yet automatically placed, but can be easily from Nasal). There is no easy way to implement any weather parameter by function in an effect volume, as this requires some amount of Nasal coding.

+In version 1.18, thermal lift and wave lift are implemented by function (wave lift is not yet automatically placed, but can be easily from Nasal). There is no easy way to implement any weather parameter by function in an effect volume, as this requires some amount of Nasal coding.

Both thermal lift and saturation require a more recent version of Flightgear than 2.0.0 in order to take effect.

@@ -332,7 +342,13 @@ The first important call sets up the conditions to be interpolated:

set_weather_station(latitude, longitude, visibility-m, temperature-degc, dewpoint-degc, pressure-sea-level-inhg);

-The cloud placement calls should be reasonably familiar, as they closely resemble the structure by which they are accessible from the 'Local Weather' menu.

+The atmosphere light propagation needs to be prepared as well by a call

+ +set_atmosphere_ipoint(latitude, longitude, vis_aloft, vis_alt_aloft, vis_overcast, overcast,overcast_alt_low, overcast_alt_high, scattering, scattering_alt_low, scattering_alt_high);

+ +The meaning of these parameters is as follows: Visibility is linearly interpolated in altitude between several altitudes: the ground value is given in the weather station call. vis_aloft determines the visibility after passing the lowest inversion layer (i.e. usually the lowest cloud layer altitude) where the visibility suddenly increases. The altitude of the transition is given by vis_alt_aloft. The visibility higher up is determined by high-altitude haze, i.e. it takes the value vis_overcast at the position overcast_alt_high (the upper edge of the haze layer) and increases with constant rate from there. The amount of high-altitude haze is given by overcase, a number between 0 and 1, and the position of the layer is determined by overcast_alt_low and overcast_alt_high. Above the second value, the skydome is no longer coloured. Finally, scattering determines the amount of light reaching the surface (between 0 and 1, reasonable values range from 0.5 to 1) and the following altitudes specify where the layers casting shadow are found - there is always the full amount of light available above scattering_alt_high. See the appendix for details of the model.

+ +The cloud placement calls should be reasonably familiar, as they closely resemble the structure by which they are accessible from the 'Local Weather (Test)' menu.

If the cloud layer has an orientation, then all placement coordinates should be rotated accordingly. Similarly, each placement call should include the altitude offset. Take care to nest effect volumes properly where possible, otherwise undesired effects might occur...

@@ -367,9 +383,9 @@ With default settings, the local weather package generates a 40x40 km weather ti

  • Some cloud textures have artefacts, rain textures have too sharp boundaries and in general some things could look better. Please don't complain, but rather get me good photographs of the sky, cloud texture files or create better AC3D cloud models. I will eventually improve texture quality, but it's not high up in the to-do list, and the cloud model files are openly accessible for anyone with an editor.

    -

  • Rain and snow may not start properly. For me, rain is only generated when I switch 'Shader effects' on and off in the menu on startup, otherwise neither moving the menu slider nor entering an effect volume generate rain. This seems to be a bug of some Flightgear versions, not of the local weather system.

    +

  • [2.0.0] Rain and snow may not start properly. For me, rain is only generated when I switch 'Shader effects' on and off in the menu on startup, otherwise neither moving the menu slider nor entering an effect volume generate rain. This seems to be a bug of some Flightgear versions, not of the local weather system.

    -

  • Especially with multiple overcast layers and weather fronts, loading and unloading weather tiles may take a long time / cause severe drops in framerate. It seems that a dual core processor is very valuable with this particular issue - try switching multiprocessor support on if needed, otherwise please refer to performance tuning to solve such problems. In more recent versions of Flightgear, an activated texture cache improves performance dramatically. In general, overcast layers and tropical weather tiles do require a system on the high end of the performance scale to render properly.

    +

  • [2.0.0] Especially with multiple overcast layers and weather fronts, loading and unloading weather tiles may take a long time / cause severe drops in framerate. It seems that a dual core processor is very valuable with this particular issue - try switching multiprocessor support on if needed, otherwise please refer to performance tuning to solve such problems. In more recent versions of Flightgear, an activated texture cache improves performance dramatically. In general, overcast layers and tropical weather tiles do require a system on the high end of the performance scale to render properly.

  • The local weather package is able to occasionally trigger errors like 'Warning:: Picked up error in TriangleIntersect'. These seem to be a problem in the core Flightgear code - the package does nothing but placing normal (rather simple) AC3D models into the scenery.

    @@ -377,7 +393,7 @@ With default settings, the local weather package generates a 40x40 km weather ti

  • [2.0.0] To smooth out changes in wind settings, rather than producing a sudden gust, the wind is changed over about 1 second. In sharp wind gradients, this produces a series of ripples like turbulence. This is actually a realistic behaviour in this situation and hence left as it is. Some systems seem to take an unreasonable effort to reinit the environment (as must be done to set wind) - here the function call setWindSmoothly() in local_weather.nas should perhaps be replace by setWind to ease the load.

    -

  • Large tile creation distances can cause problems in low visibility weather, because Flightgear loads terrain only if it is within visual range. Thus, trying to sample the terrain for a tile 55 km away in 8 km visibility doesn't work because the terrain elevation and altitude is not known. This may cause improper placement of clouds - chiefly convective clouds, but also layered clouds may not appear on the proper altitude. Currently, there is a limit which restricts tile loading range to 3 times the visibility, but presumably a better solution can be found.

    +

  • [2.0.0] Large tile creation distances can cause problems in low visibility weather, because Flightgear loads terrain only if it is within visual range. Thus, trying to sample the terrain for a tile 55 km away in 8 km visibility doesn't work because the terrain elevation and altitude is not known. This may cause improper placement of clouds - chiefly convective clouds, but also layered clouds may not appear on the proper altitude. Currently, there is a limit which restricts tile loading range to 3 times the visibility, but presumably a better solution can be found.

  • Using the 'aloft interpolated' wind option, it is possible to turn the wind direction sharply over a small distance (for example, one may turn the wind by 90 degrees from one tile to the next). Such sharp wind changes are (in most situations) unphysical, and they may cause problems for local weather because they rotate the coordinate system to a degree that the neighbouring tile may not be identified correctly. In essence, the system may not generate new tiles because the nearest tile is still the last generated one. The system largely tries to detect the problem and compensate, but occasionally this may be an issue.

    @@ -386,6 +402,10 @@ With default settings, the local weather package generates a 40x40 km weather ti

  • [2.0.0] No support for live weather data.

  • [2.0.0] No change of light saturation.

    + +

  • Currently, the light conditions need to be changed globally. This works fine for an 8/8 overcast layer, as there is little light on the ground, the light increases during the layer transition and is full above the layer. However, the effect is less than perfect for broken layers, as one can observe the ground during descent getting darker. A full solution to the problem would be (computationally rather demanding) individual cloud shadows rather than an average shading of the whole terrain, but as it stands, this is currently not feasible. + +

    Appendix A: An introduction to the algorithms

    @@ -411,37 +431,37 @@ The following series of pictures, taken over KLSV (Nellis AFB, Las Vegas) illust At 7:00 am, the thermal activity is weak, and there is no lift available in thermals yet.

    - +

    Some activity starts around 10:00 am the average available lift is 0.3 m/s, the more active clouds tend to be above city terrain.

    - +

    At 12:00 noon, the maximal cloud number is reached. The average available lift is 1 m/s, in peaks up to 2 m/s.

    - +

    The maximum of lift strength is reached close to 15:00 pm. The average lift is now 1.5 m/s, in peaks up to 3 m/s, and the strong convection leads to beginning overdevelopment, some clouds reach beyond the first inversion layer and tower higher up. At this point, the clouds may also overdevelop into a thunderstorm (which is not modelled explicitly by the convective algorithm as it requires somewhat different modelling, but is taken into account in the weather tiles).

    - +

    At 17:30 pm, the lift is still strong, 1.5 m/s on average and 2.5 m/s in peaks, but compared with the situation at noon, there are fewer clouds with stronger lift.

    - +

    At sunset around 19:00 pm, the number of clouds decreases quickly, but there is still a lot of residual thermal energy (the ground has not cooled down yet), therefore thermal lift of on average 1 m/s is still available even without solar energy input.

    - +

    While not accurate in every respect, the model works fairly well to reproduce the actual time dependence of convective clouds and thermal lift during the day.

    @@ -459,7 +479,7 @@ A cloud field is initialized with fractional lifetimes randomly distributed betw The model of the distribution of lift inside a thermal is quite complex.

    - +

    Vertically, is is characterized in addition to height and radius by two parameters, 'coning' and 'shaping', which make it cone-shaped and wasp-waisted. From zero to 200 m above ground, the lift is smoothly fading in, above the cloudbase it is smoothly faded out to zero at 10% above the nominal altitude. Horizontally, there is an outer ring where the air becomes turbulent, followed by a region of sink which in turn is followed by the inner core of lift.

    @@ -467,7 +487,7 @@ Vertically, is is characterized in addition to height and radius by two paramete The distribution of lift and sink is time dependent.

    - +

    In a young thermal, lift starts to develop from the ground, sink is initially absent. When the lift reaches the cloudbase, sink starts to develop from the ground and rises up as well. Only in a mature thermal are sink and lift in equilibrium. When the thermal starts to decay, lift initially decays from the ground upward, till it reaches the cloudbase. At this time the cap cloud dissolves. For a time there is a residual distribution of sink decaying from bottom to top till the thermal evolution is over and the thermal (and the associate turbulence field) is removed.

    @@ -481,7 +501,7 @@ In nature, what determines the altitude of various clouds are the properties of In the algorithm, various proxies for the structure of air layers and hence the condensation altitude are used. It is assumed that air layers must follow the general slope of the terrain (because there is nowhere else to go), but can (at least to some degree) flow around isolated obstacles. To get the general layout of the terrain, the algorithm first samples the altitude of an 80x80 km square around the 40x40 weather tile to be created. The choice of a larger sampling area reduces the sensitvity of the outcome to purely local terrain features and prevent pronounced transitions from one tile to the next. The result of this sampling is a distribution of probability to find the terrain at a given altitude:

    - +

    For instance, the terrain around Geneva is mostly flat around 1000 ft (where the peak of the distribution lies) with some mountains up to 4500 ft nearby. Based on such distributions, the algorithm next determines the minimum altitude alt_min, the maximum altitude alt_max, the altitude below which 20% of the terrain are found alt_20 and the median altitude below which 50% of the terrain are found alt_med.

    @@ -489,25 +509,25 @@ For instance, the terrain around Geneva is mostly flat around 1000 ft (where the Cumulus clouds are always placed at a constant altitude above alt_20. This is done to ensure gorges and canyons do not provide a minimum in otherwise flat terrain so that clouds appear down in the gorge as opposed to on the rim where they would naturally occur. Basically, layers are assumed not to trace too fine structures in the terrain, so at least 20% of the terrain are required. In the test case of Grand Canyon, the algorithm correctly places the clouds at rim altitude rather than down in the canyon:

    - +

    However, convective clouds are given some freedom to adjust to the terrain. The maximally possible upward shift is given by alt_med - alt_20. This is based on the notion that above alt_med, the terrain is not a significant factor any more because the air can simply flow around any obstacle. However, this maximal shift is not always used - if the cloud is placed far above the terrain in the first place, it would not follow the terrain much. Thus, a factor of 1000 ft / altitude above terrain, required to be between 0 and 1, modifies the shift. As a result, a cloud layer placed high above the terrain has no sensitivity to terrain features. The result of this procedure is that clouds show some degree of following terrain elevation, as seen here in Grenoble

    - +

    but they do not follow all terrain features, especially not single isolated peaks as seen here at the example of Mt. Rainier:

    - +

    Finally, layered clouds have essentially no capability to shift with terrain elevation. Moreover, they are caused by large-scale weather processes, hence they do not usually shift upward over even large mountain massives. Currently, the model places them at 0.5 * (alt_min + alt_20) base altitude in order to retain, even in mountains, the sensitivity to the flat terrain surrounding the massiv. usually this works well, but may have a problem with gorges in flat terrain. The following picture shows a Nimbostratus layer close to Grenoble:

    - +

    The offline large scale weather pattern

    @@ -517,7 +537,7 @@ The local weather package generates semi-plausible weather changes even in the a Weather tiles are classified chiefly by air pressure. What is currently in the models are three classes for a low pressure system, four different classes for the system of weather fronts and airmasses spiralling into the low pressure system and three classes for a hugh pressure system. The general rule is that low pressure tiles contain layered clouds, overcast skies and rain whereas the high pressure tiles contain clear skies and few convective clouds. The topology assumed for the weather system is apparent in the following diagram:
    - +

    A transition between classes is possible whenever a class has a common border. However, if a transition actually takes place is probabilistic. Typically, the probability not to make a transition is about 80%. Since changes are only triggered for weather tiles one is actually in, the average distance over which weather patterns persist is 160 km. An exception to this are fronts - weather front tiles trigger changes based on direction rather than probability, so a warmfront will always be a sequence of 4 tiles, a coldfront will always be a small-scale phenomenon crossed within 30 km. @@ -536,21 +556,35 @@ Realistically, the boundary layer should also depend on terrain coverage. Due to Gusty winds are assumed to be a bounday layer phenomenon and faded out to zero at a multiple of the boundary layer thickness which is given by base wind speed [kt]/10, i.e. for 25 kt winds the gusts are absent for 2.5 times the bounday layer thickness.

    -

    The altitude model of visibility

    +

    Light propagation in the atmosphere

    Relatively low visibility (as reported by METAR) is usually confined to low altitudes, due to the lower density of the upper atmosphere and the reduced level of dust and water the visibility at airliner cruise altitude is frequently in excess of 100 km. This means that an altitude model of the visibility is needed.

    -Local weather assumes that haze and dust are confined to the lowest air layer. As a proxy for the transition to a higher layer, the altitude of the lowest cloud layer (or for 9000 ft for clear skies) is used. The visibility always increases with altitude, but below the first layer transition it increases slowly at a rate of 0.2 m / ft in altitude gain. During the layer transition where the transition occurs during 1500 ft, the visibility increases rather rapidly at a rate of 5 m / ft, which means that above the lowest air layer the visibility is almost 10 km more than on the ground. The visibility then continues to grow at a rate of 1 m / ft towards the Stratosphere. In all likelihood, this dramatically underestimates the true visibility at high altitudes, but has been chosen to limit the impact on performance.

    +The following schematics illustrates the essential features of the light propagation model:

    + +

    + +

    + +The parameters to be set are overcast (the amount of colouring of the skydome, from 0 (no haze) to 1 (completely opaque)), visibility and light (the amount of light available, determining the shade of faraway objects). The assumptions underlying the model are: + +

    Credits

    -The model of a thermal has been developed by Patrice Poly. The shader code used to transform clouds is heavily based on prior work by Stuart Buchanan. Hard-coding of some features by Torsten Dreyer is greatly appreciated.

    +The model of a thermal has been developed by Patrice Poly. The shader code used to transform clouds is heavily based on prior work by Stuart Buchanan. Hard-coding of some features by Torsten Dreyer, Thorsten Brehm and Erik Hofman is greatly appreciated.

    -Thorsten Renk, March 2011 +Thorsten Renk, June 2011 - - - - + + + + diff --git a/Docs/KLSV-10_00.jpg b/Docs/img/KLSV-10_00.jpg similarity index 100% rename from Docs/KLSV-10_00.jpg rename to Docs/img/KLSV-10_00.jpg diff --git a/Docs/KLSV-12_00.jpg b/Docs/img/KLSV-12_00.jpg similarity index 100% rename from Docs/KLSV-12_00.jpg rename to Docs/img/KLSV-12_00.jpg diff --git a/Docs/KLSV-15_00.jpg b/Docs/img/KLSV-15_00.jpg similarity index 100% rename from Docs/KLSV-15_00.jpg rename to Docs/img/KLSV-15_00.jpg diff --git a/Docs/KLSV-17_30.jpg b/Docs/img/KLSV-17_30.jpg similarity index 100% rename from Docs/KLSV-17_30.jpg rename to Docs/img/KLSV-17_30.jpg diff --git a/Docs/KLSV-19_00.jpg b/Docs/img/KLSV-19_00.jpg similarity index 100% rename from Docs/KLSV-19_00.jpg rename to Docs/img/KLSV-19_00.jpg diff --git a/Docs/KLSV-5_00.jpg b/Docs/img/KLSV-5_00.jpg similarity index 100% rename from Docs/KLSV-5_00.jpg rename to Docs/img/KLSV-5_00.jpg diff --git a/Docs/KLSV-7_00.jpg b/Docs/img/KLSV-7_00.jpg similarity index 100% rename from Docs/KLSV-7_00.jpg rename to Docs/img/KLSV-7_00.jpg diff --git a/Docs/barrier.jpg b/Docs/img/barrier.jpg similarity index 100% rename from Docs/barrier.jpg rename to Docs/img/barrier.jpg diff --git a/Docs/carrier-ops08.jpg b/Docs/img/carrier-ops08.jpg similarity index 100% rename from Docs/carrier-ops08.jpg rename to Docs/img/carrier-ops08.jpg diff --git a/Docs/cloud_altitude_01.jpg b/Docs/img/cloud_altitude_01.jpg similarity index 100% rename from Docs/cloud_altitude_01.jpg rename to Docs/img/cloud_altitude_01.jpg diff --git a/Docs/cloud_altitude_02.jpg b/Docs/img/cloud_altitude_02.jpg similarity index 100% rename from Docs/cloud_altitude_02.jpg rename to Docs/img/cloud_altitude_02.jpg diff --git a/Docs/cloud_altitude_03.jpg b/Docs/img/cloud_altitude_03.jpg similarity index 100% rename from Docs/cloud_altitude_03.jpg rename to Docs/img/cloud_altitude_03.jpg diff --git a/Docs/cloud_altitude_04.jpg b/Docs/img/cloud_altitude_04.jpg similarity index 100% rename from Docs/cloud_altitude_04.jpg rename to Docs/img/cloud_altitude_04.jpg diff --git a/Docs/clouds-cumulus_afternoon.jpg b/Docs/img/clouds-cumulus_afternoon.jpg similarity index 100% rename from Docs/clouds-cumulus_afternoon.jpg rename to Docs/img/clouds-cumulus_afternoon.jpg diff --git a/Docs/clouds-detailed01.jpg b/Docs/img/clouds-detailed01.jpg similarity index 100% rename from Docs/clouds-detailed01.jpg rename to Docs/img/clouds-detailed01.jpg diff --git a/Docs/clouds-incoming-rainfront1.jpg b/Docs/img/clouds-incoming-rainfront1.jpg similarity index 100% rename from Docs/clouds-incoming-rainfront1.jpg rename to Docs/img/clouds-incoming-rainfront1.jpg diff --git a/Docs/clouds-lpb01.jpg b/Docs/img/clouds-lpb01.jpg similarity index 100% rename from Docs/clouds-lpb01.jpg rename to Docs/img/clouds-lpb01.jpg diff --git a/Docs/clouds-nimbostratus.jpg b/Docs/img/clouds-nimbostratus.jpg similarity index 100% rename from Docs/clouds-nimbostratus.jpg rename to Docs/img/clouds-nimbostratus.jpg diff --git a/Docs/clouds-static.jpg b/Docs/img/clouds-static.jpg similarity index 100% rename from Docs/clouds-static.jpg rename to Docs/img/clouds-static.jpg diff --git a/Docs/clouds-summer-rain.jpg b/Docs/img/clouds-summer-rain.jpg similarity index 100% rename from Docs/clouds-summer-rain.jpg rename to Docs/img/clouds-summer-rain.jpg diff --git a/Docs/clouds-tropical02.jpg b/Docs/img/clouds-tropical02.jpg similarity index 100% rename from Docs/clouds-tropical02.jpg rename to Docs/img/clouds-tropical02.jpg diff --git a/Docs/detailed_clouds04.jpg b/Docs/img/detailed_clouds04.jpg similarity index 100% rename from Docs/detailed_clouds04.jpg rename to Docs/img/detailed_clouds04.jpg diff --git a/Docs/detailed_clouds05.jpg b/Docs/img/detailed_clouds05.jpg similarity index 100% rename from Docs/detailed_clouds05.jpg rename to Docs/img/detailed_clouds05.jpg diff --git a/Docs/effect_nesting.gif b/Docs/img/effect_nesting.gif similarity index 100% rename from Docs/effect_nesting.gif rename to Docs/img/effect_nesting.gif diff --git a/Docs/high_pressure_border.jpg b/Docs/img/high_pressure_border.jpg similarity index 100% rename from Docs/high_pressure_border.jpg rename to Docs/img/high_pressure_border.jpg diff --git a/Docs/img/light_model.gif b/Docs/img/light_model.gif new file mode 100644 index 0000000000000000000000000000000000000000..80b5a33582f73f5d28283bd08739a105247f0d81 GIT binary patch literal 6021 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 literal 0 HcmV?d00001 diff --git a/Docs/img/lightning-gloom.jpg b/Docs/img/lightning-gloom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51340b446188259e19e1b724e14a64cb03840e60 GIT binary patch literal 33283 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 literal 0 HcmV?d00001 diff --git a/Docs/low_pressure.jpg b/Docs/img/low_pressure.jpg similarity index 100% rename from Docs/low_pressure.jpg rename to Docs/img/low_pressure.jpg diff --git a/Docs/menu1.jpg b/Docs/img/menu1.jpg similarity index 100% rename from Docs/menu1.jpg rename to Docs/img/menu1.jpg diff --git a/Docs/menu2.jpg b/Docs/img/menu2.jpg similarity index 100% rename from Docs/menu2.jpg rename to Docs/img/menu2.jpg diff --git a/Docs/menu3.jpg b/Docs/img/menu3.jpg similarity index 100% rename from Docs/menu3.jpg rename to Docs/img/menu3.jpg diff --git a/Docs/img/menu4.jpg b/Docs/img/menu4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e004472405f6b4bf843d88e2b41b252a8bdbbce1 GIT binary patch literal 29547 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 literal 0 HcmV?d00001 diff --git a/Docs/terrain1.jpg b/Docs/img/terrain1.jpg similarity index 100% rename from Docs/terrain1.jpg rename to Docs/img/terrain1.jpg diff --git a/Docs/thermal_lift.gif b/Docs/img/thermal_lift.gif similarity index 100% rename from Docs/thermal_lift.gif rename to Docs/img/thermal_lift.gif diff --git a/Docs/thermal_lift_time.gif b/Docs/img/thermal_lift_time.gif similarity index 100% rename from Docs/thermal_lift_time.gif rename to Docs/img/thermal_lift_time.gif diff --git a/Docs/tiles.gif b/Docs/img/tiles.gif similarity index 100% rename from Docs/tiles.gif rename to Docs/img/tiles.gif diff --git a/Docs/weather_patterns.jpg b/Docs/img/weather_patterns.jpg similarity index 100% rename from Docs/weather_patterns.jpg rename to Docs/img/weather_patterns.jpg diff --git a/Docs/menu4.jpg b/Docs/menu4.jpg deleted file mode 100644 index 79d29173f37a282ea8fd27f7e06648df702101b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28507 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 diff --git a/Nasal/local_weather/compat_layer.nas b/Nasal/local_weather/compat_layer.nas index 5136624d3..6d0c8c28d 100644 --- a/Nasal/local_weather/compat_layer.nas +++ b/Nasal/local_weather/compat_layer.nas @@ -180,6 +180,47 @@ else } } + +var setVisibilitySmoothly = func (vis) { + +if (features.can_disable_environment == 0) + {setVisibility(vis); return;} + +visibility_target = vis; +visibility_current = getprop("/environment/visibility-m"); + +if (smooth_visibility_loop_flag == 0) + { + smooth_visibility_loop_flag = 1; + visibility_loop(); + } +} + +var visibility_loop = func { + +if (local_weather.local_weather_running_flag == 0) {return;} + +if (visibility_target == visibility_current) + {smooth_visibility_loop_flag = 0; return;} + +if (visibility_target < visibility_current) + { + var vis_goal = visibility_target; + if (vis_goal < 0.97 * visibility_current) {vis_goal = 0.97 * visibility_current;} + } +else + { + var vis_goal = visibility_target; + if (vis_goal > 1.03 * visibility_current) {vis_goal = 1.03 * visibility_current;} + } + +setprop("/environment/visibility-m",vis_goal); +visibility_current = vis_goal; + +settimer( func {visibility_loop(); },0); +} + + #################################### # set thermal lift to given value #################################### @@ -346,6 +387,45 @@ if (features.can_set_light == 1) } } +var setLightSmoothly = func (s) { + +if (features.can_set_light == 0) + {return;} + +light_target = s; +light_current = getprop("/rendering/scene/saturation"); + +if (smooth_light_loop_flag == 0) + { + smooth_light_loop_flag = 1; + light_loop(); + } +} + +var light_loop = func { + +if (local_weather.local_weather_running_flag == 0) {return;} + +if (light_target == light_current) + {smooth_light_loop_flag = 0; return;} + +if (light_target < light_current) + { + var light_goal = light_target; + if (light_goal < 0.97 * light_current) {light_goal = 0.97 * light_current;} + } +else + { + var light_goal = light_target; + if (light_goal > 1.03 * light_current) {light_goal = 1.03 * light_current;} + } + +setprop("/rendering/scene/saturation",light_goal); +light_current = light_goal; + +settimer( func {light_loop(); },0); +} + #################################### # set horizon scattering @@ -610,14 +690,6 @@ if (local_weather.dynamics_flag == 1) var blat = buffered_tile_latitude; var blon = buffered_tile_longitude; var alpha = buffered_tile_alpha; - #var blat1 = getprop(lw~"tiles/tmp/latitude-deg"); - #var blon1 = getprop(lw~"tiles/tmp/longitude-deg"); - #var alpha1 = getprop(lw~"tmp/tile-orientation-deg"); - - #print("Lat: ", blat1, " ", blat); - #print("Lon: ", blon1, " ", blon); - #print("Alp: ", alpha1, " ", alpha); - } else { @@ -742,6 +814,18 @@ var ec = "/environment/config/"; var mvec = []; var msize = 0; +# loop flags and variables + +var smooth_visibility_loop_flag = 0; + +var visibility_target = 0.0; +var visibility_current = 0.0; + +var smooth_light_loop_flag = 0; + +var light_target = 0.0; +var light_current = 0.0; + # available hard-coded support var features = {}; diff --git a/Nasal/local_weather/local_weather.nas b/Nasal/local_weather/local_weather.nas index 7004013c3..bde539ad6 100644 --- a/Nasal/local_weather/local_weather.nas +++ b/Nasal/local_weather/local_weather.nas @@ -1,7 +1,7 @@ ######################################################## # routines to set up, transform and manage local weather -# Thorsten Renk, March 2011 +# Thorsten Renk, June 2011 # thermal model by Patrice Poly, April 2010 ######################################################## @@ -34,6 +34,7 @@ # clear_all to remove all clouds, effect volumes and weather stations and stop loops # create_detailed_cumulus_cloud to place multiple cloudlets into a box based on a size parameter # create_cumulonimbus_cloud to place multiple cloudlets into a box +# create_cumulonimbus_cloud_rain to place multiple cloudlets into a box and add a rain layer beneath # create_cumosys wrapper to place a convective cloud system based on terrain coverage # cumulus_loop to place 25 Cumulus clouds each frame # create_cumulus to place a convective cloud system based on terrain coverage @@ -673,9 +674,8 @@ compat_layer.setOvercast(ovcst); flag = getprop("local-weather/effect-volumes/number-active-vis"); -if ((flag ==0) and (vis > 0.0) and (getprop(lw~"lift-loop-flag") == 0)) +if ((flag ==0) and (vis > 0.0) and (getprop(lw~"lift-loop-flag") == 0) and (compat_layer.smooth_visibility_loop_flag == 0)) { - #cNode.getNode("visibility-m").setValue(vis); setprop(lw~"current/visibility-m",vis); compat_layer.setVisibility(vis); } @@ -843,11 +843,6 @@ setprop(lwi~"wind-speed-kt",windspeed_current); setprop(lw~"current/wind-from-heading-deg",winddir); setprop(lw~"current/wind-speed-kt",windspeed_current); -#iNode.getNode("wind-from-heading-deg").setValue(winddir); -#iNode.getNode("wind-speed-kt").setValue(windspeed_current); - -#cNode.getNode("wind-from-heading-deg").setValue(winddir); -#cNode.getNode("wind-speed-kt").setValue(windspeed_current); if (getprop(lw~"interpolation-loop-flag") ==1) {settimer(interpolation_loop, interpolation_loop_time);} @@ -1090,7 +1085,8 @@ if (ev.vis_flag ==1) # then set the new value in current and execute change cNode.getNode("visibility-m").setValue(vis); - compat_layer.setVisibility(vis); + #compat_layer.setVisibility(vis); + compat_layer.setVisibilitySmoothly(vis); # then count the number of active volumes on entry (we need that to determine # what to do on exit) @@ -1100,7 +1096,6 @@ if (ev.vis_flag ==1) setprop(lw~"effect-volumes/number-active-vis",getprop(lw~"effect-volumes/number-active-vis")+1); } -#if (ev.getNode("effects/rain-flag", 1).getValue()==1) if (ev.rain_flag == 1) { var rain = ev.rain; @@ -1132,7 +1127,7 @@ if (ev.sat_flag == 1) { var saturation = ev.sat; ev.sat_r = getprop("/rendering/scene/saturation"); - compat_layer.setLight(saturation); + compat_layer.setLightSmoothly(saturation); ev.n_entry_sat = getprop(lw~"effect-volumes/number-active-sat"); setprop(lw~"effect-volumes/number-active-sat",getprop(lw~"effect-volumes/number-active-sat")+1); } @@ -1189,7 +1184,8 @@ if (ev.vis_flag == 1) {var vis = ev.vis_r;} else {var vis = cNode.getNode("visibility-m").getValue();} cNode.getNode("visibility-m").setValue(vis); - compat_layer.setVisibility(vis); + #compat_layer.setVisibility(vis); + compat_layer.setVisibilitySmoothly(vis); # and subtract from the counter setprop(lw~"effect-volumes/number-active-vis",getprop(lw~"effect-volumes/number-active-vis")-1); @@ -1243,7 +1239,7 @@ if (ev.sat_flag == 1) else if ((n_active -1) == n_entry) {var saturation = ev.sat_r;} else {var saturation = getprop("/rendering/scene/saturation");} - compat_layer.setLight(saturation); + compat_layer.setLightSmoothly(saturation); setprop(lw~"effect-volumes/number-active-sat",getprop(lw~"effect-volumes/number-active-sat")-1); } @@ -1614,12 +1610,15 @@ else if ((type == "Cumulonimbus") or (type == "Cumulonimbus (rain)")) { } else if (type == "Cirrus") { if (subtype == "large") { - if (rn > 0.833) {path = "Models/Weather/cirrus1.xml";} - else if (rn > 0.666) {path = "Models/Weather/cirrus2.xml";} - else if (rn > 0.5) {path = "Models/Weather/cirrus3.xml";} - else if (rn > 0.333) {path = "Models/Weather/cirrus4.xml";} - else if (rn > 0.166) {path = "Models/Weather/cirrus5.xml";} - else {path = "Models/Weather/cirrus6.xml";} + if (rn > 0.888) {path = "Models/Weather/cirrus1.xml";} + else if (rn > 0.777) {path = "Models/Weather/cirrus2.xml";} + else if (rn > 0.666) {path = "Models/Weather/cirrus3.xml";} + else if (rn > 0.555) {path = "Models/Weather/cirrus4.xml";} + else if (rn > 0.444) {path = "Models/Weather/cirrus5.xml";} + else if (rn > 0.333) {path = "Models/Weather/cirrus6.xml";} + else if (rn > 0.222) {path = "Models/Weather/cirrus7.xml";} + else if (rn > 0.111) {path = "Models/Weather/cirrus8.xml";} + else {path = "Models/Weather/cirrus9.xml";} } else if (subtype == "small") { if (rn > 0.75) {path = "Models/Weather/cirrus_amorphous1.xml";} @@ -1924,10 +1923,16 @@ var create_detailed_cumulus_cloud = func (lat, lon, alt, size) { var edge_bias = convective_texture_mix; -var size_bias = 0.0; +size = size + convective_size_bias; if (size > 2.0) - {create_cumulonimbus_cloud(lat, lon, alt, size); return;} + { + if (rand() > (size - 2.0)) + {create_cumulonimbus_cloud(lat, lon, alt, size); } + else + {create_cumulonimbus_cloud_rain(lat, lon, alt, size, 0.1 + 0.2* rand());} + return; + } else if (size>1.5) { @@ -2006,10 +2011,47 @@ var create_cumulonimbus_cloud = func(lat, lon, alt, size) { var height = 3000.0; var alpha = rand() * 180.0; -create_streak("Cumulonimbus",lat,lon, alt+ 0.5* height, height,8,0.0,0.0,1600.0,1,0.0,0.0,800.0,alpha,1.0); +create_streak("Cumulonimbus",lat,lon, alt+ 700, 0,2,0.0,0.0,1600.0,1,0.0,0.0,800.0,alpha,1.0); +create_streak("Cumulonimbus",lat,lon, alt+ 0.5* height + 700, height,6,0.0,0.0,1600.0,1,0.0,0.0,800.0,alpha,1.0); + +create_streak("Congestus bottom",lat,lon, alt, 100.0,6,0.0,1.0,0.7*1600,1,0.0,0.0,0.7*800,alpha,1.0); +create_streak("Congestus bottom",lat,lon, alt + 700, 100.0,6,0.0,1.0,0.7*1600,1,0.0,0.0,0.7*800,alpha,1.0); } +########################################################### +# detailed small Cumulonimbus and rain created from multiple cloudlets +########################################################### + +var create_cumulonimbus_cloud_rain = func(lat, lon, alt, size, rain) { + +var height = 3000.0; +var alpha = rand() * 180.0; + +create_streak("Cumulonimbus",lat,lon, alt+ 700, 0,2,0.0,0.0,1600.0,1,0.0,0.0,800.0,alpha,1.0); +create_streak("Cumulonimbus",lat,lon, alt+ 0.5* height + 700, height,6,0.0,0.0,1600.0,1,0.0,0.0,800.0,alpha,1.0); + +create_streak("Congestus bottom",lat,lon, alt, 100.0,6,0.0,1.0,0.7*1600,1,0.0,0.0,0.7*800,alpha,1.0); +create_streak("Congestus bottom",lat,lon, alt + 700, 100.0,6,0.0,1.0,0.7*1600,1,0.0,0.0,0.7*800,alpha,1.0); + +# place a rain texture + +var path = "Models/Weather/rain2.xml"; +if (thread_flag == 1) + {create_cloud_vec(path, lat, lon, alt, 0.0);} + else + {compat_layer.create_cloud(path, lat, lon, alt, 0.0);} + + + +# and some rain underneath + +create_effect_volume(1, lat, lon, 2000.0, 2000.0, 0.0, 0.0, alt+1000.0, 8000.0 + 8000.0 * rand(), rain, -1, -1, -1 ,1,-1 ); + + +} + + ########################################################### # wrappers for convective cloud system to distribute # call across several frames if needed @@ -2048,6 +2090,7 @@ if (nc < 0) {print("Convective system done!");} setprop(lw~"tmp/convective-status", "idle"); assemble_effect_array(); + convective_size_bias = 0.0; return; } @@ -4058,9 +4101,7 @@ setprop(lw~"METAR/layer[3]/cover-oct",0); setprop(lw~"METAR/layer[3]/alt-agl-ft", 20000.0); setprop(lw~"METAR/available-flag",1); -# set initial value for stored random number for small-scale cloud patterns -weather_tiles.rnd_store = rand(); # set listeners @@ -4429,6 +4470,7 @@ var wind_model_flag = 1; # globals governing properties of the Cumulus system var convective_texture_mix = 0.0; +var convective_size_bias = 0.0; var cumulus_efficiency_factor = 1.0; var cloud_mean_altitude = 0.0; @@ -4455,7 +4497,7 @@ var metar_flag = 0; var local_weather_running_flag = 0; var local_weather_startup_flag = 0; var fps_control_flag = 0; -var detailed_terrain_interaction_flag = 1; +var detailed_terrain_interaction_flag = 0; # globals for framerate controlled cloud management @@ -4466,65 +4508,11 @@ var target_framerate = 25.0; # set all sorts of default properties for the menu -# setprop(lw~"tmp/cloud-type", "Altocumulus"); -# setprop(lw~"tmp/alt", 12000.0); -# setprop(lw~"tmp/nx",5); -# setprop(lw~"tmp/xoffset",800.0); -# setprop(lw~"tmp/xedge", 0.2); -# setprop(lw~"tmp/ny",15); -# setprop(lw~"tmp/yoffset",800.0); -# setprop(lw~"tmp/yedge", 0.2); -# setprop(lw~"tmp/dir",0.0); -# setprop(lw~"tmp/tri", 1.0); -# setprop(lw~"tmp/rnd-pos-x",400.0); -# setprop(lw~"tmp/rnd-pos-y",400.0); -# setprop(lw~"tmp/rnd-alt", 300.0); -# setprop(lw~"tmp/conv-strength", 1); -# setprop(lw~"tmp/conv-size", 15.0); -# setprop(lw~"tmp/conv-alt", 2000.0); -# setprop(lw~"tmp/bar-alt", 3500.0); -# setprop(lw~"tmp/bar-n", 150.0); -# setprop(lw~"tmp/bar-dir", 0.0); -# setprop(lw~"tmp/bar-dist", 5.0); -# setprop(lw~"tmp/bar-size", 10.0); -# setprop(lw~"tmp/scloud-type", "Altocumulus"); -# setprop(lw~"tmp/scloud-subtype", "small"); + setprop(lw~"tmp/scloud-lat",getprop("position/latitude-deg")); setprop(lw~"tmp/scloud-lon",getprop("position/longitude-deg")); -# setprop(lw~"tmp/scloud-alt", 5000.0); -# setprop(lw~"tmp/scloud-dir", 0.0); -# setprop(lw~"tmp/layer-type","Nimbus"); -# setprop(lw~"tmp/layer-rx",10.0); -# setprop(lw~"tmp/layer-ry",10.0); -# setprop(lw~"tmp/layer-phi",0.0); -# setprop(lw~"tmp/layer-alt",3000.0); -# setprop(lw~"tmp/layer-thickness",500.0); -# setprop(lw~"tmp/layer-density",1.0); -# setprop(lw~"tmp/layer-edge",0.2); -# setprop(lw~"tmp/layer-rain-flag",1); -# setprop(lw~"tmp/layer-rain-density",1.0); -# setprop(lw~"tmp/box-x-m",600.0); -# setprop(lw~"tmp/box-y-m",600.0); -# setprop(lw~"tmp/box-alt-ft",300.0); -# setprop(lw~"tmp/box-n",10); -# setprop(lw~"tmp/box-core-fraction",0.4); -# setprop(lw~"tmp/box-core-offset",0.2); -# setprop(lw~"tmp/box-core-height",1.4); -# setprop(lw~"tmp/box-core-n",3); -# setprop(lw~"tmp/box-bottom-fraction",0.9); -# setprop(lw~"tmp/box-bottom-thickness",0.5); -# setprop(lw~"tmp/box-bottom-n",12); -# setprop(lw~"tmp/tile-type", "High-pressure"); -# setprop(lw~"tmp/tile-orientation-deg", 260.0); -# setprop(lw~"tmp/windspeed-kt", 8.0); -# setprop(lw~"tmp/gust-frequency-hz", 0.0); -# setprop(lw~"tmp/gust-relative-strength",0.0); -# setprop(lw~"tmp/gust-angular-variation-deg",0.0); -# setprop(lw~"tmp/tile-alt-offset-ft", 0.0); setprop(lw~"tmp/tile-alt-median-ft",0.0); setprop(lw~"tmp/tile-alt-min-ft",0.0); -# setprop(lw~"tmp/tile-management", "realistic weather"); -# setprop(lw~"tmp/asymmetric-tile-loading-flag", 0); setprop(lw~"tmp/last-reading-pos-del",0); setprop(lw~"tmp/last-reading-pos-mod",0); setprop(lw~"tmp/thread-status", "idle"); @@ -4532,24 +4520,6 @@ setprop(lw~"tmp/convective-status", "idle"); setprop(lw~"tmp/presampling-status", "idle"); setprop(lw~"tmp/buffer-status", "idle"); setprop(lw~"tmp/buffer-tile-index", 0); -#setprop(lw~"tmp/FL0-wind-from-heading-deg",260.0); -#setprop(lw~"tmp/FL0-windspeed-kt",8.0); -#setprop(lw~"tmp/FL50-wind-from-heading-deg",262.0); -#setprop(lw~"tmp/FL50-windspeed-kt",11.0); -#setprop(lw~"tmp/FL100-wind-from-heading-deg",264.0); -#setprop(lw~"tmp/FL100-windspeed-kt",16.0); -#setprop(lw~"tmp/FL180-wind-from-heading-deg",265.0); -#setprop(lw~"tmp/FL180-windspeed-kt",24.0); -#setprop(lw~"tmp/FL240-wind-from-heading-deg",269.0); -#setprop(lw~"tmp/FL240-windspeed-kt",35.0); -#setprop(lw~"tmp/FL300-wind-from-heading-deg",273.0); -#setprop(lw~"tmp/FL300-windspeed-kt",45.0); -#setprop(lw~"tmp/FL340-wind-from-heading-deg",274.0); -#setprop(lw~"tmp/FL340-windspeed-kt",50.0); -#setprop(lw~"tmp/FL390-wind-from-heading-deg",273.0); -#setprop(lw~"tmp/FL390-windspeed-kt",56.0); -#setprop(lw~"tmp/FL450-wind-from-heading-deg",272.0); -#setprop(lw~"tmp/FL450-windspeed-kt",65.0); setprop(lw~"tmp/ipoint-latitude-deg",getprop("position/latitude-deg")); setprop(lw~"tmp/ipoint-longitude-deg",getprop("position/longitude-deg")); diff --git a/Nasal/local_weather/weather_tiles.nas b/Nasal/local_weather/weather_tiles.nas index 3436b29a5..216b4dc6e 100644 --- a/Nasal/local_weather/weather_tiles.nas +++ b/Nasal/local_weather/weather_tiles.nas @@ -1,7 +1,7 @@ ######################################################## # routines to set up weather tiles -# Thorsten Renk, March 2011 +# Thorsten Renk, June 2011 ######################################################## # function purpose @@ -179,6 +179,7 @@ if (rand() < small_scale_persistence) else {rnd_store = rn;} +#rn = 0.1; if (rn > 0.8) { @@ -198,7 +199,7 @@ if (rn > 0.8) } # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, 25000.0, 30000.0, 0.9, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, 25000.0, 30000.0, 0.9, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.6) { @@ -212,7 +213,7 @@ else if (rn > 0.6) create_2_8_cirrus(blat, blon, alt + alt_offset + 35000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.1, alt+alt_offset +30000.0, alt+alt_offset + 35000.0, 0.9, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.1, alt+alt_offset +30000.0, alt+alt_offset + 35000.0, 0.9, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.4) { @@ -224,7 +225,7 @@ else if (rn > 0.4) create_4_8_cirrostratus_undulatus(blat, blon, alt + alt_offset + 32000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +28000.0, alt+alt_offset + 32000.0, 0.9, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +28000.0, alt+alt_offset + 32000.0, 0.9, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.2) @@ -237,7 +238,7 @@ else if (rn > 0.2) create_1_8_cirrostratus_undulatus(blat, blon, alt + alt_offset + 32000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +28000.0, alt+alt_offset + 32000.0, 0.9, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +28000.0, alt+alt_offset + 32000.0, 0.9, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.0) { @@ -252,7 +253,7 @@ else if (rn > 0.0) create_1_8_cirrostratus_undulatus(blat, blon, alt + alt_offset + 28000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +28000.0, alt+alt_offset + 33000.0, 0.9, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +28000.0, alt+alt_offset + 33000.0, 0.9, alt+alt_offset, alt+alt_offset + 2500.0); } @@ -340,7 +341,7 @@ if (rn > 0.8) } # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +28000.0, alt+alt_offset + 30000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +28000.0, alt+alt_offset + 30000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.6) @@ -353,7 +354,7 @@ else if (rn > 0.6) create_2_8_cirrostratus(blat, blon, alt+alt_offset+25000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.2, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.2, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.4) @@ -372,7 +373,7 @@ else if (rn > 0.4) # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 24000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 24000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.2) @@ -385,7 +386,7 @@ else if (rn > 0.2) create_4_8_cirrostratus_undulatus(blat, blon, alt + alt_offset + 25000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.15, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } else if (rn > 0.0) { @@ -399,7 +400,7 @@ else if (rn > 0.0) create_1_8_cirrostratus_undulatus(blat, blon, alt + alt_offset + 25000.0, alpha); # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } # store convective altitude and strength @@ -462,7 +463,8 @@ if (rand() < small_scale_persistence) else {rnd_store = rn;} -if (rn > 0.875) + +if (rn > 0.888) { # cloud scenario 1: Altocumulus patch over weak Cumulus strength = 0.1 + rand() * 0.1; @@ -474,10 +476,10 @@ if (rn > 0.875) # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 1500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.750) +else if (rn > 0.777) { # cloud scenario 2: Altocumulus streaks strength = 0.15 + rand() * 0.2; @@ -494,22 +496,20 @@ else if (rn > 0.750) local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.625) +else if (rn > 0.666) { # cloud scenario 3: Cirrus strength = 0.1 + rand() * 0.1; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); - x = 2.0 * (rand()-0.5) * 3000; - y = 2.0 * (rand()-0.5) * 3000; - local_weather.create_streak("Cirrus",blat+get_lat(x,y,phi), blon+get_lon(x,y,phi), 22000.0+alt+alt_offset,1500.0,3,9000.0,0.0, 800.0, 1,8000.0,0.0,800,0,alpha ,1.0); + create_2_8_cirrus(blat, blon, alt + 28000.0 + alt_offset, alpha); # and specify the atmosphere local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 22000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.5) +else if (rn > 0.555) { # cloud scenario 4: Cumulonimbus banks @@ -525,10 +525,10 @@ else if (rn > 0.5) } # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.75, alt+alt_offset, alt+alt_offset + 2500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.375) +else if (rn > 0.444) { # cloud scenario 5: scattered Stratus @@ -543,7 +543,7 @@ else if (rn > 0.375) local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.2, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.250) +else if (rn > 0.333) { # cloud scenario 6: Cirrocumulus sheets @@ -564,9 +564,9 @@ else if (rn > 0.250) } # and specify the atmosphere - local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.85, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.125) +else if (rn > 0.222) { # cloud scenario 7: Thin Cirrocumulus sheets over weak Cumulus @@ -579,7 +579,7 @@ else if (rn > 0.125) local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.05, alt+alt_offset +20000.0, alt+alt_offset + 25000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn > 0.0) +else if (rn > 0.111) { # cloud scenario 8: Altocumulus perlucidus @@ -591,6 +591,22 @@ else if (rn > 0.0) local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.25, alt+alt_offset +26000.0, alt+alt_offset + 30000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); } +else if (rn > 0.0) + { + # cloud scenario 9: Cumulus, Altocumulus and Cirrus + + strength = 0.3 + rand() * 0.15; + local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); + + create_1_8_altocumulus_scattered(blat, blon, alt + 12000.0 + alt_offset, alpha); + create_2_8_altocumulus_streaks(blat, blon, alt + 12000.0 + alt_offset, alpha); + + create_2_8_cirrus(blat, blon, alt + 30000.0 + alt_offset, alpha); + + # and specify the atmosphere + local_weather.set_atmosphere_ipoint(blat, blon, vis + 10000.0, alt+alt_offset, vis + 15000.0, 0.0, alt+alt_offset +26000.0, alt+alt_offset + 30000.0, 0.8, alt+alt_offset, alt+alt_offset + 2500.0); + } + # store convective altitude and strength @@ -646,6 +662,9 @@ local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_i var alt = spread * 1000.0; var strength = 0.0; +# bias Cumulus clouds towards larger sizes due to lots of water vapour +local_weather.convective_size_bias = 0.2 + rand() * 0.2; + # now a random selection of different possible cloud configuration scenarios var rn = rand(); @@ -655,7 +674,6 @@ if (rand() < small_scale_persistence) else {rnd_store = rn;} -# rn = 0.1; if (rn > 0.857) { @@ -676,7 +694,7 @@ else if (rn > 0.714) { # cloud scenario 2: weak Cumulus, Stratus undulatus above - strength = 0.15 + rand() * 0.15; + strength = 0.2 + rand() * 0.2; local_weather.create_cumosys(blat,blon, alt + alt_offset, get_n(strength), 20000.0); create_6_8_tstratus_undulatus(blat, blon, alt+alt_offset+4000.0,alpha); @@ -793,9 +811,9 @@ calc_geo(blat); # get probabilistic values for the weather parameters -var vis = 7000.0 + rand() * 7000.0; +var vis = 9000.0 + rand() * 10000.0; var T = 5.0 + rand() * 10.0; -var spread = 1.5 + 2.5 * rand(); +var spread = 2.0 + 2.5 * rand(); var D = T - spread; var p = 1001.0 + rand() * 6.0; p = adjust_p(p); @@ -815,7 +833,8 @@ if (rand() < small_scale_persistence) else {rnd_store = rn;} -if (rn > 0.75) + +if (rn > 0.8) { # cloud scenario 1: two patches of Nimbostratus with precipitation @@ -844,7 +863,7 @@ if (rn > 0.75) # and specify the atmosphere local_weather.set_atmosphere_ipoint(blat, blon, vis + 17000.0, alt+alt_offset, vis + 22000.0, 0.2, alt+alt_offset +15000.0, alt+alt_offset + 20000.0, 0.7, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn >0.5) +else if (rn >0.6) { # cloud scenario 2: 8/8 Stratus with light precipitation # above broken cover @@ -860,7 +879,7 @@ else if (rn >0.5) local_weather.set_atmosphere_ipoint(blat, blon, vis + 17000.0, alt+alt_offset, vis + 25000.0, 0.3, alt+alt_offset +15000.0, alt+alt_offset + 20000.0, 0.6, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn >0.25) +else if (rn >0.4) { # cloud scenario 3: multiple broken layers # cloud count 1350 @@ -874,7 +893,7 @@ else if (rn >0.25) # and specify the atmosphere local_weather.set_atmosphere_ipoint(blat, blon, vis + 17000.0, alt+alt_offset, vis + 25000.0, 0.35, alt+alt_offset +10000.0, alt+alt_offset + 20000.0, 0.65, alt+alt_offset, alt+alt_offset + 2500.0); } -else if (rn >0.0) +else if (rn >0.2) { # cloud scenario 4: a low 6/8 layer and some clouds above # cloud count 650 @@ -886,7 +905,21 @@ else if (rn >0.0) # and specify the atmosphere local_weather.set_atmosphere_ipoint(blat, blon, vis + 15000.0, alt+alt_offset, vis + 24000.0, 0.2, alt+alt_offset +15000.0, alt+alt_offset + 22000.0, 0.6, alt+alt_offset, alt+alt_offset + 2500.0); } +else if (rn >0.0) + { + # cloud scenario 5: a low 8/8 layer without rain + alt = alt + local_weather.cloud_vertical_size_map["Nimbus"] * 0.5 * m_to_ft; + create_8_8_nimbus_rain(blat, blon, alt+alt_offset, alpha,0.0); + + if (rand() > 0.5) + { + create_2_8_cirrus(blat, blon, alt+alt_offset + 28000.0,alpha); + } + + # and specify the atmosphere + local_weather.set_atmosphere_ipoint(blat, blon, vis + 15000.0, alt+alt_offset, vis + 24000.0, 0.05, alt+alt_offset +5000.0, alt+alt_offset + 8000.0, 0.55, alt+alt_offset, alt+alt_offset + 2500.0); + } # store convective altitude and strength append(weather_dynamics.tile_convective_altitude,alt); @@ -946,11 +979,6 @@ var strength = 0.0; create_8_8_nimbus_rain(blat, blon, alt+alt_offset, alpha,0.4 + rand()*0.2); -# and a precipitation layer below, more rain in the center of the tile - -#local_weather.create_effect_volume(3, blat, blon, 20000.0, 20000.0, alpha, 0.0, alt + alt_offset, 3000.0, 0.3, -1, -1, -1,0 ,0.95); -#local_weather.create_effect_volume(3, blat , blon, 16000.0, 16000.0, alpha, 0.0, alt + alt_offset - 300.0, 1500.0, 0.5, -1, -1, -1,0 ,0.8); - # and some broken Stratus cover above @@ -1112,6 +1140,10 @@ local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_i var alt = spread * 1000.0; var strength = 0.0; +# bias Cumulus clouds towards larger sizes due to lots of water vapour +local_weather.convective_size_bias = 0.1 + rand() * 0.1; + + var rn = rand(); if (rand() < small_scale_persistence) @@ -1245,6 +1277,9 @@ local_weather.set_weather_station(blat, blon, alt_offset, vis, T, D, p * hp_to_i var alt = spread * 1000.0; var strength = 0.0; +# bias Cumulus clouds towards larger sizes due to lots of water vapour +local_weather.convective_size_bias = 0.3 + rand() * 0.3; + # tropical weather has a strong daily variation, call thunderstorm only in the correct afternoon time window var t_factor = 0.5 * (1.0-math.cos((t * sec_to_rad)-0.9)); @@ -3027,11 +3062,11 @@ var create_2_8_cirrus = func (lat, lon, alt, alpha) { var phi = alpha * math.pi/180.0; -var x = 2.0 * (rand()-0.5) * 3000; -var y = 2.0 * (rand()-0.5) * 3000; +var x = 2.0 * (rand()-0.5) * 1000; +var y = 2.0 * (rand()-0.5) * 1000; -local_weather.create_streak("Cirrus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,1500.0,3,12000.0,0.0, 4000.0, 3,12000.0,0.0,4000.0,alpha,1.0); +local_weather.create_streak("Cirrus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,1500.0,2,20000.0,0.0, 3000.0, 2,20000.0,0.0,3000.0,alpha,1.0); } @@ -3104,6 +3139,18 @@ for (var i = 0; i < 2; i = i + 1) } +var create_1_8_cirrus = func (lat, lon, alt, alpha) { + +var phi = alpha * math.pi/180.0; + +var x = 2.0 * (rand()-0.5) * 2000; +var y = 2.0 * (rand()-0.5) * 2000; + + +local_weather.create_streak("Cirrus",lat+get_lat(x,y,phi), lon+get_lon(x,y,phi), alt,1500.0,1,24000.0,0.0, 9000.0, 2,24000.0,0.0,4000.0,alpha,1.0); + +} + var create_1_8_cirrostratus_undulatus = func (lat, lon, alt, alpha) { local_weather.create_undulatus("Cirrostratus",lat, lon, alt,300.0,1,8000.0,0.0,400.0,40,1000.0,0.1,100.0, 1500.0, alpha,1.0); @@ -3374,7 +3421,7 @@ var m_to_lon = 0.0; # we do this on startup var lw = "/local-weather/"; var small_scale_persistence = getprop(lw~"config/small-scale-persistence"); -var rnd_store = 0.0; +var rnd_store = rand(); var elat = []; var elon = []; diff --git a/gui/dialogs/local_weather.xml b/gui/dialogs/local_weather.xml index e0130e620..06fa1bad7 100644 --- a/gui/dialogs/local_weather.xml +++ b/gui/dialogs/local_weather.xml @@ -1008,7 +1008,7 @@ -