Skip to content
Snippets Groups Projects
Commit 87de6fa2 authored by Lene Wasskog's avatar Lene Wasskog
Browse files

Merge branch 'main' into release

parents 3213079e 77515966
Branches release
No related tags found
No related merge requests found
......@@ -18,6 +18,8 @@
import subprocess
import os
import sys
import shutil
from dotenv import load_dotenv
from datetime import datetime
import pytz
......@@ -31,24 +33,34 @@ load_dotenv()
config = configparser.ConfigParser()
config.read("PSILARTEMP.cfg")
year = os.getenv("YEAR")
local_timezone = pytz.timezone(os.getenv("LOCAL_TIMEZONE"))
today = datetime.now(local_timezone)
if len(sys.argv) > 1:
year = int(sys.argv[1])
else:
year = today.year
recurring_start_date = os.getenv("RECURRING_START_DATE")
weatherdata_path = os.getenv("WEATHER_DATA_DIR")
weatherdata_path = f'{os.getenv("WEATHER_DATA_DIR")}{year}/'
tmp_path = "tmp/"
out_path = os.getenv("DATA_DIR")
home_dir = os.getenv("HOME_DIR")
out_path = f'{os.getenv("DATA_DIR")}{year}/'
os.makedirs(out_path, exist_ok=True)
# TODO: Put timezone out in .env
local_timezone = pytz.timezone("Europe/Oslo")
# Ensure that model is not run for future year
if year > today.year:
print(f"Cannot run model for future year ({year}). Quit.")
exit(0)
# If we are before the recurring start date, exit nicely
start_time = datetime.strptime(f"{year}-{recurring_start_date}","%Y-%m-%d")
if datetime.now() <= start_time:
print(f"Today is before the configured start time of {start_time}. Exiting.")
start_time = local_timezone.localize(datetime.strptime(f"{year}-{recurring_start_date}","%Y-%m-%d"))
if today <= start_time:
print(f"Today is before the configured model start {start_time}. Exiting.")
exit(0)
# """
# Calculate cumulated degree days above 5 degrees after 1st of April
# Remove all values before April 1st
# Calculate cumulated degree days above 5 degrees after 1st of March
# Remove all values before March 1st
subprocess.run(
f"cdo -selname,TM -seldate,{year}-{recurring_start_date}T00:00:00,{year}-12-31T00:00:00 {weatherdata_path}met_1_0km_nordic-{year}.nc {tmp_path}TM_from_april.nc",
shell=True,
......@@ -108,15 +120,15 @@ timesteps = result.variables["time"][:]
# print(timesteps)
timestep_index = 1
timestep_dates = []
# Remove existing tif files from result folder
subprocess.run(f"rm {out_path}result_*{year}*.tif", shell=True)
for timestep in timesteps:
timestep_date = datetime.fromtimestamp(timestep).astimezone(local_timezone)
file_date = timestep_date.astimezone(local_timezone).strftime("%Y-%m-%d")
# print(f"{timestep_index}: {file_date}")
timestep_dates.append(file_date)
# We must delete the GeoTIFF file before merging
# """
subprocess.run(f"rm {tmp_path}result_*{file_date}_lcc.tif", shell=True)
subprocess.run(f"rm {out_path}result_*{file_date}.tif", shell=True)
with open("/dev/null", "w") as devnull:
subprocess.run(
f'gdal_translate -ot Int16 -of GTiff -b {timestep_index} NETCDF:"{tmp_path}result.nc":WARNING_STATUS {tmp_path}result_WARNING_STATUS_{file_date}_lcc.tif',
......@@ -165,8 +177,8 @@ template = env.get_template("mapfile/template.j2")
output = template.render(
{
"timestep_dates": timestep_dates,
"mapserver_data_dir": os.getenv("MAPSERVER_DATA_DIR"),
"mapserver_mapfile_dir": os.getenv("MAPSERVER_MAPFILE_DIR"),
"mapserver_data_dir": f"{os.getenv('MAPSERVER_DATA_DIR')}{year}/",
"mapserver_mapfile_dir": f"{os.getenv('MAPSERVER_MAPFILE_DIR')}{year}/",
"mapserver_log_file": os.getenv("MAPSERVER_LOG_FILE"),
"mapserver_image_path": os.getenv("MAPSERVER_IMAGE_PATH"),
"mapserver_extent": os.getenv("MAPSERVER_EXTENT"),
......@@ -174,6 +186,18 @@ output = template.render(
"language_codes": language_codes,
}
)
mapfile_outdir = os.getenv("MAPFILE_DIR")
with open(f"{mapfile_outdir}/PSILARTEMP.map", "w") as f:
# Remove temporary files
subprocess.run(f"rm {tmp_path}*.tif", shell=True)
subprocess.run(f"rm {tmp_path}*.nc", shell=True)
mapfile_outdir = f'{os.getenv("MAPFILE_DIR")}{year}/'
os.makedirs(mapfile_outdir, exist_ok=True)
query_template = os.path.join(home_dir, "mapfile/query_template.xml")
query_template_DD = os.path.join(home_dir, "mapfile/query_template_DD.xml")
shutil.copy(query_template, mapfile_outdir)
shutil.copy(query_template_DD, mapfile_outdir)
with open(f"{mapfile_outdir}PSILARTEMP.map", "w") as f:
f.write(output)
......@@ -43,11 +43,12 @@ The model (as per 2023-11-14) assumes that a weather data file named `met_1_0km_
It is required that you have set the following environment variables:
```bash
YEAR=2024
# Recurring start date (MM-DD)
RECURRING_START_DATE=04-01
# Local time zone
LOCAL_TIMEZONE=Europe/Oslo
# Where your application resides
HOME_DIR=/home/foo/
HOME_DIR=/home/foo/PSILARTEMP/
# Path to the weather data
WEATHER_DATA_DIR=in/
# Path to optional CSV file with polygons for masking result.
......@@ -71,12 +72,12 @@ MAPSERVER_EXTENT="-1.5831861262936526 52.4465003983706595 39.2608060398730458 71
```bash
$ ./run_PSILARTEMP.sh
```
This creates a Python virtualenv, installs all the Python dependencies, runs the model and stores output in a log file.
This creates a Python virtualenv, installs all the Python dependencies, runs the model and stores output in a log file.
Alternatively, primarily for development purposes, you can run the Python script PSILARTEMP directly:
The script can be run for a specific year like this:
```bash
$ ./PSILARTEMP.py
$ ./run_PSILARTEMP.sh 2024
```
All intermediary files are stored in the `tmp/` folder, and they are all deleted when the model is done calculating. The GeoTIFF files are stored in the `out/` folder, and the generated mapfile is stored in the `mapfile/` folder
......@@ -183,4 +184,4 @@ else // Fallback to auto generated legend
{
document.getElementById("layerLegend").innerHTML='<img id="layerLegendImg" src="' + currentLayer.Style[0].LegendURL[0].OnlineResource + '"/>';
}
```
\ No newline at end of file
```
# Use this as an example to create your own .env file
# Year to run for
YEAR=2024
# Recurring start date (MM-DD)
RECURRING_START_DATE=04-01
# Local time zone
LOCAL_TIMEZONE=Europe/Oslo
# Where your application resides
HOME_DIR=/home/foo/
HOME_DIR=/home/foo/PSILARTEMP/
# Path to the weather data
WEATHER_DATA_DIR=in/
# Path to optional CSV file with polygons for masking result.
......@@ -23,4 +23,4 @@ MAPSERVER_LOG_FILE=/foo/log/PSILARTEMP.log
# Path to the temporary directory for writing temporary files and images. Must be writable by the user the web server is running as
MAPSERVER_IMAGE_PATH=/foo/mapserver/tmp/
# The value of the EXTENT parameter in Mapserver's mapfile. Units are DD (Decimal degrees)
MAPSERVER_EXTENT="-1.5831861262936526 52.4465003983706595 39.2608060398730458 71.7683216082912736"
\ No newline at end of file
MAPSERVER_EXTENT="-1.5831861262936526 52.4465003983706595 39.2608060398730458 71.7683216082912736"
......@@ -18,9 +18,25 @@
# Configures environment and logging before running the model
# @author: Tor-Einar Skog <tor-einar.skog@nibio.no>
validate_year() {
if [[ $1 =~ ^[0-9]{4}$ ]]; then
return 0
else
return 1
fi
}
# Check if the year parameter is passed and validate it
if [ -n "$1" ]; then
if validate_year "$1"; then
year=$1
else
echo "Invalid year: $1. Please provide a valid 4-digit year."
exit 1
fi
fi
# First: Test that we have CDO and GDAL installed
# Test that we have CDO and GDAL installed
if ! command -v cdo &> /dev/null
then
echo "ERROR: CDO could not be found. Exiting."
......@@ -44,11 +60,10 @@ then
fi
# Paths to scripts and requirements
APP_PATH=${HOME_DIR}PSILARTEMP/
LOG_FILE=${APP_PATH}log/PSILARTEMP.log
REQUIREMENTS=${APP_PATH}requirements.txt
LOG_FILE=${HOME_DIR}log/PSILARTEMP.log
REQUIREMENTS=${HOME_DIR}requirements.txt
cd $APP_PATH
cd $HOME_DIR
# Create and activate the virtual environment
python3 -m venv .venv
......@@ -57,9 +72,16 @@ python3 -m pip install -q --upgrade pip
pip install -q -r $REQUIREMENTS
# Run the model
echo "==== `date`: Running model" &>> "$LOG_FILE"
python3 $APP_PATH/PSILARTEMP.py &>> "$LOG_FILE"
echo "==== `date`: DONE running model" &>> "$LOG_FILE"
if [ -z "${year}" ]; then
echo "==== $(date): Running model for current year" >> "$LOG_FILE" 2>&1
python3 ${HOME_DIR}PSILARTEMP.py >> "$LOG_FILE" 2>&1
else
echo "==== $(date): Running model for ${year}" >> "$LOG_FILE" 2>&1
python3 ${HOME_DIR}PSILARTEMP.py "$year" >> "$LOG_FILE" 2>&1
fi
echo "==== $(date): Done running model" >> "$LOG_FILE" 2>&1
# Deactivate the virtual environment
deactivate
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment