Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"build": {
"dockerfile": "Dockerfile",
"args": {
"GEOS_TPL_TAG": "359-1057"
"GEOS_TPL_TAG": "361-1064"
}
},
"runArgs": [
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ jobs:
# frozen at the time the workflow was first triggered, so labels
# added after that first run are invisible to re-runs. The curl
# call below always returns current state, which is required for
# CI re-runs to pick up newly added labels (e.g. "ci: run CUDA
# CI re-runs to pick up newly added labels (e.g. "ci: run device
# builds"). Do not replace with github.event.pull_request.labels.
# The Authorization header is required for private repos/forks;
# GITHUB_TOKEN is provided automatically to every workflow run.
Expand Down
56 changes: 53 additions & 3 deletions .github/workflows/ci_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ jobs:
# - run: sysctl -n machdep.cpu.brand_string


# If the 'ci: run CUDA builds' PR label is found, the cuda jobs run immediately along side linux jobs.
# If the 'ci: run device builds' PR label is found, the CUDA jobs run immediately along side linux jobs.
# Note: CUDA jobs should only be run if PR is ready to merge.
cuda_builds:
name: ${{ matrix.name }}
Expand Down Expand Up @@ -433,10 +433,57 @@ jobs:
NPROC: ${{ matrix.NPROC }}
CTEST_PARALLEL_LEVEL: ${{ matrix.CTEST_PARALLEL_LEVEL || matrix.NPROC }}
RUNS_ON: ${{ matrix.RUNS_ON }}
REQUIRED_LABEL: "ci: run CUDA builds"
REQUIRED_LABEL: "ci: run device builds"
secrets: inherit

# Convenience job - passes when all other jobs have passed (must pass the CUDA jobs).
# If the 'ci: run device builds' PR label is found, the ROCm job runs alongside
# the CPU and CUDA jobs. This is a build-only job, so the runner does not need
# an AMD GPU; the image supplies the amdclang 19/ROCm 6.4.3 toolchain and the
# generated /spack-generated.cmake host-config.
rocm_builds:
name: ${{ matrix.name }}
needs:
- is_not_draft_pull_request
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu 24.04 - amdclang 19 + ROCm 6.4.3
BUILD_AND_TEST_CLI_ARGS: "--build-exe-only --no-install-schema"
CMAKE_BUILD_TYPE: Release
BUILD_GENERATOR: "--ninja"
DOCKER_REPOSITORY: geosx/ubuntu24.04-amdclang19.0.0-rocm6.4.3
ENABLE_HYPRE_DEVICE: HIP
ENABLE_HYPRE: ON
ENABLE_HYPREDRV: ON
ENABLE_TRILINOS: OFF
GEOS_ENABLE_BOUNDS_CHECK: OFF
RUNS_ON: streak2
NPROC: 8
DOCKER_RUN_ARGS: "--cpus=8 --memory=128g -e ROCM_PATH=/opt/rocm-6.4.3 -e HIP_PATH=/opt/rocm-6.4.3 -v /etc/pki/tls/certs/ca-bundle.crt:/etc/pki/tls/certs/ca-bundle.crt:ro -v /etc/pki/tls/certs/ca-bundle.crt:/certs/ca-bundle.crt:ro"
HOST_CONFIG: /spack-generated.cmake

uses: ./.github/workflows/build_and_test.yml
with:
BUILD_AND_TEST_CLI_ARGS: ${{ matrix.BUILD_AND_TEST_CLI_ARGS }}
CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }}
BUILD_GENERATOR: ${{ matrix.BUILD_GENERATOR }}
DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }}
DOCKER_REPOSITORY: ${{ matrix.DOCKER_REPOSITORY }}
DOCKER_RUN_ARGS: ${{ matrix.DOCKER_RUN_ARGS }}
ENABLE_HYPRE_DEVICE: ${{ matrix.ENABLE_HYPRE_DEVICE }}
ENABLE_HYPRE: ${{ matrix.ENABLE_HYPRE }}
ENABLE_HYPREDRV: ${{ matrix.ENABLE_HYPREDRV }}
ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }}
GEOS_ENABLE_BOUNDS_CHECK: ${{ matrix.GEOS_ENABLE_BOUNDS_CHECK }}
HOST_CONFIG: ${{ matrix.HOST_CONFIG }}
NPROC: ${{ matrix.NPROC }}
CTEST_PARALLEL_LEVEL: ${{ matrix.CTEST_PARALLEL_LEVEL || matrix.NPROC }}
RUNS_ON: ${{ matrix.RUNS_ON }}
REQUIRED_LABEL: "ci: run device builds"
secrets: inherit

