Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/cdo post ocean format #1875

Closed
wants to merge 11 commits into from
Closed
23 changes: 23 additions & 0 deletions parm/post/mom6_update.csv
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is "update" in the filename? Should this be called mom6_variables.csv instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. The remapping for the MOM6 tripolar to a destination grid projection requires two steps:

  • The netCDF attributes need to be updated for the specified MOM6 variables to be remapped;
  • Using the the script introduced in PR CDO based post-processing application #1871 the variables specified in the parm/post/mom6_interp.csv can then be correctly interpolated; this is not required for the CICE forecast output.

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
SST coordinates geolon,geolat,time
SSS coordinates geolon,geolat,time
SSH coordinates geolon,geolat,time
speed coordinates geolon,geolat,time
MLD_003 coordinates geolon,geolat,time
so coordinates geolon,geolat,time
temp coordinates geolon,geolat,time
latent coordinates geolon,geolat,time
sensible coordinates geolon,geolat,time
SW coordinates geolon,geolat,time
LW coordinates geolon,geolat,time
evap coordinates geolon,geolat,time
lprec coordinates geolon,geolat,time
LwLatSens coordinates geolon,geolat,time
Heat_PmE coordinates geolon,geolat,time
SSU coordinates geolon_u,geolat_u,time
uo coordinates geolon_u,geolat_u,time
taux coordinates geolon_u,geolat_u,time
SSV coordinates geolon_v,geolat_v,time
vo coordinates geolon_v,geolat_v,time
tauy coordinates geolon_v,geolat_v,time
cos_rot coordinates geolon,geolat,time
sin_rot coordinates geolon,geolat,time
188 changes: 188 additions & 0 deletions ush/remap_prep.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
#! /usr/bin/env bash

#######
# Script for updating/adding specified netCDF variable metadata
# attribute values.
#
# Syntax:
# remap_prep.sh variable_file input_netcdf output_netcdf
#
# Arguments:
#
# variable_file: ASCII formatted file containing netCDF variables
# and the respective metadata attributes to be
# updated/added; the supported format is as
# follows.
#
# <netCDF variable name> <netCDF metadata attribute name>
# <netCDF metadata values>
#
# An example using the format described above is as follows.
#
# SST coordinates geolon,geolat,time
# uo coordinates geolon_u,geolon_u,time
# vo coordinates geolon_v,geolon_v,time
#
# The example above will perform the following task using this
# script.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `SST` the values `geolon,geolat,time` and update
# the `output_netcdf` file path.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `uo` the values `geolon_u,geolat_u,time` and update
# the `output_netcdf` file path.
#
# * Assign the netCDF metadata attribute `coordinates` for
# variable `vo` the values `geolon_v,geolat_v,time` and update
# the `output_netcdf` file path.
#
# input_netcdf: The netCDF-formatted file path containing the
# variables defined in `variable_file`.
#
# output_netcdf: A netCDF-formatted file path to contain the
# specified variables remapped to the destination
# grid projection.
#######

source "${HOMEgfs}/ush/preamble.sh"

# Collect the command line arguments and check the validity.
variable_file="${1}"
input_path="${2}"
output_path="${3}"

#######

if [[ "$#" -ne 3 ]]; then
echo "FATAL ERROR: invalid argument syntax provided to ${BASH_SOURCE[0]}"
echo "Usage: ${BASH_SOURCE[0]} <variable_file> <input_path> <output_path>"
exit 100
fi

#######

# _comma_split_string - Split a comma-delimited string into an array.
#
# Description:
# This function takes a comma-delimited string as input and splits
# it into an array. Each element in the resulting array is
# obtained by splitting the input string at commas and then
# removing leading and trailing spaces.
#
# Parameters:
# $1 - The comma-delimited string to split.
#
# Global Variables:
# global_array - An array containing the split elements.
#
# Example usage:
# _comma_split_string "item1,item2,item3,item4"
# for element in "${global_array[@]}"; do
# echo "$element"
# done
#
# This example will split the input string into individual elements
# and print each element on a separate line.
function _comma_split_string() {
local string="${1}"

local local_array=()
global_array=()
IFS="," read -ra items <<< "${string}"
for item in "${items[@]}"; do
local_array+=("${item} ")
done
for item in "${local_array[@]}"; do
IFS=" " read -ra items <<< "${item}"
for element in "${items[@]}"; do
global_array+=("${element} ")
done
done
}

