mirror of
https://github.com/OPM/opm-simulators.git
synced 2026-10-26 07:30:08 -05:00
This commit switches away from matching specific test names in
CTestTestfile.cmake using regular expressions to using exact name
match instead. The regular expressions are a little too brittle in
the face of partially overlapping test names like
compareECLFiles_flow+UDT-1D-01
compareECLFiles_flow+UDT-1D-01B
for which the greedy matching ".*$" could yield false positives.
Instead we use the "index" function to pinpoint the exact line, and
position within the line, that matches exactly that test and
specific property. While here, switch the injected variable name
away from "search" and over to "test" to better reflect the nature
of the variable and update call sites accordingly.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
302 lines
9.0 KiB
Bash
Executable File
302 lines
9.0 KiB
Bash
Executable File
#!/bin/bash -norc
|
|
|
|
# Location of this script.
|
|
dir=$(dirname $0)
|
|
|
|
# Tests that are ultimately updated in this script run. Aggregated
|
|
# mostly in order to create the final commit message.
|
|
changed_tests=""
|
|
|
|
# Collection of properties for the test currently being processed.
|
|
# Populated by function extractTestProperties().
|
|
declare -A testProperty
|
|
|
|
# ===========================================================================
|
|
# Helper functions.
|
|
|
|
# Generate textual diffs of formatted file contents.
|
|
#
|
|
# Appends to ${WORKSPACE}/data_diff.
|
|
#
|
|
# $1 is location of reference results
|
|
# $2 is location of new simulation results
|
|
# $3 is name of result file.
|
|
compareResultFileContents () {
|
|
local reference_dir="${1}"
|
|
local simoutput_dir="${2}"
|
|
local result_file="${3}"
|
|
|
|
# Recall: convertECL prints a line of the form
|
|
#
|
|
# converting path/to/CASE.UNRST -> path/to/CASE.FUNRST
|
|
#
|
|
# so we use this output to infer the result file name.
|
|
|
|
local tmp2=$(mktemp -d)
|
|
mkdir -p "${tmp2}"/{orig,new}
|
|
|
|
if [ -s "${reference_dir}/${result_file}" ]
|
|
then
|
|
cp -a "${reference_dir}/${result_file}" "${tmp2}/orig"
|
|
ref=$(${CONVERT_ECL} "${tmp2}/orig/${result_file}" | \
|
|
awk '/converting/{print $NF}')
|
|
else
|
|
# Reference file does not exist. New file type or new case.
|
|
ref=/dev/null
|
|
fi
|
|
|
|
if [ -s "${simoutput_dir}/${result_file}" ]
|
|
then
|
|
cp -a "${simoutput_dir}/${result_file}" "${tmp2}/new"
|
|
new=$(${CONVERT_ECL} "${tmp2}/new/${result_file}" | \
|
|
awk '/converting/{print $NF}')
|
|
else
|
|
# New simulation file does not exist. Typically when the file
|
|
# type is removed. Unexpected.
|
|
new=/dev/null
|
|
fi
|
|
|
|
|
|
{
|
|
flock -x 200
|
|
if [ "${new}" != "${ref}" ]
|
|
then
|
|
diff -u "${ref}" "${new}" >> "${WORKSPACE}/data_diff"
|
|
else
|
|
# Neither reference nor updated file exists. This really
|
|
# shouldn't happen.
|
|
echo "No difference between reference and update for ${result_file}" \
|
|
>> "${WORKSPACE}/data_diff"
|
|
fi
|
|
} 200>|$TMPDIR/opm_diff_lock
|
|
|
|
rm -rf ${tmp2}
|
|
}
|
|
|
|
# Extract individual test properties of a failed test
|
|
#
|
|
# Input argument $1 is the test description from 'LastTestsFailed.log'.
|
|
#
|
|
# Populates 'testProperty' in such a way that
|
|
#
|
|
# ${testProperty["binary"]} is the simulation tool used to run the test.
|
|
# ${testProperty["dir_name"]} is the source directory in opm-tests.
|
|
# ${testProperty["file_name"]} is the base name of the simulation input file.
|
|
# ${testProperty["test_name"]} is the test suite's name of the particular test.
|
|
extractTestProperties () {
|
|
local failed_test
|
|
|
|
failed_test=$(echo "$1" | sed -e 's/.*://')
|
|
|
|
testProperty["binary"]=$(awk -v test="${failed_test}" \
|
|
-v prop="SIMULATOR" -f "${dir}/getprop.awk" \
|
|
"${BUILD_DIR}/CTestTestfile.cmake")
|
|
|
|
testProperty["dir_name"]=$(awk -v test="${failed_test}" \
|
|
-v prop="DIRNAME" -f "${dir}/getprop.awk" \
|
|
"${BUILD_DIR}/CTestTestfile.cmake")
|
|
|
|
testProperty["file_name"]=$(awk -v test="${failed_test}" \
|
|
-v prop="FILENAME" -f "${dir}/getprop.awk" \
|
|
"${BUILD_DIR}/CTestTestfile.cmake")
|
|
|
|
testProperty["test_name"]=$(awk -v test="${failed_test}" \
|
|
-v prop="TESTNAME" -f "${dir}/getprop.awk" \
|
|
"${BUILD_DIR}/CTestTestfile.cmake")
|
|
}
|
|
|
|
# Copy results from a test run to reference dir
|
|
#
|
|
# $1 = source directory to copy data from
|
|
# $2 = destination directory to copy data to
|
|
# $3 = base file name for files to copy
|
|
# $4...$@ = file types to copy
|
|
copyToReferenceDir () {
|
|
SRC_DIR=$1
|
|
DST_DIR=$2
|
|
STEM=$3
|
|
FILETYPES=${@:4}
|
|
mkdir -p "${DST_DIR}"
|
|
|
|
DIFF=1
|
|
for filetype in $FILETYPES
|
|
do
|
|
result_file="${STEM}.${filetype}"
|
|
|
|
# Don't flag results as changed if neither the reference nor
|
|
# the result directory have a specific file type. This means
|
|
# we transparently handle result files like *.RFT which are
|
|
# created only if the simulation model explicitly requests the
|
|
# file type.
|
|
if [ ! -f "${SRC_DIR}/${result_file}" -a ! -f "${DST_DIR}/${result_file}" ]
|
|
then
|
|
continue
|
|
fi
|
|
|
|
if ! cmp -s "${SRC_DIR}/${result_file}" "${DST_DIR}/${result_file}"
|
|
then
|
|
if [ -n "$CONVERT_ECL" ]
|
|
then
|
|
compareResultFileContents "${DST_DIR}" "${SRC_DIR}" "${result_file}"
|
|
fi
|
|
|
|
cp -a "${SRC_DIR}/${result_file}" "${DST_DIR}"
|
|
DIFF=0
|
|
fi
|
|
done
|
|
|
|
return $DIFF
|
|
}
|
|
|
|
# Copy damaris results from a test run to reference dir
|
|
#
|
|
# $1 = source directory to copy data from
|
|
# $2 = destination directory to copy data to
|
|
# $3 = base file name for files to copy
|
|
copyDamarisToReferenceDir () {
|
|
SRC_DIR=$1
|
|
DST_DIR=$2
|
|
STEM=$3
|
|
mkdir -p $DST_DIR
|
|
|
|
FIRST_FILE=`ls -v1 $SRC_DIR/$STEM*.h5 | head -n1`
|
|
LAST_FILE=`ls -v1 $SRC_DIR/$STEM*.h5 | tail -n1`
|
|
|
|
for file in $FIRST_FILE $LAST_FILE
|
|
do
|
|
{
|
|
flock -x 200
|
|
h5diff -v "$file" "$DST_DIR/`basename $file`" >> $WORKSPACE/data_diff
|
|
} 200>|$TMPDIR/opm_diff_lock
|
|
cp "$file" $DST_DIR
|
|
done
|
|
}
|
|
|
|
# Generate reference solution updates for restarted simulation runs.
|
|
#
|
|
# $1 is name of simulator binary
|
|
# $2 is location of reference solutions in opm-tests
|
|
# $3 is base name of simulation input file
|
|
# $4 is test suite's name of test base run
|
|
updateRestartResults () {
|
|
local binary="${1}"
|
|
local dir_name="${2}"
|
|
local file_name="${3}"
|
|
local test_name="${4}"
|
|
|
|
local rst_steps
|
|
local rst_step
|
|
local result
|
|
local case_result
|
|
|
|
rst_steps=$(echo ${BUILD_DIR}/tests/results/${binary}+${test_name}/restart/*RESTART_*.UNRST | \
|
|
sed -E -e 's;[^ ]*RESTART_([0-9]+)\.UNRST;\1;g')
|
|
|
|
result=0
|
|
for rst_step in ${rst_steps}
|
|
do
|
|
copyToReferenceDir \
|
|
"${BUILD_DIR}/tests/results/${binary}+${test_name}/restart/" \
|
|
"${OPM_TESTS_ROOT}/${dir_name}/opm-simulation-reference/${binary}/restart" \
|
|
"${file_name}_RESTART_${rst_step}" \
|
|
EGRID INIT RFT SMSPEC UNRST UNSMRY
|
|
|
|
case_result=$?
|
|
if [ ${result} -eq 0 ]
|
|
then
|
|
result=${case_result}
|
|
fi
|
|
done
|
|
|
|
if [ ${result} -eq 0 ]
|
|
then
|
|
changed_tests+=" ${test_name}(restart)"
|
|
fi
|
|
}
|
|
|
|
# Generate reference solution updates for base and restarted
|
|
# simulation runs.
|
|
#
|
|
# Uses properties of failing test being processed (${testProperty}).
|
|
updateFullSimulationResults () {
|
|
local binary=${testProperty["binary"]}
|
|
local dir_name=${testProperty["dir_name"]}
|
|
local file_name=${testProperty["file_name"]}
|
|
local test_name=${testProperty["test_name"]}
|
|
|
|
if copyToReferenceDir \
|
|
"${BUILD_DIR}/tests/results/${binary}+${test_name}" \
|
|
"${OPM_TESTS_ROOT}/${dir_name}/opm-simulation-reference/${binary}" \
|
|
"${file_name}" \
|
|
EGRID INIT RFT SMSPEC UNRST UNSMRY
|
|
then
|
|
changed_tests+=" ${test_name}"
|
|
fi
|
|
|
|
if [ -d "${BUILD_DIR}/tests/results/${binary}+${test_name}/restart" ]
|
|
then
|
|
updateRestartResults "${binary}" "${dir_name}" "${file_name}" "${test_name}"
|
|
fi
|
|
}
|
|
|
|
# Generate reference solution updates for Damaris result files.
|
|
#
|
|
# Uses properties of failing test being processed (${testProperty}).
|
|
updateDamarisResults () {
|
|
local binary=${testProperty["binary"]}
|
|
local dir_name=${testProperty["dir_name"]}
|
|
local file_name=${testProperty["file_name"]}
|
|
local test_name=${testProperty["test_name"]}
|
|
|
|
copyDamarisToReferenceDir \
|
|
"${BUILD_DIR}/tests/results/${binary}+${test_name}" \
|
|
"${OPM_TESTS_ROOT}/${dir_name}/opm-simulation-reference/${binary}" \
|
|
"${file_name}"
|
|
|
|
changed_tests+=" ${test_name}"
|
|
}
|
|
|
|
# Generate reference solution updates for cases that don't run a full
|
|
# simulation (e.g., those that use the 'NOSIM' keyword).
|
|
#
|
|
# Updates the .EGRID and .INIT files only.
|
|
updateInitFileResults () {
|
|
local binary=${testProperty["binary"]}
|
|
local dir_name=${testProperty["dir_name"]}
|
|
local file_name=${testProperty["file_name"]}
|
|
local test_name=${testProperty["test_name"]}
|
|
|
|
if copyToReferenceDir \
|
|
"${BUILD_DIR}/tests/results/init/${binary}+${test_name}" \
|
|
"${OPM_TESTS_ROOT}/${dir_name}/opm-simulation-reference/${binary}" \
|
|
"${file_name}" \
|
|
EGRID INIT
|
|
then
|
|
changed_tests+=" ${test_name}"
|
|
fi
|
|
}
|
|
|
|
changed_tests=""
|
|
|
|
# If we get here, the ${failed_test} is one of the compare*Files_*
|
|
# tests. Extract specific information about the test itself and
|
|
# update its reference solutions accordingly.
|
|
|
|
extractTestProperties "$@"
|
|
|
|
case "$@" in
|
|
*compareECLFiles* )
|
|
updateFullSimulationResults ;;
|
|
|
|
*compareECLInitFiles* )
|
|
updateInitFileResults ;;
|
|
|
|
*compareDamarisFiles* )
|
|
updateDamarisResults ;;
|
|
esac
|
|
|
|
{
|
|
flock -x 200
|
|
echo $changed_tests >> $TMPDIR/changed_tests
|
|
} 200>|$TMPDIR/opm_diff_lock
|