# Convenience job - passes when all other jobs have passed (including the GPU jobs).
check_that_all_jobs_succeeded:
runs-on: ubuntu-22.04
needs:
Expand All @@ -446,6 +493,7 @@ jobs:
- check_code_rules
- cpu_builds
- cuda_builds
- rocm_builds
- run_integrated_tests
if: ${{ always() }}
steps:
Expand All @@ -455,12 +503,14 @@ jobs:
echo "check_code_style_and_documentation: ${{needs.check_code_style_and_documentation.result}}"
echo "cpu_builds: ${{needs.cpu_builds.result}}"
echo "cuda_builds: ${{needs.cuda_builds.result}}"
echo "rocm_builds: ${{needs.rocm_builds.result}}"
echo "run_integrated_tests: ${{needs.run_integrated_tests.result}} "
${{
needs.if_not_unassigned_pull_request.result == 'success' &&
needs.are_submodules_in_sync.result == 'success' &&
needs.check_code_style_and_documentation.result == 'success' &&
needs.cpu_builds.result == 'success' &&
needs.cuda_builds.result == 'success' &&
needs.rocm_builds.result == 'success' &&
needs.run_integrated_tests.result == 'success'
}}
2 changes: 1 addition & 1 deletion .integrated_tests.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
baselines:
bucket: geosx
baseline: integratedTests/baseline_integratedTests-pr3884-17320-39debdc
baseline: integratedTests/baseline_integratedTests-pr4127-17399-63445db

allow_fail:
all: ''
Expand Down
16 changes: 15 additions & 1 deletion BASELINE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,48 @@ This file is designed to track changes to the integrated test baselines.
Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining.
These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD).

PR #4127 (2026-08-23) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4127-17399-63445db.tar.gz>
=====================
Rebaseline five restart checks after the TPL update changed VTK/Scotch mesh partitioning. Global mesh topology and fields are unchanged.

PR #3884 (2026-08-16) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3884-17320-39debdc.tar.gz>
=====================
Total stress fix in the thermo-poromechanics model

PR #4114 (2026-08-14) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4114-17283-3bb33cb.tar.gz>
=====================
Stop dumping linear systems from ATS decks (`writeLinearSystem` no longer set). That flag is stored in restart files, so `perf_status_test` restartchecks need a new baseline.

PR #4088 (2026-07-27) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4088-17188-4247846.tar.gz>
=====================
Fluid reset after convergence failure

PR #3972 (2026-07-28) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3972-17154-316e6d8.tar.gz>
Well model refactor . Integrated test update due to schema changes
=====================
Well model refactor . Integrated test update due to schema changes

PR #3836 (2026-05-20) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3836-17046-2e89f64.tar.gz>
=====================
Added statistics `Group` objects for each statistics `Task` instance

PR #4040 (2026-06-16) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4040-16993-1393f80.tar.gz>
=====================
Move relperm driver to use new constitutive driver framework

PR #3705 (2026-06-12) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3705-16862-2b262bf.tar.gz>
=====================
Implement compositional enthalpy model

PR #4074 (2026-06-10) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4074-16937-bf66240.tar.gz>
=====================
Change triaxial driver to use restart for checks

PR #4067 (2026-06-10) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4067-16928-3038f6b.tar.gz>
=====================
Add Coulomb friction/cohesion input from vtk mesh

PR #4068 (2026-06-09) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4068-16828-c74157c.tar.gz>
=====================
Add MPI runs for smoke tests with surfaceGenerator