#######

# _strip_whitespace - Remove whitespace from a string.
#
# Description:
# This function takes an input string and removes all whitespace
# characters (spaces, tabs, and newline characters) to produce a
# cleaned output string.
#
# Parameters:
# $1 - The input string from which whitespace will be removed.
#
# Return:
# The cleaned string with no whitespace.
#
# Example usage:
# cleaned_string=$(_strip_whitespace " This is a string with spaces ")
# echo "Cleaned string: \"$cleaned_string\""
#
# This example will remove all leading, trailing, and internal
# whitespace from the input string and display the cleaned result.
function _strip_whitespace(){
local in_string="${1}"

Check notice

Code scanning / shellcheck

Command appears to be unreachable. Check usage (or ignore if invoked indirectly). Note

Command appears to be unreachable. Check usage (or ignore if invoked indirectly).

out_string=$(echo "${in_string}" | sed "s/ //g")

Check notice

Code scanning / shellcheck

See if you can use ${variable//search/replace} instead. Note

See if you can use ${variable//search/replace} instead.

Check notice

Code scanning / shellcheck

Command appears to be unreachable. Check usage (or ignore if invoked indirectly). Note

Command appears to be unreachable. Check usage (or ignore if invoked indirectly).

Check notice

Code scanning / shellcheck

Command appears to be unreachable. Check usage (or ignore if invoked indirectly). Note

Command appears to be unreachable. Check usage (or ignore if invoked indirectly).
}

#######

# ncattr_update - Update/add attributes for a variable in a netCDF file.
#
# Description:
# This function updates the specified attribute for a specified
# variable in a netCDF file using the `ncatted` command.
#
# Parameters:
# $1 - The variable name to update.
# $2 - netCDF variable metadata attribute name.
# $3 - The coordinates as a comma-separated string.
#
# Global Variables:
# global_array - An array containing the split coordinates.
# output_path - The path to the output netCDF file.
#
# Example usage:
# ncupdate "variable_name" "coords" "lon,lat,time"
#
# This example updates the `coords` attributes for the specified
# variable and writes the updates to the output netCDF file.
function ncattr_update(){
local varname="${1}"
local ncattr="${2}"
local coords="${3}"

_comma_split_string "${coords}"
coords="${global_array[@]}"

Check warning

Code scanning / shellcheck

Assigning an array to a string! Assign as array, or use * instead of @ to concatenate. Warning

Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.
coords_str="$(echo "${coords}" | tr -s ' ')"
ncattr_str="$(echo "${ncattr}" | tr -s ' ')"
echo "Adding netCDF attribute ${ncattr_str} values ${coords_str} to variable ${varname} metadata and writing to file ${output_path}"
(ncatted -O -a "${ncattr_str}","${varname}",c,c," ${coords_str}" "${output_path}" "${output_path}")

Check warning

Code scanning / shellcheck

Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A"B"C"? Warning

Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A"B"C"?
}

#######

# Copy the input file path to the output file path.
echo "Copying file ${input_path} to ${output_path} and preparing for variable updates."
cp "${input_path}" "${output_path}"

# Read the configuration file for the the variables to be updated and
# proceed accordingly.
while IFS= read -r line; do

# Get the attributes for the respective variable.
varname=$(awk '{print $1}' <<< "${line}")
ncattr=$(awk '{print $2}' <<< "${line}")
coords=$(awk '{print $3}' <<< "${line}")

# Update the variable attributes and write the updates to the
# specified output file (see `output_path`).
ncattr_update "${varname}" "${ncattr}" "${coords}"

done < "${variable_file}"

exit 0