diff --git a/.gitmodules b/.gitmodules index f91588f..5c47d09 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ -[submodule "domain-tools"] - path = domain-tools - url = https://github.com/COSIMA/domain-tools.git -[submodule "topogtools"] - path = topogtools - url = https://github.com/COSIMA/topogtools.git [submodule "om3-scripts"] path = om3-scripts url = https://github.com/COSIMA/om3-scripts.git +[submodule "bathymetry-tools"] + path = bathymetry-tools + url = https://github.com/COSIMA/bathymetry-tools.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 08f9243..5eabf27 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ -# make_OM3_025deg_topo \ No newline at end of file +# make_OM3_025deg_topo + +Make 0.25-degree `topog.nc` MOM bathymetry file from the GEBCO 2024 dataset. + +## Workflow Overview + +1. **Generate Topography:** + Use `./gen_topog.sh` to generate the topography and associated files. For 0.25-degree resolution or higher, this will require submission via `qsub`. + + First, add gdata for your project & working directory to the `#PBS -l storage=` line in `get_topo.sh` + + Then, use the `qsub` command to submit the script, passing the required input files as arguments. For example: + ```bash + qsub -v INPUT_HGRID="/path/to/ocean_hgrid.nc",INPUT_VGRID="/path/to/ocean_vgrid.nc",INPUT_GBCO="/path/to/GEBCO_2024.nc" -P $PROJECT gen_topo.sh + ``` + +2. **Finalize Output Files:** + Once the output files meet your satisfaction, commit and push the changes, then add the git commit hash as metadata in the output `.nc` files by running `finalise.sh`. + +## Note on Dependencies + +This workflow relies on the **hh5 conda environments** for running the scripts and generating the outputs. As long as you are a member of the _hh5_ project, this conda environment is loaded as part of the scripts. + +--- \ No newline at end of file diff --git a/bathymetry-tools b/bathymetry-tools new file mode 160000 index 0000000..a298d51 --- /dev/null +++ b/bathymetry-tools @@ -0,0 +1 @@ +Subproject commit a298d5198540c529b703fd82b216f4073ea4af0a diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..ff4eaf8 --- /dev/null +++ b/build.sh @@ -0,0 +1,24 @@ +# Copyright 2024 ACCESS-NRI and contributors. See the top-level COPYRIGHT file for details. +# SPDX-License-Identifier: Apache-2.0 +# +# Build bathymetry-tools executables + +module purge +module load intel-compiler +module load netcdf + +cd ./bathymetry-tools/ + + +# Check if the build directory exists before cleaning +if [ -d "build" ]; then + cmake --build build --target clean +fi + +cmake -B build -DCMAKE_BUILD_TYPE=Release -DNetCDF_Fortran_LIBRARY=$NETCDF_ROOT/lib/Intel/libnetcdff.so -DNetCDF_C_LIBRARY=$NETCDF_ROOT/lib/libnetcdf.so -DNetCDF_Fortran_INCLUDE_DIRS=$NETCDF_ROOT/include/Intel + +cmake --build build + +cmake --install build --prefix=./ + +cd ../ diff --git a/domain-tools b/domain-tools deleted file mode 160000 index 2cba76b..0000000 --- a/domain-tools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2cba76ba8f3f2006ea0785bcbe765d5a0351cb5b diff --git a/edit_025deg_topog_new_fillfraction.txt b/edit_025deg_topog_new_fillfraction.txt new file mode 100644 index 0000000..b02b59e --- /dev/null +++ b/edit_025deg_topog_new_fillfraction.txt @@ -0,0 +1,11 @@ +editTopo.py edits file version 1 +# +# This file can be used as an argument for editTopo.py --apply +# +# created: Fri Nov 1 12:56:59 2024 +# by: ek4684 +# via: editTopo.py /g/data/tm70/ek4684/domain-tools/C-grid-workflow/fill_fraction_0.5/topog_new_fillfraction.nc --overwrite +# +# i j old new + 1235 737 0.0 65.28469848632812 + 1227 734 0.0 56.118499755859375 diff --git a/finalise.sh b/finalise.sh new file mode 100755 index 0000000..947d129 --- /dev/null +++ b/finalise.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env sh +# Copyright 2024 ACCESS-NRI and contributors. See the top-level COPYRIGHT file for details. +# SPDX-License-Identifier: Apache-2.0 +# +# Commit changes and push, then add metadata to note how changes were made + +module load nco +module load git + +echo "About to commit all changes to git repository and push to remote." +read -p "Proceed? (y/n) " yesno +case $yesno in + [Yy] ) ;; + * ) echo "Cancelled."; exit 0;; +esac + +set -x +set -e + +git commit -am "Files used for topo/mask generation on $(date)" || true +git push || true + +ncatted -O -h -a history,global,a,c," | Created on $(date) using https://github.com/ACCESS-NRI/make_OM3_025deg_topo/tree/$(git rev-parse --short HEAD)" topog.nc +ncatted -O -h -a history,global,a,c," | Updated on $(date) using https://github.com/ACCESS-NRI/make_OM3_025deg_topo/tree/$(git rev-parse --short HEAD)" ocean_mask.nc +ncatted -O -h -a history,global,a,c," | Created on $(date) using https://github.com/ACCESS-NRI/make_OM3_025deg_topo/tree/$(git rev-parse --short HEAD)" kmt.nc +ncatted -O -h -a history,global,a,c," | Updated on $(date) using https://github.com/ACCESS-NRI/make_OM3_025deg_topo/tree/$(git rev-parse --short HEAD)" ocean_vgrid.nc + +ncatted -O -h -a history,global,a,c," and based on GEBCO_2024 topography" topog.nc + diff --git a/gen_topo.sh b/gen_topo.sh new file mode 100755 index 0000000..c76e872 --- /dev/null +++ b/gen_topo.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env sh +# Copyright 2023 ACCESS-NRI and contributors. See the top-level COPYRIGHT file for details. +# SPDX-License-Identifier: Apache-2.0 + +#PBS -q normal +#PBS -l walltime=4:00:00,mem=10GB +#PBS -l wd +#PBS -l storage=gdata/hh5+gdata/ik11+gdata/tm70 + +# Input files - Using the environment variables passed via -v +INPUT_HGRID=$INPUT_HGRID +INPUT_VGRID=$INPUT_VGRID +INPUT_GBCO=$INPUT_GBCO +# Minimum allowed y-size for a cell (in m) +CUTOFF_VALUE=6000 +# Output filenames +ESMF_MESH_FILE='access-om3-025deg-ESMFmesh.nc' +ESMF_NO_MASK_MESH_FILE='access-om3-025deg-nomask-ESMFmesh.nc' + + +# Build bathymetry-tools +./build.sh + +module purge +module use /g/data/hh5/public/modules +module load conda/analysis3 +module load nco + +set -x #print commands to e file +set -e #exit on error + +# Copy and link input files +cp -L --preserve=timestamps "$INPUT_HGRID" ./ocean_hgrid.nc +cp -L --preserve=timestamps "$INPUT_VGRID" ./ocean_vgrid.nc +ln -sf "$INPUT_GBCO" ./GEBCO_2024.nc + +# Convert double precision vgrid to single +./bathymetry-tools/bin/float_vgrid --vgrid ocean_vgrid.nc --vgrid_type mom6 + +# Interpolate topography on horizontal grid: +./bathymetry-tools/bin/topogtools gen_topo -i GEBCO_2024.nc -o topog_new.nc --hgrid ocean_hgrid.nc --tripolar --longitude-offset -100 + +# Cut off T cells of size less than cutoff value +./bathymetry-tools/bin/topogtools min_dy -i topog_new.nc -o topog_new_min_dy.nc --cutoff "$CUTOFF_VALUE" --hgrid ocean_hgrid.nc + +# Fill cells that have a sea area fraction smaller than 0.5: +./bathymetry-tools/bin/topogtools fill_fraction -i topog_new_min_dy.nc -o topog_new_fillfraction.nc --fraction 0.5 + +# edit_topo.py +python ./bathymetry-tools/editTopo.py --overwrite --nogui --apply edit_025deg_topog_new_fillfraction.txt --output topog_new_fillfraction_edited.nc topog_new_fillfraction.nc + +# Remove seas: +./bathymetry-tools/bin/topogtools deseas -i topog_new_fillfraction_edited.nc -o topog_new_fillfraction_edited_deseas.nc --grid_type C + +# Set maximum/minimum depth +./bathymetry-tools/bin/topogtools min_max_depth -i topog_new_fillfraction_edited_deseas.nc -o topog_new_fillfraction_edited_deseas_mindepth.nc --level 4 --vgrid ocean_vgrid.nc --vgrid_type mom6 + +# Name final topog as topo.nc +cp topog_new_fillfraction_edited_deseas_mindepth.nc topog.nc +# add name and checksum for input files +MD5SUM=$(md5sum ocean_hgrid.nc | awk '{print $1}') +ncatted -O -h -a input_file,global,a,c,"$(readlink -f $INPUT_HGRID) (md5sum:$MD5SUM) ; " topog.nc +MD5SUM=$(md5sum ocean_vgrid.nc | awk '{print $1}') +ncatted -O -h -a input_file,global,a,c,"$(readlink -f $INPUT_VGRID) (md5sum:$MD5SUM) ; " topog.nc +MD5SUM=$(md5sum GEBCO_2024.nc | awk '{print $1}') +ncatted -O -h -a input_file,global,a,c,"$(readlink -f $INPUT_GBCO) (md5sum:$MD5SUM) ; " topog.nc + +#Move intermediate files to a separate directory +OUTPUT_DIR="topography_intermediate_output" +mkdir -p $OUTPUT_DIR +mv topog_new* $OUTPUT_DIR/ + +# Create land/sea mask +./bathymetry-tools/bin/topogtools mask -i topog.nc -o ocean_mask.nc + +# Add MD5 checksum as a global attribute to topog.nc +MD5SUM_topog=$(md5sum topog.nc | awk '{print $1}') +ncatted -O -h -a input_file,global,a,c,"$(readlink -f topog.nc) (md5sum:$MD5SUM_topog)" ocean_mask.nc + +# Make CICE mask file (`kmt.nc`) +ncrename -O -v mask,kmt ocean_mask.nc kmt.nc +ncks -O -x -v geolon_t,geolat_t kmt.nc kmt.nc #drop unused vars + +# Add MD5 checksum as a global attribute to ocean_mask.nc +MD5SUM_mask=$(md5sum ocean_mask.nc | awk '{print $1}') +ncatted -O -h -a ocean_mask_file,global,a,c,"$(readlink -f ocean_mask.nc) (md5sum:$MD5SUM_mask)" kmt.nc + +# Create ESMF mesh from hgrid and ocean_mask.nc +python3 ./om3-scripts/mesh_generation/generate_mesh.py --grid-type=mom --grid-filename=ocean_hgrid.nc --mesh-filename="$ESMF_MESH_FILE" --mask-filename=ocean_mask.nc --wrap-lons + +# Create ESMF mesh without mask +python3 ./om3-scripts/mesh_generation/generate_mesh.py --grid-type=mom --grid-filename=ocean_hgrid.nc --mesh-filename="$ESMF_NO_MASK_MESH_FILE" --wrap-lons diff --git a/topogtools b/topogtools deleted file mode 160000 index 6b49831..0000000 --- a/topogtools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6b4983127aa18dfdf1b62b2e18b581d82d4a64d4