PR #4062 (2026-05-26) <https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr4062-16784-6d8782e.tar.gz>
Expand Down
4 changes: 2 additions & 2 deletions scripts/runIntegratedTests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ Options:
and hdf5 artifact the run produced, and pack the
tarball named in develop's .integrated_tests.yaml into
.integrated-test-baselines/. Cannot be used with --baselines.
--filter EXPR ATS name filter (tests whose name contains EXPR)
--filter EXPR ATS label filter (tests whose label contains EXPR)
--cutoff TIME ATS cutoff (default ${CUTOFF})
--build-dir NAME Build directory name under the repo (default ${BUILD_DIR_NAME})
--no-pull Do not docker pull the image first
Expand Down Expand Up @@ -671,7 +671,7 @@ else
log "Using mounted baselines at /tmp/geos/baselines"
fi
if [[ -n "${FILTER}" ]]; then
ATS_CMD+=(-f "${FILTER}")
ATS_CMD+=(--ats filter "label.find('${FILTER}') >= 0")
fi
if [[ ${#EXTRA_ATS_ARGS[@]} -gt 0 ]]; then
ATS_CMD+=("${EXTRA_ATS_ARGS[@]}")
Expand Down
30 changes: 22 additions & 8 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@

cmake_minimum_required( VERSION 3.24 )

# At the moment we are manually passing the cuda arch flag.
cmake_policy(SET CMP0104 OLD) # when using nvcc populate CMAKE_CUDA_ARCHITECTURES, raise error if we can't
# CUDA architectures are supplied by the host configuration or CI.
cmake_policy(SET CMP0104 NEW)
# BLT 0.6.2 still uses FindCUDA while configuring its CUDA targets.
if(POLICY CMP0146)
cmake_policy(SET CMP0146 OLD)
endif()
cmake_policy(SET CMP0074 NEW) # dont ignore <PackageName>_ROOT env vars when searching for packages via find_package()
cmake_policy(SET CMP0066 NEW) # use CMAKE_<LANG>_FLAGS_<BUILD_TYPE> for try_compile() instead of only CMAKE_<LANG>_FLAGS
cmake_policy(SET CMP0056 NEW) # use CMAKE_EXE_LINKER_FLAGS in try_compile() in addition to CMAKE_<LANG>_FLAGS
Expand All @@ -12,7 +16,7 @@ cmake_policy(SET CMP0056 NEW) # use CMAKE_EXE_LINKER_FLAGS in try_compile() in a
################################
project( geosx LANGUAGES C CXX )
include(GNUInstallDirs)
set( BLT_CXX_STD "c++17" CACHE STRING "Version of C++ standard" )
set( BLT_CXX_STD "c++20" CACHE STRING "Version of C++ standard" )
if(CMAKE_BUILD_TYPE EQUAL "Debug")
set( ENABLE_WARNINGS_AS_ERRORS "OFF" CACHE PATH "")
else()
Expand Down Expand Up @@ -50,6 +54,18 @@ option( ENABLE_BENCHMARKS "Enables benchmarks" ON )
include( cmake/blt/SetupBLT.cmake )
set( BLT_SOURCE_DIR ${PROJECT_SOURCE_DIR}/cmake/blt/ )

# BLT's bundled GoogleTest currently uses an implicit char8_t-to-char32_t
# conversion that Clang 22 diagnoses as -Wcharacter-conversion. Keep GEOS'
# warnings-as-errors policy intact while limiting the compatibility flag to
# the third-party test target.
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 22 )
foreach( _geos_gtest_target gtest gtest_main gmock gmock_main )
if( TARGET ${_geos_gtest_target} )
target_compile_options( ${_geos_gtest_target} PRIVATE -Wno-error=character-conversion )
endif()
endforeach()
endif()

# use, i.e. don't skip the full RPATH for the build tree
set( CMAKE_SKIP_BUILD_RPATH FALSE )

Expand Down Expand Up @@ -245,7 +261,7 @@ install( FILES ${CMAKE_BINARY_DIR}/schema.xsd
################################
# Add python environment setup
################################
message(WARNING "Temporarily changing the geosPythonBranch to feature/remove-dndx-detj")
message(STATUS "Using geosPythonPackages branch feature/remove-dndx-detj")
set(GEOS_PYTHON_PACKAGES_BRANCH "feature/remove-dndx-detj" CACHE STRING "" FORCE)


Expand Down Expand Up @@ -321,14 +337,12 @@ endif()

if ( ENABLE_ATS )
if (NOT DEFINED ATS_WORKING_DIR)
message( WARNING "ATS_WORKING_DIR is not defined (required for integrated testing system)" )
message( WARNING "Defaulting to ${CMAKE_BINARY_DIR}/integratedTests/workingDir" )
message( STATUS "ATS_WORKING_DIR is not defined; defaulting to ${CMAKE_BINARY_DIR}/integratedTests/workingDir" )
set( ATS_WORKING_DIR "${CMAKE_BINARY_DIR}/integratedTests/workingDir" CACHE PATH "")
endif()

if (NOT DEFINED ATS_BASELINE_DIR)
message( WARNING "ATS_BASELINE_DIR is not defined (required for integrated testing system)" )
message( WARNING "Defaulting to ${CMAKE_SOURCE_DIR}/../integratedTests" )
message( STATUS "ATS_BASELINE_DIR is not defined; defaulting to ${CMAKE_SOURCE_DIR}/../integratedTests" )
set( ATS_BASELINE_DIR "${CMAKE_SOURCE_DIR}/../integratedTests" CACHE PATH "")
endif()

Expand Down
27 changes: 20 additions & 7 deletions src/cmake/GeosxOptions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ option( GEOS_ENABLE_WAVEPROPAGATION "Enables wave propagation physics package" O
#message( "SPHINX_FOUND = ${SPHINX_FOUND}" )
#message( "SPHINX_EXECUTABLE = ${SPHINX_EXECUTABLE}" )

if( NOT BLT_CXX_STD STREQUAL c++17 )
MESSAGE( FATAL_ERROR "c++17 is NOT enabled. GEOSX requires c++17" )
endif( NOT BLT_CXX_STD STREQUAL c++17 )
if( NOT BLT_CXX_STD STREQUAL c++20 )
MESSAGE( FATAL_ERROR "c++20 is NOT enabled. GEOS requires c++20" )
endif( NOT BLT_CXX_STD STREQUAL c++20 )

message( "CMAKE_CXX_COMPILER_ID = ${CMAKE_CXX_COMPILER_ID}" )

Expand All @@ -162,6 +162,13 @@ blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS
CLANG "-Wpedantic -pedantic-errors -Wshadow -Wfloat-equal -Wno-cast-align -Wcast-qual"
)

if( ENABLE_HIP )
# amdclang compiles C++ sources through the HIP driver. GEOS has existing
# [=] lambdas that implicitly capture this; C++20 diagnoses that pattern.
blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS
CLANG "-Wno-deprecated-this-capture -Wno-unused-parameter -Wno-unused-variable -Wno-unused-lambda-capture -Wno-gpu-maybe-wrong-side" )
endif()

blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS_DEBUG
GNU "-Wno-unused-parameter -Wno-unused-variable"
CLANG "-Wno-unused-parameter -Wno-unused-variable -fstandalone-debug"
Expand All @@ -188,11 +195,17 @@ if (ENABLE_GBENCHMARK)
endif()

if( GEOS_ENABLE_FPE )
check_cxx_compiler_flag( "-ffp-exception-behavior=strict" GEOS_CXX_HAS_FP_EXCEPTION_BEHAVIOR_STRICT)
if( GEOS_CXX_HAS_FP_EXCEPTION_BEHAVIOR_STRICT )
blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS CLANG "-ffp-exception-behavior=strict" )
# amdclang compiles HIP sources through the CXX driver. The host-only
# floating-point exception flag is rejected for the device compilation.
if( ENABLE_HIP )
message( STATUS "GEOS_ENABLE_FPE is ON, but HIP builds do not support -ffp-exception-behavior=strict; skipping the flag." )
else()
message( WARNING "GEOS_ENABLE_FPE is ON, but ${CMAKE_CXX_COMPILER_ID} does not support -ffp-exception-behavior=strict." )
check_cxx_compiler_flag( "-ffp-exception-behavior=strict" GEOS_CXX_HAS_FP_EXCEPTION_BEHAVIOR_STRICT)
if( GEOS_CXX_HAS_FP_EXCEPTION_BEHAVIOR_STRICT )
blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS CLANG "-ffp-exception-behavior=strict" )
else()
message( WARNING "GEOS_ENABLE_FPE is ON, but ${CMAKE_CXX_COMPILER_ID} does not support -ffp-exception-behavior=strict." )
endif()
endif()
endif()

Expand Down
4 changes: 2 additions & 2 deletions src/cmake/thirdparty/SetupGeosxThirdParty.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ if(DEFINED UMPIRE_DIR)
message( " ----> umpire_VERSION = ${umpire_VERSION}")

set(ENABLE_UMPIRE ON CACHE BOOL "")
set(thirdPartyLibs ${thirdPartyLibs} umpire)
set(thirdPartyLibs ${thirdPartyLibs} umpire::umpire)
else()
mandatory_tpl_doesnt_exist("Umpire" UMPIRE_DIR)
endif()
Expand Down Expand Up @@ -695,7 +695,7 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE)
get_filename_component( HYPRE_INSTALL_DIR "${HYPRE_DIR}/../../.." ABSOLUTE )
endif()

set( HYPRE_DEPENDS blas lapack umpire )
set( HYPRE_DEPENDS blas lapack umpire::umpire )
if( ENABLE_SUPERLU_DIST )
list( APPEND HYPRE_DEPENDS superlu_dist )
endif()
Expand Down
2 changes: 1 addition & 1 deletion src/coreComponents/common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ set( common_sources
Units.cpp
)

set( dependencyList ${parallelDeps} lvarray RAJA chai umpire)
set( dependencyList ${parallelDeps} lvarray RAJA chai umpire::umpire)

if (TARGET conduit::conduit)
set( dependencyList ${dependencyList} conduit::conduit )
Expand Down
2 changes: 1 addition & 1 deletion src/coreComponents/common/LifoStorageCuda.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class LifoStorageCuda : public LifoStorageCommon< T, INDEX_TYPE >
{
LIFO_MARK_FUNCTION;
// The copy to host will only start when the data is copied on device buffer
baseLifo::m_hostDeque.getStream().wait_for( const_cast< camp::resources::Event * >( &m_pushToDeviceEvents[id] ) );
baseLifo::m_hostDeque.getStream().wait_for( m_pushToDeviceEvents[id] );
baseLifo::m_hostDeque.emplaceFrontFromBack( m_deviceDeque );

if( baseLifo::m_maxNumberOfBuffers - id > (int)(m_deviceDeque.capacity() + baseLifo::m_hostDeque.capacity()) )
Expand Down
21 changes: 6 additions & 15 deletions src/coreComponents/common/format/Format.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@
#include <type_traits>
#include <optional>

#if __cplusplus < 202002L
#define GEOS_USE_FMT
#endif

#ifdef GEOS_USE_FMT
#ifndef FMT_HEADER_ONLY
Expand All @@ -33,9 +31,6 @@
#include "../include/fmt/ranges.h"
#include "../include/fmt/xchar.h"
#define GEOS_FMT_NS fmt
#else // use C++20's <format>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'm a bit confused here. Since we are not enforcing C++20, shouldn't we always use <format>?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hi Dick, this branch is enforcing C++20, but {fmt} remains intentional because GEOS uses fmt::runtime, fmt::join, fmt::is_formattable and custom fmt::formatter. Also, <format> is not uniformly supported by the CUDA/HIP backends. Maybe we can address this on a separate PR

#include <format>
#define GEOS_FMT_NS std
#endif

#ifdef GEOS_USE_FMT
Expand Down Expand Up @@ -80,6 +75,12 @@ struct fmt::formatter< T, std::enable_if_t< std::is_enum< T >::value > >
*/
#define GEOS_FMT( msg, ... ) GEOS_FMT_NS::format( msg, __VA_ARGS__ )

/**
* @brief Interpolate arguments into a run-time format string.
* @param msg the message format string, evaluated at run time
*/
#define GEOS_FMT_RUNTIME( msg, ... ) GEOS_FMT_NS::format( GEOS_FMT_NS::runtime( msg ), __VA_ARGS__ )

/**
* @brief Interpolate arguments into a message format string and write into an output iterator.
* @param iter the output iterator to write to
Expand Down Expand Up @@ -140,18 +141,8 @@ constexpr auto GEOS_FMT_NS::detail::has_const_formatter_impl< GEOS_FMT_NS::forma
/**
* Evaluates at compile time if a fmt::formatter exists for a given type
*/
#if __cplusplus < 202002L
// fmt 11.2: has_formatter<T, Context>() no longer works. The second parameter
// is now Char (not format_context), and the type-trait form is deprecated.
template< class T >
static constexpr bool has_formatter_v = fmt::is_formattable< fmt::remove_cvref_t< T > >::value;
#else
template< typename T >
concept has_formatter_v = requires ( T& v, std::format_context ctx )
{
std::formatter< std::remove_cvref_t< T > >().format( v, ctx );
};
#endif

namespace geos::format
{
Expand Down
Loading
Loading