From cfbcd25b690583ffb02dc20ef986ad9c2bf2a9ad Mon Sep 17 00:00:00 2001 From: Alex Richert <82525672+AlexanderRichert-NOAA@users.noreply.github.com> Date: Mon, 22 Jan 2024 17:32:57 -0800 Subject: [PATCH] Merge sp into ip (#210) * ***Merge sp into ip***: main code; tests; spack recipe; update VERSION to 5.0.0 * update cmake option descriptions * u * Update docs (incl. incorporate sp docs) * Doc updates; fix doc build of sp routines * Update docs/layout * cmake description tweak * update docs * Fix parallel test exe builds * remove layout.xml * simplify spack CI * fix some type mismatches in fftpack.F * test allowing arg mismatch * clean up linux CI * move arg mismatch flag * update flags from sp * Revert "fix some type mismatches in fftpack.F" This reverts commit 7f9f5bfbb064d8d73e701c3be4478e2204490deb. * remove layout.xml from docs/CMakeLists.txt * move bigendian setting to sp tests only * fix tests/CMakeLists.txt typo * fix spack CI * update CI for sp merge * set -fno-bounds-check * whitelist TEST_TIME_LIMIT in recipe check CI * update macos ci * remove noboundcheck flag * disable asan for fftpack.F * Revert "disable asan for fftpack.F" This reverts commit 64f4a9adbf33b0c60f97cf82010e3eb2ec288e06. * disable bounds checks for specific sp files * remove ip2 references * rename test coverage artifact * update license * update README.md * Update package.py * Update Intel.yml --- .github/workflows/Intel.yml | 29 +- .github/workflows/Linux.yml | 29 +- .github/workflows/MacOS.yml | 29 +- .github/workflows/Spack.yml | 17 +- .github/workflows/developer.yml | 19 +- CMakeLists.txt | 18 +- LICENSE.md | 4 +- README.md | 52 +- VERSION | 2 +- cmake/PackageConfig.cmake.in | 2 - docs/Doxyfile.in | 6 +- docs/user_guide.md | 706 ++++++++++++---- spack/package.py | 19 +- src/CMakeLists.txt | 25 +- src/fftpack.F | 1337 ++++++++++++++++++++++++++++++ src/lapack_gen.F | 116 +++ src/ncpus.F | 40 + src/spanaly.f | 76 ++ src/spdz2uv.f | 82 ++ src/speps.f | 53 ++ src/spfft.f | 75 ++ src/spfft1.f | 59 ++ src/spffte.f | 133 +++ src/spfftpt.f | 48 ++ src/spgradq.f | 66 ++ src/spgradx.f | 72 ++ src/spgrady.f | 59 ++ src/splaplac.f | 49 ++ src/splat.F | 192 +++++ src/splegend.f | 131 +++ src/sppad.f | 36 + src/spsynth.f | 158 ++++ src/sptez.f | 71 ++ src/sptezd.f | 60 ++ src/sptezm.f | 70 ++ src/sptezmd.f | 63 ++ src/sptezmv.f | 78 ++ src/sptezv.f | 76 ++ src/sptgpm.f | 124 +++ src/sptgpmd.f | 81 ++ src/sptgpmv.f | 143 ++++ src/sptgps.f | 547 ++++++++++++ src/sptgpsd.f | 100 +++ src/sptgpsv.f | 934 +++++++++++++++++++++ src/sptgpt.f | 104 +++ src/sptgptd.f | 77 ++ src/sptgptsd.f | 130 +++ src/sptgptv.f | 122 +++ src/sptgptvd.f | 160 ++++ src/sptran.f | 122 +++ src/sptrand.f | 150 ++++ src/sptranf.f | 161 ++++ src/sptranf0.f | 64 ++ src/sptranf1.f | 76 ++ src/sptranfv.f | 196 +++++ src/sptranv.f | 126 +++ src/sptrun.f | 85 ++ src/sptrund.f | 105 +++ src/sptrung.f | 90 ++ src/sptrungv.f | 141 ++++ src/sptrunl.f | 115 +++ src/sptrunm.f | 101 +++ src/sptrunmv.f | 153 ++++ src/sptruns.f | 96 +++ src/sptrunsv.f | 149 ++++ src/sptrunv.f | 162 ++++ src/spuv2dz.f | 91 ++ src/spvar.f | 35 + src/spwget.f | 26 + tests/CMakeLists.txt | 69 +- tests/data/README | 5 + tests/data/sptrung.gi.in | Bin 0 -> 259208 bytes tests/data/sptrungv.ll.in | Bin 0 -> 212424 bytes tests/data/sptrungv.uv.in | Bin 0 -> 521280 bytes tests/data/sptrungv.uv.out | Bin 0 -> 212424 bytes tests/input_data_mod_grib1.F90 | 10 - tests/input_data_mod_grib1_4.F90 | 10 + tests/input_data_mod_grib1_8.F90 | 10 + tests/input_data_mod_grib1_d.F90 | 10 + tests/input_data_mod_grib2.F90 | 10 - tests/input_data_mod_grib2_4.F90 | 10 + tests/input_data_mod_grib2_8.F90 | 10 + tests/input_data_mod_grib2_d.F90 | 10 + tests/interp_mod_grib1.F90 | 30 +- tests/interp_mod_grib1_4.F90 | 7 + tests/interp_mod_grib1_8.F90 | 7 + tests/interp_mod_grib1_d.F90 | 7 + tests/interp_mod_grib2.F90 | 31 +- tests/interp_mod_grib2_4.F90 | 7 + tests/interp_mod_grib2_8.F90 | 7 + tests/interp_mod_grib2_d.F90 | 7 + tests/test_fft.F90 | 117 +++ tests/test_ncpus.F90 | 16 + tests/test_scalar_grib1.F90 | 12 +- tests/test_scalar_grib2.F90 | 12 +- tests/test_splaplac.F90 | 47 ++ tests/test_splat.F90 | 50 ++ tests/test_sppad.F90 | 51 ++ tests/test_sptezv.F90 | 79 ++ tests/test_sptrung.F90 | 41 + tests/test_sptrungv.F90 | 58 ++ tests/test_vector_grib1.F90 | 12 +- tests/test_vector_grib2.F90 | 12 +- 103 files changed, 9297 insertions(+), 390 deletions(-) create mode 100644 src/fftpack.F create mode 100644 src/lapack_gen.F create mode 100644 src/ncpus.F create mode 100644 src/spanaly.f create mode 100644 src/spdz2uv.f create mode 100644 src/speps.f create mode 100644 src/spfft.f create mode 100644 src/spfft1.f create mode 100644 src/spffte.f create mode 100644 src/spfftpt.f create mode 100644 src/spgradq.f create mode 100644 src/spgradx.f create mode 100644 src/spgrady.f create mode 100644 src/splaplac.f create mode 100644 src/splat.F create mode 100644 src/splegend.f create mode 100644 src/sppad.f create mode 100644 src/spsynth.f create mode 100644 src/sptez.f create mode 100644 src/sptezd.f create mode 100644 src/sptezm.f create mode 100644 src/sptezmd.f create mode 100644 src/sptezmv.f create mode 100644 src/sptezv.f create mode 100644 src/sptgpm.f create mode 100644 src/sptgpmd.f create mode 100644 src/sptgpmv.f create mode 100644 src/sptgps.f create mode 100644 src/sptgpsd.f create mode 100644 src/sptgpsv.f create mode 100644 src/sptgpt.f create mode 100644 src/sptgptd.f create mode 100644 src/sptgptsd.f create mode 100644 src/sptgptv.f create mode 100644 src/sptgptvd.f create mode 100644 src/sptran.f create mode 100644 src/sptrand.f create mode 100644 src/sptranf.f create mode 100644 src/sptranf0.f create mode 100644 src/sptranf1.f create mode 100644 src/sptranfv.f create mode 100644 src/sptranv.f create mode 100644 src/sptrun.f create mode 100644 src/sptrund.f create mode 100644 src/sptrung.f create mode 100644 src/sptrungv.f create mode 100644 src/sptrunl.f create mode 100644 src/sptrunm.f create mode 100644 src/sptrunmv.f create mode 100644 src/sptruns.f create mode 100644 src/sptrunsv.f create mode 100644 src/sptrunv.f create mode 100644 src/spuv2dz.f create mode 100644 src/spvar.f create mode 100644 src/spwget.f create mode 100644 tests/data/README create mode 100644 tests/data/sptrung.gi.in create mode 100644 tests/data/sptrungv.ll.in create mode 100644 tests/data/sptrungv.uv.in create mode 100644 tests/data/sptrungv.uv.out create mode 100644 tests/input_data_mod_grib1_4.F90 create mode 100644 tests/input_data_mod_grib1_8.F90 create mode 100644 tests/input_data_mod_grib1_d.F90 create mode 100644 tests/input_data_mod_grib2_4.F90 create mode 100644 tests/input_data_mod_grib2_8.F90 create mode 100644 tests/input_data_mod_grib2_d.F90 create mode 100644 tests/interp_mod_grib1_4.F90 create mode 100644 tests/interp_mod_grib1_8.F90 create mode 100644 tests/interp_mod_grib1_d.F90 create mode 100644 tests/interp_mod_grib2_4.F90 create mode 100644 tests/interp_mod_grib2_8.F90 create mode 100644 tests/interp_mod_grib2_d.F90 create mode 100644 tests/test_fft.F90 create mode 100644 tests/test_ncpus.F90 create mode 100644 tests/test_splaplac.F90 create mode 100644 tests/test_splat.F90 create mode 100644 tests/test_sppad.F90 create mode 100644 tests/test_sptezv.F90 create mode 100644 tests/test_sptrung.F90 create mode 100644 tests/test_sptrungv.F90 diff --git a/.github/workflows/Intel.yml b/.github/workflows/Intel.yml index 36afb0fc..22cec949 100644 --- a/.github/workflows/Intel.yml +++ b/.github/workflows/Intel.yml @@ -37,33 +37,8 @@ jobs: rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list sudo apt-get update - sudo apt-get install intel-oneapi-dev-utilities intel-oneapi-mpi-devel intel-oneapi-openmp intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic + sudo apt-get install intel-oneapi-openmp intel-oneapi-compiler-fortran-2023.2.1 intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic-2023.2.1 echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bash_profile - - - name: cache-sp - id: cache-sp - uses: actions/cache@v2 - with: - path: ~/sp - key: sp-${{ runner.os }}-Intel-${{ matrix.compilers }}-${{ matrix.openmp }} - - - name: checkout-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - uses: actions/checkout@v2 - with: - repository: NOAA-EMC/NCEPLIBS-sp - path: sp - ref: develop - - - name: build-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - run: | - cd sp - mkdir build - cd build - ${{ matrix.compilers }} cmake -DCMAKE_INSTALL_PREFIX=~/sp -DOPENMP=${{ matrix.openmp}} -DBUILD_8=ON .. - make -j2 - make install - name: checkout uses: actions/checkout@v2 @@ -75,7 +50,7 @@ jobs: cd ip mkdir build cd build - ${{ matrix.compilers }} cmake -DOPENMP=${{ matrix.openmp }} -DBUILD_SHARED_LIBS=OFF -DCMAKE_PREFIX_PATH="~/sp" -DBUILD_8=ON .. + ${{ matrix.compilers }} cmake -DOPENMP=${{ matrix.openmp }} -DBUILD_SHARED_LIBS=OFF -DBUILD_8=ON .. make -j2 VERBOSE=1 - name: test diff --git a/.github/workflows/Linux.yml b/.github/workflows/Linux.yml index f3206ca5..54a38060 100644 --- a/.github/workflows/Linux.yml +++ b/.github/workflows/Linux.yml @@ -26,36 +26,10 @@ jobs: steps: - - name: cache-sp - id: cache-sp - uses: actions/cache@v2 - with: - path: ~/sp - key: sp-${{ runner.os }}-Linux-${{ matrix.openmp }}-2.3.3-1 - - - name: checkout-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - uses: actions/checkout@v2 - with: - repository: NOAA-EMC/NCEPLIBS-sp - path: sp - ref: v2.3.3 - - - name: build-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - run: | - cd sp - mkdir build - cd build - cmake -DCMAKE_INSTALL_PREFIX=~/sp -DOPENMP=${{ matrix.openmp }} ${{ matrix.options }} .. - make -j2 - make install - - name: checkout uses: actions/checkout@v2 with: path: ip - submodules: true - name: build run: | @@ -63,10 +37,9 @@ jobs: mkdir build cd build cmake -DCMAKE_PREFIX_PATH="~/" -DOPENMP=${{ matrix.openmp }} ${{ matrix.options }} .. - make -j2 + make -j2 VERBOSE=1 - name: test run: | cd $GITHUB_WORKSPACE/ip/build ctest --verbose --output-on-failure --rerun-failed - diff --git a/.github/workflows/MacOS.yml b/.github/workflows/MacOS.yml index dc722c1c..9a6efc9c 100644 --- a/.github/workflows/MacOS.yml +++ b/.github/workflows/MacOS.yml @@ -25,33 +25,6 @@ jobs: steps: - - name: cache-sp - id: cache-sp - uses: actions/cache@v2 - with: - path: ~/sp - key: sp-${{ matrix.openmp }}-MacOS-2.3.3-1 - - - name: checkout-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - uses: actions/checkout@v2 - with: - repository: NOAA-EMC/NCEPLIBS-sp - path: sp - ref: v2.3.3 - - - name: build-sp - if: steps.cache-sp.outputs.cache-hit != 'true' - run: | - cd sp - mkdir build - cd build - cmake -DOPENMP=${{ matrix.openmp }} -DCMAKE_INSTALL_PREFIX=~/sp -DBUILD_SHARED_LIBS=${{ matrix.sharedlibs }} -DBUILD_8=ON .. - make -j2 - make install - ls -l ~/sp - ls -l ~/sp/lib - - name: checkout uses: actions/checkout@v2 with: @@ -62,7 +35,7 @@ jobs: cd ip mkdir build cd build - cmake -DOPENMP=${{ matrix.openmp }} -DCMAKE_PREFIX_PATH="~/sp" -DBUILD_SHARED_LIBS=${{ matrix.sharedlibs }} -DCMAKE_INSTALL_PREFIX=~/install -DBUILD_8=ON .. + cmake -DOPENMP=${{ matrix.openmp }} -DBUILD_SHARED_LIBS=${{ matrix.sharedlibs }} -DCMAKE_INSTALL_PREFIX=~/install -DBUILD_8=ON .. make -j2 VERBOSE=2 make install ls -l ~/install diff --git a/.github/workflows/Spack.yml b/.github/workflows/Spack.yml index 633850c6..6f3558d5 100644 --- a/.github/workflows/Spack.yml +++ b/.github/workflows/Spack.yml @@ -21,10 +21,7 @@ jobs: strategy: matrix: os: ["ubuntu-latest"] - openmp: ["+openmp", "~openmp"] - sharedlibs: ["+shared", "~shared"] - pic: ["+pic", "~pic"] - precision: ["d", "4", "8"] + variants: ["+openmp +shared +pic precision=d", "+openmp ~shared ~pic precision=4", "~openmp ~shared +pic precision=8"] runs-on: ${{ matrix.os }} steps: @@ -42,16 +39,18 @@ jobs: spack env activate ip-env cp $GITHUB_WORKSPACE/ip/spack/package.py $SPACK_ROOT/var/spack/repos/builtin/packages/ip/package.py spack develop --no-clone --path $GITHUB_WORKSPACE/ip ip@develop - spack add ip@develop%gcc@11 ${{ matrix.openmp }} ${{ matrix.sharedlibs }} ${{ matrix.pic }} precision=${{ matrix.precision }} target=x86_64 - if [ ${{ matrix.precision }} == "d" ]; then spack add grib-util@develop ; fi + spack add ip@develop%gcc@11 ${{ matrix.variants }} target=x86_64 + precision=$(echo ${{ matrix.variants }} | grep -oP " precision=\K[4d8]") + if [ "$precision" == "d" ]; then spack add grib-util@develop ; fi spack external find cmake gmake spack concretize # Run installation and run CTest suite spack install --verbose --fail-fast --test root # Run 'spack load' and check that key build options were respected spack load ip - if [ ${{ matrix.sharedlibs }} == "+shared" ]; then suffix="so" ; else suffix="a"; fi - ls ${IP_LIB${{ matrix.precision }}} | grep -cE '/libip_${{ matrix.precision }}\.'$suffix'$' + if [[ "${{ matrix.variants }}" =~ "+shared" ]]; then suffix="so" ; else suffix="a"; fi + libvar=IP_LIB${precision} + ls ${!libvar} | grep -cE "/libip_${precision}\."$suffix'$' # This job validates the Spack recipe by making sure each cmake build option is represented recipe-check: @@ -67,7 +66,7 @@ jobs: - name: recipe-check run: | echo "If this jobs fails, look at the most recently output CMake option below and make sure that option appears in spack/package.py" - for opt in $(grep -ioP '^option\(\K(?!(ENABLE_DOCS))[^ ]+' $GITHUB_WORKSPACE/ip/CMakeLists.txt) ; do + for opt in $(grep -ioP '^option\(\K(?!(ENABLE_DOCS|TEST_TIME_LIMIT))[^ ]+' $GITHUB_WORKSPACE/ip/CMakeLists.txt) ; do echo "Checking for presence of '$opt' CMake option in package.py" grep -cP "define.+\b${opt}\b" $GITHUB_WORKSPACE/ip/spack/package.py done diff --git a/.github/workflows/developer.yml b/.github/workflows/developer.yml index 6f234f54..2c1ff20e 100644 --- a/.github/workflows/developer.yml +++ b/.github/workflows/developer.yml @@ -28,21 +28,6 @@ jobs: sudo apt-get install doxygen python3 -m pip install gcovr - - name: checkout-sp - uses: actions/checkout@v2 - with: - repository: NOAA-EMC/NCEPLIBS-sp - path: sp - - - name: build-sp - run: | - cd sp - mkdir build - cd build - cmake -DOPENMP=ON -DCMAKE_INSTALL_PREFIX=~/sp -DBUILD_8=ON .. - make -j2 - make install - - name: checkout uses: actions/checkout@v2 with: @@ -53,7 +38,7 @@ jobs: cd ip mkdir build cd build - cmake -DENABLE_DOCS=YES -DCMAKE_PREFIX_PATH="~/" -DOPENMP=ON -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -fsanitize=address" -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON -DBUILD_8=ON .. + cmake -DENABLE_DOCS=YES -DOPENMP=ON -DCMAKE_Fortran_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -fsanitize=address" -DCMAKE_C_FLAGS="-g -fprofile-abs-path -fprofile-arcs -ftest-coverage -O0 -fsanitize=address" -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=ON -DBUILD_8=ON .. make -j2 VERBOSE=1 - name: test @@ -69,7 +54,7 @@ jobs: - name: upload-test-coverage uses: actions/upload-artifact@v2 with: - name: test-coverage + name: ip-test-coverage path: | ip/build/*.html ip/build/*.css diff --git a/CMakeLists.txt b/CMakeLists.txt index bbb02373..b7803f43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,12 +13,14 @@ project(ip VERSION ${pVersion} LANGUAGES C Fortran) include(GNUInstallDirs) # Handle user options. -option(ENABLE_DOCS "Enable generation of doxygen-based documentation." OFF) +option(ENABLE_DOCS "Enable generation of Doxygen-based documentation" OFF) option(OPENMP "Use OpenMP threading" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) -option(BUILD_4 "Build the 4-byte real version of the library, libip_4.a" ON) -option(BUILD_D "Build the 8-byte real version of the library, libip_d.a" ON) -option(BUILD_8 "Build the 8-byte integer version of the library, libsp_8.a" OFF) +option(BUILD_4 "Build the 4-byte real version of the library, libip_4.{a,so}" ON) +option(BUILD_D "Build the 8-byte real version of the library, libip_d.{a,so}" ON) +option(BUILD_8 "Build the 8-byte integer & real version of the library, libip_8.{a,so}" OFF) +option(BUILD_DEPRECATED "Build deprecated spectral processing functions" OFF) +option(TEST_TIME_LIMIT "Set timeout for tests" OFF) # Figure whether user wants a _4, a _d, and/or _8. if(BUILD_4) @@ -47,9 +49,6 @@ if(OPENMP) find_package(OpenMP REQUIRED COMPONENTS Fortran) endif() -# We need the NCEPLIBS-sp library. -find_package(sp 2.3.0 REQUIRED) - # Set compiler flags. if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|IntelLLVM)$") set(CMAKE_Fortran_FLAGS "-g -traceback -assume byterecl -fp-model strict -fpp -auto ${CMAKE_Fortran_FLAGS}") @@ -61,10 +60,13 @@ if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|IntelLLVM)$") set(fortran_d_flags "-r8") set(fortran_8_flags "-i8 -r8") elseif(CMAKE_Fortran_COMPILER_ID MATCHES "^(GNU)$") - set(CMAKE_Fortran_FLAGS "-g -fbacktrace -cpp -fimplicit-none ${CMAKE_Fortran_FLAGS}") + set(CMAKE_Fortran_FLAGS "-g -fbacktrace -cpp ${CMAKE_Fortran_FLAGS}") set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -ggdb -Wall -Wno-unused-dummy-argument -Wsurprising -Wextra -fcheck=all") set(fortran_d_flags "-fdefault-real-8") set(fortran_8_flags "-fdefault-integer-8 -fdefault-real-8") + if(${CMAKE_Fortran_COMPILER_VERSION} VERSION_GREATER_EQUAL 10) + set(CMAKE_Fortran_FLAGS "-w -fallow-argument-mismatch -fallow-invalid-boz ${CMAKE_Fortran_FLAGS}") + endif() endif() # This is the source code directiroy. diff --git a/LICENSE.md b/LICENSE.md index a0819a18..09061024 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ -Copyright 2020 National Oceanic and Atmospheric Administration (by assignment from I. M. Systems Group) +Copyright 2020 National Oceanic and Atmospheric Administration -The [NCEPLIBS-ip2] code incorporated in the Unified Forecast System (UFS) was jointly developed by the National Oceanic and Atmospheric Administration and the I. M. Systems Group. The gold standard copy of the Code will be maintained by NOAA at [https://github.com/NOAA-EMC/NCEPLIBS-ip2]. +The [NCEPLIBS-ip] repository is maintained by NOAA at [https://github.com/NOAA-EMC/NCEPLIBS-ip]. The National Oceanic and Atmospheric Administration is releasing this code under the GNU Lesser General Public License v3.0 (the "License"); you may not use this code except in compliance with the License. diff --git a/README.md b/README.md index f33e795e..a6c86ef3 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@ # Interpolation Library -The NCEP general interpolation library contains Fortran 90 -subprograms to be used for interpolating between nearly all grids used -at NCEP. The library is particularly efficient when interpolating many -fields at one time. +The NCEP general interpolation library contains Fortran 90 subprograms to be +used for interpolating between nearly all grids used at NCEP. The library is +particularly efficient when interpolating many fields at one time. It also +contains routines for spectral transforms and other processing, including those +previously contained in the NCEPLIBS-sp library. This is part of the [NCEPLIBS](https://github.com/NOAA-EMC/NCEPLIBS) project. -There are currently six interpolation methods available in the -library: +There are currently six interpolation methods available in the library: - bilinear - bicubic - neighbor @@ -27,40 +27,42 @@ To submit bug reports, feature requests, or other code-related issues including * NCEP/EMC Developers -Code Manager: [George Gayno](mailto:george.gayno@noaa.gov) +Code Manager: [Alex Richert](mailto:alexander.richert@noaa.gov) ### Prerequisites -This package requires the [NCEPLIBS-sp](https://github.com/NOAA-EMC/NCEPLIBS-sp) library. +This package does not link to any other libraries, but requires CMake (version +3.15+) to build. ### Installing ``` mkdir build cd build -cmake -DCMAKE_INSTALL_PREFIX=/path/to/install /path/to/NCEPLIBS-ip2 +cmake -DCMAKE_INSTALL_PREFIX=/path/to/install /path/to/NCEPLIBS-ip make -j2 -make test (or ctest --verbose) +make test # (or ctest --verbose) make install ``` ### Usage -To use the ip library add `use ip_mod` to your Fortran code. It contains all the necessary public interfaces. +Most routines and any public interfaces required can be accessed by adding `use +ip_mod` to your Fortran code. Most spectral transform and processing subroutines +can be accessed by calling them in your code (no `use` statement) and linking +to the ip library at build time. ## Disclaimer -The United States Department of Commerce (DOC) GitHub project code is -provided on an "as is" basis and the user assumes responsibility for -its use. DOC has relinquished control of the information and no longer -has responsibility to protect the integrity, confidentiality, or -availability of the information. Any claims against the Department of -Commerce stemming from the use of its GitHub project will be governed -by all applicable Federal law. Any reference to specific commercial -products, processes, or services by service mark, trademark, -manufacturer, or otherwise, does not constitute or imply their -endorsement, recommendation or favoring by the Department of -Commerce. The Department of Commerce seal and logo, or the seal and -logo of a DOC bureau, shall not be used in any manner to imply -endorsement of any commercial product or activity by DOC or the United -States Government. +The United States Department of Commerce (DOC) GitHub project code is provided +on an "as is" basis and the user assumes responsibility for its use. DOC has +relinquished control of the information and no longer has responsibility to +protect the integrity, confidentiality, or availability of the information. Any +claims against the Department of Commerce stemming from the use of its GitHub +project will be governed by all applicable Federal law. Any reference to +specific commercial products, processes, or services by service mark, trademark, +manufacturer, or otherwise, does not constitute or imply their endorsement, +recommendation or favoring by the Department of Commerce. The Department of +Commerce seal and logo, or the seal and logo of a DOC bureau, shall not be used +in any manner to imply endorsement of any commercial product or activity by DOC +or the United States Government. diff --git a/VERSION b/VERSION index fdc66988..0062ac97 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.4.0 +5.0.0 diff --git a/cmake/PackageConfig.cmake.in b/cmake/PackageConfig.cmake.in index c63b4fb5..e4e05327 100644 --- a/cmake/PackageConfig.cmake.in +++ b/cmake/PackageConfig.cmake.in @@ -9,8 +9,6 @@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") include(CMakeFindDependencyMacro) -find_dependency(sp CONFIG) - if(@OPENMP@) find_dependency(OpenMP COMPONENTS Fortran) endif() diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index d25a6e1e..6927d5c3 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -763,7 +763,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -886,6 +886,8 @@ INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.f90 \ *.F90 \ + *.f \ + *.F \ *.c \ *.h @@ -1011,7 +1013,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = @abs_top_srcdir@/docs/sp_user_guide.md +USE_MDFILE_AS_MAINPAGE = @abs_top_srcdir@/docs/user_guide.md #--------------------------------------------------------------------------- # Configuration options related to source browsing diff --git a/docs/user_guide.md b/docs/user_guide.md index 72fd7ca8..2a188177 100644 --- a/docs/user_guide.md +++ b/docs/user_guide.md @@ -1,21 +1,29 @@ -@mainpage - ## Introduction -The NCEP general interpolation library (NCEPLIBS-ip) contains Fortran -90 subprograms to be used for interpolating between nearly all grids -used at NCEP. The library is particularly efficient when interpolating -many fields at one time. - -NCEPLIBS-ip supports compilation with the GNU Compiler Collection -(gfortran), Intel Classic (ifort), and Intel OneAPI (ifx) compilers. -In the case of Intel LLVM, it is recommended to use at least version -2023.2.1 to avoid any number of compiler issues. +The NCEP general interpolation library (NCEPLIBS-ip) contains Fortran 90 +subprograms to be used for interpolating between nearly all grids used at NCEP. +The library is particularly efficient when interpolating many fields at one +time. It also contains functionality for interpolating, transforming, and +otherwise manipulating spectral data (these functions were formerly contained in +the NCEPLIBS-sp library). + +NCEPLIBS-ip supports compilation with the GNU Compiler Collection (gfortran), +Intel Classic (ifort), and Intel OneAPI (ifx) compilers. In the case of Intel +OneAPI (IntelLLVM), it is recommended to use at least version 2023.2.1 to avoid +any number of compiler issues. + +\note Some routines may behave poorly or unpredictably when using 4-byte reals +(libip_4). For instance, there is an ATAN2 function used for polar stereo grids +where for certain regions of certain grids, floating point differences between +4-byte output values (~1e-7) can be amplified into sizable differences in output +field values. Some applications may therefore benefit from the use of 8-byte +reals (libip_d or libip_8). ## Interpolation -There are currently six interpolation methods available in the -library: +### Interpolation Methods + +There are currently six interpolation methods available in the library: - bilinear - bicubic - neighbor @@ -26,111 +34,96 @@ library: Some of the methods have interpolation sub-options. A few methods have restrictions on the type of input or output grids. -Several methods can perform interpolation on fields with bitmaps -(i.e. some points on the input grid may be undefined). In this case, -the bitmap is interpolated to the output grid. Only valid input points -are used to interpolate to valid output points. An output bitmap will -also be created to locate invalid data where the output grid extends -outside the domain of the input grid. - -The driver routines for interpolating scalars and vectors may be found -in ipolates_mod. The interpolation method is chosen via the first -argument of these routines (variable IP). Sub-options are set via the -IPOPT array. +Several methods can perform interpolation on fields with bitmaps (i.e. some +points on the input grid may be undefined). In this case, the bitmap is +interpolated to the output grid. Only valid input points are used to interpolate +to valid output points. An output bitmap will also be created to locate invalid +data where the output grid extends outside the domain of the input grid. -It should be noted that some routines may behave poorly or unpredictably when -using 4-byte reals (libip_4). For instance, there is an ATAN2 function -used for polar stereo grids where for certain grids/coordinates, floating point -differences between 4-byte output values (~1e-7) can be amplified into -noticeable differences in output field values. Some applications may therefore -benefit from the use of 8-byte reals (libip_d). +The driver routines for interpolating scalars and vectors may be found in +ipolates_mod. The interpolation method is chosen via the first argument of these +routines (variable IP). Sub-options are set via the IPOPT array. -### Bilinear Interpolation +#### Bilinear Interpolation Method Bilinear interpolation is chosen by setting IP=0. This method has two sub-options: -1. The percent of valid input data required to make output data (the -default is 50%). +1. The percent of valid input data required to make output data (the default is + 50%). -2. If valid input data is not found near an a spiral search may be -performed. The spiral search is only an option for scalar data. +2. If valid input data is not found near an a spiral search may be performed. + The spiral search is only an option for scalar data. -The bilinear method has no restrictions and can interpolate with -bitmaps. +The bilinear method has no restrictions and can interpolate with bitmaps. -### Bicubic Interpolation +#### Bicubic Interpolation Method Bicubic interpolation is chosen by setting IP=1. This method has two sub-options: -1. A monotonic constraint option for straight bicubic or for -constraining the output value to be within the range of the four -surrounding input values. -2. The percent of valid input data required to make output data, which -defaults to 50%. +1. A monotonic constraint option for straight bicubic or for constraining the + output value to be within the range of the four surrounding input values. +2. The percent of valid input data required to make output data, which defaults + to 50%. The bicubic method cannot interpolate data with bitmaps. -### Neighbor Interpolation +#### Neighbor Interpolation Method Neighbor interpolation is chosen by setting IP=2. -Neighbor interpolation means that the output value is set to the -nearest input value. It would be appropriate for interpolating integer -fields such as vegetation index. +Neighbor interpolation means that the output value is set to the nearest input +value. It would be appropriate for interpolating integer fields such as +vegetation index. -This method has one sub-option: If valid input data is not found near an -an output point, a spiral search is optionally performed. +This method has one sub-option: If valid input data is not found near an an +output point, a spiral search is optionally performed. -The neighbor method has no restrictions and can interpolate with -bitmaps. +The neighbor method has no restrictions and can interpolate with bitmaps. -### Budget interpolation +#### Budget Interpolation Method Budget interpolation is chosen by setting IP=3. -Budget interpolation means a low-order interpolation method that -quasi-conserves area averages. It would be appropriate for -interpolating budget fields such as precipitation. +Budget interpolation means a low-order interpolation method that quasi-conserves +area averages. It would be appropriate for interpolating budget fields such as +precipitation. -This method assumes that the field really represents box averages -where each box extends halfway to its neighboring grid point in each -direction. The method actually averages bilinearly interpolated -values in a square array of points distributed within each output grid -box. +This method assumes that the field really represents box averages where each box +extends halfway to its neighboring grid point in each direction. The method +actually averages bilinearly interpolated values in a square array of points +distributed within each output grid box. There are several sub-options: -1. The number of points in the radius of the square array may be set. -The default is 2, meaning that 25 sample points will be averaged for -each output value. +1. The number of points in the radius of the square array may be set. The + default is 2, meaning that 25 sample points will be averaged for each output + value. -2. The respective averaging weights for the radius points are -adjustable. The default is for all weights equal to 1, giving an -unweighted average. +2. The respective averaging weights for the radius points are adjustable. The + default is for all weights equal to 1, giving an unweighted average. -3. Optionally, one may assume the boxes stretch nearly all the way to -each of the neighboring grid points and the weights are the adjoint of -the bilinear interpolation weights. +3. Optionally, one may assume the boxes stretch nearly all the way to each of + the neighboring grid points and the weights are the adjoint of the bilinear + interpolation weights. -4. The percent of valid input data required to make output data is -adjustable. The default is 50%. +4. The percent of valid input data required to make output data is adjustable. + The default is 50%. -5. In cases where there is no or insufficient valid input data, a -spiral search may be invoked to search for the nearest valid data. -search square (scalar interpolation only). +5. In cases where there is no or insufficient valid input data, a spiral search + may be invoked to search for the nearest valid data. search square (scalar + interpolation only). This method can interpolate data with bitmaps. -### Spectral Interpolation +#### Spectral Interpolation Method -Spectral interpolation is chosen by setting IP=4. +The spectral interpolation scheme is chosen by setting IP=4. -This method has two -sub-options: +This method has two sub-options: 1. set the spectral shape (triangular or rhomboidal) @@ -139,54 +132,51 @@ sub-options: The input grid must be a global cylindrical grid (either Gaussian or equidistant). This method cannot interpolate data with bitmaps. -Unless the output grid is a global cylindrical grid, a polar -stereographic grid centered at the pole, or a Mercator grid, this -method can be quite expensive. +Unless the output grid is a global cylindrical grid, a polar stereographic grid +centered at the pole, or a Mercator grid, this method can be quite expensive. -### Neighbor-Budget Interpolation +#### Neighbor-Budget Interpolation Method Neighbor-budget interpolation is chosen by setting IP=6. -This method computes weighted averages of neighbor points arranged in -a square box centered around each output grid point and stretching -nearly halfway to each of the neighboring grid points. The main -difference with the budget interpolation (IP=3) is neighbor vs -bilinear interpolation of the square box of points. +This method computes weighted averages of neighbor points arranged in a square +box centered around each output grid point and stretching nearly halfway to each +of the neighboring grid points. The main difference with the budget +interpolation (IP=3) is neighbor vs bilinear interpolation of the square box of +points. There are the following sub-options: -1. The number of points in the radius of the square array may be set. -The default is 2, meaning that 25 sample points will be averaged for -each output value. +1. The number of points in the radius of the square array may be set. The + default is 2, meaning that 25 sample points will be averaged for each output + value. -2. The respective averaging weights for the radius points are -adjustable. The default is for all weights equal to 1, giving an -unweighted average. +2. The respective averaging weights for the radius points are adjustable. The + default is for all weights equal to 1, giving an unweighted average. -3. The percent of valid input data required to make output data is -adjustable. The default is 50%. +3. The percent of valid input data required to make output data is adjustable. + The default is 50%. -## Vectors and Scalars +### Vectors and Scalars -The library can handle two-dimensional vector fields as well as scalar -fields. The input and output vectors are rotated if necessary so that -they are either resolved relative to their defined grid in the -direction of increasing x and y coordinates or resolved relative to -eastward and northward directions on the earth. The rotation is -determined by the grid definitions. +The library can handle two-dimensional vector fields as well as scalar fields. +The input and output vectors are rotated if necessary so that they are either +resolved relative to their defined grid in the direction of increasing x and y +coordinates or resolved relative to eastward and northward directions on the +earth. The rotation is determined by the grid definitions. Vectors are generally interpolated (by all methods except spectral -interpolation) by moving the relevant input vectors along a great -circle to the output point, keeping their orientations with respect to -the great circle constant, before independently interpolating the -respective components. This ensures that vector interpolation will be -consistent over the whole globe including the poles. +interpolation) by moving the relevant input vectors along a great circle to the +output point, keeping their orientations with respect to the great circle +constant, before independently interpolating the respective components. This +ensures that vector interpolation will be consistent over the whole globe +including the poles. -## Grids +### Grids -The input and output grids are defined by their respective GRIB2 grid -definition template and template number as decoced by the NCEP G2 -library. There are six map projections recognized by the library: +The input and output grids are defined by their respective GRIB2 grid definition +template and template number as decoced by the NCEP G2 library. There are six +map projections recognized by the library: Grid Template Number | Map projection ---------------------|--------------- @@ -197,40 +187,37 @@ Grid Template Number | Map projection 30 | Lambert conformal conical 40 | Gaussian equidistant cyclindrical -If the output grid definition template number is negative, then the -output data may be just a set of station points. In this case, the -user must pass the number of points to be output along with their -latitudes and longitudes. +If the output grid definition template number is negative, then the output data +may be just a set of station points. In this case, the user must pass the number +of points to be output along with their latitudes and longitudes. -For vector interpolation, the vector rotations parameters must also be -passed. On the other hand, for non-negative output data representation -types, the number of output grid points and their latitudes and -longitudes (and the vector rotation parameters for vector -interpolation) are all returned by the interpolation subprograms. +For vector interpolation, the vector rotations parameters must also be passed. +On the other hand, for non-negative output data representation types, the number +of output grid points and their latitudes and longitudes (and the vector +rotation parameters for vector interpolation) are all returned by the +interpolation subprograms. -If an output equidistant cylindrical grid contains multiple pole -points, then the pole points are forced to be self-consistent. That -is, scalar fields are obliged to be constant at the pole and vector -components are obliged to exhibit a wavenumber one variation at the -pole. +If an output equidistant cylindrical grid contains multiple pole points, then +the pole points are forced to be self-consistent. That is, scalar fields are +obliged to be constant at the pole and vector components are obliged to exhibit +a wavenumber one variation at the pole. -Generally, only regular grids can be interpolated in this -library. However, the thinned WAFS grids may be expanded to a regular -grid (or vice versa) using subprograms ipxwafs(), ipxwafs2(), or -ipxwafs3(). Eta data (with Arakawa "E" staggering) on the "H" or "V" -grid may be expanded to a filled regular grid (or vice versa) using -subprogram ipxetas(). +Generally, only regular grids can be interpolated in this library. However, the +thinned WAFS grids may be expanded to a regular grid (or vice versa) using +subprograms ipxwafs(), ipxwafs2(), or ipxwafs3(). Eta data (with Arakawa "E" +staggering) on the "H" or "V" grid may be expanded to a filled regular grid (or +vice versa) using subprogram ipxetas(). -## Return Codes +### Return Codes -The return code issued by an interpolation subprogram determines -whether it ran successfully or how it failed. Check nonzero return -codes against the docblock of the respective subprogram. +The return code issued by an interpolation subprogram determines whether it ran +successfully or how it failed. Check nonzero return codes against the docblock +of the respective subprogram. -## Entry point list +### Entry point list: interpolation -Scalar and vecotr field interpolation subprograms can be found in the -relevant module documentation: +Scalar and vecotr field interpolation subprograms can be found in the relevant +module documentation: Name | Function ---- |--------- @@ -268,16 +255,98 @@ ipxwafs() | expand or contract wafs grids ipxwafs2() | expand or contract wafs grids ipxwafs3() | expand or contract wafs grids -## How to invoke ip2lib: examples - -
-***********************************************************************
-Example 1. Read a grib 2 file of scalar data on a global regular
-            1-deg lat/lon grid and call ipolates to interpolate
-            it to NCEP standard grid 218, a lambert conformal grid.
-            Uses the NCEP G2 library to degrib the data.
-***********************************************************************
-
+## Spectral Transformation & Processing
+
+The library's spectral processing subroutines can handle both scalar and
+two-dimensional vector fields. Each vector field will be represented in spectral
+space appropriately by its respective spherical divergence and curl (vorticity),
+thus avoiding the pole problems associated with representing components
+separately.
+
+Some of the functions performed by the library are spectral interpolations
+between two grids, spectral truncations in place on a grid, and basic spectral
+transforms between grid and wave space. Only global Gaussian or global
+equidistant cylindrical grids are allowed for transforming into wave space.
+There are no such restricitions on grids for transforming from wave space.
+However, there are special fast entry points for transforming wave space to
+polar stereographic and Mercator grids as well as the aforementioned cylindrical
+grids.
+
+The indexing of the cylindrical transform grids is totally general. The grids
+may run north to south or south to north; they may run east to west or west to
+east; they may start at any longitude as long as the prime meridian is on the
+grid; they may be dimensioned in any order (e.g. (i,j,k), (k,j,i),
+(i,k,nfield,j), etc.). Furthermore, the transform may be performed on only some
+of the latitudes at one time as long as both hemisphere counterparts are
+transformed at the same time (as in the global spectral model). The grid
+indexing will default to the customary global indexing, i.e. north to south,
+east to west, prime meridian as first longitude, and (i,j,k) order.
+
+The wave space may be either triangular or rhomboidal in shape. Its internal
+indexing is strictly "IBM order", i.e. zonal wavenumber is the slower index with
+the real and imaginary components always paired together. The imaginary
+components of all the zonally symmetric modes should always be zero, as should
+the global mean of any divergence and vorticity fields. The stride between the
+start of successive wave fields is general, defaulting to the computed length of
+each field.
+
+
+
+### Entry Point List: Spectral Interpolation & Transformation
+
+Spectral interpolations or truncations between grid and grid
+
+   Name        | Function
+   ----        | --------
+   sptrun()    | Spectrally truncate gridded scalar fields
+   sptrunv()   | Spectrally truncate gridded vector fields
+   sptrung()   | Spectrally interpolate scalars to stations
+   sptrungv()  | Spectrally interpolate vectors to stations
+   sptruns()   | Spectrally interpolate scalars to polar stereo
+   sptrunsv()  | Spectrally interpolate vectors to polar stereo
+   sptrunm()   | Spectrally interpolate scalars to Mercator
+   sptrunmv()  | Spectrally interpolate vectors to Mercator
+
+Spectral transforms between wave and grid
+
+   Name        | Function
+   ----        | ------------------------------------------------------------------
+   sptran()    | Perform a scalar spherical transform
+   sptranv()   | Perform a vector spherical transform
+   sptrand()   | Perform a gradient spherical transform
+   sptgpt()    | Transform spectral scalar to station points
+   sptgptv()   | Transform spectral vector to station points
+   sptgptd()   | Transform spectral to station point gradients
+   sptgps()    | Transform spectral scalar to polar stereo
+   sptgpsv()   | Transform spectral vector to polar stereo
+   sptgpsd()   | Transform spectral to polar stereo gradients
+   sptgpm()    | Transform spectral scalar to Mercator
+   sptgpmv()   | Transform spectral vector to Mercator
+   sptgpmd()   | Transform spectral to Mercator gradients
+
+Spectral transform utilities
+
+   Name        | Function
+   ----        | ------------------------------------------------------------------
+   spwget()    | Get wave-space constants
+   splat()     | Compute latitude functions
+   speps()     | Compute utility spectral fields
+   splegend()  | Compute Legendre polynomials
+   spanaly()   | Analyze spectral from Fourier
+   spsynth()   | Synthesize Fourier from spectral
+   spdz2uv()   | Compute winds from divergence and vorticity
+   spuv2dz()   | Compute divergence and vorticity from winds
+   spgradq()   | Compute gradient in spectral space
+   splaplac()  | Compute Laplacian in spectral space
+
+
+## Examples: Interpolation Routines
+
+Example 1. Read a grib 2 file of scalar data on a global regular 1-deg lat/lon
+grid and call ipolates to interpolate it to NCEP standard grid 218, a lambert
+conformal grid. Uses the NCEP G2 library to degrib the data.
+
+\code{fortran}
  program example_1
 
 use ip_mod
@@ -481,14 +550,14 @@ use ip_mod
  close(10)
 
  end program example_1
+\endcode
 
-***********************************************************************
 Example 2.  Read a grib 2 file of u/v wind data on a global regular
             1-deg lat/lon grid and call ipolatev to interpolate
             it to four random station points.  Uses the NCEP
             G2 library to degrib the data.
-***********************************************************************
 
+\code{fortran}
  program example_2
 
  use grib_mod  ! ncep grib 2 library
@@ -677,4 +746,339 @@ Example 2.  Read a grib 2 file of u/v wind data on a global regular
  enddo
 
  end program example_2
-
+\endcode + +## Examples: Spectral Processing & Transformation + +Example 1. Interpolate heights and winds from a latlon grid + to two antipodal polar stereographic grids. + Subprograms GETGB and PUTGB from w3lib are referenced. + +\code{fortran} +c unit number 11 is the input latlon grib file +c unit number 31 is the input latlon grib index file +c unit number 51 is the output northern polar stereographic grib file +c unit number 52 is the output southern polar stereographic grib file +c nominal spectral truncation is r40 +c maximum input gridsize is 360x181 +c maximum number of levels wanted is 12 + parameter(lug=11,lui=31,lun=51,lus=52) + parameter(iromb=1,maxwv=40,jf=360*181,kx=12) + integer kp5(kx),kp6(kx),kp7(kx) + integer kpo(kx) + data kpo/1000,850,700,500,400,300,250,200,150,100,70,50/ +c height + km=12 + kp5=7 + kp6=100 + kp7=kpo + call gs65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv) +c winds + km=12 + kp5=33 + kp6=100 + kp7=kpo + call gv65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv) +c + stop + end +c + subroutine gs65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv) +c interpolates a scalar field using spectral transforms. + integer kp5(km),kp6(km),kp7(km) +c output grids are 65x65 (381 km true at latitide 60). +c nh grid oriented at 280E; sh grid oriented at 100E. + parameter(nph=32,nps=2*nph+1,npq=nps*nps) + parameter(true=60.,xmesh=381.e3,orient=280.) + parameter(rerth=6.3712e6) + parameter(pi=3.14159265358979,dpr=180./pi) + real gn(npq,km),gs(npq,km) + integer jpds(25),jgds(22),kpds(25,km),kgds(22,km) + logical lb(jf) + real f(jf,km) +c + g2=((1.+sin(abs(true)/dpr))*rerth/xmesh)**2 + r2=2*nph**2 + rlatn1=dpr*asin((g2-r2)/(g2+r2)) + rlonn1=mod(orient+315,360.) + rlats1=-rlatn1 + rlons1=mod(rlonn1+270,360.) + jpds=-1 + do k=1,km + jpds(5)=kp5(k) + jpds(6)=kp6(k) + jpds(7)=kp7(k) + j=0 + call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k), + & lb,f(1,k),iret) + if(iret.ne.0) call exit(1) + if(mod(kpds(4,k)/64,2).eq.1) call exit(2) + enddo + idrt=kgds(1,1) + imax=kgds(2,1) + jmax=kgds(3,1) +c + call sptruns(iromb,maxwv,idrt,imax,jmax,km,nps, + & 0,0,0,jf,0,0,0,0,true,xmesh,orient,f,gn,gs) +c + do k=1,km + kpds(3,k)=27 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlatn1*1.e3) + kgds(5,k)=nint(rlonn1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(orient*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=0 + kgds(11,k)=64 + call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,gn(1,k),iret) + enddo + do k=1,km + kpds(3,k)=28 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlats1*1.e3) + kgds(5,k)=nint(rlons1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(mod(orient+180,360.)*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=128 + kgds(11,k)=64 + call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,gs(1,k),iret) + enddo +c + end +c + subroutine gv65(lug,lui,lun,lus,jf,km,kp5,kp6,kp7,iromb,maxwv) +c interpolates a vector field using spectral transforms. + integer kp5(km),kp6(km),kp7(km) +c output grids are 65x65 (381 km true at latitide 60). +c nh grid oriented at 280E; sh grid oriented at 100E. +c winds are rotated to be relative to grid coordinates. + parameter(nph=32,nps=2*nph+1,npq=nps*nps) + parameter(true=60.,xmesh=381.e3,orient=280.) + parameter(rerth=6.3712e6) + parameter(pi=3.14159265358979,dpr=180./pi) + real un(npq,km),vn(npq,km),us(npq,km),vs(npq,km) + integer jpds(25),jgds(22),kpds(25,km),kgds(22,km) + logical lb(jf) + real u(jf,km),v(jf,km) +c + g2=((1.+sin(abs(true)/dpr))*rerth/xmesh)**2 + r2=2*nph**2 + rlatn1=dpr*asin((g2-r2)/(g2+r2)) + rlonn1=mod(orient+315,360.) + rlats1=-rlatn1 + rlons1=mod(rlonn1+270,360.) + jpds=-1 + do k=1,km + jpds(5)=kp5(k) + jpds(6)=kp6(k) + jpds(7)=kp7(k) + j=0 + call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k), + & lb,u(1,k),iret) + if(iret.ne.0) call exit(1) + if(mod(kpds(4,k)/64,2).eq.1) call exit(2) + jpds=kpds(:,k) + jgds=kgds(:,k) + jpds(5)=jpds(5)+1 + j=0 + call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k), + & lb,v(1,k),iret) + if(iret.ne.0) call exit(1) + if(mod(kpds(4,k)/64,2).eq.1) call exit(2) + enddo + idrt=kgds(1,1) + imax=kgds(2,1) + jmax=kgds(3,1) +c + call sptrunsv(iromb,maxwv,idrt,imax,jmax,km,nps, + & 0,0,0,jf,0,0,0,0,true,xmesh,orient,u,v, + & .true.,un,vn,us,vs,.false.,dum,dum,dum,dum, + & .false.,dum,dum,dum,dum) +c + do k=1,km + kpds(3,k)=27 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlatn1*1.e3) + kgds(5,k)=nint(rlonn1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(orient*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=0 + kgds(11,k)=64 + kpds(5,k)=kp5(k) + call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,un(1,k),iret) + enddo + do k=1,km + kpds(3,k)=27 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlatn1*1.e3) + kgds(5,k)=nint(rlonn1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(orient*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=0 + kgds(11,k)=64 + kpds(5,k)=kp5(k)+1 + call putgb(lun,npq,kpds(1,k),kgds(1,k),lb,vn(1,k),iret) + enddo + do k=1,km + kpds(3,k)=28 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlats1*1.e3) + kgds(5,k)=nint(rlons1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(mod(orient+180,360.)*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=128 + kgds(11,k)=64 + kpds(5,k)=kp5(k) + call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,us(1,k),iret) + enddo + do k=1,km + kpds(3,k)=28 + kgds(1,k)=5 + kgds(2,k)=nps + kgds(3,k)=nps + kgds(4,k)=nint(rlats1*1.e3) + kgds(5,k)=nint(rlons1*1.e3) + kgds(6,k)=8 + kgds(7,k)=nint(mod(orient+180,360.)*1.e3) + kgds(8,k)=nint(xmesh) + kgds(9,k)=nint(xmesh) + kgds(10,k)=128 + kgds(11,k)=64 + kpds(5,k)=kp5(k)+1 + call putgb(lus,npq,kpds(1,k),kgds(1,k),lb,vs(1,k),iret) + enddo +c + end +\endcode + +Example 2. Spectrally truncate winds in place on a latlon grid. + +\code{fortran} +c unit number 11 is the input latlon grib file +c unit number 31 is the input latlon grib index file +c unit number 51 is the output latlon grib file +c nominal spectral truncation is r40 +c maximum input gridsize is 360x181 +c maximum number of levels wanted is 12 + parameter(lug=11,lui=31,luo=51) + parameter(iromb=1,maxwv=40,jf=360*181,kx=12) + integer kp5(kx),kp6(kx),kp7(kx) + integer kpo(kx) + data kpo/1000,850,700,500,400,300,250,200,150,100,70,50/ +c winds + km=12 + kp5=33 + kp6=100 + kp7=kpo + call gvr40(lug,lui,luo,jf,km,kp5,kp6,kp7,iromb,maxwv) +c + stop + end +c + subroutine gvr40(lug,lui,luo,jf,km,kp5,kp6,kp7,iromb,maxwv) +c interpolates a vector field using spectral transforms. + integer kp5(km),kp6(km),kp7(km) + integer jpds(25),jgds(22),kpds(25,km),kgds(22,km) + logical lb(jf) + real u(jf,km),v(jf,km) +c + jpds=-1 + do k=1,km + jpds(5)=kp5(k) + jpds(6)=kp6(k) + jpds(7)=kp7(k) + j=0 + call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k), + & lb,u(1,k),iret) + if(iret.ne.0) call exit(1) + if(mod(kpds(4,k)/64,2).eq.1) call exit(2) + jpds=kpds(:,k) + jgds=kgds(:,k) + jpds(5)=jpds(5)+1 + j=0 + call getgb(lug,lui,jf,j,jpds,jgds,kf,j,kpds(1,k),kgds(1,k), + & lb,v(1,k),iret) + if(iret.ne.0) call exit(1) + if(mod(kpds(4,k)/64,2).eq.1) call exit(2) + enddo + idrt=kgds(1,1) + imax=kgds(2,1) + jmax=kgds(3,1) +c + call sptrunv(iromb,maxwv,idrt,imax,jmax,idrt,imax,jmax,km, + & 0,0,0,jf,0,0,jf,0,u,v,.true.,u,v, + & .false.,dum,dum,.false.,dum,dum) +c + do k=1,km + kpds(5,k)=kp5(k) + call putgb(luo,kf,kpds(1,k),kgds(1,k),lb,u(1,k),iret) + enddo + do k=1,km + kpds(5,k)=kp5(k)+1 + call putgb(luo,kf,kpds(1,k),kgds(1,k),lb,v(1,k),iret) + enddo +c + end +\endcode + +Example 3. Compute latlon temperatures from spectral temperatures and + compute latlon winds from spectral divergence and vorticity. + +\code{fortran} +c unit number 11 is the input sigma file +c unit number 51 is the output latlon file +c nominal spectral truncation is t62 +c output gridsize is 144x73 +c number of levels is 28 + parameter(iromb=0,maxwv=62) + parameter(idrt=0,im=144,jm=73) + parameter(levs=28) + parameter(mx=(maxwv+1)*((iromb+1)*maxwv+2)/2) + real t(mx,levs),d(mx,levs),z(mx,levs) + real tg(im,jm,km),ug(im,jm,km),vg(im,jm,km) +c temperature + do k=1,4 + read(11) + enddo + do k=1,levs + read(11) (t(m,k),m=1,mx) + enddo + call sptran(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1, + & t,tg(1,1,1),tg(1,jm,1),1) + call sptran( + do k=1,levs + write(51) ((tg(i,j,k),i=1,im),j=1,jm) + enddo +c winds + do k=1,levs + read(11) (d(m,k),m=1,mx) + read(11) (z(m,k),m=1,mx) + enddo + call sptranv(iromb,maxwv,idrt,im,jm,levs,0,0,0,0,0,0,0,0,1, + & d,z,ug(1,1,1),ug(1,jm,1),vg(1,1,1),vg(1,jm,1),1) + do k=1,levs + write(51) ((ug(i,j,k),i=1,im),j=1,jm) + write(51) ((vg(i,j,k),i=1,im),j=1,jm) + enddo + end +\endcode diff --git a/spack/package.py b/spack/package.py index 5f43718c..662e4e8b 100644 --- a/spack/package.py +++ b/spack/package.py @@ -48,12 +48,18 @@ class Ip(CMakePackage): description="Set precision (_4/_d/_8 library versions)", when="@4.2:", ) + variant( + "deprecated", + default=False, + description="Build deprecated spectral interpolation functions", + when="@5.0:", + ) - depends_on("sp") + depends_on("sp", when="@:4") depends_on("sp@:2.3.3", when="@:4.0") - depends_on("sp precision=4", when="@4.1: precision=4") - depends_on("sp precision=d", when="@4.1: precision=d") - depends_on("sp precision=8", when="@4.1: precision=8") + depends_on("sp precision=4", when="@4.1:4 precision=4") + depends_on("sp precision=d", when="@4.1:4 precision=d") + depends_on("sp precision=8", when="@4.1:4 precision=8") def cmake_args(self): args = [ @@ -72,13 +78,16 @@ def cmake_args(self): if self.spec.satisfies("@4.2:"): args.append(self.define("BUILD_8", self.spec.satisfies("precision=8"))) + if self.spec.satisfies("@5:"): + args.append(self.define_from_variant("BUILD_DEPRECATED", "deprecated")) + return args def setup_run_environment(self, env): suffixes = ( self.spec.variants["precision"].value if self.spec.satisfies("@4.1:") - else ["4", "8", "d"] + else ("4", "8", "d") ) shared = False if self.spec.satisfies("@:4.0") else self.spec.satisfies("+shared") for suffix in suffixes: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bf272349..86ce0c81 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ # This is the CMake file for the src directory of NCEPLIBS-ip. # -# Mark Potts, Kyle Gerheiser, Ed Hartnett, Eric Engle +# Alex Richert, Mark Potts, Kyle Gerheiser, Ed Hartnett, Eric Engle # These are the source code filees. set(fortran_src gdswzd_c.F90 gdswzd_mod.F90 ipolates.F90 ipolatev.F90 @@ -13,7 +13,22 @@ ip_equid_cylind_grid_mod.F90 ip_lambert_conf_grid_mod.F90 ip_mercator_grid_mod.F90 ip_polar_stereo_grid_mod.F90 ip_rot_equid_cylind_egrid_mod.F90 ip_rot_equid_cylind_grid_mod.F90 ip_constants_mod.F90 ip_grids_mod.F90 ip_grid_factory_mod.F90 -ip_interpolators_mod.F90 earth_radius_mod.F90 polfix_mod.F90) +ip_interpolators_mod.F90 earth_radius_mod.F90 polfix_mod.F90 +fftpack.F lapack_gen.F ncpus.F spanaly.f spdz2uv.f speps.f spfft1.f spffte.f +spfftpt.f splaplac.f splat.F splegend.f sppad.f spsynth.f sptezd.f sptez.f +sptezmd.f sptezm.f sptezmv.f sptezv.f sptgpm.f sptgpmv.f sptgps.f sptgpsv.f +sptgpt.f sptgptv.f sptrand.f sptran.f sptranf0.f sptranf1.f sptranf.f sptranfv.f +sptranv.f sptrun.f sptrung.f sptrungv.f sptrunm.f sptrunmv.f sptruns.f +sptrunsv.f sptrunv.f spuv2dz.f spwget.f) + +if(BUILD_DEPRECATED) + set(fortran_src ${fortran_src} spfft.f spgradq.f spgradx.f spgrady.f sptgpmd.f + sptgpsd.f sptgptd.f sptgptsd.f sptgptvd.f sptrund.f sptrunl.f spvar.f) +endif() + +set_source_files_properties(fftpack.F PROPERTIES COMPILE_FLAGS -fcheck=no-bounds) +set_source_files_properties(sptranf.f PROPERTIES COMPILE_FLAGS -fcheck=no-bounds) +set_source_files_properties(sptranfv.f PROPERTIES COMPILE_FLAGS -fcheck=no-bounds) # Build _4, _d, and/or _8 depending on options provided to CMake foreach(kind ${kinds}) @@ -38,8 +53,7 @@ foreach(kind ${kinds}) # Set compiler flags. target_compile_definitions(${lib_name} PRIVATE "LSIZE=${kind_definition}") - set(BUILD_FLAGS "${fortran_${kind}_flags}") - set_target_properties(${lib_name} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(${lib_name} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") set_target_properties(${lib_name} PROPERTIES Fortran_MODULE_DIRECTORY "${module_dir}") target_include_directories(${lib_name} PUBLIC $ $) @@ -48,9 +62,6 @@ foreach(kind ${kinds}) if(OpenMP_Fortran_FOUND) target_link_libraries(${lib_name} PUBLIC OpenMP::OpenMP_Fortran) endif() - - # Link to sp library. - target_link_libraries(${lib_name} PUBLIC sp::sp_${kind}) list(APPEND LIB_TARGETS ${lib_name}) diff --git a/src/fftpack.F b/src/fftpack.F new file mode 100644 index 00000000..bb415a6a --- /dev/null +++ b/src/fftpack.F @@ -0,0 +1,1337 @@ +C> @file +C> @brief A concatination of the (FFTPACK)[https://netlib.org/fftpack/] library code. +C> +C> FFTPACK is a package of Fortran subprograms for the fast Fourier +C> transform of periodic and other symmetric sequences. It includes +C> complex, real, sine, cosine, and quarter-wave transforms. +C> +C>Reference: +C>- P.N. Swarztrauber, Vectorizing the FFTs, in Parallel Computations +C>(G. Rodrigue, ed.), Academic Press, 1982, pp. 51--83. +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + +C> dcrft +C> +C> @param init +C> @param x +C> @param ldx +C> @param y +C> @param ldy +C> @param n +C> @param m +C> @param isign +C> @param scale +C> @param table +C> @param n1 +C> @param wrk +C> @param n2 +C> @param z +C> @param nz +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE dcrft(init,x,ldx,y,ldy,n,m,isign,scale, + & table,n1,wrk,n2,z,nz) + + implicit none + integer init,ldx,ldy,n,m,isign,n1,n2,nz,i,j + real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk,z + + IF (init.ne.0) THEN + CALL rffti(n,table) + ELSE +!OCL NOVREC + DO j=1,m + y(1,j)=x(1,j) + DO i=2,n + y(i,j)=x(i+1,j) + ENDDO + CALL rfftb(n,y(1,j),table) + DO i=1,n + y(i,j)=scale*y(i,j) + ENDDO + ENDDO + ENDIF + + RETURN + END + +C> scrft +C> +C> @param init +C> @param x +C> @param ldx +C> @param y +C> @param ldy +C> @param n +C> @param m +C> @param isign +C> @param scale +C> @param table +C> @param n1 +C> @param wrk +C> @param n2 +C> @param z +C> @param nz +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + + SUBROUTINE scrft(init,x,ldx,y,ldy,n,m,isign,scale, + & table,n1,wrk,n2,z,nz) + + implicit none + integer init,ldx,ldy,n,m,isign,n1,n2,nz,i,j + real x(2*ldx,*),y(ldy,*),scale,table(44002),wrk,z + + IF (init.ne.0) THEN + CALL rffti(n,table) + ELSE +!OCL NOVREC + DO j=1,m + y(1,j)=x(1,j) + DO i=2,n + y(i,j)=x(i+1,j) + ENDDO + CALL rfftb(n,y(1,j),table) + DO i=1,n + y(i,j)=scale*y(i,j) + ENDDO + ENDDO + ENDIF + + RETURN + END + +C> csfft +C> +C> @param isign +C> @param n +C> @param scale +C> @param x +C> @param y +C> @param table +C> @param work +C> @param isys +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE csfft(isign,n,scale,x,y,table,work,isys) + + implicit none + integer isign,n,isys,i + real scale,x(*),y(*),table(*),work(*) + + IF (isign.eq.0) THEN + CALL rffti(n,table) + ENDIF + IF (isign.eq.1) THEN + y(1)=x(1) + DO i=2,n + y(i)=x(i+1) + ENDDO + CALL rfftb(n,y,table) + DO i=1,n + y(i)=scale*y(i) + ENDDO + ENDIF + + RETURN + END + +C> drcft +C> +C> @param init +C> @param x +C> @param ldx +C> @param y +C> @param ldy +C> @param n +C> @param m +C> @param isign +C> @param scale +C> @param table +C> @param n1 +C> @param wrk +C> @param n2 +C> @param z +C> @param nz +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE drcft(init,x,ldx,y,ldy,n,m,isign,scale, + & table,n1,wrk,n2,z,nz) + + implicit none + integer init,ldx,ldy,n,m,isign,n1,n2,nz,i,j + real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk,z + + IF (init.ne.0) THEN + CALL rffti(n,table) + ELSE + DO j=1,m + DO i=1,n + y(i,j)=x(i,j) + ENDDO + CALL rfftf(n,y(1,j),table) + DO i=1,n + y(i,j)=scale*y(i,j) + ENDDO + DO i=n,2,-1 + y(i+1,j)=y(i,j) + ENDDO + y(2,j)=0. +C 01/17/2013 vvvvvvvvvvvvv E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo. + y(n+2,j) = 0. + ENDDO + ENDIF + + RETURN + END + +C> srcft +C> +C> @param init +C> @param x +C> @param ldx +C> @param y +C> @param ldy +C> @param n +C> @param m +C> @param isign +C> @param scale +C> @param table +C> @param n1 +C> @param wrk +C> @param n2 +C> @param z +C> @param nz +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE srcft(init,x,ldx,y,ldy,n,m,isign,scale, + & table,n1,wrk,n2,z,nz) + + implicit none + integer init,ldx,ldy,n,m,isign,n1,n2,nz,i,j + real x(ldx,*),y(2*ldy,*),scale,table(44002),wrk,z + + IF (init.ne.0) THEN + CALL rffti(n,table) + ELSE + DO j=1,m + DO i=1,n + y(i,j)=x(i,j) + ENDDO + CALL rfftf(n,y(1,j),table) + DO i=1,n + y(i,j)=scale*y(i,j) + ENDDO + DO i=n,2,-1 + y(i+1,j)=y(i,j) + ENDDO + y(2,j)=0. + y(n+2,j) = 0. +C 01/17/2013 ^^^^^^^^^^E.Mirvis added ver 2.0.1 by S.Moorthi request. No +|- demo. + ENDDO + ENDIF + + RETURN + END + +C> scfft +C> +C> @param isign +C> @param n +C> @param scale +C> @param x +C> @param y +C> @param table +C> @param work +C> @param isys +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE scfft(isign,n,scale,x,y,table,work,isys) + + implicit none + integer isign,n,isys,i + real scale,x(*),y(*),table(*),work(*) + + IF (isign.eq.0) THEN + CALL rffti(n,table) + ENDIF + IF (isign.eq.-1) THEN + DO i=1,n + y(i)=x(i) + ENDDO + CALL rfftf(n,y,table) + DO i=1,n + y(i)=scale*y(i) + ENDDO + DO i=n,2,-1 + y(i+1)=y(i) + ENDDO + y(2)=0. + ENDIF + + RETURN + END + +C> RFFTF +C> +C> @param N +C> @param R +C> @param WSAVE +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTF (N,R,WSAVE) + DIMENSION R(1) ,WSAVE(1) + IF (N .EQ. 1) RETURN + CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1)) + RETURN + END + +C> RFFTB +C> +C> @param N +C> @param R +C> @param WSAVE +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTB (N,R,WSAVE) + DIMENSION R(1) ,WSAVE(1) + IF (N .EQ. 1) RETURN + CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1)) + RETURN + END + +C> RFFTI +C> +C> @param N +C> @param WSAVE +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTI (N,WSAVE) + DIMENSION WSAVE(1) + IF (N .EQ. 1) RETURN + CALL RFFTI1 (N,WSAVE(N+1),WSAVE(2*N+1)) + RETURN + END + +C> RFFTB1 +C> +C> @param N +C> @param C +C> @param CH +C> @param WA +C> @param IFAC +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTB1 (N,C,CH,WA,IFAC) + DIMENSION CH(1) ,C(1) ,WA(1) ,IFAC(*) + NF = IFAC(2) + NA = 0 + L1 = 1 + IW = 1 + DO 116 K1=1,NF + IP = IFAC(K1+2) + L2 = IP*L1 + IDO = N/L2 + IDL1 = IDO*L1 + IF (IP .NE. 4) GO TO 103 + IX2 = IW+IDO + IX3 = IX2+IDO + IF (NA .NE. 0) GO TO 101 + CALL RADB4 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3)) + GO TO 102 + 101 CALL RADB4 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3)) + 102 NA = 1-NA + GO TO 115 + 103 IF (IP .NE. 2) GO TO 106 + IF (NA .NE. 0) GO TO 104 + CALL RADB2 (IDO,L1,C,CH,WA(IW)) + GO TO 105 + 104 CALL RADB2 (IDO,L1,CH,C,WA(IW)) + 105 NA = 1-NA + GO TO 115 + 106 IF (IP .NE. 3) GO TO 109 + IX2 = IW+IDO + IF (NA .NE. 0) GO TO 107 + CALL RADB3 (IDO,L1,C,CH,WA(IW),WA(IX2)) + GO TO 108 + 107 CALL RADB3 (IDO,L1,CH,C,WA(IW),WA(IX2)) + 108 NA = 1-NA + GO TO 115 + 109 IF (IP .NE. 5) GO TO 112 + IX2 = IW+IDO + IX3 = IX2+IDO + IX4 = IX3+IDO + IF (NA .NE. 0) GO TO 110 + CALL RADB5 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4)) + GO TO 111 + 110 CALL RADB5 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4)) + 111 NA = 1-NA + GO TO 115 + 112 IF (NA .NE. 0) GO TO 113 + CALL RADBG (IDO,IP,L1,IDL1,C,C,C,CH,CH,WA(IW)) + GO TO 114 + 113 CALL RADBG (IDO,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW)) + 114 IF (IDO .EQ. 1) NA = 1-NA + 115 L1 = L2 + IW = IW+(IP-1)*IDO + 116 CONTINUE + IF (NA .EQ. 0) RETURN + DO 117 I=1,N + C(I) = CH(I) + 117 CONTINUE + RETURN + END + +C> RFFTF1 +C> +C> @param N +C> @param C +C> @param CH +C> @param WA +C> @param IFAC +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC) + DIMENSION CH(1) ,C(1) ,WA(1) ,IFAC(*) + NF = IFAC(2) + NA = 1 + L2 = N + IW = N + DO 111 K1=1,NF + KH = NF-K1 + IP = IFAC(KH+3) + L1 = L2/IP + IDO = N/L2 + IDL1 = IDO*L1 + IW = IW-(IP-1)*IDO + NA = 1-NA + IF (IP .NE. 4) GO TO 102 + IX2 = IW+IDO + IX3 = IX2+IDO + IF (NA .NE. 0) GO TO 101 + CALL RADF4 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3)) + GO TO 110 + 101 CALL RADF4 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3)) + GO TO 110 + 102 IF (IP .NE. 2) GO TO 104 + IF (NA .NE. 0) GO TO 103 + CALL RADF2 (IDO,L1,C,CH,WA(IW)) + GO TO 110 + 103 CALL RADF2 (IDO,L1,CH,C,WA(IW)) + GO TO 110 + 104 IF (IP .NE. 3) GO TO 106 + IX2 = IW+IDO + IF (NA .NE. 0) GO TO 105 + CALL RADF3 (IDO,L1,C,CH,WA(IW),WA(IX2)) + GO TO 110 + 105 CALL RADF3 (IDO,L1,CH,C,WA(IW),WA(IX2)) + GO TO 110 + 106 IF (IP .NE. 5) GO TO 108 + IX2 = IW+IDO + IX3 = IX2+IDO + IX4 = IX3+IDO + IF (NA .NE. 0) GO TO 107 + CALL RADF5 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4)) + GO TO 110 + 107 CALL RADF5 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4)) + GO TO 110 + 108 IF (IDO .EQ. 1) NA = 1-NA + IF (NA .NE. 0) GO TO 109 + CALL RADFG (IDO,IP,L1,IDL1,C,C,C,CH,CH,WA(IW)) + NA = 1 + GO TO 110 + 109 CALL RADFG (IDO,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW)) + NA = 0 + 110 L2 = L1 + 111 CONTINUE + IF (NA .EQ. 1) RETURN + DO 112 I=1,N + C(I) = CH(I) + 112 CONTINUE + RETURN + END + +C> RFFTI1 +C> +C> @param N +C> @param WA +C> @param IFAC +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RFFTI1 (N,WA,IFAC) + DIMENSION WA(1) ,IFAC(*) ,NTRYH(4) + DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/ + NL = N + NF = 0 + J = 0 + 101 J = J+1 + IF (J-4) 102,102,103 + 102 NTRY = NTRYH(J) + GO TO 104 + 103 NTRY = NTRY+2 + 104 NQ = NL/NTRY + NR = NL-NTRY*NQ + IF (NR) 101,105,101 + 105 NF = NF+1 + IFAC(NF+2) = NTRY + NL = NQ + IF (NTRY .NE. 2) GO TO 107 + IF (NF .EQ. 1) GO TO 107 + DO 106 I=2,NF + IB = NF-I+2 + IFAC(IB+2) = IFAC(IB+1) + 106 CONTINUE + IFAC(3) = 2 + 107 IF (NL .NE. 1) GO TO 104 + IFAC(1) = N + IFAC(2) = NF + TPI = 6.28318530717959 + ARGH = TPI/FLOAT(N) + IS = 0 + NFM1 = NF-1 + L1 = 1 + IF (NFM1 .EQ. 0) RETURN +!OCL NOVREC + DO 110 K1=1,NFM1 + IP = IFAC(K1+2) + LD = 0 + L2 = L1*IP + IDO = N/L2 + IPM = IP-1 + DO 109 J=1,IPM + LD = LD+L1 + I = IS + ARGLD = FLOAT(LD)*ARGH + FI = 0 +!OCL SCALAR + DO 108 II=3,IDO,2 + I = I+2 + FI = FI+1 + ARG = FI*ARGLD + WA(I-1) = COS(ARG) + WA(I) = SIN(ARG) + 108 CONTINUE + IS = IS+IDO + 109 CONTINUE + L1 = L2 + 110 CONTINUE + RETURN + END + +C> RADB2 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADB2 (IDO,L1,CC,CH,WA1) + DIMENSION CC(IDO,2,L1) ,CH(IDO,L1,2) , + 1 WA1(1) + DO 101 K=1,L1 + CH(1,K,1) = CC(1,1,K)+CC(IDO,2,K) + CH(1,K,2) = CC(1,1,K)-CC(IDO,2,K) + 101 CONTINUE + IF (IDO-2) 107,105,102 + 102 IDP2 = IDO+2 +!OCL NOVREC + DO 104 K=1,L1 + DO 103 I=3,IDO,2 + IC = IDP2-I + CH(I-1,K,1) = CC(I-1,1,K)+CC(IC-1,2,K) + TR2 = CC(I-1,1,K)-CC(IC-1,2,K) + CH(I,K,1) = CC(I,1,K)-CC(IC,2,K) + TI2 = CC(I,1,K)+CC(IC,2,K) + CH(I-1,K,2) = WA1(I-2)*TR2-WA1(I-1)*TI2 + CH(I,K,2) = WA1(I-2)*TI2+WA1(I-1)*TR2 + 103 CONTINUE + 104 CONTINUE + IF (MOD(IDO,2) .EQ. 1) RETURN + 105 DO 106 K=1,L1 + CH(IDO,K,1) = CC(IDO,1,K)+CC(IDO,1,K) + CH(IDO,K,2) = -(CC(1,2,K)+CC(1,2,K)) + 106 CONTINUE + 107 RETURN + END + +C> RADB3 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADB3 (IDO,L1,CC,CH,WA1,WA2) + DIMENSION CC(IDO,3,L1) ,CH(IDO,L1,3) , + 1 WA1(1) ,WA2(1) + DATA TAUR,TAUI /-.5,.866025403784439/ + DO 101 K=1,L1 + TR2 = CC(IDO,2,K)+CC(IDO,2,K) + CR2 = CC(1,1,K)+TAUR*TR2 + CH(1,K,1) = CC(1,1,K)+TR2 + CI3 = TAUI*(CC(1,3,K)+CC(1,3,K)) + CH(1,K,2) = CR2-CI3 + CH(1,K,3) = CR2+CI3 + 101 CONTINUE + IF (IDO .EQ. 1) RETURN + IDP2 = IDO+2 +!OCL NOVREC + DO 103 K=1,L1 + DO 102 I=3,IDO,2 + IC = IDP2-I + TR2 = CC(I-1,3,K)+CC(IC-1,2,K) + CR2 = CC(I-1,1,K)+TAUR*TR2 + CH(I-1,K,1) = CC(I-1,1,K)+TR2 + TI2 = CC(I,3,K)-CC(IC,2,K) + CI2 = CC(I,1,K)+TAUR*TI2 + CH(I,K,1) = CC(I,1,K)+TI2 + CR3 = TAUI*(CC(I-1,3,K)-CC(IC-1,2,K)) + CI3 = TAUI*(CC(I,3,K)+CC(IC,2,K)) + DR2 = CR2-CI3 + DR3 = CR2+CI3 + DI2 = CI2+CR3 + DI3 = CI2-CR3 + CH(I-1,K,2) = WA1(I-2)*DR2-WA1(I-1)*DI2 + CH(I,K,2) = WA1(I-2)*DI2+WA1(I-1)*DR2 + CH(I-1,K,3) = WA2(I-2)*DR3-WA2(I-1)*DI3 + CH(I,K,3) = WA2(I-2)*DI3+WA2(I-1)*DR3 + 102 CONTINUE + 103 CONTINUE + RETURN + END + +C> RADB4 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> @param WA3 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADB4 (IDO,L1,CC,CH,WA1,WA2,WA3) + DIMENSION CC(IDO,4,L1) ,CH(IDO,L1,4) , + 1 WA1(1) ,WA2(1) ,WA3(1) + DATA SQRT2 /1.414213562373095/ + DO 101 K=1,L1 + TR1 = CC(1,1,K)-CC(IDO,4,K) + TR2 = CC(1,1,K)+CC(IDO,4,K) + TR3 = CC(IDO,2,K)+CC(IDO,2,K) + TR4 = CC(1,3,K)+CC(1,3,K) + CH(1,K,1) = TR2+TR3 + CH(1,K,2) = TR1-TR4 + CH(1,K,3) = TR2-TR3 + CH(1,K,4) = TR1+TR4 + 101 CONTINUE + IF (IDO-2) 107,105,102 + 102 IDP2 = IDO+2 +!OCL NOVREC + DO 104 K=1,L1 + DO 103 I=3,IDO,2 + IC = IDP2-I + TI1 = CC(I,1,K)+CC(IC,4,K) + TI2 = CC(I,1,K)-CC(IC,4,K) + TI3 = CC(I,3,K)-CC(IC,2,K) + TR4 = CC(I,3,K)+CC(IC,2,K) + TR1 = CC(I-1,1,K)-CC(IC-1,4,K) + TR2 = CC(I-1,1,K)+CC(IC-1,4,K) + TI4 = CC(I-1,3,K)-CC(IC-1,2,K) + TR3 = CC(I-1,3,K)+CC(IC-1,2,K) + CH(I-1,K,1) = TR2+TR3 + CR3 = TR2-TR3 + CH(I,K,1) = TI2+TI3 + CI3 = TI2-TI3 + CR2 = TR1-TR4 + CR4 = TR1+TR4 + CI2 = TI1+TI4 + CI4 = TI1-TI4 + CH(I-1,K,2) = WA1(I-2)*CR2-WA1(I-1)*CI2 + CH(I,K,2) = WA1(I-2)*CI2+WA1(I-1)*CR2 + CH(I-1,K,3) = WA2(I-2)*CR3-WA2(I-1)*CI3 + CH(I,K,3) = WA2(I-2)*CI3+WA2(I-1)*CR3 + CH(I-1,K,4) = WA3(I-2)*CR4-WA3(I-1)*CI4 + CH(I,K,4) = WA3(I-2)*CI4+WA3(I-1)*CR4 + 103 CONTINUE + 104 CONTINUE + IF (MOD(IDO,2) .EQ. 1) RETURN + 105 CONTINUE + DO 106 K=1,L1 + TI1 = CC(1,2,K)+CC(1,4,K) + TI2 = CC(1,4,K)-CC(1,2,K) + TR1 = CC(IDO,1,K)-CC(IDO,3,K) + TR2 = CC(IDO,1,K)+CC(IDO,3,K) + CH(IDO,K,1) = TR2+TR2 + CH(IDO,K,2) = SQRT2*(TR1-TI1) + CH(IDO,K,3) = TI2+TI2 + CH(IDO,K,4) = -SQRT2*(TR1+TI1) + 106 CONTINUE + 107 RETURN + END + +C> RADB5 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> @param WA3 +C> @param WA4 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADB5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4) + DIMENSION CC(IDO,5,L1) ,CH(IDO,L1,5) , + 1 WA1(1) ,WA2(1) ,WA3(1) ,WA4(1) + DATA TR11,TI11,TR12,TI12 /.309016994374947,.951056516295154, + 1-.809016994374947,.587785252292473/ + DO 101 K=1,L1 + TI5 = CC(1,3,K)+CC(1,3,K) + TI4 = CC(1,5,K)+CC(1,5,K) + TR2 = CC(IDO,2,K)+CC(IDO,2,K) + TR3 = CC(IDO,4,K)+CC(IDO,4,K) + CH(1,K,1) = CC(1,1,K)+TR2+TR3 + CR2 = CC(1,1,K)+TR11*TR2+TR12*TR3 + CR3 = CC(1,1,K)+TR12*TR2+TR11*TR3 + CI5 = TI11*TI5+TI12*TI4 + CI4 = TI12*TI5-TI11*TI4 + CH(1,K,2) = CR2-CI5 + CH(1,K,3) = CR3-CI4 + CH(1,K,4) = CR3+CI4 + CH(1,K,5) = CR2+CI5 + 101 CONTINUE + IF (IDO .EQ. 1) RETURN + IDP2 = IDO+2 + DO 103 K=1,L1 + DO 102 I=3,IDO,2 + IC = IDP2-I + TI5 = CC(I,3,K)+CC(IC,2,K) + TI2 = CC(I,3,K)-CC(IC,2,K) + TI4 = CC(I,5,K)+CC(IC,4,K) + TI3 = CC(I,5,K)-CC(IC,4,K) + TR5 = CC(I-1,3,K)-CC(IC-1,2,K) + TR2 = CC(I-1,3,K)+CC(IC-1,2,K) + TR4 = CC(I-1,5,K)-CC(IC-1,4,K) + TR3 = CC(I-1,5,K)+CC(IC-1,4,K) + CH(I-1,K,1) = CC(I-1,1,K)+TR2+TR3 + CH(I,K,1) = CC(I,1,K)+TI2+TI3 + CR2 = CC(I-1,1,K)+TR11*TR2+TR12*TR3 + CI2 = CC(I,1,K)+TR11*TI2+TR12*TI3 + CR3 = CC(I-1,1,K)+TR12*TR2+TR11*TR3 + CI3 = CC(I,1,K)+TR12*TI2+TR11*TI3 + CR5 = TI11*TR5+TI12*TR4 + CI5 = TI11*TI5+TI12*TI4 + CR4 = TI12*TR5-TI11*TR4 + CI4 = TI12*TI5-TI11*TI4 + DR3 = CR3-CI4 + DR4 = CR3+CI4 + DI3 = CI3+CR4 + DI4 = CI3-CR4 + DR5 = CR2+CI5 + DR2 = CR2-CI5 + DI5 = CI2-CR5 + DI2 = CI2+CR5 + CH(I-1,K,2) = WA1(I-2)*DR2-WA1(I-1)*DI2 + CH(I,K,2) = WA1(I-2)*DI2+WA1(I-1)*DR2 + CH(I-1,K,3) = WA2(I-2)*DR3-WA2(I-1)*DI3 + CH(I,K,3) = WA2(I-2)*DI3+WA2(I-1)*DR3 + CH(I-1,K,4) = WA3(I-2)*DR4-WA3(I-1)*DI4 + CH(I,K,4) = WA3(I-2)*DI4+WA3(I-1)*DR4 + CH(I-1,K,5) = WA4(I-2)*DR5-WA4(I-1)*DI5 + CH(I,K,5) = WA4(I-2)*DI5+WA4(I-1)*DR5 + 102 CONTINUE + 103 CONTINUE + RETURN + END + +C> RADBG +C> +C> @param IDO +C> @param IP +C> @param L1 +C> @param IDL1 +C> @param CC +C> @param C1 +C> @param C2 +C> @param CH +C> @param CH2 +C> @param WA +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADBG (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA) + DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) , + 1 C1(IDO,L1,IP) ,C2(IDL1,IP), + 2 CH2(IDL1,IP) ,WA(1) + DATA TPI/6.28318530717959/ + ARG = TPI/FLOAT(IP) + DCP = COS(ARG) + DSP = SIN(ARG) + IDP2 = IDO+2 + NBD = (IDO-1)/2 + IPP2 = IP+2 + IPPH = (IP+1)/2 + IF (IDO .LT. L1) GO TO 103 + DO 102 K=1,L1 + DO 101 I=1,IDO + CH(I,K,1) = CC(I,1,K) + 101 CONTINUE + 102 CONTINUE + GO TO 106 + 103 DO 105 I=1,IDO + DO 104 K=1,L1 + CH(I,K,1) = CC(I,1,K) + 104 CONTINUE + 105 CONTINUE +!OCL NOVREC + 106 DO 108 J=2,IPPH + JC = IPP2-J + J2 = J+J + DO 107 K=1,L1 + CH(1,K,J) = CC(IDO,J2-2,K)+CC(IDO,J2-2,K) + CH(1,K,JC) = CC(1,J2-1,K)+CC(1,J2-1,K) + 107 CONTINUE + 108 CONTINUE + IF (IDO .EQ. 1) GO TO 116 + IF (NBD .LT. L1) GO TO 112 +!OCL NOVREC + DO 111 J=2,IPPH + JC = IPP2-J + DO 110 K=1,L1 + DO 109 I=3,IDO,2 + IC = IDP2-I + CH(I-1,K,J) = CC(I-1,2*J-1,K)+CC(IC-1,2*J-2,K) + CH(I-1,K,JC) = CC(I-1,2*J-1,K)-CC(IC-1,2*J-2,K) + CH(I,K,J) = CC(I,2*J-1,K)-CC(IC,2*J-2,K) + CH(I,K,JC) = CC(I,2*J-1,K)+CC(IC,2*J-2,K) + 109 CONTINUE + 110 CONTINUE + 111 CONTINUE + GO TO 116 + 112 DO 115 J=2,IPPH + JC = IPP2-J + DO 114 I=3,IDO,2 + IC = IDP2-I + DO 113 K=1,L1 + CH(I-1,K,J) = CC(I-1,2*J-1,K)+CC(IC-1,2*J-2,K) + CH(I-1,K,JC) = CC(I-1,2*J-1,K)-CC(IC-1,2*J-2,K) + CH(I,K,J) = CC(I,2*J-1,K)-CC(IC,2*J-2,K) + CH(I,K,JC) = CC(I,2*J-1,K)+CC(IC,2*J-2,K) + 113 CONTINUE + 114 CONTINUE + 115 CONTINUE + 116 AR1 = 1. + AI1 = 0. +!OCL NOVREC + DO 120 L=2,IPPH + LC = IPP2-L + AR1H = DCP*AR1-DSP*AI1 + AI1 = DCP*AI1+DSP*AR1 + AR1 = AR1H + DO 117 IK=1,IDL1 + C2(IK,L) = CH2(IK,1)+AR1*CH2(IK,2) + C2(IK,LC) = AI1*CH2(IK,IP) + 117 CONTINUE + DC2 = AR1 + DS2 = AI1 + AR2 = AR1 + AI2 = AI1 +!OCL NOVREC + DO 119 J=3,IPPH + JC = IPP2-J + AR2H = DC2*AR2-DS2*AI2 + AI2 = DC2*AI2+DS2*AR2 + AR2 = AR2H + DO 118 IK=1,IDL1 + C2(IK,L) = C2(IK,L)+AR2*CH2(IK,J) + C2(IK,LC) = C2(IK,LC)+AI2*CH2(IK,JC) + 118 CONTINUE + 119 CONTINUE + 120 CONTINUE +!OCL NOVREC + DO 122 J=2,IPPH + DO 121 IK=1,IDL1 + CH2(IK,1) = CH2(IK,1)+CH2(IK,J) + 121 CONTINUE + 122 CONTINUE +!OCL NOVREC + DO 124 J=2,IPPH + JC = IPP2-J + DO 123 K=1,L1 + CH(1,K,J) = C1(1,K,J)-C1(1,K,JC) + CH(1,K,JC) = C1(1,K,J)+C1(1,K,JC) + 123 CONTINUE + 124 CONTINUE + IF (IDO .EQ. 1) GO TO 132 + IF (NBD .LT. L1) GO TO 128 +!OCL NOVREC + DO 127 J=2,IPPH + JC = IPP2-J + DO 126 K=1,L1 + DO 125 I=3,IDO,2 + CH(I-1,K,J) = C1(I-1,K,J)-C1(I,K,JC) + CH(I-1,K,JC) = C1(I-1,K,J)+C1(I,K,JC) + CH(I,K,J) = C1(I,K,J)+C1(I-1,K,JC) + CH(I,K,JC) = C1(I,K,J)-C1(I-1,K,JC) + 125 CONTINUE + 126 CONTINUE + 127 CONTINUE + GO TO 132 + 128 DO 131 J=2,IPPH + JC = IPP2-J + DO 130 I=3,IDO,2 + DO 129 K=1,L1 + CH(I-1,K,J) = C1(I-1,K,J)-C1(I,K,JC) + CH(I-1,K,JC) = C1(I-1,K,J)+C1(I,K,JC) + CH(I,K,J) = C1(I,K,J)+C1(I-1,K,JC) + CH(I,K,JC) = C1(I,K,J)-C1(I-1,K,JC) + 129 CONTINUE + 130 CONTINUE + 131 CONTINUE + 132 CONTINUE + IF (IDO .EQ. 1) RETURN + DO 133 IK=1,IDL1 + C2(IK,1) = CH2(IK,1) + 133 CONTINUE + DO 135 J=2,IP + DO 134 K=1,L1 + C1(1,K,J) = CH(1,K,J) + 134 CONTINUE + 135 CONTINUE + IF (NBD .GT. L1) GO TO 139 + IS = -IDO + DO 138 J=2,IP + IS = IS+IDO + IDIJ = IS + DO 137 I=3,IDO,2 + IDIJ = IDIJ+2 + DO 136 K=1,L1 + C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J) + C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J) + 136 CONTINUE + 137 CONTINUE + 138 CONTINUE + GO TO 143 + 139 IS = -IDO +!OCL NOVREC + DO 142 J=2,IP + IS = IS+IDO + DO 141 K=1,L1 + IDIJ = IS + DO 140 I=3,IDO,2 + IDIJ = IDIJ+2 + C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J) + C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J) + 140 CONTINUE + 141 CONTINUE + 142 CONTINUE + 143 RETURN + END + +C> RADBG +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADF2 (IDO,L1,CC,CH,WA1) + DIMENSION CH(IDO,2,L1) ,CC(IDO,L1,2) , + 1 WA1(1) + DO 101 K=1,L1 + CH(1,1,K) = CC(1,K,1)+CC(1,K,2) + CH(IDO,2,K) = CC(1,K,1)-CC(1,K,2) + 101 CONTINUE + IF (IDO-2) 107,105,102 + 102 IDP2 = IDO+2 + DO 104 K=1,L1 + DO 103 I=3,IDO,2 + IC = IDP2-I + TR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2) + TI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2) + CH(I,1,K) = CC(I,K,1)+TI2 + CH(IC,2,K) = TI2-CC(I,K,1) + CH(I-1,1,K) = CC(I-1,K,1)+TR2 + CH(IC-1,2,K) = CC(I-1,K,1)-TR2 + 103 CONTINUE + 104 CONTINUE + IF (MOD(IDO,2) .EQ. 1) RETURN + 105 DO 106 K=1,L1 + CH(1,2,K) = -CC(IDO,K,2) + CH(IDO,1,K) = CC(IDO,K,1) + 106 CONTINUE + 107 RETURN + END + +C> RADF3 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADF3 (IDO,L1,CC,CH,WA1,WA2) + DIMENSION CH(IDO,3,L1) ,CC(IDO,L1,3) , + 1 WA1(1) ,WA2(1) + DATA TAUR,TAUI /-.5,.866025403784439/ + DO 101 K=1,L1 + CR2 = CC(1,K,2)+CC(1,K,3) + CH(1,1,K) = CC(1,K,1)+CR2 + CH(1,3,K) = TAUI*(CC(1,K,3)-CC(1,K,2)) + CH(IDO,2,K) = CC(1,K,1)+TAUR*CR2 + 101 CONTINUE + IF (IDO .EQ. 1) RETURN + IDP2 = IDO+2 + DO 103 K=1,L1 + DO 102 I=3,IDO,2 + IC = IDP2-I + DR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2) + DI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2) + DR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3) + DI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3) + CR2 = DR2+DR3 + CI2 = DI2+DI3 + CH(I-1,1,K) = CC(I-1,K,1)+CR2 + CH(I,1,K) = CC(I,K,1)+CI2 + TR2 = CC(I-1,K,1)+TAUR*CR2 + TI2 = CC(I,K,1)+TAUR*CI2 + TR3 = TAUI*(DI2-DI3) + TI3 = TAUI*(DR3-DR2) + CH(I-1,3,K) = TR2+TR3 + CH(IC-1,2,K) = TR2-TR3 + CH(I,3,K) = TI2+TI3 + CH(IC,2,K) = TI3-TI2 + 102 CONTINUE + 103 CONTINUE + RETURN + END + +C> RADF4 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> @param WA3 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADF4 (IDO,L1,CC,CH,WA1,WA2,WA3) + DIMENSION CC(IDO,L1,4) ,CH(IDO,4,L1) , + 1 WA1(1) ,WA2(1) ,WA3(1) + DATA HSQT2 /.7071067811865475/ + DO 101 K=1,L1 + TR1 = CC(1,K,2)+CC(1,K,4) + TR2 = CC(1,K,1)+CC(1,K,3) + CH(1,1,K) = TR1+TR2 + CH(IDO,4,K) = TR2-TR1 + CH(IDO,2,K) = CC(1,K,1)-CC(1,K,3) + CH(1,3,K) = CC(1,K,4)-CC(1,K,2) + 101 CONTINUE + IF (IDO-2) 107,105,102 + 102 IDP2 = IDO+2 +!OCL NOVREC + DO 104 K=1,L1 + DO 103 I=3,IDO,2 + IC = IDP2-I + CR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2) + CI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2) + CR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3) + CI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3) + CR4 = WA3(I-2)*CC(I-1,K,4)+WA3(I-1)*CC(I,K,4) + CI4 = WA3(I-2)*CC(I,K,4)-WA3(I-1)*CC(I-1,K,4) + TR1 = CR2+CR4 + TR4 = CR4-CR2 + TI1 = CI2+CI4 + TI4 = CI2-CI4 + TI2 = CC(I,K,1)+CI3 + TI3 = CC(I,K,1)-CI3 + TR2 = CC(I-1,K,1)+CR3 + TR3 = CC(I-1,K,1)-CR3 + CH(I-1,1,K) = TR1+TR2 + CH(IC-1,4,K) = TR2-TR1 + CH(I,1,K) = TI1+TI2 + CH(IC,4,K) = TI1-TI2 + CH(I-1,3,K) = TI4+TR3 + CH(IC-1,2,K) = TR3-TI4 + CH(I,3,K) = TR4+TI3 + CH(IC,2,K) = TR4-TI3 + 103 CONTINUE + 104 CONTINUE + IF (MOD(IDO,2) .EQ. 1) RETURN + 105 CONTINUE + DO 106 K=1,L1 + TI1 = -HSQT2*(CC(IDO,K,2)+CC(IDO,K,4)) + TR1 = HSQT2*(CC(IDO,K,2)-CC(IDO,K,4)) + CH(IDO,1,K) = TR1+CC(IDO,K,1) + CH(IDO,3,K) = CC(IDO,K,1)-TR1 + CH(1,2,K) = TI1-CC(IDO,K,3) + CH(1,4,K) = TI1+CC(IDO,K,3) + 106 CONTINUE + 107 RETURN + END + +C> RADF5 +C> +C> @param IDO +C> @param L1 +C> @param CC +C> @param CH +C> @param WA1 +C> @param WA2 +C> @param WA3 +C> @param WA4 +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADF5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4) + DIMENSION CC(IDO,L1,5) ,CH(IDO,5,L1) , + 1 WA1(1) ,WA2(1) ,WA3(1) ,WA4(1) + DATA TR11,TI11,TR12,TI12 /.309016994374947,.951056516295154, + 1-.809016994374947,.587785252292473/ + DO 101 K=1,L1 + CR2 = CC(1,K,5)+CC(1,K,2) + CI5 = CC(1,K,5)-CC(1,K,2) + CR3 = CC(1,K,4)+CC(1,K,3) + CI4 = CC(1,K,4)-CC(1,K,3) + CH(1,1,K) = CC(1,K,1)+CR2+CR3 + CH(IDO,2,K) = CC(1,K,1)+TR11*CR2+TR12*CR3 + CH(1,3,K) = TI11*CI5+TI12*CI4 + CH(IDO,4,K) = CC(1,K,1)+TR12*CR2+TR11*CR3 + CH(1,5,K) = TI12*CI5-TI11*CI4 + 101 CONTINUE + IF (IDO .EQ. 1) RETURN + IDP2 = IDO+2 + DO 103 K=1,L1 + DO 102 I=3,IDO,2 + IC = IDP2-I + DR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2) + DI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2) + DR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3) + DI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3) + DR4 = WA3(I-2)*CC(I-1,K,4)+WA3(I-1)*CC(I,K,4) + DI4 = WA3(I-2)*CC(I,K,4)-WA3(I-1)*CC(I-1,K,4) + DR5 = WA4(I-2)*CC(I-1,K,5)+WA4(I-1)*CC(I,K,5) + DI5 = WA4(I-2)*CC(I,K,5)-WA4(I-1)*CC(I-1,K,5) + CR2 = DR2+DR5 + CI5 = DR5-DR2 + CR5 = DI2-DI5 + CI2 = DI2+DI5 + CR3 = DR3+DR4 + CI4 = DR4-DR3 + CR4 = DI3-DI4 + CI3 = DI3+DI4 + CH(I-1,1,K) = CC(I-1,K,1)+CR2+CR3 + CH(I,1,K) = CC(I,K,1)+CI2+CI3 + TR2 = CC(I-1,K,1)+TR11*CR2+TR12*CR3 + TI2 = CC(I,K,1)+TR11*CI2+TR12*CI3 + TR3 = CC(I-1,K,1)+TR12*CR2+TR11*CR3 + TI3 = CC(I,K,1)+TR12*CI2+TR11*CI3 + TR5 = TI11*CR5+TI12*CR4 + TI5 = TI11*CI5+TI12*CI4 + TR4 = TI12*CR5-TI11*CR4 + TI4 = TI12*CI5-TI11*CI4 + CH(I-1,3,K) = TR2+TR5 + CH(IC-1,2,K) = TR2-TR5 + CH(I,3,K) = TI2+TI5 + CH(IC,2,K) = TI5-TI2 + CH(I-1,5,K) = TR3+TR4 + CH(IC-1,4,K) = TR3-TR4 + CH(I,5,K) = TI3+TI4 + CH(IC,4,K) = TI4-TI3 + 102 CONTINUE + 103 CONTINUE + RETURN + END + +C> RADFG +C> +C> @param IDO +C> @param IP +C> @param L1 +C> @param IDL1 +C> @param CC +C> @param C1 +C> @param C2 +C> @param CH +C> @param CH2 +C> @param WA +C> +C> @author Paul N. Swarztrauber, National Center for Atmospheric Research, Boulder, CO + SUBROUTINE RADFG (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA) + DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) , + 1 C1(IDO,L1,IP) ,C2(IDL1,IP), + 2 CH2(IDL1,IP) ,WA(1) + DATA TPI/6.28318530717959/ + ARG = TPI/FLOAT(IP) + DCP = COS(ARG) + DSP = SIN(ARG) + IPPH = (IP+1)/2 + IPP2 = IP+2 + IDP2 = IDO+2 + NBD = (IDO-1)/2 + IF (IDO .EQ. 1) GO TO 119 + DO 101 IK=1,IDL1 + CH2(IK,1) = C2(IK,1) + 101 CONTINUE + DO 103 J=2,IP + DO 102 K=1,L1 + CH(1,K,J) = C1(1,K,J) + 102 CONTINUE + 103 CONTINUE + IF (NBD .GT. L1) GO TO 107 + IS = -IDO + DO 106 J=2,IP + IS = IS+IDO + IDIJ = IS + DO 105 I=3,IDO,2 + IDIJ = IDIJ+2 + DO 104 K=1,L1 + CH(I-1,K,J) = WA(IDIJ-1)*C1(I-1,K,J)+WA(IDIJ)*C1(I,K,J) + CH(I,K,J) = WA(IDIJ-1)*C1(I,K,J)-WA(IDIJ)*C1(I-1,K,J) + 104 CONTINUE + 105 CONTINUE + 106 CONTINUE + GO TO 111 + 107 IS = -IDO + DO 110 J=2,IP + IS = IS+IDO + DO 109 K=1,L1 + IDIJ = IS + DO 108 I=3,IDO,2 + IDIJ = IDIJ+2 + CH(I-1,K,J) = WA(IDIJ-1)*C1(I-1,K,J)+WA(IDIJ)*C1(I,K,J) + CH(I,K,J) = WA(IDIJ-1)*C1(I,K,J)-WA(IDIJ)*C1(I-1,K,J) + 108 CONTINUE + 109 CONTINUE + 110 CONTINUE + 111 IF (NBD .LT. L1) GO TO 115 + DO 114 J=2,IPPH + JC = IPP2-J + DO 113 K=1,L1 + DO 112 I=3,IDO,2 + C1(I-1,K,J) = CH(I-1,K,J)+CH(I-1,K,JC) + C1(I-1,K,JC) = CH(I,K,J)-CH(I,K,JC) + C1(I,K,J) = CH(I,K,J)+CH(I,K,JC) + C1(I,K,JC) = CH(I-1,K,JC)-CH(I-1,K,J) + 112 CONTINUE + 113 CONTINUE + 114 CONTINUE + GO TO 121 + 115 DO 118 J=2,IPPH + JC = IPP2-J + DO 117 I=3,IDO,2 + DO 116 K=1,L1 + C1(I-1,K,J) = CH(I-1,K,J)+CH(I-1,K,JC) + C1(I-1,K,JC) = CH(I,K,J)-CH(I,K,JC) + C1(I,K,J) = CH(I,K,J)+CH(I,K,JC) + C1(I,K,JC) = CH(I-1,K,JC)-CH(I-1,K,J) + 116 CONTINUE + 117 CONTINUE + 118 CONTINUE + GO TO 121 + 119 DO 120 IK=1,IDL1 + C2(IK,1) = CH2(IK,1) + 120 CONTINUE + 121 DO 123 J=2,IPPH + JC = IPP2-J + DO 122 K=1,L1 + C1(1,K,J) = CH(1,K,J)+CH(1,K,JC) + C1(1,K,JC) = CH(1,K,JC)-CH(1,K,J) + 122 CONTINUE + 123 CONTINUE +C + AR1 = 1. + AI1 = 0. + DO 127 L=2,IPPH + LC = IPP2-L + AR1H = DCP*AR1-DSP*AI1 + AI1 = DCP*AI1+DSP*AR1 + AR1 = AR1H + DO 124 IK=1,IDL1 + CH2(IK,L) = C2(IK,1)+AR1*C2(IK,2) + CH2(IK,LC) = AI1*C2(IK,IP) + 124 CONTINUE + DC2 = AR1 + DS2 = AI1 + AR2 = AR1 + AI2 = AI1 + DO 126 J=3,IPPH + JC = IPP2-J + AR2H = DC2*AR2-DS2*AI2 + AI2 = DC2*AI2+DS2*AR2 + AR2 = AR2H + DO 125 IK=1,IDL1 + CH2(IK,L) = CH2(IK,L)+AR2*C2(IK,J) + CH2(IK,LC) = CH2(IK,LC)+AI2*C2(IK,JC) + 125 CONTINUE + 126 CONTINUE + 127 CONTINUE + DO 129 J=2,IPPH + DO 128 IK=1,IDL1 + CH2(IK,1) = CH2(IK,1)+C2(IK,J) + 128 CONTINUE + 129 CONTINUE +C + IF (IDO .LT. L1) GO TO 132 + DO 131 K=1,L1 + DO 130 I=1,IDO + CC(I,1,K) = CH(I,K,1) + 130 CONTINUE + 131 CONTINUE + GO TO 135 + 132 DO 134 I=1,IDO + DO 133 K=1,L1 + CC(I,1,K) = CH(I,K,1) + 133 CONTINUE + 134 CONTINUE + 135 DO 137 J=2,IPPH + JC = IPP2-J + J2 = J+J + DO 136 K=1,L1 + CC(IDO,J2-2,K) = CH(1,K,J) + CC(1,J2-1,K) = CH(1,K,JC) + 136 CONTINUE + 137 CONTINUE + IF (IDO .EQ. 1) RETURN + IF (NBD .LT. L1) GO TO 141 + DO 140 J=2,IPPH + JC = IPP2-J + J2 = J+J + DO 139 K=1,L1 + DO 138 I=3,IDO,2 + IC = IDP2-I + CC(I-1,J2-1,K) = CH(I-1,K,J)+CH(I-1,K,JC) + CC(IC-1,J2-2,K) = CH(I-1,K,J)-CH(I-1,K,JC) + CC(I,J2-1,K) = CH(I,K,J)+CH(I,K,JC) + CC(IC,J2-2,K) = CH(I,K,JC)-CH(I,K,J) + 138 CONTINUE + 139 CONTINUE + 140 CONTINUE + RETURN + 141 DO 144 J=2,IPPH + JC = IPP2-J + J2 = J+J + DO 143 I=3,IDO,2 + IC = IDP2-I + DO 142 K=1,L1 + CC(I-1,J2-1,K) = CH(I-1,K,J)+CH(I-1,K,JC) + CC(IC-1,J2-2,K) = CH(I-1,K,J)-CH(I-1,K,JC) + CC(I,J2-1,K) = CH(I,K,J)+CH(I,K,JC) + CC(IC,J2-2,K) = CH(I,K,JC)-CH(I,K,J) + 142 CONTINUE + 143 CONTINUE + 144 CONTINUE + RETURN + END diff --git a/src/lapack_gen.F b/src/lapack_gen.F new file mode 100644 index 00000000..36db1e46 --- /dev/null +++ b/src/lapack_gen.F @@ -0,0 +1,116 @@ +C> @file +C> @brief Two Numerical Recipes routines for matrix inversion From Numerical Recipes. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 2012-11-05 | E.Mirvis | separated this generic LU from the splat.F + +C> Solves a system of linear equations, follows call to ludcmp(). +C> +C> @param A +C> @param N +C> @param NP +C> @param INDX +C> @param B + SUBROUTINE LUBKSB(A,N,NP,INDX,B) + REAL A(NP,NP),B(N) + INTEGER INDX(N) + II=0 + DO 12 I=1,N + LL=INDX(I) + SUM=B(LL) + B(LL)=B(I) + IF (II.NE.0)THEN + DO 11 J=II,I-1 + SUM=SUM-A(I,J)*B(J) + 11 CONTINUE + ELSE IF (SUM.NE.0.) THEN + II=I + ENDIF + B(I)=SUM + 12 CONTINUE + DO 14 I=N,1,-1 + SUM=B(I) + IF(I.LT.N)THEN + DO 13 J=I+1,N + SUM=SUM-A(I,J)*B(J) + 13 CONTINUE + ENDIF + B(I)=SUM/A(I,I) + 14 CONTINUE + RETURN + END + +C> Replaces an NxN matrix a with the LU decomposition. +C> +C> @param A +C> @param N +C> @param NP +C> @param INDX + SUBROUTINE LUDCMP(A,N,NP,INDX) +C PARAMETER (NMAX=400,TINY=1.0E-20) + PARAMETER (TINY=1.0E-20) +C==EM==^^^ +C + REAL A(NP,NP),VV(N),D +C REAL A(NP,NP),VV(NMAX),D +C==EM==^^^ + INTEGER INDX(N) + D=1. + DO 12 I=1,N + AAMAX=0. + DO 11 J=1,N + IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) + 11 CONTINUE + IF (AAMAX.EQ.0.) print *, 'SINGULAR MATRIX.' + VV(I)=1./AAMAX + 12 CONTINUE + DO 19 J=1,N + IF (J.GT.1) THEN + DO 14 I=1,J-1 + SUM=A(I,J) + IF (I.GT.1)THEN + DO 13 K=1,I-1 + SUM=SUM-A(I,K)*A(K,J) + 13 CONTINUE + A(I,J)=SUM + ENDIF + 14 CONTINUE + ENDIF + AAMAX=0. + DO 16 I=J,N + SUM=A(I,J) + IF (J.GT.1)THEN + DO 15 K=1,J-1 + SUM=SUM-A(I,K)*A(K,J) + 15 CONTINUE + A(I,J)=SUM + ENDIF + DUM=VV(I)*ABS(SUM) + IF (DUM.GE.AAMAX) THEN + IMAX=I + AAMAX=DUM + ENDIF + 16 CONTINUE + IF (J.NE.IMAX)THEN + DO 17 K=1,N + DUM=A(IMAX,K) + A(IMAX,K)=A(J,K) + A(J,K)=DUM + 17 CONTINUE + D=-D + VV(IMAX)=VV(J) + ENDIF + INDX(J)=IMAX + IF(J.NE.N)THEN + IF(A(J,J).EQ.0.)A(J,J)=TINY + DUM=1./A(J,J) + DO 18 I=J+1,N + A(I,J)=A(I,J)*DUM + 18 CONTINUE + ENDIF + 19 CONTINUE + IF(A(N,N).EQ.0.)A(N,N)=TINY + RETURN + END diff --git a/src/ncpus.F b/src/ncpus.F new file mode 100644 index 00000000..2995c473 --- /dev/null +++ b/src/ncpus.F @@ -0,0 +1,40 @@ +C> @file +C> Set number of cpus. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 94-08-19 | Iredell | Initial. +C> 98-11-09 | Vuong | Add doc>block and remove cray references. +C> 1998-12-18 | Iredell | IBM SMP version. +C> 2010-11-16 | Slovacek | Linux must have different call. +C> 2012-11-01 | Mirvis | Multi-threading on LINUX-IBM/TIDE. +C> +C> @author Iredell @date 94-08-19 + +C> Set number of CPUs - the number of processors over which +C> to parallelize. +C> +C> @param[out] ncpus number of CPUs. +C> +C> @return Number of CPUs assigned. +C> +C> @author Iredell @date 94-08-19 + FUNCTION NCPUS() + INTEGER NTHREADS, TID, OMP_GET_NUM_THREADS,OMP_GET_THREAD_NUM +C Obtain thread number +#ifdef OPENMP +!$OMP PARALLEL PRIVATE(TID) + TID = OMP_GET_THREAD_NUM() +! PRINT *, '...............thread # ', TID + if (TID. eq. 0) then + NCPUS=OMP_GET_NUM_THREADS() +! PRINT *, 'totaly #------------------- of threads = ',NCPUS + endif +!$OMP END PARALLEL +#else + TID = 0 + NCPUS = 1 +#endif + RETURN + END diff --git a/src/spanaly.f b/src/spanaly.f new file mode 100644 index 00000000..93f8a965 --- /dev/null +++ b/src/spanaly.f @@ -0,0 +1,76 @@ +C> @file +C> @brief Analyze spectral from Fourier. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 91-10-31 | Mark Iredell | Initial. +C> 94-08-01 | Mark Iredell | Moved zonal wavenumber loop inside. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> +C> @author Iredell @date 91-10-31 + +C> Analyzes spectral coefficients from Fourier coefficients +C> for a latitude pair (Northern and Southern hemispheres). +C> +C> Vector components are multiplied by cosine of latitude. +C> +C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param IM even number of Fourier coefficients +C> @param IX dimension of Fourier coefficients (IX>=IM+2) +C> @param NC dimension of spectral coefficients (NC>=(M+1)*((I+1)*M+2)) +C> @param NCTOP dimension of spectral coefficients over top (NCTOP>=2*(M+1)) +C> @param KM number of fields +C> @param WGT Gaussian weight +C> @param CLAT cosine of latitude +C> @param PLN Legendre polynomials +C> @param PLNTOP Legendre polynomial over top +C> @param MP identifiers (0 for scalar, 1 for vector) +C> @param F Fourier coefficients combined +C> @param SPC spectral coefficients +C> @param SPCTOP spectral coefficients over top +C> +C> @author Iredell @date 91-10-31 + SUBROUTINE SPANALY(I,M,IM,IX,NC,NCTOP,KM,WGT,CLAT,PLN,PLNTOP,MP, + & F,SPC,SPCTOP) + INTEGER MP(KM) + REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1) + REAL F(IX,2,KM) + REAL SPC(NC,KM),SPCTOP(NCTOP,KM) + REAL FW(2,2) + +C FOR EACH ZONAL WAVENUMBER, ANALYZE TERMS OVER TOTAL WAVENUMBER. +C ANALYZE EVEN AND ODD POLYNOMIALS SEPARATELY. + LX=MIN(M,IM/2) +!C$OMP PARALLEL DO PRIVATE(L,NT,KS,KP,FW) + DO K=1,KM + DO L=0,LX + NT=MOD(M+1+(I-1)*L,2)+1 + KS=L*(2*M+(I-1)*(L-1)) + KP=KS/2+1 + IF(MP(K).EQ.0) THEN + FW(1,1)=WGT*(F(2*L+1,1,K)+F(2*L+1,2,K)) + FW(2,1)=WGT*(F(2*L+2,1,K)+F(2*L+2,2,K)) + FW(1,2)=WGT*(F(2*L+1,1,K)-F(2*L+1,2,K)) + FW(2,2)=WGT*(F(2*L+2,1,K)-F(2*L+2,2,K)) + ELSE + FW(1,1)=WGT*CLAT*(F(2*L+1,1,K)+F(2*L+1,2,K)) + FW(2,1)=WGT*CLAT*(F(2*L+2,1,K)+F(2*L+2,2,K)) + FW(1,2)=WGT*CLAT*(F(2*L+1,1,K)-F(2*L+1,2,K)) + FW(2,2)=WGT*CLAT*(F(2*L+2,1,K)-F(2*L+2,2,K)) + SPCTOP(2*L+1,K)=SPCTOP(2*L+1,K)+PLNTOP(L+1)*FW(1,NT) + SPCTOP(2*L+2,K)=SPCTOP(2*L+2,K)+PLNTOP(L+1)*FW(2,NT) + ENDIF + DO N=L,I*L+M,2 + SPC(KS+2*N+1,K)=SPC(KS+2*N+1,K)+PLN(KP+N)*FW(1,1) + SPC(KS+2*N+2,K)=SPC(KS+2*N+2,K)+PLN(KP+N)*FW(2,1) + ENDDO + DO N=L+1,I*L+M,2 + SPC(KS+2*N+1,K)=SPC(KS+2*N+1,K)+PLN(KP+N)*FW(1,2) + SPC(KS+2*N+2,K)=SPC(KS+2*N+2,K)+PLN(KP+N)*FW(2,2) + ENDDO + ENDDO + ENDDO + RETURN + END diff --git a/src/spdz2uv.f b/src/spdz2uv.f new file mode 100644 index 00000000..9bdc0efd --- /dev/null +++ b/src/spdz2uv.f @@ -0,0 +1,82 @@ +C> @file +C> @brief Compute winds from divergence and vorticity. +C> @author Iredell @date 92-10-31 + +C> Computes the wind components from divergence and vorticity +C> in spectral space. +C> +C> Subprogram speps() should be called already. +C> +C> If L is the zonal wavenumber, N is the total wavenumber, +C>
      
+C> EPS(L,N) = SQRT((N**2-L**2)/(4*N**2-1))
+C> 
+C> and A is earth radius, +C> then the zonal wind component U is computed as +C>
+C> U(L,N)=-I*L/(N*(N+1))*A*D(L,N)
+C> +EPS(L,N+1)/(N+1)*A*Z(L,N+1)-EPS(L,N)/N*A*Z(L,N-1)
+C> 
+C> and the meridional wind component V is computed as +C>
+C> V(L,N)=-I*L/(N*(N+1))*A*Z(L,N)
+C> -EPS(L,N+1)/(N+1)*A*D(L,N+1)+EPS(L,N)/N*A*D(L,N-1)
+C> 
+C> where D is divergence and Z is vorticity. +C> +C> U and V are weighted by the cosine of latitude. +C> +C> Cxtra terms are computed over top of the spectral domain. +C> +C> Advantage is taken of the fact that EPS(L,L)=0 +C> in order to vectorize over the entire spectral domain. +C> +C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2 +C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A +C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A +C> @param EONTOP (M+1) EPSILON/N*A OVER TOP +C> @param D ((M+1)*((I+1)*M+2)) divergence +C> @param Z ((M+1)*((I+1)*M+2)) vorticity +C> @param U ((M+1)*((I+1)*M+2)) zonal wind (times coslat) +C> @param V ((M+1)*((I+1)*M+2)) merid wind (times coslat) +C> @param UTOP (2*(M+1)) zonal wind (times coslat) over top +C> @param VTOP (2*(M+1)) merid wind (times coslat) over top +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPDZ2UV(I,M,ENN1,ELONN1,EON,EONTOP,D,Z,U,V,UTOP,VTOP) + REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2) + REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1) + REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2)) + REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2)) + REAL UTOP(2*(M+1)),VTOP(2*(M+1)) + +C COMPUTE WINDS IN THE SPECTRAL DOMAIN + K=1 + U(2*K-1)=EON(K+1)*Z(2*K+1) + U(2*K)=EON(K+1)*Z(2*K+2) + V(2*K-1)=-EON(K+1)*D(2*K+1) + V(2*K)=-EON(K+1)*D(2*K+2) + DO K=2,(M+1)*((I+1)*M+2)/2-1 + U(2*K-1)=ELONN1(K)*D(2*K)+EON(K+1)*Z(2*K+1)-EON(K)*Z(2*K-3) + U(2*K)=-ELONN1(K)*D(2*K-1)+EON(K+1)*Z(2*K+2)-EON(K)*Z(2*K-2) + V(2*K-1)=ELONN1(K)*Z(2*K)-EON(K+1)*D(2*K+1)+EON(K)*D(2*K-3) + V(2*K)=-ELONN1(K)*Z(2*K-1)-EON(K+1)*D(2*K+2)+EON(K)*D(2*K-2) + ENDDO + K=(M+1)*((I+1)*M+2)/2 + U(2*K-1)=ELONN1(K)*D(2*K)-EON(K)*Z(2*K-3) + U(2*K)=-ELONN1(K)*D(2*K-1)-EON(K)*Z(2*K-2) + V(2*K-1)=ELONN1(K)*Z(2*K)+EON(K)*D(2*K-3) + V(2*K)=-ELONN1(K)*Z(2*K-1)+EON(K)*D(2*K-2) + +C COMPUTE WINDS OVER TOP OF THE SPECTRAL DOMAIN + DO L=0,M + K=L*(2*M+(I-1)*(L-1))/2+I*L+M+1 + UTOP(2*L+1)=-EONTOP(L+1)*Z(2*K-1) + UTOP(2*L+2)=-EONTOP(L+1)*Z(2*K) + VTOP(2*L+1)=EONTOP(L+1)*D(2*K-1) + VTOP(2*L+2)=EONTOP(L+1)*D(2*K) + ENDDO + RETURN + END diff --git a/src/speps.f b/src/speps.f new file mode 100644 index 00000000..691c7dc6 --- /dev/null +++ b/src/speps.f @@ -0,0 +1,53 @@ +C> @file +C> @brief Compute utility spectral fields. +C> @author Iredell @date 92-10-31 + +C> Computes constant fields indexed in the spectral domain +C> in "IBM ORDER" (Zonal wavenumber is the slower index). +C> +C> If L is the zonal wavenumber and N is the total wavenumber +C> and A is the earth radius, then the fields returned are: +C> - (1) normalizing factor EPSILON=SQRT((N**2-L**2)/(4*N**2-1)) +C> - (2) Laplacian factor N*(N+1)/A**2 +C> - (3) zonal derivative/Laplacian factor L/(N*(N+1))*A +C> - (4) Meridional derivative/Laplacian factor EPSILON/N*A +C> +C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param EPS ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1)) +C> @param EPSTOP (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP +C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2 +C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A +C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A +C> @param EONTOP (M+1) EPSILON/N*A OVER TOP +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPEPS(I,M,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1) + REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2) + REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1) + PARAMETER(RERTH=6.3712E6,RA2=1./RERTH**2) + + DO L=0,M + K=L*(2*M+(I-1)*(L-1))/2+L+1 + EPS(K)=0. + ENN1(K)=RA2*L*(L+1) + ELONN1(K)=RERTH/(L+1) + EON(K)=0. + ENDDO + DO L=0,M + DO N=L+1,I*L+M + K=L*(2*M+(I-1)*(L-1))/2+N+1 + EPS(K)=SQRT(FLOAT(N**2-L**2)/FLOAT(4*N**2-1)) + ENN1(K)=RA2*N*(N+1) + ELONN1(K)=RERTH*L/(N*(N+1)) + EON(K)=RERTH/N*EPS(K) + ENDDO + ENDDO + DO L=0,M + N=I*L+M+1 + EPSTOP(L+1)=SQRT(FLOAT(N**2-L**2)/FLOAT(4*N**2-1)) + EONTOP(L+1)=RERTH/N*EPSTOP(L+1) + ENDDO + RETURN + END diff --git a/src/spfft.f b/src/spfft.f new file mode 100644 index 00000000..672bb025 --- /dev/null +++ b/src/spfft.f @@ -0,0 +1,75 @@ +C> @file +C> @brief Perform multiple fast fourier transforms. +C> @author Iredell @date 96-02-20 + +C> This subprogram performs multiple fast fourier transforms +C> between complex amplitudes in fourier space and real values +C> in cyclic physical space. +C> +C> Subprogram spfft must be invoked first with idir=0 +C> to initialize trigonemetric data. Use subprogram spfft1 +C> to perform an fft without previous initialization. +C> This version invokes the ibm essl fft. +C> +C> The restrictions on imax are that it must be a multiple +C> of 1 to 25 factors of two, up to 2 factors of three, +C> and up to 1 factor of five, seven and eleven. +C> +C> If IDIR=0, then W and G need not contain any valid data. +C> the other parameters must be supplied and cannot change +C> in succeeding calls until the next time it is called with IDIR=0. +C> +C> This subprogram is not thread-safe when IDIR=0. On the other hand, +C> when IDIR is not zero, it can be called from a threaded region. +C> +C> @param IMAX number of values in the cyclic physical space +C> (see limitations on imax in remarks below.) +C> @param INCW first dimension of the complex amplitude array +C> (INCW >= IMAX/2+1) +C> @param INCG first dimension of the real value array +C> (INCG >= IMAX) +C> @param KMAX number of transforms to perform +C> @param[out] W complex amplitudes if IDIR>0 +C> @param[out] G real values if IDIR<0 +C> @param IDIR direction flag +C> - IDIR=0 to initialize internal trigonometric data +C> - IDIR>0 TO transform from Fourier to physical space +C> - IDIR<0 TO transform from physical to fourier space +C> +C> @author Iredell @date 96-02-20 + SUBROUTINE SPFFT(IMAX,INCW,INCG,KMAX,W,G,IDIR) + + IMPLICIT NONE + INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR + COMPLEX,INTENT(INOUT):: W(INCW,KMAX) + REAL,INTENT(INOUT):: G(INCG,KMAX) + INTEGER,SAVE:: NAUX1=0 + REAL,SAVE,ALLOCATABLE:: AUX1CR(:),AUX1RC(:) + INTEGER:: NAUX2 + REAL:: AUX2(20000+INT(0.57*IMAX)) + + NAUX2=20000+INT(0.57*IMAX) + +C INITIALIZATION. +C ALLOCATE AND FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA + SELECT CASE(IDIR) + CASE(0) + IF(NAUX1.GT.0) DEALLOCATE(AUX1CR,AUX1RC) + NAUX1=25000+INT(0.82*IMAX) + ALLOCATE(AUX1CR(NAUX1),AUX1RC(NAUX1)) + CALL SCRFT(1,W,INCW,G,INCG,IMAX,KMAX,-1,1., + & AUX1CR,NAUX1,AUX2,NAUX2,0.,0) + CALL SRCFT(1,G,INCG,W,INCW,IMAX,KMAX,+1,1./IMAX, + & AUX1RC,NAUX1,AUX2,NAUX2,0.,0) + +C FOURIER TO PHYSICAL TRANSFORM. + CASE(1:) + CALL SCRFT(0,W,INCW,G,INCG,IMAX,KMAX,-1,1., + & AUX1CR,NAUX1,AUX2,NAUX2,0.,0) + +C PHYSICAL TO FOURIER TRANSFORM. + CASE(:-1) + CALL SRCFT(0,G,INCG,W,INCW,IMAX,KMAX,+1,1./IMAX, + & AUX1RC,NAUX1,AUX2,NAUX2,0.,0) + END SELECT + END SUBROUTINE diff --git a/src/spfft1.f b/src/spfft1.f new file mode 100644 index 00000000..4800356a --- /dev/null +++ b/src/spfft1.f @@ -0,0 +1,59 @@ +C> @file +C> @brief Perform multiple fast Fourier transforms. +C> @author Iredell @date 96-02-20 + +C> This subprogram performs multiple fast Fourier transforms +C> between complex amplitudes in Fourier space and real values +C> in cyclic physical space. +C> +C> Subprogram spfft1() initializes trigonometric data each call. +C> Use subprogram spfft() to save time and initialize once. +C> This version invokes the IBM ESSL FFT. +C> +C> @note The restrictions on IMAX are that it must be a multiple of 1 +C> to 25 factors of two, up to 2 factors of three, and up to 1 factor of +C> five, seven and eleven. +C> +C> @note This subprogram is thread-safe. +C> +C> @param IMAX number of values in the cyclic physical space +C> (see limitations on imax in remarks below.) +C> @param INCW first dimension of the complex amplitude array +C> (INCW >= IMAX/2+1) +C> @param INCG first dimension of the real value array (INCG >= IMAX) +C> @param KMAX number of transforms to perform +C> @param[out] W complex amplitudes if IDIR>0 +C> @param[out] G values if IDIR<0 +C> @param IDIR direction flag +C> - IDIR>0 to transform from Fourier to physical space +C> - IDIR<0 to transform from physical to Fourier space +C> +C> @author Iredell @date 96-02-20 + SUBROUTINE SPFFT1(IMAX,INCW,INCG,KMAX,W,G,IDIR) + IMPLICIT NONE + INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR + COMPLEX,INTENT(INOUT):: W(INCW,KMAX) + REAL,INTENT(INOUT):: G(INCG,KMAX) + REAL:: AUX1(25000+INT(0.82*IMAX)) + REAL:: AUX2(20000+INT(0.57*IMAX)) + INTEGER:: NAUX1,NAUX2 +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + NAUX1=25000+INT(0.82*IMAX) + NAUX2=20000+INT(0.57*IMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C FOURIER TO PHYSICAL TRANSFORM. + SELECT CASE(IDIR) + CASE(1:) + CALL SCRFT(1,W,INCW,G,INCG,IMAX,KMAX,-1,1., + & AUX1,NAUX1,AUX2,NAUX2,0.,0) + CALL SCRFT(0,W,INCW,G,INCG,IMAX,KMAX,-1,1., + & AUX1,NAUX1,AUX2,NAUX2,0.,0) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C PHYSICAL TO FOURIER TRANSFORM. + CASE(:-1) + CALL SRCFT(1,G,INCG,W,INCW,IMAX,KMAX,+1,1./IMAX, + & AUX1,NAUX1,AUX2,NAUX2,0.,0) + CALL SRCFT(0,G,INCG,W,INCW,IMAX,KMAX,+1,1./IMAX, + & AUX1,NAUX1,AUX2,NAUX2,0.,0) + END SELECT + END SUBROUTINE diff --git a/src/spffte.f b/src/spffte.f new file mode 100644 index 00000000..d7beb288 --- /dev/null +++ b/src/spffte.f @@ -0,0 +1,133 @@ +C> @file +C> @brief Perform multiple fast Fourier transforms. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 1998-12-18 | Iredell | Initial. +C> 2012-11-12 | Mirvis | fixing hard-wired types problem on Intel/Linux. +C> +C> @author Iredell @date 96-02-20 + +C> This subprogram performs multiple fast Fourier transforms +C> between complex amplitudes in Fourier space and real values +C> in cyclic physical space. +C> +C> This subprogram must be invoked first with IDIR=0 +C> to initialize trigonemetric data. Use subprogram spfft1() +C> to perform an FFT without previous initialization. +C> +C> This version invokes the IBM ESSL FFT. +C> +C> @note The restrictions on IMAX are that it must be a multiple +C> of 1 to 25 factors of two, up to 2 factors of three, +C> and up to 1 factor of five, seven and eleven. +C> +C> If IDIR=0, then W and G need not contain any valid data. +C> The other parameters must be supplied and cannot change +C> in succeeding calls until the next time it is called with IDIR=0. +C> +C> This subprogram is thread-safe. +C> +C> @param IMAX number of values in the cyclic physical space +C> (see limitations on imax in remarks below.) +C> @param INCW first dimension of the complex amplitude array +C> (INCW >= IMAX/2+1) +C> @param INCG first dimension of the real value array +C> (INCG >= IMAX) +C> @param KMAX number of transforms to perform +C> @param[out] W complex amplitudes if IDIR>0 +C> @param[out] G real values if IDIR<0 +C> @param IDIR direction flag +C> - IDIR=0 to initialize trigonometric data +C> - IDIR>0 to transform from Fourier to physical space +C> - IDIR<0 to transform from physical to Fourier space +C> @param[out] AFFT auxiliary array if IDIR<>0 +C> +C> @author Iredell @date 96-02-20 + SUBROUTINE SPFFTE(IMAX,INCW,INCG,KMAX,W,G,IDIR,AFFT) + IMPLICIT NONE + INTEGER,INTENT(IN):: IMAX,INCW,INCG,KMAX,IDIR + REAL,INTENT(INOUT):: W(2*INCW,KMAX) + REAL,INTENT(INOUT):: G(INCG,KMAX) + REAL(8),INTENT(INOUT):: AFFT(50000+4*IMAX) + INTEGER:: INIT,INC2X,INC2Y,N,M,ISIGN,NAUX1,NAUX2,NAUX3 +C ==EM== ^(4) + REAL:: SCALE + REAL(8):: AUX2(20000+2*IMAX),AUX3 + INTEGER:: IACR,IARC + + NAUX1=25000+2*IMAX + NAUX2=20000+2*IMAX + NAUX3=1 + IACR=1 + IARC=1+NAUX1 + +C INITIALIZATION. +C FILL AUXILIARY ARRAYS WITH TRIGONOMETRIC DATA + SELECT CASE(IDIR) + CASE(0) + INIT=1 + INC2X=INCW + INC2Y=INCG + N=IMAX + M=KMAX + ISIGN=-1 + SCALE=1. + IF(DIGITS(1.).LT.DIGITS(1._8)) THEN + CALL SCRFT(INIT,W,INC2X,G,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IACR),NAUX1,AUX2,NAUX2,AUX3,NAUX3) + ELSE + CALL DCRFT(INIT,W,INC2X,G,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IACR),NAUX1,AUX2,NAUX2) + ENDIF + INIT=1 + INC2X=INCG + INC2Y=INCW + N=IMAX + M=KMAX + ISIGN=+1 + SCALE=1./IMAX + IF(DIGITS(1.).LT.DIGITS(1._8)) THEN + CALL SRCFT(INIT,G,INC2X,W,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IARC),NAUX1,AUX2,NAUX2,AUX3,NAUX3) + ELSE + CALL DRCFT(INIT,G,INC2X,W,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IARC),NAUX1,AUX2,NAUX2) + ENDIF + +C FOURIER TO PHYSICAL TRANSFORM. + CASE(1:) + INIT=0 + INC2X=INCW + INC2Y=INCG + N=IMAX + M=KMAX + ISIGN=-1 + SCALE=1. + IF(DIGITS(1.).LT.DIGITS(1._8)) THEN + CALL SCRFT(INIT,W,INC2X,G,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IACR),NAUX1,AUX2,NAUX2,AUX3,NAUX3) + ELSE + CALL DCRFT(INIT,W,INC2X,G,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IACR),NAUX1,AUX2,NAUX2) + ENDIF + +C PHYSICAL TO FOURIER TRANSFORM. + CASE(:-1) + INIT=0 + INC2X=INCG + INC2Y=INCW + N=IMAX + M=KMAX + ISIGN=+1 + SCALE=1./IMAX + IF(DIGITS(1.).LT.DIGITS(1._8)) THEN + CALL SRCFT(INIT,G,INC2X,W,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IARC),NAUX1,AUX2,NAUX2,AUX3,NAUX3) + ELSE + CALL DRCFT(INIT,G,INC2X,W,INC2Y,N,M,ISIGN,SCALE, + & AFFT(IARC),NAUX1,AUX2,NAUX2) + ENDIF + END SELECT + END SUBROUTINE diff --git a/src/spfftpt.f b/src/spfftpt.f new file mode 100644 index 00000000..72a53de8 --- /dev/null +++ b/src/spfftpt.f @@ -0,0 +1,48 @@ +C> @file +C> @brief Compute fourier transform to gridpoints. +C> @author Iredell @date 96-02-20 + +C> This subprogram computes a slow Fourier transform +C> from Fourier space to a set of gridpoints. +C> +C> @note This subprogram is thread-safe. +C> +C> @param M Fourier wavenumber truncation +C> @param N number of gridpoints +C> @param INCW first dimension of the complex amplitude array +C> (INCW >= M+1) +C> @param INCG first dimension of the gridpoint array +C> (INCG >= N) +C> @param KMAX number of Fourier fields +C> @param RLON grid longitudes in degrees +C> @param W Fourier amplitudes +C> @param G gridpoint values +C> +C> @author Iredell @date 96-02-20 + SUBROUTINE SPFFTPT(M,N,INCW,INCG,KMAX,RLON,W,G) + + IMPLICIT NONE + INTEGER,INTENT(IN):: M,N,INCW,INCG,KMAX + REAL,INTENT(IN):: RLON(N) + REAL,INTENT(IN):: W(2*INCW,KMAX) + REAL,INTENT(OUT):: G(INCG,KMAX) + INTEGER I,K,L + REAL RADLON,SLON(M),CLON(M) + REAL,PARAMETER:: PI=3.14159265358979 + + DO I=1,N + RADLON=PI/180*RLON(I) + DO L=1,M + SLON(L)=SIN(L*RADLON) + CLON(L)=COS(L*RADLON) + ENDDO + DO K=1,KMAX + G(I,K)=W(1,K) + ENDDO + DO L=1,M + DO K=1,KMAX + G(I,K)=G(I,K)+2.*(W(2*L+1,K)*CLON(L)-W(2*L+2,K)*SLON(L)) + ENDDO + ENDDO + ENDDO + END SUBROUTINE diff --git a/src/spgradq.f b/src/spgradq.f new file mode 100644 index 00000000..9fa03873 --- /dev/null +++ b/src/spgradq.f @@ -0,0 +1,66 @@ +C> @file +C> @brief Compute gradient in spectral space. +C> @author Iredell @date 92-10-31 + +C> Computes the horizontal vector gradient of a scalar field +C> in spectral space. +C> +C> Subprogram speps() should be called already. +C> +C> If l is the zonal wavenumber, n is the total wavenumber, +C> eps(l,n)=sqrt((n**2-l**2)/(4*n**2-1)) and a is earth radius, +C> then the zonal gradient of q(l,n) is simply i*l/a*q(l,n) +C> while the meridional gradient of q(l,n) is computed as +C> eps(l,n+1)*(n+2)/a*q(l,n+1)-eps(l,n+1)*(n-1)/a*q(l,n-1). +C> +C> Extra terms are computed over top of the spectral domain. +C> +C> Advantage is taken of the fact that eps(l,l)=0 +C> in order to vectorize over the entire spectral domain. +C> +C> @param I spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param ENN1 +C> @param ELONN1 +C> @param EON EPSILON/N*A +C> @param EONTOP EPSILON/N*A over top +C> @param Q scalar field +C> @param QDX zonal gradient (times coslat) +C> @param QDY merid gradient (times coslat) +C> @param QDYTOP merid gradient (times coslat) over top +C> +C> @author IREDELL @date 92-10-31 + SUBROUTINE SPGRADQ(I,M,ENN1,ELONN1,EON,EONTOP,Q,QDX,QDY,QDYTOP) + + REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2) + REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1) + REAL Q((M+1)*((I+1)*M+2)) + REAL QDX((M+1)*((I+1)*M+2)),QDY((M+1)*((I+1)*M+2)) + REAL QDYTOP(2*(M+1)) + +C TAKE ZONAL AND MERIDIONAL GRADIENTS + K=1 + QDX(2*K-1)=0. + QDX(2*K)=0. + QDY(2*K-1)=EON(K+1)*ENN1(K+1)*Q(2*K+1) + QDY(2*K)=EON(K+1)*ENN1(K+1)*Q(2*K+2) + DO K=2,(M+1)*((I+1)*M+2)/2-1 + QDX(2*K-1)=-ELONN1(K)*ENN1(K)*Q(2*K) + QDX(2*K)=ELONN1(K)*ENN1(K)*Q(2*K-1) + QDY(2*K-1)=EON(K+1)*ENN1(K+1)*Q(2*K+1)-EON(K)*ENN1(K-1)*Q(2*K-3) + QDY(2*K)=EON(K+1)*ENN1(K+1)*Q(2*K+2)-EON(K)*ENN1(K-1)*Q(2*K-2) + ENDDO + K=(M+1)*((I+1)*M+2)/2 + QDX(2*K-1)=-ELONN1(K)*ENN1(K)*Q(2*K) + QDX(2*K)=ELONN1(K)*ENN1(K)*Q(2*K-1) + QDY(2*K-1)=-EON(K)*ENN1(K-1)*Q(2*K-3) + QDY(2*K)=-EON(K)*ENN1(K-1)*Q(2*K-2) + +C TAKE MERIDIONAL GRADIENT OVER TOP + DO L=0,M + K=L*(2*M+(I-1)*(L-1))/2+I*L+M+1 + QDYTOP(2*L+1)=-EONTOP(L+1)*ENN1(K)*Q(2*K-1) + QDYTOP(2*L+2)=-EONTOP(L+1)*ENN1(K)*Q(2*K) + ENDDO + RETURN + END diff --git a/src/spgradx.f b/src/spgradx.f new file mode 100644 index 00000000..e3e2e4f1 --- /dev/null +++ b/src/spgradx.f @@ -0,0 +1,72 @@ +C> @file +C> @brief Compute x-gradient in Fourier space +C> @author IREDELL @date 96-02-20 + +C> This subprogram computes the x-gradient of fields +C> in complex Fourier space. +C> +C> The x-gradient of a vector field W is +C> WX=CONJG(W)*L/RERTH +C> where L is the wavenumber and RERTH is the Earth radius, +C> so that the result is the x-gradient of the pseudo-vector. +C> +C> The x-gradient of a scalar field W is +C> WX=CONJG(W)*L/(RERTH*CLAT) +C> where CLAT is the cosine of latitude. +C> +C> At the pole this is undefined, so the way to get +C> the x-gradient at the pole is by passing both +C> the weighted wavenumber 0 and the unweighted wavenumber 1 +C> amplitudes at the pole and setting MP=10. +C> In this case, the wavenumber 1 amplitudes are used +C> to compute the x-gradient and then zeroed out. +C> +C> @note This subprogram is thread-safe. +C> +C> @param M Fourier wavenumber truncation +C> @param INCW first dimension of the complex amplitude array +C> (INCW >= M+1) +C> @param KMAX number of Fourier fields +C> @param MP identifiers +C> (0 or 10 for scalar, 1 for vector) +C> @param CLAT cosine of latitude +C> @param[out] W Fourier amplitudes corrected when MP=10 and CLAT=0 +C> @param[out] WX complex amplitudes of x-gradients +C> +C> @author IREDELL @date 96-02-20 + SUBROUTINE SPGRADX(M,INCW,KMAX,MP,CLAT,W,WX) + + IMPLICIT NONE + INTEGER,INTENT(IN):: M,INCW,KMAX,MP(KMAX) + REAL,INTENT(IN):: CLAT + REAL,INTENT(INOUT):: W(2*INCW,KMAX) + REAL,INTENT(OUT):: WX(2*INCW,KMAX) + INTEGER K,L + REAL,PARAMETER:: RERTH=6.3712E6 + + DO K=1,KMAX + IF(MP(K).EQ.1) THEN + DO L=0,M + WX(2*L+1,K)=-W(2*L+2,K)*(L/RERTH) + WX(2*L+2,K)=+W(2*L+1,K)*(L/RERTH) + ENDDO + ELSEIF(CLAT.EQ.0.) THEN + DO L=0,M + WX(2*L+1,K)=0 + WX(2*L+2,K)=0 + ENDDO + IF(MP(K).EQ.10.AND.M.GE.2) THEN + WX(3,K)=-W(4,K)/RERTH + WX(4,K)=+W(3,K)/RERTH + W(3,K)=0 + W(4,K)=0 + ENDIF + ELSE + DO L=0,M + WX(2*L+1,K)=-W(2*L+2,K)*(L/(RERTH*CLAT)) + WX(2*L+2,K)=+W(2*L+1,K)*(L/(RERTH*CLAT)) + ENDDO + ENDIF + ENDDO + + END SUBROUTINE diff --git a/src/spgrady.f b/src/spgrady.f new file mode 100644 index 00000000..922ca501 --- /dev/null +++ b/src/spgrady.f @@ -0,0 +1,59 @@ +C> @file +C> @brief Compute y-gradient in spectral space. +C> @author IREDELL @date 92-10-31 + +C> Computes the horizontal vector y-gradient of a scalar field +c> in spectral space. +C> +C> Subprogram speps should be called already. +C> +C> If L is the zonal wavenumber, N is the total wavenumber, +C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is Earth radius, +C> then the meridional gradient of Q(L,N) is computed as +C> EPS(L,N+1)*(N+2)/A*Q(L,N+1)-EPS(L,N+1)*(N-1)/A*Q(L,N-1). +C> +C> Extra terms are computed over top of the spectral domain. +C> +C> Advantage is taken of the fact that EPS(L,L)=0 +C> in order to vectorize over the entire spectral domain. +C> +C> @param I spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param ENN1 N*(N+1)/A**2 +C> @param EON EPSILON/N*A +C> @param EONTOP EPSILON/N*A over top +C> @param Q scalar field +C> @param QDY merid gradient (times coslat) +C> @param QDYTOP merid gradient (times coslat) over top +C> +C> @author IREDELL @date 92-10-31 + SUBROUTINE SPGRADY(I,M,ENN1,EON,EONTOP,Q,QDY,QDYTOP) + + REAL ENN1((M+1)*((I+1)*M+2)/2) + REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1) + REAL Q((M+1)*((I+1)*M+2)) + REAL QDY((M+1)*((I+1)*M+2)) + REAL QDYTOP(2*(M+1)) + +C TAKE MERIDIONAL GRADIENT + K=1 + QDY(2*K-1)=EON(K+1)*ENN1(K+1)*Q(2*K+1) + QDY(2*K)=EON(K+1)*ENN1(K+1)*Q(2*K+2) + DO K=2,(M+1)*((I+1)*M+2)/2-1 + QDY(2*K-1)=EON(K+1)*ENN1(K+1)*Q(2*K+1)-EON(K)*ENN1(K-1)*Q(2*K-3) + QDY(2*K)=EON(K+1)*ENN1(K+1)*Q(2*K+2)-EON(K)*ENN1(K-1)*Q(2*K-2) + ENDDO + K=(M+1)*((I+1)*M+2)/2 + QDY(2*K-1)=-EON(K)*ENN1(K-1)*Q(2*K-3) + QDY(2*K)=-EON(K)*ENN1(K-1)*Q(2*K-2) + +C TAKE MERIDIONAL GRADIENT OVER TOP + DO L=0,M + K=L*(2*M+(I-1)*(L-1))/2+I*L+M+1 + QDYTOP(2*L+1)=-EONTOP(L+1)*ENN1(K)*Q(2*K-1) + QDYTOP(2*L+2)=-EONTOP(L+1)*ENN1(K)*Q(2*K) + ENDDO + + RETURN + END diff --git a/src/splaplac.f b/src/splaplac.f new file mode 100644 index 00000000..f0ce9274 --- /dev/null +++ b/src/splaplac.f @@ -0,0 +1,49 @@ +C> @file +C> @brief Compute laplacian in spectral space. +C> @author Iredell @date 92-10-31 + +C> Computes the laplacian or the inverse laplacian +C> of a scalar field in spectral space. +C> +C> Subprogram speps() should be called already. +C> +C> The Laplacian of Q(L,N) is simply -N*(N+1)/A**2*Q(L,N) +C> +C> @param I spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param ENN1 N*(N+1)/A**2 +C> @param[out] Q if IDIR > 0, scalar field +C> (Q(0,0) is not computed) +C> @param[out] QD2 if IDIR < 0, Laplacian +C> @param IDIR flag +C> - IDIR > 0 to take Laplacian +C> - IDIR < 0 to take inverse Laplacian +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPLAPLAC(I,M,ENN1,Q,QD2,IDIR) + + REAL ENN1((M+1)*((I+1)*M+2)/2) + REAL Q((M+1)*((I+1)*M+2)) + REAL QD2((M+1)*((I+1)*M+2)) + +C TAKE LAPLACIAN + IF(IDIR.GT.0) THEN + K=1 + QD2(2*K-1)=0. + QD2(2*K)=0. + DO K=2,(M+1)*((I+1)*M+2)/2 + QD2(2*K-1)=Q(2*K-1)*(-ENN1(K)) + QD2(2*K)=Q(2*K)*(-ENN1(K)) + ENDDO + +C TAKE INVERSE LAPLACIAN + ELSE + DO K=2,(M+1)*((I+1)*M+2)/2 + Q(2*K-1)=QD2(2*K-1)/(-ENN1(K)) + Q(2*K)=QD2(2*K)/(-ENN1(K)) + ENDDO + ENDIF + + RETURN + END diff --git a/src/splat.F b/src/splat.F new file mode 100644 index 00000000..3b27073e --- /dev/null +++ b/src/splat.F @@ -0,0 +1,192 @@ +C> @file +C> @brief Computes cosines of colatitude and Gaussian weights +C> for sets of latitudes. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-20 | Iredell | Initial. +C> 97-10-20 | Iredell | Adjust precision. +C> 98-06-11 | Iredell | Generalize precision using FORTRAN 90 intrinsic. +C> 1998-12-03 | Iredell | Generalize precision further. +C> 1998-12-03 | Iredell | Uses AIX ESSL BLAS calls. +C> 2009-12-27 | D. Stark | Updated to switch between ESSL calls on an AIX platform, and Numerical Recipies calls elsewise. +C> 2010-12-30 | Slovacek | Update alignment so preprocessor does not cause compilation failure. +C> 2012-09-01 | E. Mirvis & M.Iredell | Merging & debugging linux errors of _d and _8 using generic LU factorization. +C> 2012-11-05 | E. Mirvis | Generic FFTPACK and LU lapack were removed. +C> +C> @author Iredell @date 96-02-20 + +C> Computes cosines of colatitude and Gaussian weights +C> for one of the following specific global sets of latitudes. +C> - Gaussian latitudes (IDRT=4) +C> - Equally-spaced latitudes including poles (IDRT=0) +C> - Equally-spaced latitudes excluding poles (IDRT=256) +C> +C> The Gaussian latitudes are located at the zeroes of the +C> Legendre polynomial of the given order. These latitudes +C> are efficient for reversible transforms from spectral space. +C> (About twice as many equally-spaced latitudes are needed.) +C> The weights for the equally-spaced latitudes are based on +C> Ellsaesser (JAM,1966). (No weight is given the pole point.) +C> Note that when analyzing grid to spectral in latitude pairs, +C> if an equator point exists, its weight should be halved. +C> This version invokes the ibm essl matrix solver. +C> +C> @param[in] IDRT grid identifier +C> - 4 for Gaussian grid +C> - 0 for equally-spaced grid including poles +C> - 256 for equally-spaced grid excluding poles +C> @param[in] JMAX number of latitudes +C> @param[out] SLAT sines of latitude +C> @param[out] WLAT Gaussian weights +C> +C> @author Iredell @date 96-02-20 + SUBROUTINE SPLAT(IDRT,JMAX,SLAT,WLAT) + REAL SLAT(JMAX),WLAT(JMAX) + INTEGER,PARAMETER:: KD=SELECTED_REAL_KIND(15,45) + REAL(KIND=KD):: PK(JMAX/2),PKM1(JMAX/2),PKM2(JMAX/2) + REAL(KIND=KD):: SLATD(JMAX/2),SP,SPMAX,EPS=10.*EPSILON(SP) + PARAMETER(JZ=50) + REAL BZ(JZ) + DATA BZ / 2.4048255577, 5.5200781103, + $ 8.6537279129, 11.7915344391, 14.9309177086, 18.0710639679, + $ 21.2116366299, 24.3524715308, 27.4934791320, 30.6346064684, + $ 33.7758202136, 36.9170983537, 40.0584257646, 43.1997917132, + $ 46.3411883717, 49.4826098974, 52.6240518411, 55.7655107550, + $ 58.9069839261, 62.0484691902, 65.1899648002, 68.3314693299, + $ 71.4729816036, 74.6145006437, 77.7560256304, 80.8975558711, + $ 84.0390907769, 87.1806298436, 90.3221726372, 93.4637187819, + $ 96.6052679510, 99.7468198587, 102.888374254, 106.029930916, + $ 109.171489649, 112.313050280, 115.454612653, 118.596176630, + $ 121.737742088, 124.879308913, 128.020877005, 131.162446275, + $ 134.304016638, 137.445588020, 140.587160352, 143.728733573, + $ 146.870307625, 150.011882457, 153.153458019, 156.295034268 / + REAL:: DLT,D1=1. + REAL AWORK((JMAX+1)/2,((JMAX+1)/2)),BWORK(((JMAX+1)/2)) + INTEGER:: JHE,JHO,J0=0 + INTEGER IPVT((JMAX+1)/2) + PARAMETER(PI=3.14159265358979,C=(1.-(2./PI)**2)*0.25) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C GAUSSIAN LATITUDES + IF(IDRT.EQ.4) THEN + JH=JMAX/2 + JHE=(JMAX+1)/2 + R=1./SQRT((JMAX+0.5)**2+C) + DO J=1,MIN(JH,JZ) + SLATD(J)=COS(BZ(J)*R) + ENDDO + DO J=JZ+1,JH + SLATD(J)=COS((BZ(JZ)+(J-JZ)*PI)*R) + ENDDO + SPMAX=1. + DO WHILE(SPMAX.GT.EPS) + SPMAX=0. + DO J=1,JH + PKM1(J)=1. + PK(J)=SLATD(J) + ENDDO + DO N=2,JMAX + DO J=1,JH + PKM2(J)=PKM1(J) + PKM1(J)=PK(J) + PK(J)=((2*N-1)*SLATD(J)*PKM1(J)-(N-1)*PKM2(J))/N + ENDDO + ENDDO + DO J=1,JH + SP=PK(J)*(1.-SLATD(J)**2)/(JMAX*(PKM1(J)-SLATD(J)*PK(J))) + SLATD(J)=SLATD(J)-SP + SPMAX=MAX(SPMAX,ABS(SP)) + ENDDO + ENDDO +CDIR$ IVDEP + DO J=1,JH + SLAT(J)=SLATD(J) + WLAT(J)=(2.*(1.-SLATD(J)**2))/(JMAX*PKM1(J))**2 + SLAT(JMAX+1-J)=-SLAT(J) + WLAT(JMAX+1-J)=WLAT(J) + ENDDO + IF(JHE.GT.JH) THEN + SLAT(JHE)=0. + WLAT(JHE)=2./JMAX**2 + DO N=2,JMAX,2 + WLAT(JHE)=WLAT(JHE)*N**2/(N-1)**2 + ENDDO + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C EQUALLY-SPACED LATITUDES INCLUDING POLES + ELSEIF(IDRT.EQ.0) THEN + JH=JMAX/2 + JHE=(JMAX+1)/2 + JHO=JHE-1 + DLT=PI/(JMAX-1) + SLAT(1)=1. + DO J=2,JH + SLAT(J)=COS((J-1)*DLT) + ENDDO + DO JS=1,JHO + DO J=1,JHO + AWORK(JS,J)=COS(2*(JS-1)*J*DLT) + ENDDO + ENDDO + DO JS=1,JHO + BWORK(JS)=-D1/(4*(JS-1)**2-1) + ENDDO + + call ludcmp(awork,jho,jhe,ipvt) + call lubksb(awork,jho,jhe,ipvt,bwork) + + WLAT(1)=0. + DO J=1,JHO + WLAT(J+1)=BWORK(J) + ENDDO +CDIR$ IVDEP + DO J=1,JH + print *, j, jmax, JMAX+1-J + SLAT(JMAX+1-J)=-SLAT(J) + WLAT(JMAX+1-J)=WLAT(J) + ENDDO + IF(JHE.GT.JH) THEN + SLAT(JHE)=0. + WLAT(JHE)=2.*WLAT(JHE) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C EQUALLY-SPACED LATITUDES EXCLUDING POLES + ELSEIF(IDRT.EQ.256) THEN + JH=JMAX/2 + JHE=(JMAX+1)/2 + JHO=JHE + DLT=PI/JMAX + SLAT(1)=1. + DO J=1,JH + SLAT(J)=COS((J-0.5)*DLT) + ENDDO + DO JS=1,JHO + DO J=1,JHO + AWORK(JS,J)=COS(2*(JS-1)*(J-0.5)*DLT) + ENDDO + ENDDO + DO JS=1,JHO + BWORK(JS)=-D1/(4*(JS-1)**2-1) + ENDDO + + call ludcmp(awork,jho,jhe,ipvt,d) + call lubksb(awork,jho,jhe,ipvt,bwork) + + WLAT(1)=0. + DO J=1,JHO + WLAT(J)=BWORK(J) + ENDDO +CDIR$ IVDEP + DO J=1,JH + SLAT(JMAX+1-J)=-SLAT(J) + WLAT(JMAX+1-J)=WLAT(J) + ENDDO + IF(JHE.GT.JH) THEN + SLAT(JHE)=0. + WLAT(JHE)=2.*WLAT(JHE) + ENDIF + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + RETURN + END diff --git a/src/splegend.f b/src/splegend.f new file mode 100644 index 00000000..b862ca87 --- /dev/null +++ b/src/splegend.f @@ -0,0 +1,131 @@ +C> @file +C> +C> Compute Legendre polynomials +C> @author IREDELL @date 92-10-31 + +C> Evaluates the orthonormal associated Legendre polynomials in the +C> spectral domain at a given latitude. Subprogram splegend should +C> be called already. If l is the zonal wavenumber, N is the total +C> wavenumber, and EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) then the +C> following bootstrapping formulas are used: +C> +C>
+C> PLN(0,0)=SQRT(0.5)
+C> PLN(L,L)=PLN(L-1,L-1)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L))
+C> PLN(L,N)=(SLAT*PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
+C> 
+C> +C> Synthesis at the pole needs only two zonal wavenumbers. Scalar +C> fields are synthesized with zonal wavenumber 0 while vector +C> fields are synthesized with zonal wavenumber 1. (Thus polar +C> vector fields are implicitly divided by clat.) The following +C> bootstrapping formulas are used at the pole: +C> +C>
+C> PLN(0,0)=SQRT(0.5)
+C> PLN(1,1)=SQRT(0.75)
+C> PLN(L,N)=(PLN(L,N-1)-EPS(L,N-1)*PLN(L,N-2))/EPS(L,N)
+C> 
+C> +C> PROGRAM HISTORY LOG: +C> - 91-10-31 MARK IREDELL +C> - 98-06-10 MARK IREDELL GENERALIZE PRECISION +C> +C> @param I - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param M - INTEGER SPECTRAL TRUNCATION +C> @param SLAT - REAL SINE OF LATITUDE +C> @param CLAT - REAL COSINE OF LATITUDE +C> @param EPS - REAL ((M+1)*((I+1)*M+2)/2) SQRT((N**2-L**2)/(4*N**2-1)) +C> @param EPSTOP - REAL (M+1) SQRT((N**2-L**2)/(4*N**2-1)) OVER TOP +C> @param[out] PLN - REAL ((M+1)*((I+1)*M+2)/2) LEGENDRE POLYNOMIAL +C> @param[out] PLNTOP - REAL (M+1) LEGENDRE POLYNOMIAL OVER TOP +C> + SUBROUTINE SPLEGEND(I,M,SLAT,CLAT,EPS,EPSTOP,PLN,PLNTOP) + +CFPP$ NOCONCUR R + REAL EPS((M+1)*((I+1)*M+2)/2),EPSTOP(M+1) + REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1) + REAL(KIND=SELECTED_REAL_KIND(15,45)):: DLN((M+1)*((I+1)*M+2)/2) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C ITERATIVELY COMPUTE PLN WITHIN SPECTRAL DOMAIN AT POLE + M1=M+1 + M2=2*M+I+1 + MX=(M+1)*((I+1)*M+2)/2 + IF(CLAT.EQ.0.) THEN + DLN(1)=SQRT(0.5) + IF(M.GT.0) THEN + DLN(M1+1)=SQRT(0.75) + DLN(2)=SLAT*DLN(1)/EPS(2) + ENDIF + IF(M.GT.1) THEN + DLN(M1+2)=SLAT*DLN(M1+1)/EPS(M1+2) + DLN(3)=(SLAT*DLN(2)-EPS(2)*DLN(1))/EPS(3) + DO N=3,M + K=1+N + DLN(K)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPS(K) + K=M1+N + DLN(K)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPS(K) + ENDDO + IF(I.EQ.1) THEN + K=M2 + DLN(K)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPS(K) + ENDIF + DO K=M2+1,MX + DLN(K)=0. + ENDDO + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN + K=M1+1 + PLNTOP(1)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPSTOP(1) + IF(M.GT.0) THEN + K=M2+1 + PLNTOP(2)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPSTOP(2) + DO L=2,M + PLNTOP(L+1)=0. + ENDDO + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C ITERATIVELY COMPUTE PLN(L,L) (BOTTOM HYPOTENUSE OF DOMAIN) + ELSE + NML=0 + K=1 + DLN(K)=SQRT(0.5) + DO L=1,M+(I-1)*NML + KP=K + K=L*(2*M+(I-1)*(L-1))/2+L+NML+1 + DLN(K)=DLN(KP)*CLAT*SQRT(FLOAT(2*L+1)/FLOAT(2*L)) + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C COMPUTE PLN(L,L+1) (DIAGONAL NEXT TO BOTTOM HYPOTENUSE OF DOMAIN) + NML=1 +CDIR$ IVDEP + DO L=0,M+(I-1)*NML + K=L*(2*M+(I-1)*(L-1))/2+L+NML+1 + DLN(K)=SLAT*DLN(K-1)/EPS(K) + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C COMPUTE REMAINING PLN IN SPECTRAL DOMAIN + DO NML=2,M +CDIR$ IVDEP + DO L=0,M+(I-1)*NML + K=L*(2*M+(I-1)*(L-1))/2+L+NML+1 + DLN(K)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPS(K) + ENDDO + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C COMPUTE POLYNOMIALS OVER TOP OF SPECTRAL DOMAIN + DO L=0,M + NML=M+1+(I-1)*L + K=L*(2*M+(I-1)*(L-1))/2+L+NML+1 + PLNTOP(L+1)=(SLAT*DLN(K-1)-EPS(K-1)*DLN(K-2))/EPSTOP(L+1) + ENDDO + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C RETURN VALUES + DO K=1,MX + PLN(K)=DLN(K) + ENDDO + RETURN + END diff --git a/src/sppad.f b/src/sppad.f new file mode 100644 index 00000000..6721e44e --- /dev/null +++ b/src/sppad.f @@ -0,0 +1,36 @@ +C> @file +C> @brief Pad or truncate a spectral field. +C> @author Iredell @date 92-10-31 + +C> Pad or truncate a spectral field. +C> +C> @param I1 input spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M1 input spectral truncation +C> @param Q1 ((M+1)*((I+1)*M+2)) input field +C> @param I2 output spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M2 output spectral truncation +C> @param Q2 ((M+1)*((I+1)*M+2)) output field +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPPAD(I1,M1,Q1,I2,M2,Q2) + + REAL Q1((M1+1)*((I1+1)*M1+2)) + REAL Q2((M2+1)*((I2+1)*M2+2)) + + DO L=0,M2 + DO N=L,I2*L+M2 + KS2=L*(2*M2+(I2-1)*(L-1))+2*N + IF(L.LE.M1.AND.N.LE.I1*L+M1) THEN + KS1=L*(2*M1+(I1-1)*(L-1))+2*N + Q2(KS2+1)=Q1(KS1+1) + Q2(KS2+2)=Q1(KS1+2) + ELSE + Q2(KS2+1)=0 + Q2(KS2+2)=0 + ENDIF + ENDDO + ENDDO + RETURN + END diff --git a/src/spsynth.f b/src/spsynth.f new file mode 100644 index 00000000..4e0feb99 --- /dev/null +++ b/src/spsynth.f @@ -0,0 +1,158 @@ +C> @file +C> @brief Synthesize Fourier coefficients from spectral coefficients. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 91-10-31 | Mark Iredell | Initial. +C> 1998-12-18 | Mark Iredell | Include scalar and gradient option. +C> +C> @author Iredell @date 92-10-31 + +C> Synthesizes Fourier coefficients from spectral coefficients +C> for a latitude pair (Northern and Southern hemispheres). +C> +C> Vector components are divided by cosine of latitude. +C> +C> @param I spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param IM even number of Fourier coefficients +C> @param IX dimension of Fourier coefficients (IX>=IM+2) +C> @param NC dimension of spectral coefficients +C> (NC>=(M+1)*((I+1)*M+2)) +C> @param NCTOP dimension of spectral coefficients over top +C> (NCTOP>=2*(M+1)) +C> @param KM number of fields +C> @param CLAT cosine of latitude +C> @param PLN ((M+1)*((I+1)*M+2)/2) Legendre polynomial +C> @param PLNTOP Legendre polynomial over top +C> @param SPC spectral coefficients +C> @param SPCTOP spectral coefficients over top +C> @param MP identifiers (0 for scalar, 1 for vector, +C> or 10 for scalar and gradient) +C> @param F Fourier coefficients for latitude pair +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPSYNTH(I,M,IM,IX,NC,NCTOP,KM,CLAT,PLN,PLNTOP,MP, + & SPC,SPCTOP,F) + + REAL PLN((M+1)*((I+1)*M+2)/2),PLNTOP(M+1) + INTEGER MP(KM) + REAL SPC(NC,KM),SPCTOP(NCTOP,KM) + REAL F(IX,2,KM) + +C ZERO OUT FOURIER COEFFICIENTS. + DO K=1,KM + DO L=0,IM/2 + F(2*L+1,1,K)=0. + F(2*L+2,1,K)=0. + F(2*L+1,2,K)=0. + F(2*L+2,2,K)=0. + ENDDO + ENDDO + +C SYNTHESIS OVER POLE. +C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM. +C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY. + IF(CLAT.EQ.0) THEN + LTOPE=MOD(M+1+I,2) +!C$OMP PARALLEL DO PRIVATE(LB,LE,L,KS,KP,N,F1R,F1I) + DO K=1,KM + LB=MP(K) + LE=MP(K) + IF(MP(K).EQ.10) THEN + LB=0 + LE=1 + ENDIF + L=LB + IF(L.EQ.1) THEN + IF(L.EQ.LTOPE) THEN + F(2*L+1,1,K)=PLNTOP(L+1)*SPCTOP(2*L+1,K) + F(2*L+2,1,K)=PLNTOP(L+1)*SPCTOP(2*L+2,K) + ELSE + F(2*L+1,2,K)=PLNTOP(L+1)*SPCTOP(2*L+1,K) + F(2*L+2,2,K)=PLNTOP(L+1)*SPCTOP(2*L+2,K) + ENDIF + ENDIF +C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER. +C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY. + DO L=LB,LE + KS=L*(2*M+(I-1)*(L-1)) + KP=KS/2+1 + DO N=L,I*L+M,2 + F(2*L+1,1,K)=F(2*L+1,1,K)+PLN(KP+N)*SPC(KS+2*N+1,K) + F(2*L+2,1,K)=F(2*L+2,1,K)+PLN(KP+N)*SPC(KS+2*N+2,K) + ENDDO + DO N=L+1,I*L+M,2 + F(2*L+1,2,K)=F(2*L+1,2,K)+PLN(KP+N)*SPC(KS+2*N+1,K) + F(2*L+2,2,K)=F(2*L+2,2,K)+PLN(KP+N)*SPC(KS+2*N+2,K) + ENDDO +C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE. +C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE. + F1R=F(2*L+1,1,K) + F1I=F(2*L+2,1,K) + F(2*L+1,1,K)=F1R+F(2*L+1,2,K) + F(2*L+2,1,K)=F1I+F(2*L+2,2,K) + F(2*L+1,2,K)=F1R-F(2*L+1,2,K) + F(2*L+2,2,K)=F1I-F(2*L+2,2,K) + ENDDO + ENDDO + +C SYNTHESIS OVER FINITE LATITUDE. +C INITIALIZE FOURIER COEFFICIENTS WITH TERMS OVER TOP OF THE SPECTRUM. +C INITIALIZE EVEN AND ODD POLYNOMIALS SEPARATELY. + ELSE + LX=MIN(M,IM/2) + LTOPE=MOD(M+1,2) + LTOPO=1-LTOPE + LE=1+I*LTOPE + LO=2-I*LTOPO +!C$OMP PARALLEL DO PRIVATE(L,KS,KP,N,F1R,F1I) + DO K=1,KM + IF(MP(K).EQ.1) THEN + DO L=LTOPE,LX,2 + F(2*L+1,LE,K)=PLNTOP(L+1)*SPCTOP(2*L+1,K) + F(2*L+2,LE,K)=PLNTOP(L+1)*SPCTOP(2*L+2,K) + ENDDO + DO L=LTOPO,LX,2 + F(2*L+1,LO,K)=PLNTOP(L+1)*SPCTOP(2*L+1,K) + F(2*L+2,LO,K)=PLNTOP(L+1)*SPCTOP(2*L+2,K) + ENDDO + ENDIF +C FOR EACH ZONAL WAVENUMBER, SYNTHESIZE TERMS OVER TOTAL WAVENUMBER. +C SYNTHESIZE EVEN AND ODD POLYNOMIALS SEPARATELY. + DO L=0,LX + KS=L*(2*M+(I-1)*(L-1)) + KP=KS/2+1 + DO N=L,I*L+M,2 + F(2*L+1,1,K)=F(2*L+1,1,K)+PLN(KP+N)*SPC(KS+2*N+1,K) + F(2*L+2,1,K)=F(2*L+2,1,K)+PLN(KP+N)*SPC(KS+2*N+2,K) + ENDDO + DO N=L+1,I*L+M,2 + F(2*L+1,2,K)=F(2*L+1,2,K)+PLN(KP+N)*SPC(KS+2*N+1,K) + F(2*L+2,2,K)=F(2*L+2,2,K)+PLN(KP+N)*SPC(KS+2*N+2,K) + ENDDO + ENDDO +C SEPARATE FOURIER COEFFICIENTS FROM EACH HEMISPHERE. +C ODD POLYNOMIALS CONTRIBUTE NEGATIVELY TO THE SOUTHERN HEMISPHERE. +C DIVIDE VECTOR COMPONENTS BY COSINE LATITUDE. + DO L=0,LX + F1R=F(2*L+1,1,K) + F1I=F(2*L+2,1,K) + F(2*L+1,1,K)=F1R+F(2*L+1,2,K) + F(2*L+2,1,K)=F1I+F(2*L+2,2,K) + F(2*L+1,2,K)=F1R-F(2*L+1,2,K) + F(2*L+2,2,K)=F1I-F(2*L+2,2,K) + ENDDO + IF(MP(K).EQ.1) THEN + DO L=0,LX + F(2*L+1,1,K)=F(2*L+1,1,K)/CLAT + F(2*L+2,1,K)=F(2*L+2,1,K)/CLAT + F(2*L+1,2,K)=F(2*L+1,2,K)/CLAT + F(2*L+2,2,K)=F(2*L+2,2,K)/CLAT + ENDDO + ENDIF + ENDDO + ENDIF + END diff --git a/src/sptez.f b/src/sptez.f new file mode 100644 index 00000000..87db1063 --- /dev/null +++ b/src/sptez.f @@ -0,0 +1,71 @@ +C> @file +C> @brief Perform a simple scalar spherical transform. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of a scalar quantity +C> and a field on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave field is in sequential 'IBM ORDER'. +C> +C> The grid field is indexed East to West, then North to South. +C> +C> For more flexibility and efficiency, call sptran(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid, +C> - IDRT=0 for equally-spaced grid including poles, +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param[out] WAVE wave field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] GRID grid field (E->W,N->S) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZ(IROMB,MAXWV,IDRT,IMAX,JMAX,WAVE,GRID,IDIR) + + REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2)) + REAL GRID(IMAX,JMAX) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=1 + IS=1 + JN=IMAX + JS=-JN + KW=2*MX + KG=IMAX*JMAX + JB=1 + JE=(JMAX+1)/2 + JC=NCPUS() +! print *, " EM: SPTEZ:::JJJJJJJJJJJJJJJJJJJCCCCCCCCCCC=" ,JC + IF(IDIR.LT.0) WAVE=0 + + CALL SPTRANF(IROMB,MAXWV,IDRT,IMAX,JMAX,1, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVE,GRID,GRID(1,JMAX),IDIR) + + END diff --git a/src/sptezd.f b/src/sptezd.f new file mode 100644 index 00000000..0c0eaf3c --- /dev/null +++ b/src/sptezd.f @@ -0,0 +1,60 @@ +C> @file +C> @brief Perform a simple gradient spherical transform. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of a scalar field +C> and its mean and gradient on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave field is in sequential 'IBM ORDER'. +C> +C> The grid fiels is indexed East to West, then North to South. +C> +C> For more flexibility and efficiency, call sptran(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param[out] WAVE wave field if IDIR>0 +C> @param[out] GRIDMN global mean if IDIR<0 +C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0 +C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZD(IROMB,MAXWV,IDRT,IMAX,JMAX, + & WAVE,GRIDMN,GRIDX,GRIDY,IDIR) + + REAL WAVE(*),GRIDX(IMAX,JMAX),GRIDY(IMAX,JMAX) + + JC=NCPUS() + CALL SPTRAND(IROMB,MAXWV,IDRT,IMAX,JMAX,1, + & 0,0,0,0,0,0,0,0,JC, + & WAVE,GRIDMN, + & GRIDX,GRIDX(1,JMAX),GRIDY,GRIDY(1,JMAX),1) + END diff --git a/src/sptezm.f b/src/sptezm.f new file mode 100644 index 00000000..1236c5c5 --- /dev/null +++ b/src/sptezm.f @@ -0,0 +1,70 @@ +C> @file +C> @brief Perform simple scalar spherical transforms. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs spherical transforms +C> between spectral coefficients of scalar quantities +C> and fields on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> Wave fields are in sequential 'IBM ORDER'. +C> +C> Grid fields are indexed East to West, then North to South. +C> +C> For more flexibility and efficiency, call sptran(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes +C> @param JMAX number of latitudes +C> @param KMAX number of fields to transform +C> @param[out] WAVE wave field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] GRID grid field (E->W,N->S) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZM(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX,WAVE,GRID,IDIR) + + REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX) + REAL GRID(IMAX,JMAX,KMAX) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=1 + IS=1 + JN=IMAX + JS=-JN + KW=2*MX + KG=IMAX*JMAX + JB=1 + JE=(JMAX+1)/2 + JC=NCPUS() + IF(IDIR.LT.0) WAVE=0 + + CALL SPTRANF(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVE,GRID,GRID(1,JMAX,1),IDIR) + END diff --git a/src/sptezmd.f b/src/sptezmd.f new file mode 100644 index 00000000..72f0610c --- /dev/null +++ b/src/sptezmd.f @@ -0,0 +1,63 @@ +C> @file +C> @brief Perform simple gradient spherical transforms. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs spherical transforms +C> between spectral coefficients of scalar fields +C> and their means and gradients on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a gaussian grid. +C> +C> The wave fields are in sequential 'IBM ORDER'. +C> +C> The grid fields are indexed East to West, then North to South. +C> +C> For more flexibility and efficiency, call sptran(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param KMAX number +C> @param[out] WAVE wave field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2) +C> @param[out] GRIDMN global mean if IDIR<0 +C> @param[out] GRIDX grid x-gradients (E->W,N->S) if IDIR<0 +C> @param[out] GRIDY grid y-gradients (E->W,N->S) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZMD(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & WAVE,GRIDMN,GRIDX,GRIDY,IDIR) + + REAL WAVE((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX) + REAL GRIDMN(KMAX),GRIDX(IMAX,JMAX,KMAX),GRIDY(IMAX,JMAX,KMAX) + + JC=NCPUS() + CALL SPTRAND(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & 0,0,0,0,0,0,0,0,JC, + & WAVE,GRIDMN, + & GRIDX,GRIDX(1,JMAX,1),GRIDY,GRIDY(1,JMAX,1),IDIR) + END diff --git a/src/sptezmv.f b/src/sptezmv.f new file mode 100644 index 00000000..79a83378 --- /dev/null +++ b/src/sptezmv.f @@ -0,0 +1,78 @@ +C> @file +C> @brief Perform simple vector spherical transforms. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs spherical transforms +C> between spectral coefficients of divergence and curl +C> and vector fields on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> Wave fields are in sequential 'IBM ORDER'. +C> +C> Grid fields are indexed east to west, then north to south. +C> +C> For more flexibility and efficiency, call sptran(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes +C> @param JMAX number of latitudes +C> @param KMAX number of fields to transform +C> @param[out] WAVED wave divergence field if IDIR<0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] WAVEZ wave vorticity field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] GRIDU grid u-wind (E->W,N->S) if IDIR>0 +C> @param[out] GRIDV grid v-wind (E->W,N->S) if IDIR>0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZMV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & WAVED,WAVEZ,GRIDU,GRIDV,IDIR) + + REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX) + REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2),KMAX) + REAL GRIDU(IMAX,JMAX,KMAX) + REAL GRIDV(IMAX,JMAX,KMAX) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=1 + IS=1 + JN=IMAX + JS=-JN + KW=2*MX + KG=IMAX*JMAX + JB=1 + JE=(JMAX+1)/2 + JC=NCPUS() + IF(IDIR.LT.0) WAVED=0 + IF(IDIR.LT.0) WAVEZ=0 + + CALL SPTRANFV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVED,WAVEZ, + & GRIDU,GRIDU(1,JMAX,1),GRIDV,GRIDV(1,JMAX,1),IDIR) + END diff --git a/src/sptezv.f b/src/sptezv.f new file mode 100644 index 00000000..9a574019 --- /dev/null +++ b/src/sptezv.f @@ -0,0 +1,76 @@ +C> @file +C> @brief Perform a simple vector spherical transform +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of divergence and curl +C> and a vector field on a global cylindrical grid. +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave field is in sequential 'IBM order'. +C> +C> The grid field is indexed east to west, then north to south. +C> +C> For more flexibility and efficiency, call SPTRAN(). +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> Dimension |Linear |Quadratic +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB Spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param IDRT Grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX Even number of longitudes +C> @param JMAX Number of latitudes +C> @param[out] WAVED Wave divergence field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] WAVEZ Wave vorticity field if IDIR>0 +C> where MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 +C> @param[out] GRIDU Grid u-wind (E->W,N->S) if IDIR<0 +C> @param[out] GRIDV Grid v-wind (E->W,N->S) if IDIR<0 +C> @param IDIR Transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave) +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTEZV(IROMB,MAXWV,IDRT,IMAX,JMAX, + & WAVED,WAVEZ,GRIDU,GRIDV,IDIR) + + REAL WAVED((MAXWV+1)*((IROMB+1)*MAXWV+2)) + REAL WAVEZ((MAXWV+1)*((IROMB+1)*MAXWV+2)) + REAL GRIDU(IMAX,JMAX) + REAL GRIDV(IMAX,JMAX) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=1 + IS=1 + JN=IMAX + JS=-JN + KW=2*MX + KG=IMAX*JMAX + JB=1 + JE=(JMAX+1)/2 + JC=NCPUS() + IF(IDIR.LT.0) WAVED=0 + IF(IDIR.LT.0) WAVEZ=0 + + CALL SPTRANFV(IROMB,MAXWV,IDRT,IMAX,JMAX,1, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVED,WAVEZ, + & GRIDU,GRIDU(1,JMAX),GRIDV,GRIDV(1,JMAX),IDIR) + END diff --git a/src/sptgpm.f b/src/sptgpm.f new file mode 100644 index 00000000..44325d27 --- /dev/null +++ b/src/sptgpm.f @@ -0,0 +1,124 @@ +C> @file +C> @brief Transform spectral scalar to Mercator +C> ### Program history log: +C> Date | Programmer | Comments +C> -----------|------------|--------- +C> 96-02-29 | IREDELL | Initial. +C> 1998-12-15 | IREDELL | OpenMP directives inserted. +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of scalar quantities +C> to scalar fields on a Mercator grid. +C> The wave-space can be either triangular or rhomboidal. +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e. with zonal wavenumber as the slower index. +C> The Mercator grid is identified by the location +C> of its first point and by its respective increments. +C> The transforms are all multiprocessed over sector points. +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB Spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param KMAX Number of fields to transform +C> @param MI Number of points in the faster zonal direction +C> @param MJ Number of points in the slower merid direction +C> @param KWSKIP Skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP Skip number between grid fields +C> (defaults to MI*MJ if KGSKIP=0) +C> @param NISKIP Skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP Skip number between grid j-points +C> (defaults to MI if NJSKIP=0) +C> @param RLAT1 Latitude of the first grid point in degrees +C> @param RLON1 Longitude of the first grid point in degrees +C> @param DLAT Latitude increment in degrees such that +C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. +C> DLAT is negative for grids indexed southward. +C> (in terms of grid increment DY valid at latitude RLATI, +C> the latitude increment DLAT is determined as +C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) +C> where DPR=180/PI and RERTH is earth's radius) +C> @param DLON Longitude increment in degrees such that +C> D(LAMBDA)/D(I)=DLON where I is zonal index. +C> DLON is negative for grids indexed westward. +C> @param WAVE Wave fields +C> @param GM Mercator fields +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTGPM(IROMB,MAXWV,KMAX,MI,MJ, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WAVE,GM) + + REAL WAVE(*),GM(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(KMAX) + REAL WTOP(2*(MAXWV+1),KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,KMAX) + REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI) + PARAMETER(RERTH=6.3712E6) + PARAMETER(PI=3.14159265358979,DPR=180./PI) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NI=NISKIP + NJ=NJSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=MI*MJ + IF(NI.EQ.0) NI=1 + IF(NJ.EQ.0) NJ=MI + DO I=1,MI + RLON=MOD(RLON1+DLON*(I-1)+3600,360.) + DO L=1,MAXWV + CLON(L,I)=COS(L*RLON/DPR) + SLON(L,I)=SIN(L*RLON/DPR) + ENDDO + ENDDO + YE=1-LOG(TAN((RLAT1+90)/2/DPR))*DPR/DLAT + DO J=1,MJ + RLAT=ATAN(EXP(DLAT/DPR*(J-YE)))*2*DPR-90 + CLAT(J)=COS(RLAT/DPR) + SLAT(J)=SIN(RLAT/DPR) + ENDDO + MP=0 +C$OMP PARALLEL DO + DO K=1,KMAX + WTOP(1:2*MXTOP,K)=0 + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM TO GRID +C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,IJK) + DO J=1,MJ + CALL SPLEGEND(IROMB,MAXWV,SLAT(J),CLAT(J),EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT(J),PLN,PLNTOP,MP,WAVE,WTOP,F) + DO K=1,KMAX + DO I=1,MI + IJK=(I-1)*NI+(J-1)*NJ+(K-1)*KG+1 + GM(IJK)=F(1,1,K) + ENDDO + DO L=1,MAXWV + DO I=1,MI + IJK=(I-1)*NI+(J-1)*NJ+(K-1)*KG+1 + GM(IJK)=GM(IJK)+2.*(F(2*L+1,1,K)*CLON(L,I) + & -F(2*L+2,1,K)*SLON(L,I)) + ENDDO + ENDDO + ENDDO + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptgpmd.f b/src/sptgpmd.f new file mode 100644 index 00000000..4aefb160 --- /dev/null +++ b/src/sptgpmd.f @@ -0,0 +1,81 @@ +C> @file +C> @brief Transform spectral to Mercator gradients. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of scalar fields +C> to gradient fields on a Mercator grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The Mercator grid is identified by the location +C> of its first point and by its respective increments. +C> +C> The transforms are all multiprocessed over sector points. +C> +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB Spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param KMAX Number of fields to transform +C> @param MI Number of points in the faster zonal direction +C> @param MJ Number of points in the slower merid direction +C> @param KWSKIP Skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP Skip number between grid fields +C> (defaults to MI*MJ if KGSKIP=0) +C> @param NISKIP Skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP Skip number between grid j-points +C> (defaults to MI if NJSKIP=0) +C> @param RLAT1 Latitude of the first grid point in degrees +C> @param RLON1 Longitude of the first grid point in degrees +C> @param DLAT Latitude increment in degrees such that +C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. +C> DLAT is negative for grids indexed southward. +C> (in terms of grid increment dy valid at latitude RLATI, +C> the latitude increment DLAT is determined as +C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) +C> where DPR=180/PI and RERTH is Earth's radius) +C> @param DLON Longitude increment in degrees such that +C> D(LAMBDA)/D(I)=DLON where I is zonal index. +C> DLON is negative for grids indexed westward. +C> @param WAVE Wave fields +C> @param XM Mercator x-gradients +C> @param YM Mercator y-gradients +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPMD(IROMB,MAXWV,KMAX,MI,MJ, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WAVE,XM,YM) + + REAL WAVE(*),XM(*),YM(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + KW=KWSKIP + IF(KW.EQ.0) KW=2*MX + +C CALCULATE GRADIENTS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),1) + WZ(1:2*MX,K)=0. + ENDDO + CALL SPTGPMV(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WD,WZ,XM,YM) + END diff --git a/src/sptgpmv.f b/src/sptgpmv.f new file mode 100644 index 00000000..c153a09c --- /dev/null +++ b/src/sptgpmv.f @@ -0,0 +1,143 @@ +C> @file +C> @brief Transform spectral vector to Mercator +C> ### Program history log: +C> Date | Programmer | Comments +C> -----|------------|---------- +C> 96-02-29 | IREDELL | Initial. +C> 1998-12-15 | IREDELL | OpenMP directives inserted. +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of divergences and curls +C> to vector fields on a Mercator grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e., with zonal wavenumber as the slower index. +C> +C> The Mercator grid is identified by the location +C> of its first point and by its respective increments. +C> +C> The transforms are all multiprocessed over sector points. +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB Spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param KMAX Number of fields to transform +C> @param MI Number of points in the faster zonal direction +C> @param MJ Number of points in the slower merid direction +C> @param KWSKIP Skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP Skip number between grid fields +C> (defaults to MI*MJ if KGSKIP=0) +C> @param NISKIP Skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP Skip number between grid j-points +C> (defaults to MI if NJSKIP=0) +C> @param RLAT1 Latitude of the first grid point in degrees +C> @param RLON1 Longitude of the first grid point in degrees +C> @param DLAT Latitude increment in degrees such that +C> D(PHI)/D(J)=DLAT*COS(PHI) where J is meridional index. +C> DLAT is negative for grids indexed southward. +C> (in terms of grid increment dy valid at latitude RLATI, +C> The latitude increment DLAT is determined as +C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) +C> where DPR=180/PI and RERTH is Earth's radius) +C> @param DLON longitude increment in degrees such that +C> D(LAMBDA)/D(I)=DLON where I is zonal index. +C> DLON is negative for grids indexed westward. +C> @param WAVED Wave divergence fields +C> @param WAVEZ Wave vorticity fields +C> @param UM Mercator u-winds +C> @param VM Mercator v-winds +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTGPMV(IROMB,MAXWV,KMAX,MI,MJ, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WAVED,WAVEZ,UM,VM) + + REAL WAVED(*),WAVEZ(*),UM(*),VM(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(2*KMAX) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX) + REAL WTOP(2*(MAXWV+1),2*KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,2*KMAX) + REAL CLAT(MJ),SLAT(MJ),CLON(MAXWV,MI),SLON(MAXWV,MI) + PARAMETER(RERTH=6.3712E6) + PARAMETER(PI=3.14159265358979,DPR=180./PI) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + MDIM=2*MX+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NI=NISKIP + NJ=NJSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=MI*MJ + IF(NI.EQ.0) NI=1 + IF(NJ.EQ.0) NJ=MI + DO I=1,MI + RLON=MOD(RLON1+DLON*(I-1)+3600,360.) + DO L=1,MAXWV + CLON(L,I)=COS(L*RLON/DPR) + SLON(L,I)=SIN(L*RLON/DPR) + ENDDO + ENDDO + YE=1-LOG(TAN((RLAT1+90)/2/DPR))*DPR/DLAT + DO J=1,MJ + RLAT=ATAN(EXP(DLAT/DPR*(J-YE)))*2*DPR-90 + CLAT(J)=COS(RLAT/DPR) + SLAT(J)=SIN(RLAT/DPR) + ENDDO + MP=1 +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE SPECTRAL WINDS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPDZ2UV(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & WAVED(KWS+1),WAVEZ(KWS+1), + & W(1,K),W(1,KMAX+K),WTOP(1,K),WTOP(1,KMAX+K)) + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM TO GRID +C$OMP PARALLEL DO PRIVATE(PLN,PLNTOP,F,KU,KV,IJK) + DO J=1,MJ + CALL SPLEGEND(IROMB,MAXWV,SLAT(J),CLAT(J),EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT(J),PLN,PLNTOP,MP,W,WTOP,F) + DO K=1,KMAX + KU=K + KV=K+KMAX + DO I=1,MI + IJK=(I-1)*NI+(J-1)*NJ+(K-1)*KG+1 + UM(IJK)=F(1,1,KU) + VM(IJK)=F(1,1,KV) + ENDDO + DO L=1,MAXWV + DO I=1,MI + IJK=(I-1)*NI+(J-1)*NJ+(K-1)*KG+1 + UM(IJK)=UM(IJK)+2.*(F(2*L+1,1,KU)*CLON(L,I) + & -F(2*L+2,1,KU)*SLON(L,I)) + VM(IJK)=VM(IJK)+2.*(F(2*L+1,1,KV)*CLON(L,I) + & -F(2*L+2,1,KV)*SLON(L,I)) + ENDDO + ENDDO + ENDDO + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptgps.f b/src/sptgps.f new file mode 100644 index 00000000..481e2d1f --- /dev/null +++ b/src/sptgps.f @@ -0,0 +1,547 @@ +C> @file +C> @brief Transform spectral scalar to polar stereo. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of scalar quantities +C> to scalar fields on a pair of polar stereographic grids. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The two square polar stereographic grids are centered +C> on the respective poles, with the orientation longitude +C> of the southern hemisphere grid 180 degrees opposite +C> that of the northern hemisphere grid. +C> +C> The transform is made efficient +C> by combining points in eight sectors +C> of each polar stereographic grid, +C> numbered as in the diagram below. +C> +C> The pole and the sector boundaries +C> are treated specially in the code. +C> +C> Unfortunately, this approach induces +C> some hairy indexing and code loquacity. +C> +C>
+C>              \ 4 | 5 /
+C>               \  |  /
+C>              3 \ | / 6
+C>                 \|/
+C>              ----+----
+C>                 /|\
+C>              2 / | \ 7
+C>               /  |  \
+C>              / 1 | 8 \
+C> 
+C> +C> The transforms are all multiprocessed over sector points. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NPS odd order of the polar stereographic grids. +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between grid fields +C> (defaults to NPS*NPS if KGSKIP=0) +C> @param NISKIP skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP skip number between grid j-points +C> (defaults to NPS if NJSKIP=0) +C> @param TRUE latitude at which ps grid is true (usually 60.) +C> @param XMESH grid length at true latitude (m) +C> @param ORIENT longitude at bottom of northern ps grid +C> (southern ps grid will have opposite orientation.) +C> @param WAVE wave fields +C> @param GN northern polar stereographic fields +C> @param GS southern polar stereographic fields +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPS(IROMB,MAXWV,KMAX,NPS, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WAVE,GN,GS) + + REAL WAVE(*),GN(*),GS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(KMAX) + REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3) + REAL WTOP(2*(MAXWV+1),KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,KMAX) + DATA SROT/0.,1.,0.,-1./,CROT/1.,0.,-1.,0./ + PARAMETER(RERTH=6.3712E6) + PARAMETER(PI=3.14159265358979,DPR=180./PI) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NI=NISKIP + NJ=NJSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NPS*NPS + IF(NI.EQ.0) NI=1 + IF(NJ.EQ.0) NJ=NPS + MP=0 + NPH=(NPS-1)/2 + GQ=((1.+SIN(TRUE/DPR))*RERTH/XMESH)**2 +C$OMP PARALLEL DO + DO K=1,KMAX + WTOP(1:2*MXTOP,K)=0 + ENDDO + +C CALCULATE POLE POINT + I1=NPH+1 + J1=NPH+1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + SLAT1=1. + CLAT1=0. + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT1,PLN,PLNTOP,MP,WAVE,WTOP,F) +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + GN(IJK1)=F(1,1,K) + GS(IJK1)=F(1,2,K) + ENDDO + +C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE, +C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI) + DO J1=1,NPH + I1=NPH+1 + RADLON=ORIENT/DPR + J3=NPS+1-I1 + I3=J1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J7=I1 + I7=NPS+1-J1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT1,PLN,PLNTOP,MP,WAVE,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON) + CLON(L,1)=COS(L*RADLON) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + GN(IJK1)=F(1,1,K) + GN(IJK3)=F(1,1,K) + GN(IJK5)=F(1,1,K) + GN(IJK7)=F(1,1,K) + GS(IJK1)=F(1,2,K) + GS(IJK3)=F(1,2,K) + GS(IJK5)=F(1,2,K) + GS(IJK7)=F(1,2,K) + ENDDO + IF(KMAX.EQ.1) THEN + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + GN(IJ1)=GN(IJ1)+2*(F(LR,1,1)*CLON(L,1) + & -F(LI,1,1)*SLON(L,1)) + GN(IJ3)=GN(IJ3)+2*(F(LR,1,1)*CLON(L,3) + & -F(LI,1,1)*SLON(L,3)) + GN(IJ5)=GN(IJ5)+2*(F(LR,1,1)*CLON(L,5) + & -F(LI,1,1)*SLON(L,5)) + GN(IJ7)=GN(IJ7)+2*(F(LR,1,1)*CLON(L,7) + & -F(LI,1,1)*SLON(L,7)) + GS(IJ1)=GS(IJ1)+2*(F(LR,2,1)*CLON(L,5) + & -F(LI,2,1)*SLON(L,5)) + GS(IJ3)=GS(IJ3)+2*(F(LR,2,1)*CLON(L,3) + & -F(LI,2,1)*SLON(L,3)) + GS(IJ5)=GS(IJ5)+2*(F(LR,2,1)*CLON(L,1) + & -F(LI,2,1)*SLON(L,1)) + GS(IJ7)=GS(IJ7)+2*(F(LR,2,1)*CLON(L,7) + & -F(LI,2,1)*SLON(L,7)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + GN(IJK1)=GN(IJK1)+2*(F(LR,1,K)*CLON(L,1) + & -F(LI,1,K)*SLON(L,1)) + GN(IJK3)=GN(IJK3)+2*(F(LR,1,K)*CLON(L,3) + & -F(LI,1,K)*SLON(L,3)) + GN(IJK5)=GN(IJK5)+2*(F(LR,1,K)*CLON(L,5) + & -F(LI,1,K)*SLON(L,5)) + GN(IJK7)=GN(IJK7)+2*(F(LR,1,K)*CLON(L,7) + & -F(LI,1,K)*SLON(L,7)) + GS(IJK1)=GS(IJK1)+2*(F(LR,2,K)*CLON(L,5) + & -F(LI,2,K)*SLON(L,5)) + GS(IJK3)=GS(IJK3)+2*(F(LR,2,K)*CLON(L,3) + & -F(LI,2,K)*SLON(L,3)) + GS(IJK5)=GS(IJK5)+2*(F(LR,2,K)*CLON(L,1) + & -F(LI,2,K)*SLON(L,1)) + GS(IJK7)=GS(IJK7)+2*(F(LR,2,K)*CLON(L,7) + & -F(LI,2,K)*SLON(L,7)) + ENDDO + ENDDO + ENDIF + ENDDO + +C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE, +C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI) + DO J1=1,NPH + I1=J1 + RADLON=(ORIENT-45)/DPR + J3=NPS+1-I1 + I3=J1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J7=I1 + I7=NPS+1-J1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT1,PLN,PLNTOP,MP,WAVE,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON) + CLON(L,1)=COS(L*RADLON) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + GN(IJK1)=F(1,1,K) + GN(IJK3)=F(1,1,K) + GN(IJK5)=F(1,1,K) + GN(IJK7)=F(1,1,K) + GS(IJK1)=F(1,2,K) + GS(IJK3)=F(1,2,K) + GS(IJK5)=F(1,2,K) + GS(IJK7)=F(1,2,K) + ENDDO + IF(KMAX.EQ.1) THEN + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + GN(IJ1)=GN(IJ1)+2*(F(LR,1,1)*CLON(L,1) + & -F(LI,1,1)*SLON(L,1)) + GN(IJ3)=GN(IJ3)+2*(F(LR,1,1)*CLON(L,3) + & -F(LI,1,1)*SLON(L,3)) + GN(IJ5)=GN(IJ5)+2*(F(LR,1,1)*CLON(L,5) + & -F(LI,1,1)*SLON(L,5)) + GN(IJ7)=GN(IJ7)+2*(F(LR,1,1)*CLON(L,7) + & -F(LI,1,1)*SLON(L,7)) + GS(IJ1)=GS(IJ1)+2*(F(LR,2,1)*CLON(L,3) + & -F(LI,2,1)*SLON(L,3)) + GS(IJ3)=GS(IJ3)+2*(F(LR,2,1)*CLON(L,1) + & -F(LI,2,1)*SLON(L,1)) + GS(IJ5)=GS(IJ5)+2*(F(LR,2,1)*CLON(L,7) + & -F(LI,2,1)*SLON(L,7)) + GS(IJ7)=GS(IJ7)+2*(F(LR,2,1)*CLON(L,5) + & -F(LI,2,1)*SLON(L,5)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + GN(IJK1)=GN(IJK1)+2*(F(LR,1,K)*CLON(L,1) + & -F(LI,1,K)*SLON(L,1)) + GN(IJK3)=GN(IJK3)+2*(F(LR,1,K)*CLON(L,3) + & -F(LI,1,K)*SLON(L,3)) + GN(IJK5)=GN(IJK5)+2*(F(LR,1,K)*CLON(L,5) + & -F(LI,1,K)*SLON(L,5)) + GN(IJK7)=GN(IJK7)+2*(F(LR,1,K)*CLON(L,7) + & -F(LI,1,K)*SLON(L,7)) + GS(IJK1)=GS(IJK1)+2*(F(LR,2,K)*CLON(L,3) + & -F(LI,2,K)*SLON(L,3)) + GS(IJK3)=GS(IJK3)+2*(F(LR,2,K)*CLON(L,1) + & -F(LI,2,K)*SLON(L,1)) + GS(IJK5)=GS(IJK5)+2*(F(LR,2,K)*CLON(L,7) + & -F(LI,2,K)*SLON(L,7)) + GS(IJK7)=GS(IJK7)+2*(F(LR,2,K)*CLON(L,5) + & -F(LI,2,K)*SLON(L,5)) + ENDDO + ENDDO + ENDIF + ENDDO + +C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN, +C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE +C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,LR,LI) + DO J1=1,NPH-1 + DO I1=J1+1,NPH + J2=I1 + I2=J1 + J3=NPS+1-I1 + I3=J1 + J4=NPS+1-J1 + I4=I1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J6=NPS+1-I1 + I6=NPS+1-J1 + J7=I1 + I7=NPS+1-J1 + J8=J1 + I8=NPS+1-I1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ2=(I2-1)*NI+(J2-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ4=(I4-1)*NI+(J4-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ6=(I6-1)*NI+(J6-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + IJ8=(I8-1)*NI+(J8-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + RADLON1=ORIENT/DPR+ATAN(-DI1/DJ1) + RADLON2=(ORIENT-45)/DPR*2-RADLON1 + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT1,PLN,PLNTOP,MP,WAVE,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON1) + CLON(L,1)=COS(L*RADLON1) + SLON(L,2)=SIN(L*RADLON2) + CLON(L,2)=COS(L*RADLON2) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,4)=SLON(L,2)*CROT(MOD(1*L,4)) + & -CLON(L,2)*SROT(MOD(1*L,4)) + CLON(L,4)=CLON(L,2)*CROT(MOD(1*L,4)) + & +SLON(L,2)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,6)=SLON(L,2)*CROT(MOD(2*L,4)) + & -CLON(L,2)*SROT(MOD(2*L,4)) + CLON(L,6)=CLON(L,2)*CROT(MOD(2*L,4)) + & +SLON(L,2)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + SLON(L,8)=SLON(L,2)*CROT(MOD(3*L,4)) + & -CLON(L,2)*SROT(MOD(3*L,4)) + CLON(L,8)=CLON(L,2)*CROT(MOD(3*L,4)) + & +SLON(L,2)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK2=IJ2+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK4=IJ4+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK6=IJ6+(K-1)*KG + IJK7=IJ7+(K-1)*KG + IJK8=IJ8+(K-1)*KG + GN(IJK1)=F(1,1,K) + GN(IJK2)=F(1,1,K) + GN(IJK3)=F(1,1,K) + GN(IJK4)=F(1,1,K) + GN(IJK5)=F(1,1,K) + GN(IJK6)=F(1,1,K) + GN(IJK7)=F(1,1,K) + GN(IJK8)=F(1,1,K) + GS(IJK1)=F(1,2,K) + GS(IJK2)=F(1,2,K) + GS(IJK3)=F(1,2,K) + GS(IJK4)=F(1,2,K) + GS(IJK5)=F(1,2,K) + GS(IJK6)=F(1,2,K) + GS(IJK7)=F(1,2,K) + GS(IJK8)=F(1,2,K) + ENDDO + IF(KMAX.EQ.1) THEN + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + GN(IJ1)=GN(IJ1)+2*(F(LR,1,1)*CLON(L,1) + & -F(LI,1,1)*SLON(L,1)) + GN(IJ2)=GN(IJ2)+2*(F(LR,1,1)*CLON(L,2) + & -F(LI,1,1)*SLON(L,2)) + GN(IJ3)=GN(IJ3)+2*(F(LR,1,1)*CLON(L,3) + & -F(LI,1,1)*SLON(L,3)) + GN(IJ4)=GN(IJ4)+2*(F(LR,1,1)*CLON(L,4) + & -F(LI,1,1)*SLON(L,4)) + GN(IJ5)=GN(IJ5)+2*(F(LR,1,1)*CLON(L,5) + & -F(LI,1,1)*SLON(L,5)) + GN(IJ6)=GN(IJ6)+2*(F(LR,1,1)*CLON(L,6) + & -F(LI,1,1)*SLON(L,6)) + GN(IJ7)=GN(IJ7)+2*(F(LR,1,1)*CLON(L,7) + & -F(LI,1,1)*SLON(L,7)) + GN(IJ8)=GN(IJ8)+2*(F(LR,1,1)*CLON(L,8) + & -F(LI,1,1)*SLON(L,8)) + GS(IJ1)=GS(IJ1)+2*(F(LR,2,1)*CLON(L,4) + & -F(LI,2,1)*SLON(L,4)) + GS(IJ2)=GS(IJ2)+2*(F(LR,2,1)*CLON(L,3) + & -F(LI,2,1)*SLON(L,3)) + GS(IJ3)=GS(IJ3)+2*(F(LR,2,1)*CLON(L,2) + & -F(LI,2,1)*SLON(L,2)) + GS(IJ4)=GS(IJ4)+2*(F(LR,2,1)*CLON(L,1) + & -F(LI,2,1)*SLON(L,1)) + GS(IJ5)=GS(IJ5)+2*(F(LR,2,1)*CLON(L,8) + & -F(LI,2,1)*SLON(L,8)) + GS(IJ6)=GS(IJ6)+2*(F(LR,2,1)*CLON(L,7) + & -F(LI,2,1)*SLON(L,7)) + GS(IJ7)=GS(IJ7)+2*(F(LR,2,1)*CLON(L,6) + & -F(LI,2,1)*SLON(L,6)) + GS(IJ8)=GS(IJ8)+2*(F(LR,2,1)*CLON(L,5) + & -F(LI,2,1)*SLON(L,5)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + IJK1=IJ1+(K-1)*KG + IJK2=IJ2+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK4=IJ4+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK6=IJ6+(K-1)*KG + IJK7=IJ7+(K-1)*KG + IJK8=IJ8+(K-1)*KG + GN(IJK1)=GN(IJK1)+2*(F(LR,1,K)*CLON(L,1) + & -F(LI,1,K)*SLON(L,1)) + GN(IJK2)=GN(IJK2)+2*(F(LR,1,K)*CLON(L,2) + & -F(LI,1,K)*SLON(L,2)) + GN(IJK3)=GN(IJK3)+2*(F(LR,1,K)*CLON(L,3) + & -F(LI,1,K)*SLON(L,3)) + GN(IJK4)=GN(IJK4)+2*(F(LR,1,K)*CLON(L,4) + & -F(LI,1,K)*SLON(L,4)) + GN(IJK5)=GN(IJK5)+2*(F(LR,1,K)*CLON(L,5) + & -F(LI,1,K)*SLON(L,5)) + GN(IJK6)=GN(IJK6)+2*(F(LR,1,K)*CLON(L,6) + & -F(LI,1,K)*SLON(L,6)) + GN(IJK7)=GN(IJK7)+2*(F(LR,1,K)*CLON(L,7) + & -F(LI,1,K)*SLON(L,7)) + GN(IJK8)=GN(IJK8)+2*(F(LR,1,K)*CLON(L,8) + & -F(LI,1,K)*SLON(L,8)) + GS(IJK1)=GS(IJK1)+2*(F(LR,2,K)*CLON(L,4) + & -F(LI,2,K)*SLON(L,4)) + GS(IJK2)=GS(IJK2)+2*(F(LR,2,K)*CLON(L,3) + & -F(LI,2,K)*SLON(L,3)) + GS(IJK3)=GS(IJK3)+2*(F(LR,2,K)*CLON(L,2) + & -F(LI,2,K)*SLON(L,2)) + GS(IJK4)=GS(IJK4)+2*(F(LR,2,K)*CLON(L,1) + & -F(LI,2,K)*SLON(L,1)) + GS(IJK5)=GS(IJK5)+2*(F(LR,2,K)*CLON(L,8) + & -F(LI,2,K)*SLON(L,8)) + GS(IJK6)=GS(IJK6)+2*(F(LR,2,K)*CLON(L,7) + & -F(LI,2,K)*SLON(L,7)) + GS(IJK7)=GS(IJK7)+2*(F(LR,2,K)*CLON(L,6) + & -F(LI,2,K)*SLON(L,6)) + GS(IJK8)=GS(IJK8)+2*(F(LR,2,K)*CLON(L,5) + & -F(LI,2,K)*SLON(L,5)) + ENDDO + ENDDO + ENDIF + ENDDO + ENDDO + + END diff --git a/src/sptgpsd.f b/src/sptgpsd.f new file mode 100644 index 00000000..69cc3c34 --- /dev/null +++ b/src/sptgpsd.f @@ -0,0 +1,100 @@ +C> @file +C> @brief Transform spectral to polar stereographic gradients +C> ### Program history log: +C> Date | Programmer | Comments +C> -----|------------|---------- +C> 96-02-29 | IREDELL | Initial. +C> 1998-12-15 | IREDELL | OpenMP directives inserted. +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of scalar fields +C> to gradient fields on a pair of polar stereographic grids. +C> The wave-space can be either triangular or rhomboidal. +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e., with zonal wavenumber as the slower index. +C> The two square polar stereographic grids are centered +C> on the respective poles, with the orientation longitude +C> of the southern hemisphere grid 180 degrees opposite +C> that of the northern hemisphere grid. +C> The vectors are automatically rotated to be resolved +C> relative to the respective polar stereographic grids. +C> +C> The transform is made efficient by combining points in eight +C> sectors of each polar stereographic grid, numbered as in the +C> following diagram. The pole and the sector boundaries are +C> treated specially in the code. Unfortunately, this approach +C> induces some hairy indexing and code loquacity, for which +C> the developer apologizes. +C> +C> \verbatim +C> \ 4 | 5 / +C> \ | / +C> 3 \ | / 6 +C> \|/ +C> ----+---- +C> /|\ +C> 2 / | \ 7 +C> / | \ +C> / 1 | 8 \ +C> \endverbatim +C> +C> The transforms are all multiprocessed over sector points. +C> transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB Spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param KMAX Number of fields to transform +C> @param NPS Odd order of the polar stereographic grids +C> @param KWSKIP Skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP Skip number between grid fields +C> (defaults to NPS*NPS if KGSKIP=0) +C> @param NISKIP Skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP Skip number between grid j-points +C> (defaults to NPS if NJSKIP=0) +C> @param TRUE Latitude at which PS grid is true (usually 60.) +C> @param XMESH Grid length at true latitude (M) +C> @param ORIENT Longitude at bottom of northern PS grid +C> (southern PS grid will have opposite orientation.) +C> @param WAVE Wave fields +C> @param XN Northern polar stereographic x-gradients +C> @param YN Northern polar stereographic y-gradients +C> @param XS Southern polar stereographic x-gradients +C> @param YS Southern polar stereographic y-gradients +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTGPSD(IROMB,MAXWV,KMAX,NPS, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WAVE,XN,YN,XS,YS) + + REAL WAVE(*),XN(*),YN(*),XS(*),YS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + KW=KWSKIP + IF(KW.EQ.0) KW=2*MX +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE GRADIENTS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),1) + WZ(1:2*MX,K)=0. + ENDDO + CALL SPTGPSV(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WD,WZ,XN,YN,XS,YS) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptgpsv.f b/src/sptgpsv.f new file mode 100644 index 00000000..edb58fdd --- /dev/null +++ b/src/sptgpsv.f @@ -0,0 +1,934 @@ +C> @file +C> @brief Transform spectral vector to polar stereo. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of divergences and curls +C> to vector fields on a pair of polar stereographic grids. +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The two square polar stereographic grids are centered +C> on the respective poles, with the orientation longitude +C> of the southern hemisphere grid 180 degrees opposite +C> that of the northern hemisphere grid. +C> +C> The vectors are automatically rotated to be resolved +C> relative to the respective polar stereographic grids. +C> +C> The transform is made efficient +C> by combining points in eight sectors +C> of each polar stereographic grid, +C> numbered as in the diagram below. +C> The pole and the sector boundaries +C> are treated specially in the code. +C> Unfortunately, this approach induces +C> some hairy indexing and code loquacity, +C> for which the developer apologizes. +C> +C>
+C>              \ 4 | 5 /
+C>               \  |  /
+C>              3 \ | / 6
+C>                 \|/
+C>              ----+----
+C>                 /|\
+C>              2 / | \ 7
+C>               /  |  \
+C>              / 1 | 8 \
+C> 
+C> +C> The transforms are all multiprocessed over sector points. +C> transform several fields at a time to improve vectorization. +C> subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NPS odd order of the polar stereographic grids +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between grid fields +C> (defaults to NPS*NPS if KGSKIP=0) +C> @param NISKIP skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP skip number between grid j-points +C> (defaults to NPS if NJSKIP=0) +C> @param TRUE latitude at which ps grid is true (usually 60.) +C> @param XMESH grid length at true latitude (m) +C> @param ORIENT longitude at bottom of northern ps grid +C> (southern ps grid will have opposite orientation.) +C> @param WAVED wave divergence fields +C> @param WAVEZ wave vorticity fields +C> @param UN northern polar stereographic u-winds +C> @param VN northern polar stereographic v-winds +C> @param US southern polar stereographic u-winds +C> @param VS southern polar stereographic v-winds +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPSV(IROMB,MAXWV,KMAX,NPS, + & KWSKIP,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WAVED,WAVEZ,UN,VN,US,VS) + + REAL WAVED(*),WAVEZ(*),UN(*),VN(*),US(*),VS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(2*KMAX) + REAL SLON(MAXWV,8),CLON(MAXWV,8),SROT(0:3),CROT(0:3) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX) + REAL WTOP(2*(MAXWV+1),2*KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,2*KMAX) + DATA SROT/0.,1.,0.,-1./,CROT/1.,0.,-1.,0./ + PARAMETER(RERTH=6.3712E6) + PARAMETER(PI=3.14159265358979,DPR=180./PI) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + MDIM=2*MX+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NI=NISKIP + NJ=NJSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NPS*NPS + IF(NI.EQ.0) NI=1 + IF(NJ.EQ.0) NJ=NPS + MP=1 + NPH=(NPS-1)/2 + GQ=((1.+SIN(TRUE/DPR))*RERTH/XMESH)**2 + SRH=SQRT(0.5) + +C CALCULATE SPECTRAL WINDS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPDZ2UV(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & WAVED(KWS+1),WAVEZ(KWS+1), + & W(1,K),W(1,KMAX+K),WTOP(1,K),WTOP(1,KMAX+K)) + ENDDO + +C CALCULATE POLE POINT + I1=NPH+1 + J1=NPH+1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + SLAT1=1. + CLAT1=0. + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + COSO=COS(ORIENT/DPR) + SINO=SIN(ORIENT/DPR) +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + UN(IJK1)=2*( COSO*F(3,1,KU)+SINO*F(3,1,KV)) + VN(IJK1)=2*(-SINO*F(3,1,KU)+COSO*F(3,1,KV)) + US(IJK1)=2*( COSO*F(3,2,KU)-SINO*F(3,2,KV)) + VS(IJK1)=2*( SINO*F(3,2,KU)+COSO*F(3,2,KV)) + ENDDO + +C CALCULATE POINTS ALONG THE ROW AND COLUMN OF THE POLE, +C STARTING AT THE ORIENTATION LONGITUDE AND GOING CLOCKWISE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI) + DO J1=1,NPH + I1=NPH+1 + RADLON=ORIENT/DPR + J3=NPS+1-I1 + I3=J1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J7=I1 + I7=NPS+1-J1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON) + CLON(L,1)=COS(L*RADLON) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + UN(IJK1)= F(1,1,KU) + VN(IJK1)= F(1,1,KV) + UN(IJK3)= F(1,1,KV) + VN(IJK3)=-F(1,1,KU) + UN(IJK5)=-F(1,1,KU) + VN(IJK5)=-F(1,1,KV) + UN(IJK7)=-F(1,1,KV) + VN(IJK7)= F(1,1,KU) + US(IJK1)=-F(1,2,KU) + VS(IJK1)=-F(1,2,KV) + US(IJK3)=-F(1,2,KV) + VS(IJK3)= F(1,2,KU) + US(IJK5)= F(1,2,KU) + VS(IJK5)= F(1,2,KV) + US(IJK7)= F(1,2,KV) + VS(IJK7)=-F(1,2,KU) + ENDDO + IF(KMAX.EQ.1) THEN + KU=1 + KV=2 + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + UN(IJ1)=UN(IJ1)+2*(F(LR,1,KU)*CLON(L,1) + & -F(LI,1,KU)*SLON(L,1)) + VN(IJ1)=VN(IJ1)+2*(F(LR,1,KV)*CLON(L,1) + & -F(LI,1,KV)*SLON(L,1)) + UN(IJ3)=UN(IJ3)+2*(F(LR,1,KV)*CLON(L,3) + & -F(LI,1,KV)*SLON(L,3)) + VN(IJ3)=VN(IJ3)-2*(F(LR,1,KU)*CLON(L,3) + & -F(LI,1,KU)*SLON(L,3)) + UN(IJ5)=UN(IJ5)-2*(F(LR,1,KU)*CLON(L,5) + & -F(LI,1,KU)*SLON(L,5)) + VN(IJ5)=VN(IJ5)-2*(F(LR,1,KV)*CLON(L,5) + & -F(LI,1,KV)*SLON(L,5)) + UN(IJ7)=UN(IJ7)-2*(F(LR,1,KV)*CLON(L,7) + & -F(LI,1,KV)*SLON(L,7)) + VN(IJ7)=VN(IJ7)+2*(F(LR,1,KU)*CLON(L,7) + & -F(LI,1,KU)*SLON(L,7)) + US(IJ1)=US(IJ1)-2*(F(LR,2,KU)*CLON(L,5) + & -F(LI,2,KU)*SLON(L,5)) + VS(IJ1)=VS(IJ1)-2*(F(LR,2,KV)*CLON(L,5) + & -F(LI,2,KV)*SLON(L,5)) + US(IJ3)=US(IJ3)-2*(F(LR,2,KV)*CLON(L,3) + & -F(LI,2,KV)*SLON(L,3)) + VS(IJ3)=VS(IJ3)+2*(F(LR,2,KU)*CLON(L,3) + & -F(LI,2,KU)*SLON(L,3)) + US(IJ5)=US(IJ5)+2*(F(LR,2,KU)*CLON(L,1) + & -F(LI,2,KU)*SLON(L,1)) + VS(IJ5)=VS(IJ5)+2*(F(LR,2,KV)*CLON(L,1) + & -F(LI,2,KV)*SLON(L,1)) + US(IJ7)=US(IJ7)+2*(F(LR,2,KV)*CLON(L,7) + & -F(LI,2,KV)*SLON(L,7)) + VS(IJ7)=VS(IJ7)-2*(F(LR,2,KU)*CLON(L,7) + & -F(LI,2,KU)*SLON(L,7)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + UN(IJK1)=UN(IJK1)+2*(F(LR,1,KU)*CLON(L,1) + & -F(LI,1,KU)*SLON(L,1)) + VN(IJK1)=VN(IJK1)+2*(F(LR,1,KV)*CLON(L,1) + & -F(LI,1,KV)*SLON(L,1)) + UN(IJK3)=UN(IJK3)+2*(F(LR,1,KV)*CLON(L,3) + & -F(LI,1,KV)*SLON(L,3)) + VN(IJK3)=VN(IJK3)-2*(F(LR,1,KU)*CLON(L,3) + & -F(LI,1,KU)*SLON(L,3)) + UN(IJK5)=UN(IJK5)-2*(F(LR,1,KU)*CLON(L,5) + & -F(LI,1,KU)*SLON(L,5)) + VN(IJK5)=VN(IJK5)-2*(F(LR,1,KV)*CLON(L,5) + & -F(LI,1,KV)*SLON(L,5)) + UN(IJK7)=UN(IJK7)-2*(F(LR,1,KV)*CLON(L,7) + & -F(LI,1,KV)*SLON(L,7)) + VN(IJK7)=VN(IJK7)+2*(F(LR,1,KU)*CLON(L,7) + & -F(LI,1,KU)*SLON(L,7)) + US(IJK1)=US(IJK1)-2*(F(LR,2,KU)*CLON(L,5) + & -F(LI,2,KU)*SLON(L,5)) + VS(IJK1)=VS(IJK1)-2*(F(LR,2,KV)*CLON(L,5) + & -F(LI,2,KV)*SLON(L,5)) + US(IJK3)=US(IJK3)-2*(F(LR,2,KV)*CLON(L,3) + & -F(LI,2,KV)*SLON(L,3)) + VS(IJK3)=VS(IJK3)+2*(F(LR,2,KU)*CLON(L,3) + & -F(LI,2,KU)*SLON(L,3)) + US(IJK5)=US(IJK5)+2*(F(LR,2,KU)*CLON(L,1) + & -F(LI,2,KU)*SLON(L,1)) + VS(IJK5)=VS(IJK5)+2*(F(LR,2,KV)*CLON(L,1) + & -F(LI,2,KV)*SLON(L,1)) + US(IJK7)=US(IJK7)+2*(F(LR,2,KV)*CLON(L,7) + & -F(LI,2,KV)*SLON(L,7)) + VS(IJK7)=VS(IJK7)-2*(F(LR,2,KU)*CLON(L,7) + & -F(LI,2,KU)*SLON(L,7)) + ENDDO + ENDDO + ENDIF + ENDDO + +C CALCULATE POINTS ON THE MAIN DIAGONALS THROUGH THE POLE, +C STARTING CLOCKWISE OF THE ORIENTATION LONGITUDE AND GOING CLOCKWISE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI) + DO J1=1,NPH + I1=J1 + RADLON=(ORIENT-45)/DPR + J3=NPS+1-I1 + I3=J1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J7=I1 + I7=NPS+1-J1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON) + CLON(L,1)=COS(L*RADLON) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + UN(IJK1)=SRH*( F(1,1,KU)+F(1,1,KV)) + VN(IJK1)=SRH*(-F(1,1,KU)+F(1,1,KV)) + UN(IJK3)=SRH*(-F(1,1,KU)+F(1,1,KV)) + VN(IJK3)=SRH*(-F(1,1,KU)-F(1,1,KV)) + UN(IJK5)=SRH*(-F(1,1,KU)-F(1,1,KV)) + VN(IJK5)=SRH*( F(1,1,KU)-F(1,1,KV)) + UN(IJK7)=SRH*( F(1,1,KU)-F(1,1,KV)) + VN(IJK7)=SRH*( F(1,1,KU)+F(1,1,KV)) + US(IJK1)=SRH*(-F(1,2,KU)-F(1,2,KV)) + VS(IJK1)=SRH*( F(1,2,KU)-F(1,2,KV)) + US(IJK3)=SRH*( F(1,2,KU)-F(1,2,KV)) + VS(IJK3)=SRH*( F(1,2,KU)+F(1,2,KV)) + US(IJK5)=SRH*( F(1,2,KU)+F(1,2,KV)) + VS(IJK5)=SRH*(-F(1,2,KU)+F(1,2,KV)) + US(IJK7)=SRH*(-F(1,2,KU)+F(1,2,KV)) + VS(IJK7)=SRH*(-F(1,2,KU)-F(1,2,KV)) + ENDDO + IF(KMAX.EQ.1) THEN + KU=1 + KV=2 + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + UN(IJ1)=UN(IJ1)+2*SRH*(( F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,1) + & -( F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,1)) + VN(IJ1)=VN(IJ1)+2*SRH*((-F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,1) + & -(-F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,1)) + UN(IJ3)=UN(IJ3)+2*SRH*((-F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,3) + & -(-F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,3)) + VN(IJ3)=VN(IJ3)+2*SRH*((-F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,3) + & -(-F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,3)) + UN(IJ5)=UN(IJ5)+2*SRH*((-F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,5) + & -(-F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,5)) + VN(IJ5)=VN(IJ5)+2*SRH*(( F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,5) + & -( F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,5)) + UN(IJ7)=UN(IJ7)+2*SRH*(( F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,7) + & -( F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,7)) + VN(IJ7)=VN(IJ7)+2*SRH*(( F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,7) + & -( F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,7)) + US(IJ1)=US(IJ1)+2*SRH*((-F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,3) + & -(-F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,3)) + VS(IJ1)=VS(IJ1)+2*SRH*(( F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,3) + & -( F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,3)) + US(IJ3)=US(IJ3)+2*SRH*(( F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,1) + & -( F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,1)) + VS(IJ3)=VS(IJ3)+2*SRH*(( F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,1) + & -( F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,1)) + US(IJ5)=US(IJ5)+2*SRH*(( F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,7) + & -( F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,7)) + VS(IJ5)=VS(IJ5)+2*SRH*((-F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,7) + & -(-F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,7)) + US(IJ7)=US(IJ7)+2*SRH*((-F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,5) + & -(-F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,5)) + VS(IJ7)=VS(IJ7)+2*SRH*((-F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,5) + & -(-F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,5)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK7=IJ7+(K-1)*KG + UN(IJK1)=UN(IJK1)+2*SRH*(( F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,1) + & -( F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,1)) + VN(IJK1)=VN(IJK1)+2*SRH*((-F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,1) + & -(-F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,1)) + UN(IJK3)=UN(IJK3)+2*SRH*((-F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,3) + & -(-F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,3)) + VN(IJK3)=VN(IJK3)+2*SRH*((-F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,3) + & -(-F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,3)) + UN(IJK5)=UN(IJK5)+2*SRH*((-F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,5) + & -(-F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,5)) + VN(IJK5)=VN(IJK5)+2*SRH*(( F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,5) + & -( F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,5)) + UN(IJK7)=UN(IJK7)+2*SRH*(( F(LR,1,KU)-F(LR,1,KV)) + & *CLON(L,7) + & -( F(LI,1,KU)-F(LI,1,KV)) + & *SLON(L,7)) + VN(IJK7)=VN(IJK7)+2*SRH*(( F(LR,1,KU)+F(LR,1,KV)) + & *CLON(L,7) + & -( F(LI,1,KU)+F(LI,1,KV)) + & *SLON(L,7)) + US(IJK1)=US(IJK1)+2*SRH*((-F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,3) + & -(-F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,3)) + VS(IJK1)=VS(IJK1)+2*SRH*(( F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,3) + & -( F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,3)) + US(IJK3)=US(IJK3)+2*SRH*(( F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,1) + & -( F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,1)) + VS(IJK3)=VS(IJK3)+2*SRH*(( F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,1) + & -( F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,1)) + US(IJK5)=US(IJK5)+2*SRH*(( F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,7) + & -( F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,7)) + VS(IJK5)=VS(IJK5)+2*SRH*((-F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,7) + & -(-F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,7)) + US(IJK7)=US(IJK7)+2*SRH*((-F(LR,2,KU)+F(LR,2,KV)) + & *CLON(L,5) + & -(-F(LI,2,KU)+F(LI,2,KV)) + & *SLON(L,5)) + VS(IJK7)=VS(IJK7)+2*SRH*((-F(LR,2,KU)-F(LR,2,KV)) + & *CLON(L,5) + & -(-F(LI,2,KU)-F(LI,2,KV)) + & *SLON(L,5)) + ENDDO + ENDDO + ENDIF + ENDDO + +C CALCULATE THE REMAINDER OF THE POLAR STEREOGRAPHIC DOMAIN, +C STARTING AT THE SECTOR JUST CLOCKWISE OF THE ORIENTATION LONGITUDE +C AND GOING CLOCKWISE UNTIL ALL EIGHT SECTORS ARE DONE. +C$OMP PARALLEL DO PRIVATE(I1,J2,I2,J3,I3,J4,I4,J5,I5,J6,I6,J7,I7,J8,I8) +C$OMP& PRIVATE(IJ1,IJ2,IJ3,IJ4,IJ5,IJ6,IJ7,IJ8) +C$OMP& PRIVATE(IJK1,IJK2,IJK3,IJK4,IJK5,IJK6,IJK7,IJK8) +C$OMP& PRIVATE(DJ1,DI1,RQ,RR,RADLON,RADLON1,RADLON2,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,SLON,CLON,KU,KV,LR,LI) + DO J1=1,NPH-1 + DO I1=J1+1,NPH + J2=I1 + I2=J1 + J3=NPS+1-I1 + I3=J1 + J4=NPS+1-J1 + I4=I1 + J5=NPS+1-J1 + I5=NPS+1-I1 + J6=NPS+1-I1 + I6=NPS+1-J1 + J7=I1 + I7=NPS+1-J1 + J8=J1 + I8=NPS+1-I1 + IJ1=(I1-1)*NI+(J1-1)*NJ+1 + IJ2=(I2-1)*NI+(J2-1)*NJ+1 + IJ3=(I3-1)*NI+(J3-1)*NJ+1 + IJ4=(I4-1)*NI+(J4-1)*NJ+1 + IJ5=(I5-1)*NI+(J5-1)*NJ+1 + IJ6=(I6-1)*NI+(J6-1)*NJ+1 + IJ7=(I7-1)*NI+(J7-1)*NJ+1 + IJ8=(I8-1)*NI+(J8-1)*NJ+1 + DI1=I1-NPH-1 + DJ1=J1-NPH-1 + RQ=DI1**2+DJ1**2 + RR=SQRT(1/RQ) + SLAT1=(GQ-RQ)/(GQ+RQ) + CLAT1=SQRT(1.-SLAT1**2) + RADLON1=ORIENT/DPR+ATAN(-DI1/DJ1) + RADLON2=(ORIENT-45)/DPR*2-RADLON1 + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + DO L=1,MAXWV + SLON(L,1)=SIN(L*RADLON1) + CLON(L,1)=COS(L*RADLON1) + SLON(L,2)=SIN(L*RADLON2) + CLON(L,2)=COS(L*RADLON2) + SLON(L,3)=SLON(L,1)*CROT(MOD(1*L,4)) + & -CLON(L,1)*SROT(MOD(1*L,4)) + CLON(L,3)=CLON(L,1)*CROT(MOD(1*L,4)) + & +SLON(L,1)*SROT(MOD(1*L,4)) + SLON(L,4)=SLON(L,2)*CROT(MOD(1*L,4)) + & -CLON(L,2)*SROT(MOD(1*L,4)) + CLON(L,4)=CLON(L,2)*CROT(MOD(1*L,4)) + & +SLON(L,2)*SROT(MOD(1*L,4)) + SLON(L,5)=SLON(L,1)*CROT(MOD(2*L,4)) + & -CLON(L,1)*SROT(MOD(2*L,4)) + CLON(L,5)=CLON(L,1)*CROT(MOD(2*L,4)) + & +SLON(L,1)*SROT(MOD(2*L,4)) + SLON(L,6)=SLON(L,2)*CROT(MOD(2*L,4)) + & -CLON(L,2)*SROT(MOD(2*L,4)) + CLON(L,6)=CLON(L,2)*CROT(MOD(2*L,4)) + & +SLON(L,2)*SROT(MOD(2*L,4)) + SLON(L,7)=SLON(L,1)*CROT(MOD(3*L,4)) + & -CLON(L,1)*SROT(MOD(3*L,4)) + CLON(L,7)=CLON(L,1)*CROT(MOD(3*L,4)) + & +SLON(L,1)*SROT(MOD(3*L,4)) + SLON(L,8)=SLON(L,2)*CROT(MOD(3*L,4)) + & -CLON(L,2)*SROT(MOD(3*L,4)) + CLON(L,8)=CLON(L,2)*CROT(MOD(3*L,4)) + & +SLON(L,2)*SROT(MOD(3*L,4)) + ENDDO +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK2=IJ2+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK4=IJ4+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK6=IJ6+(K-1)*KG + IJK7=IJ7+(K-1)*KG + IJK8=IJ8+(K-1)*KG + UN(IJK1)=RR*(-DJ1*F(1,1,KU)-DI1*F(1,1,KV)) + VN(IJK1)=RR*( DI1*F(1,1,KU)-DJ1*F(1,1,KV)) + UN(IJK2)=RR*(-DI1*F(1,1,KU)-DJ1*F(1,1,KV)) + VN(IJK2)=RR*( DJ1*F(1,1,KU)-DI1*F(1,1,KV)) + UN(IJK3)=RR*( DI1*F(1,1,KU)-DJ1*F(1,1,KV)) + VN(IJK3)=RR*( DJ1*F(1,1,KU)+DI1*F(1,1,KV)) + UN(IJK4)=RR*( DJ1*F(1,1,KU)-DI1*F(1,1,KV)) + VN(IJK4)=RR*( DI1*F(1,1,KU)+DJ1*F(1,1,KV)) + UN(IJK5)=RR*( DJ1*F(1,1,KU)+DI1*F(1,1,KV)) + VN(IJK5)=RR*(-DI1*F(1,1,KU)+DJ1*F(1,1,KV)) + UN(IJK6)=RR*( DI1*F(1,1,KU)+DJ1*F(1,1,KV)) + VN(IJK6)=RR*(-DJ1*F(1,1,KU)+DI1*F(1,1,KV)) + UN(IJK7)=RR*(-DI1*F(1,1,KU)+DJ1*F(1,1,KV)) + VN(IJK7)=RR*(-DJ1*F(1,1,KU)-DI1*F(1,1,KV)) + UN(IJK8)=RR*(-DJ1*F(1,1,KU)+DI1*F(1,1,KV)) + VN(IJK8)=RR*(-DI1*F(1,1,KU)-DJ1*F(1,1,KV)) + US(IJK1)=RR*( DJ1*F(1,2,KU)+DI1*F(1,2,KV)) + VS(IJK1)=RR*(-DI1*F(1,2,KU)+DJ1*F(1,2,KV)) + US(IJK2)=RR*( DI1*F(1,2,KU)+DJ1*F(1,2,KV)) + VS(IJK2)=RR*(-DJ1*F(1,2,KU)+DI1*F(1,2,KV)) + US(IJK3)=RR*(-DI1*F(1,2,KU)+DJ1*F(1,2,KV)) + VS(IJK3)=RR*(-DJ1*F(1,2,KU)-DI1*F(1,2,KV)) + US(IJK4)=RR*(-DJ1*F(1,2,KU)+DI1*F(1,2,KV)) + VS(IJK4)=RR*(-DI1*F(1,2,KU)-DJ1*F(1,2,KV)) + US(IJK5)=RR*(-DJ1*F(1,2,KU)-DI1*F(1,2,KV)) + VS(IJK5)=RR*( DI1*F(1,2,KU)-DJ1*F(1,2,KV)) + US(IJK6)=RR*(-DI1*F(1,2,KU)-DJ1*F(1,2,KV)) + VS(IJK6)=RR*( DJ1*F(1,2,KU)-DI1*F(1,2,KV)) + US(IJK7)=RR*( DI1*F(1,2,KU)-DJ1*F(1,2,KV)) + VS(IJK7)=RR*( DJ1*F(1,2,KU)+DI1*F(1,2,KV)) + US(IJK8)=RR*( DJ1*F(1,2,KU)-DI1*F(1,2,KV)) + VS(IJK8)=RR*( DI1*F(1,2,KU)+DJ1*F(1,2,KV)) + ENDDO + IF(KMAX.EQ.1) THEN + KU=1 + KV=2 + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 + UN(IJ1)=UN(IJ1)+2*RR*((-DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,1) + & -(-DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,1)) + VN(IJ1)=VN(IJ1)+2*RR*(( DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,1) + & -( DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,1)) + UN(IJ2)=UN(IJ2)+2*RR*((-DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,2) + & -(-DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,2)) + VN(IJ2)=VN(IJ2)+2*RR*(( DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,2) + & -( DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,2)) + UN(IJ3)=UN(IJ3)+2*RR*(( DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,3) + & -( DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,3)) + VN(IJ3)=VN(IJ3)+2*RR*(( DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,3) + & -( DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,3)) + UN(IJ4)=UN(IJ4)+2*RR*(( DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,4) + & -( DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,4)) + VN(IJ4)=VN(IJ4)+2*RR*(( DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,4) + & -( DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,4)) + UN(IJ5)=UN(IJ5)+2*RR*(( DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,5) + & -( DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,5)) + VN(IJ5)=VN(IJ5)+2*RR*((-DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,5) + & -(-DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,5)) + UN(IJ6)=UN(IJ6)+2*RR*(( DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,6) + & -( DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,6)) + VN(IJ6)=VN(IJ6)+2*RR*((-DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,6) + & -(-DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,6)) + UN(IJ7)=UN(IJ7)+2*RR*((-DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,7) + & -(-DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,7)) + VN(IJ7)=VN(IJ7)+2*RR*((-DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,7) + & -(-DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,7)) + UN(IJ8)=UN(IJ8)+2*RR*((-DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,8) + & -(-DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,8)) + VN(IJ8)=VN(IJ8)+2*RR*((-DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,8) + & -(-DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,8)) + US(IJ1)=US(IJ1)+2*RR*(( DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,4) + & -( DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,4)) + VS(IJ1)=VS(IJ1)+2*RR*((-DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,4) + & -(-DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,4)) + US(IJ2)=US(IJ2)+2*RR*(( DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,3) + & -( DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,3)) + VS(IJ2)=VS(IJ2)+2*RR*((-DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,3) + & -(-DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,3)) + US(IJ3)=US(IJ3)+2*RR*((-DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,2) + & -(-DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,2)) + VS(IJ3)=VS(IJ3)+2*RR*((-DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,2) + & -(-DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,2)) + US(IJ4)=US(IJ4)+2*RR*((-DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,1) + & -(-DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,1)) + VS(IJ4)=VS(IJ4)+2*RR*((-DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,1) + & -(-DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,1)) + US(IJ5)=US(IJ5)+2*RR*((-DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,8) + & -(-DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,8)) + VS(IJ5)=VS(IJ5)+2*RR*(( DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,8) + & -( DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,8)) + US(IJ6)=US(IJ6)+2*RR*((-DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,7) + & -(-DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,7)) + VS(IJ6)=VS(IJ6)+2*RR*(( DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,7) + & -( DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,7)) + US(IJ7)=US(IJ7)+2*RR*(( DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,6) + & -( DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,6)) + VS(IJ7)=VS(IJ7)+2*RR*(( DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,6) + & -( DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,6)) + US(IJ8)=US(IJ8)+2*RR*(( DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,5) + & -( DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,5)) + VS(IJ8)=VS(IJ8)+2*RR*(( DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,5) + & -( DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,5)) + ENDDO + ELSE + DO L=1,MAXWV + LR=2*L+1 + LI=2*L+2 +CDIR$ IVDEP + DO K=1,KMAX + KU=K + KV=K+KMAX + IJK1=IJ1+(K-1)*KG + IJK2=IJ2+(K-1)*KG + IJK3=IJ3+(K-1)*KG + IJK4=IJ4+(K-1)*KG + IJK5=IJ5+(K-1)*KG + IJK6=IJ6+(K-1)*KG + IJK7=IJ7+(K-1)*KG + IJK8=IJ8+(K-1)*KG + UN(IJK1)=UN(IJK1)+2*RR*((-DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,1) + & -(-DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,1)) + VN(IJK1)=VN(IJK1)+2*RR*(( DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,1) + & -( DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,1)) + UN(IJK2)=UN(IJK2)+2*RR*((-DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,2) + & -(-DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,2)) + VN(IJK2)=VN(IJK2)+2*RR*(( DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,2) + & -( DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,2)) + UN(IJK3)=UN(IJK3)+2*RR*(( DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,3) + & -( DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,3)) + VN(IJK3)=VN(IJK3)+2*RR*(( DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,3) + & -( DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,3)) + UN(IJK4)=UN(IJK4)+2*RR*(( DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,4) + & -( DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,4)) + VN(IJK4)=VN(IJK4)+2*RR*(( DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,4) + & -( DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,4)) + UN(IJK5)=UN(IJK5)+2*RR*(( DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,5) + & -( DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,5)) + VN(IJK5)=VN(IJK5)+2*RR*((-DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,5) + & -(-DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,5)) + UN(IJK6)=UN(IJK6)+2*RR*(( DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,6) + & -( DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,6)) + VN(IJK6)=VN(IJK6)+2*RR*((-DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,6) + & -(-DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,6)) + UN(IJK7)=UN(IJK7)+2*RR*((-DI1*F(LR,1,KU)+DJ1*F(LR,1,KV)) + & *CLON(L,7) + & -(-DI1*F(LI,1,KU)+DJ1*F(LI,1,KV)) + & *SLON(L,7)) + VN(IJK7)=VN(IJK7)+2*RR*((-DJ1*F(LR,1,KU)-DI1*F(LR,1,KV)) + & *CLON(L,7) + & -(-DJ1*F(LI,1,KU)-DI1*F(LI,1,KV)) + & *SLON(L,7)) + UN(IJK8)=UN(IJK8)+2*RR*((-DJ1*F(LR,1,KU)+DI1*F(LR,1,KV)) + & *CLON(L,8) + & -(-DJ1*F(LI,1,KU)+DI1*F(LI,1,KV)) + & *SLON(L,8)) + VN(IJK8)=VN(IJK8)+2*RR*((-DI1*F(LR,1,KU)-DJ1*F(LR,1,KV)) + & *CLON(L,8) + & -(-DI1*F(LI,1,KU)-DJ1*F(LI,1,KV)) + & *SLON(L,8)) + US(IJK1)=US(IJK1)+2*RR*(( DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,4) + & -( DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,4)) + VS(IJK1)=VS(IJK1)+2*RR*((-DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,4) + & -(-DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,4)) + US(IJK2)=US(IJK2)+2*RR*(( DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,3) + & -( DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,3)) + VS(IJK2)=VS(IJK2)+2*RR*((-DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,3) + & -(-DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,3)) + US(IJK3)=US(IJK3)+2*RR*((-DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,2) + & -(-DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,2)) + VS(IJK3)=VS(IJK3)+2*RR*((-DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,2) + & -(-DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,2)) + US(IJK4)=US(IJK4)+2*RR*((-DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,1) + & -(-DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,1)) + VS(IJK4)=VS(IJK4)+2*RR*((-DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,1) + & -(-DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,1)) + US(IJK5)=US(IJK5)+2*RR*((-DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,8) + & -(-DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,8)) + VS(IJK5)=VS(IJK5)+2*RR*(( DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,8) + & -( DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,8)) + US(IJK6)=US(IJK6)+2*RR*((-DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,7) + & -(-DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,7)) + VS(IJK6)=VS(IJK6)+2*RR*(( DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,7) + & -( DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,7)) + US(IJK7)=US(IJK7)+2*RR*(( DI1*F(LR,2,KU)-DJ1*F(LR,2,KV)) + & *CLON(L,6) + & -( DI1*F(LI,2,KU)-DJ1*F(LI,2,KV)) + & *SLON(L,6)) + VS(IJK7)=VS(IJK7)+2*RR*(( DJ1*F(LR,2,KU)+DI1*F(LR,2,KV)) + & *CLON(L,6) + & -( DJ1*F(LI,2,KU)+DI1*F(LI,2,KV)) + & *SLON(L,6)) + US(IJK8)=US(IJK8)+2*RR*(( DJ1*F(LR,2,KU)-DI1*F(LR,2,KV)) + & *CLON(L,5) + & -( DJ1*F(LI,2,KU)-DI1*F(LI,2,KV)) + & *SLON(L,5)) + VS(IJK8)=VS(IJK8)+2*RR*(( DI1*F(LR,2,KU)+DJ1*F(LR,2,KV)) + & *CLON(L,5) + & -( DI1*F(LI,2,KU)+DJ1*F(LI,2,KV)) + & *SLON(L,5)) + ENDDO + ENDDO + ENDIF + ENDDO + ENDDO + + END diff --git a/src/sptgpt.f b/src/sptgpt.f new file mode 100644 index 00000000..cec003f0 --- /dev/null +++ b/src/sptgpt.f @@ -0,0 +1,104 @@ +C> @file +C> @brief Transform spectral scalar to station points. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> 2003-06-30 | Iredell | Use spfftpt(). +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +c> from spectral coefficients of scalar quantities +c> to specified sets of station points on the globe. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and point fields may have general indexing, +c> but each wave field is in sequential 'IBM order', +c> i.e. with zonal wavenumber as the slower index. +C> +C> The transforms are all multiprocessed over stations. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NMAX number of station points to return +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between station point sets +C> (defaults to NMAX if KGSKIP=0) +C> @param NRSKIP skip number between station lats and lons +C> (defaults to 1 if NRSKIP=0) +C> @param NGSKIP skip number between station points +C> (defaults to 1 if NGSKIP=0) +C> @param RLAT station latitudes in degrees +C> @param RLON station longitudes in degrees +C> @param WAVE wave fields +C> @param GP station point sets +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPT(IROMB,MAXWV,KMAX,NMAX, + & KWSKIP,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WAVE,GP) + + REAL RLAT(*),RLON(*),WAVE(*),GP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(KMAX) + REAL WTOP(2*(MAXWV+1),KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,KMAX) + PARAMETER(PI=3.14159265358979) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NR=NRSKIP + NG=NGSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NMAX + IF(NR.EQ.0) NR=1 + IF(NG.EQ.0) NG=1 + MP=0 +C$OMP PARALLEL DO + DO K=1,KMAX + WTOP(1:2*MXTOP,K)=0 + ENDDO + +C CALCULATE STATION FIELDS +C$OMP PARALLEL DO PRIVATE(RADLAT,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,NK) + DO N=1,NMAX + RADLAT=PI/180*RLAT((N-1)*NR+1) + IF(RLAT((N-1)*NR+1).GE.89.9995) THEN + SLAT1=1. + CLAT1=0. + ELSEIF(RLAT((N-1)*NR+1).LE.-89.9995) THEN + SLAT1=-1. + CLAT1=0. + ELSE + SLAT1=SIN(RADLAT) + CLAT1=COS(RADLAT) + ENDIF + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,KW,2*MXTOP,KMAX, + & CLAT1,PLN,PLNTOP,MP,WAVE,WTOP,F) + CALL SPFFTPT(MAXWV,1,2*MAXWV+3,KG,KMAX,RLON((N-1)*NR+1), + & F,GP((N-1)*NG+1)) + ENDDO + END diff --git a/src/sptgptd.f b/src/sptgptd.f new file mode 100644 index 00000000..e0d99e19 --- /dev/null +++ b/src/sptgptd.f @@ -0,0 +1,77 @@ +C> @file +C> @brief Transform spectral to station point gradients. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +c> from spectral coefficients of scalar fields +c> to specified sets of station point gradients on the globe. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and point fields may have general indexing, +c> but each wave field is in sequential 'IBM order', +c> i.e. with zonal wavenumber as the slower index. +C> +C> The transforms are all multiprocessed over stations. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NMAX number of station points to return +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between station point sets +C> (defaults to NMAX if KGSKIP=0) +C> @param NRSKIP skip number between station lats and lons +C> (defaults to 1 if NRSKIP=0) +C> @param NGSKIP skip number between station points +c> (defaults to 1 if NGSKIP=0) +C> @param RLAT station latitudes in degrees +C> @param RLON station longitudes in degrees +C> @param WAVE wave fields +C> @param XP station point x-gradient sets +C> @param YP station point y-gradient sets +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPTD(IROMB,MAXWV,KMAX,NMAX, + & KWSKIP,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WAVE,XP,YP) + + REAL RLAT(*),RLON(*),WAVE(*),XP(*),YP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + KW=KWSKIP + IF(KW.EQ.0) KW=2*MX +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE STATION FIELDS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),1) + WZ(1:2*MX,K)=0. + ENDDO + CALL SPTGPTV(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WD,WZ,XP,YP) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptgptsd.f b/src/sptgptsd.f new file mode 100644 index 00000000..b22dfa51 --- /dev/null +++ b/src/sptgptsd.f @@ -0,0 +1,130 @@ +C> @file +C> @brief Transform spectral scalar to station points. +C> @author Iredell @date 96-02-29 +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> 1999-08-18 | Iredell | Openmp directive typo fixed. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of scalar quantities +C> to specified sets of station point values +C> and their gradients on the globe. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and point fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The transforms are all multiprocessed over stations. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NMAX number of station points to return +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between station point sets +C> (defaults to NMAX if KGSKIP=0) +C> @param NRSKIP skip number between station lats and lons +C> (defaults to 1 if NRSKIP=0) +C> @param NGSKIP skip number between station points +C> (defaults to 1 if NGSKIP=0) +C> @param RLAT station latitudes in degrees +C> @param RLON station longitudes in degrees +C> @param WAVE wave fields +C> @param GP station point sets +C> @param XP station point x-gradient sets +C> @param YP station point y-gradient sets +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPTSD(IROMB,MAXWV,KMAX,NMAX, + & KWSKIP,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WAVE,GP,XP,YP) + + REAL RLAT(*),RLON(*),WAVE(*) + REAL GP(*),XP(*),YP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(2*KMAX) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2*KMAX) + REAL WTOP(2*(MAXWV+1),2*KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+2,2,3*KMAX),G(3*KMAX) + PARAMETER(PI=3.14159265358979) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + MDIM=2*MX + IDIM=2*MAXWV+2 + KW=KWSKIP + KG=KGSKIP + NR=NRSKIP + NG=NGSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NMAX + IF(NR.EQ.0) NR=1 + IF(NG.EQ.0) NG=1 + MP(1:KMAX)=10 + MP(KMAX+1:2*KMAX)=1 +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE SPECTRAL WINDS +C$OMP PARALLEL DO PRIVATE(KWS,KS,KY) + DO K=1,KMAX + KWS=(K-1)*KW + KS=0*KMAX+K + KY=1*KMAX+K + DO I=1,2*MX + W(I,KS)=WAVE(KWS+I) + ENDDO + DO I=1,2*MXTOP + WTOP(I,KS)=0 + ENDDO + CALL SPGRADY(IROMB,MAXWV,ENN1,EON,EONTOP, + & WAVE(KWS+1),W(1,KY),WTOP(1,KY)) + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C CALCULATE STATION FIELDS +C$OMP PARALLEL DO PRIVATE(KS,KY,KX,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK) + DO N=1,NMAX + IF(ABS(RLAT((N-1)*NR+1)).GE.89.9995) THEN + SLAT1=SIGN(1.,RLAT((N-1)*NR+1)) + CLAT1=0. + ELSE + SLAT1=SIN(PI/180*RLAT((N-1)*NR+1)) + CLAT1=COS(PI/180*RLAT((N-1)*NR+1)) + ENDIF + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + CALL SPGRADX(MAXWV,IDIM,KMAX,MP,CLAT1,F(1,1,1),F(1,1,2*KMAX+1)) + CALL SPFFTPT(MAXWV,1,IDIM,1,3*KMAX,RLON((N-1)*NR+1),F,G) + DO K=1,KMAX + KS=0*KMAX+K + KY=1*KMAX+K + KX=2*KMAX+K + NK=(N-1)*NG+(K-1)*KG+1 + GP(NK)=G(KS) + XP(NK)=G(KX) + YP(NK)=G(KY) + ENDDO + ENDDO +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptgptv.f b/src/sptgptv.f new file mode 100644 index 00000000..37cf3b05 --- /dev/null +++ b/src/sptgptv.f @@ -0,0 +1,122 @@ +C> @file +C> @brief Transform spectral vector to station points. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | IREDELL | Initial +C> 1998-12-15 | IREDELL | Openmp directives inserted +C> 1999-08-18 | IREDELL | Openmp directive typo fixed +C> 2003-06-30 | IREDELL | use spfftpt() +C> +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of divergences and curls +C> to specified sets of station point vectors on the globe. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and point fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The transforms are all multiprocessed over stations. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NMAX number of station points to return +C> @param KWSKIP skip number between wave fields +c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0) +C> @param KGSKIP skip number between station point sets +c> (defaults to NMAX IF KGSKIP=0) +C> @param NRSKIP skip number between station lats and lons +c> (defaults to 1 if NRSKIP=0) +C> @param NGSKIP skip number between station points +c> (defaults to 1 if NGSKIP=0) +C> @param RLAT station latitudes in degrees +C> @param RLON station longitudes in degrees +C> @param WAVED wave divergence fields +C> @param WAVEZ wave vorticity fields +C> @param UP station point u-wind sets +C> @param VP station point v-wind sets +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTGPTV(IROMB,MAXWV,KMAX,NMAX, + & KWSKIP,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WAVED,WAVEZ,UP,VP) + + REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*),UP(*),VP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(2*KMAX) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,2*KMAX) + REAL WTOP(2*(MAXWV+1),2*KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+3,2,2*KMAX) + REAL G(2*KMAX) + PARAMETER(PI=3.14159265358979) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + MDIM=2*MX+1 + IDIM=2*MAXWV+3 + KW=KWSKIP + KG=KGSKIP + NR=NRSKIP + NG=NGSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NMAX + IF(NR.EQ.0) NR=1 + IF(NG.EQ.0) NG=1 + MP=1 + +C CALCULATE SPECTRAL WINDS +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPDZ2UV(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & WAVED(KWS+1),WAVEZ(KWS+1), + & W(1,K),W(1,KMAX+K),WTOP(1,K),WTOP(1,KMAX+K)) + ENDDO + +C CALCULATE STATION FIELDS +C$OMP PARALLEL DO PRIVATE(KU,KV,RADLAT,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK) + DO N=1,NMAX + RADLAT=PI/180*RLAT((N-1)*NR+1) + IF(RLAT((N-1)*NR+1).GE.89.9995) THEN + SLAT1=1. + CLAT1=0. + ELSEIF(RLAT((N-1)*NR+1).LE.-89.9995) THEN + SLAT1=-1. + CLAT1=0. + ELSE + SLAT1=SIN(RADLAT) + CLAT1=COS(RADLAT) + ENDIF + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,2*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + CALL SPFFTPT(MAXWV,1,2*MAXWV+3,1,2*KMAX,RLON((N-1)*NR+1),F,G) + DO K=1,KMAX + KU=K + KV=K+KMAX + NK=(N-1)*NG+(K-1)*KG+1 + UP(NK)=G(KU) + VP(NK)=G(KV) + ENDDO + ENDDO + + END diff --git a/src/sptgptvd.f b/src/sptgptvd.f new file mode 100644 index 00000000..14b35e42 --- /dev/null +++ b/src/sptgptvd.f @@ -0,0 +1,160 @@ +C> @file +C> @brief Transform spectral vector to station points. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> 1999-08-18 | Iredell | Openmp directive typo fixed. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> from spectral coefficients of divergences and curls +C> to specified sets of station point vectors and their +C> gradients on the globe. +C> +C>
+C> DP=(D(UP)/DLON+D(VP*CLAT)/DLAT)/(R*CLAT)
+C> ZP=(D(VP)/DLON-D(UP*CLAT)/DLAT)/(R*CLAT)
+C> UXP=D(UP*CLAT)/DLON/(R*CLAT)
+C> VXP=D(VP*CLAT)/DLON/(R*CLAT)
+C> UYP=D(UP*CLAT)/DLAT/R
+C> VYP=D(VP*CLAT)/DLAT/R
+C> 
+C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The wave and point fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> The transforms are all multiprocessed over stations. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param KMAX number of fields to transform. +C> @param NMAX number of station points to return +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0) +C> @param KGSKIP skip number between station point sets +C> (defaults to NMAX if KGSKIP=0) +C> @param NRSKIP skip number between station lats and lons +C> (defaults to 1 if NRSKIP=0) +C> @param NGSKIP skip number between station points +C> (defaults to 1 if NGSKIP=0) +C> @param RLAT station latitudes in degrees +C> @param RLON station longitudes in degrees +C> @param WAVED wave divergence fields +C> @param WAVEZ wave vorticity fields +C> @param DP station point divergence sets +C> @param ZP station point vorticity sets +C> @param UP station point u-wind sets +C> @param VP station point v-wind sets +C> @param UXP station point u-wind x-gradient sets +C> @param VXP station point v-wind x-gradient sets +C> @param UYP station point u-wind y-gradient sets +C> @param VYP station point v-wind y-gradient sets +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTGPTVD(IROMB,MAXWV,KMAX,NMAX, + & KWSKIP,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WAVED,WAVEZ, + & DP,ZP,UP,VP,UXP,VXP,UYP,VYP) + + REAL RLAT(*),RLON(*),WAVED(*),WAVEZ(*) + REAL DP(*),ZP(*),UP(*),VP(*),UXP(*),VXP(*),UYP(*),VYP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + INTEGER MP(4*KMAX) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,4*KMAX) + REAL WTOP(2*(MAXWV+1),4*KMAX) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),PLNTOP(MAXWV+1) + REAL F(2*MAXWV+2,2,6*KMAX),G(6*KMAX) + PARAMETER(PI=3.14159265358979) + +C CALCULATE PRELIMINARY CONSTANTS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + MDIM=2*MX + IDIM=2*MAXWV+2 + KW=KWSKIP + KG=KGSKIP + NR=NRSKIP + NG=NGSKIP + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=NMAX + IF(NR.EQ.0) NR=1 + IF(NG.EQ.0) NG=1 + MP(1:2*KMAX)=0 + MP(2*KMAX+1:4*KMAX)=1 + +C CALCULATE SPECTRAL WINDS +C$OMP PARALLEL DO PRIVATE(KWS,KD,KZ,KU,KV) + DO K=1,KMAX + KWS=(K-1)*KW + KD=0*KMAX+K + KZ=1*KMAX+K + KU=2*KMAX+K + KV=3*KMAX+K + DO I=1,2*MX + W(I,KD)=WAVED(KWS+I) + W(I,KZ)=WAVEZ(KWS+I) + ENDDO + DO I=1,2*MXTOP + WTOP(I,KD)=0 + WTOP(I,KZ)=0 + ENDDO + CALL SPDZ2UV(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & WAVED(KWS+1),WAVEZ(KWS+1), + & W(1,KU),W(1,KV),WTOP(1,KU),WTOP(1,KV)) + ENDDO + +C CALCULATE STATION FIELDS +C$OMP PARALLEL DO PRIVATE(KD,KZ,KU,KV,KUX,KVX,SLAT1,CLAT1) +C$OMP& PRIVATE(PLN,PLNTOP,F,G,NK) + DO N=1,NMAX + KU=2*KMAX+1 + KUX=4*KMAX+1 + IF(ABS(RLAT((N-1)*NR+1)).GE.89.9995) THEN + SLAT1=SIGN(1.,RLAT((N-1)*NR+1)) + CLAT1=0. + ELSE + SLAT1=SIN(PI/180*RLAT((N-1)*NR+1)) + CLAT1=COS(PI/180*RLAT((N-1)*NR+1)) + ENDIF + CALL SPLEGEND(IROMB,MAXWV,SLAT1,CLAT1,EPS,EPSTOP, + & PLN,PLNTOP) + CALL SPSYNTH(IROMB,MAXWV,2*MAXWV,IDIM,MDIM,2*MXTOP,4*KMAX, + & CLAT1,PLN,PLNTOP,MP,W,WTOP,F) + CALL SPGRADX(MAXWV,IDIM,2*KMAX,MP(2*KMAX+1),CLAT1, + & F(1,1,2*KMAX+1),F(1,1,4*KMAX+1)) + CALL SPFFTPT(MAXWV,1,IDIM,1,6*KMAX,RLON((N-1)*NR+1),F,G) + DO K=1,KMAX + KD=0*KMAX+K + KZ=1*KMAX+K + KU=2*KMAX+K + KV=3*KMAX+K + KUX=4*KMAX+K + KVX=5*KMAX+K + NK=(N-1)*NG+(K-1)*KG+1 + DP(NK)=G(KD) + ZP(NK)=G(KZ) + UP(NK)=G(KU) + VP(NK)=G(KV) + UXP(NK)=G(KUX) + VXP(NK)=G(KVX) + UYP(NK)=G(KVX)-CLAT1*G(KZ) + VYP(NK)=CLAT1*G(KD)-G(KUX) + ENDDO + ENDDO + END diff --git a/src/sptran.f b/src/sptran.f new file mode 100644 index 00000000..1d52a458 --- /dev/null +++ b/src/sptran.f @@ -0,0 +1,122 @@ +C> @file +C> @brief Perform a scalar spherical transform. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | IREDELL | Initial +C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted +C> +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform between spectral +C> coefficients of scalar quantities and fields on a global +C> cylindrical grid. +C> +C> The wave-space can be either triangular or +C> rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> Transforms are done in latitude pairs for efficiency; +C> thus grid arrays for each hemisphere must be passed. +C> If so requested, just a subset of the latitude pairs +C> may be transformed in each invocation of the subprogram. +C> +C> The transforms are all multiprocessed over latitude except +C> the transform from Fourier to spectral is multiprocessed +C> over zonal wavenumber to ensure reproducibility. +C> +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid, +C> - IDRT=0 for equally-spaced grid including poles, +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param KMAX number of fields to transform. +C> @param IPRIME longitude index for the prime meridian. +C> (defaults to 1 if IPRIME=0) +C> @param ISKIP skip number between longitudes +C> (defaults to 1 if ISKIP=0) +C> @param JNSKIP skip number between n.h. latitudes from north +C> (defaults to imax if JNSKIP=0) +C> @param JSSKIP skip number between s.h. latitudes from south +c> (defaults to -imax if JSSKIP=0) +C> @param KWSKIP skip number between wave fields +c> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0) +C> @param KGSKIP skip number between grid fields +c> (defaults to IMAX*JMAX IF KGSKIP=0) +C> @param JBEG latitude index (from pole) to begin transform +c> (defaults to 1 if JBEG=0) +C> (if JBEG=0 and IDIR<0, wave is zeroed before transform) +C> @param JEND latitude index (from pole) to end transform +c> (defaults to (JMAX+1)/2 IF JEND=0) +C> @param JCPU number of cpus over which to multiprocess +C> @param[out] WAVE wave fields if IDIR>0 +C> @param[out] gridn n.h. grid fields (starting at jbeg) if IDIR<0 +C> @param[out] grids s.h. grid fields (starting at jbeg) if IDIR<0 +C> @param IDIR transform flag +C> (idir>0 for wave to grid, idir<0 for grid to wave) +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTRAN(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP, + & JBEG,JEND,JCPU, + & WAVE,GRIDN,GRIDS,IDIR) + + REAL WAVE(*),GRIDN(*),GRIDS(*) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=IPRIME + IS=ISKIP + JN=JNSKIP + JS=JSSKIP + KW=KWSKIP + KG=KGSKIP + JB=JBEG + JE=JEND + JC=JCPU + IF(IP.EQ.0) IP=1 + IF(IS.EQ.0) IS=1 + IF(JN.EQ.0) JN=IMAX + IF(JS.EQ.0) JS=-JN + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=IMAX*JMAX + IF(JB.EQ.0) JB=1 + IF(JE.EQ.0) JE=(JMAX+1)/2 + IF(JC.EQ.0) JC=NCPUS() + + IF(IDIR.LT.0.AND.JBEG.EQ.0) THEN + DO K=1,KMAX + KWS=(K-1)*KW + WAVE(KWS+1:KWS+2*MX)=0 + ENDDO + ENDIF + + CALL SPTRANF(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVE,GRIDN,GRIDS,IDIR) + + END diff --git a/src/sptrand.f b/src/sptrand.f new file mode 100644 index 00000000..f26cb877 --- /dev/null +++ b/src/sptrand.f @@ -0,0 +1,150 @@ +C> @file +C> @brief Perform a gradient spherical transform. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | IREDELL | Initial +C> 1998-12-15 | IREDELL | openmp directives inserted +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of scalar fields +C> and their means and gradients on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'IBM order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> Transforms are done in latitude pairs for efficiency; +C> thus grid arrays for each hemisphere must be passed. +C> if so requested, just a subset of the latitude pairs +C> may be transformed in each invocation of the subprogram. +C> +C> The transforms are all multiprocessed over latitude except +C> the transform from Fourier to spectral is multiprocessed +C> over zonal wavenumber to ensure reproducibility. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param KMAX number of fields to transform. +C> @param IPRIME longitude index for the prime meridian. +C> (defaults to 1 if IPRIME=0) +C> @param ISKIP skip number between longitudes +C> (defaults to 1 if ISKIP=0) +C> @param JNSKIP skip number between n.h. latitudes from north +C> (defaults to IMAX if JNSKIP=0) +C> @param JSSKIP skip number between s.h. latitudes from south +C> (defaults to -IMAX if JSSKIP=0) +C> @param KWSKIP skip number between wave fields +C> (defaults to (MAXWV+1)*((IROMB+1)*MAXWV+2) if KWSKIP=0) +C> @param KGSKIP skip number between grid fields +C> (defaults to IMAX*JMAX if KGSKIP=0) +C> @param JBEG latitude index (from pole) to begin transform +C> (defaults to 1 if JBEG=0). If JBEG=0 and IDIR<0, wave is zeroed before transform. +C> @param JEND latitude index (from pole) to end transform +C> (defaults to (JMAX+1)/2 if JEND=0) +C> @param JCPU number of cpus over which to multiprocess +C> @param[out] WAVE wave fields if IDIR>0 +C> @param[out] GRIDMN global means if IDIR<0 +C> @param[out] GRIDXN n.h. x-gradients (starting at JBEG) if IDIR<0 +C> @param[out] GRIDXS s.h. x-gradients (starting at JBEG) if IDIR<0 +C> [GRIDX=(D(WAVE)/DLAM)/(CLAT*RERTH)] +C> @param[out] GRIDYN n.h. y-gradients (starting at JBEG) if IDIR<0 +C> @param[out] GRIDYS s.h. y-gradients (starting at JBEG) if IDIR<0 +C> [GRIDY=(D(WAVE)/DPHI)/RERTH] +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave) +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTRAND(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP, + & JBEG,JEND,JCPU, + & WAVE,GRIDMN,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR) + + REAL WAVE(*),GRIDMN(KMAX),GRIDXN(*),GRIDXS(*),GRIDYN(*),GRIDYS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + +C SET PARAMETERS + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + KW=KWSKIP + IF(KW.EQ.0) KW=2*MX + +C TRANSFORM WAVE TO GRID + IF(IDIR.GT.0) THEN +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + GRIDMN(K)=WAVE(KWS+1)/SQRT(2.) + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),1) + WZ(1:2*MX,K)=0. + ENDDO + CALL SPTRANV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IPRIME,ISKIP,JNSKIP,JSSKIP,MDIM,KGSKIP, + & JBEG,JEND,JCPU, + & WD,WZ,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR) + +C TRANSFORM GRID TO WAVE + ELSE +C$OMP PARALLEL DO + DO K=1,KMAX + WD(1:2*MX,K)=0. + WZ(1:2*MX,K)=0. + ENDDO + CALL SPTRANV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IPRIME,ISKIP,JNSKIP,JSSKIP,MDIM,KGSKIP, + & JBEG,JEND,JCPU, + & WD,WZ,GRIDXN,GRIDXS,GRIDYN,GRIDYS,IDIR) + IF(JBEG.EQ.0) THEN +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WAVE(KWS+1),WD(1,K),-1) + WAVE(KWS+1)=GRIDMN(K)*SQRT(2.) + ENDDO + ELSE +C$OMP PARALLEL DO PRIVATE(KWS) + DO K=1,KMAX + KWS=(K-1)*KW + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WZ(1,K),WD(1,K),-1) + WAVE(KWS+1:KWS+2*MX)=WAVE(KWS+1:KWS+2*MX)+WZ(1:2*MX,K) + WAVE(KWS+1)=GRIDMN(K)*SQRT(2.) + ENDDO + ENDIF + ENDIF + END diff --git a/src/sptranf.f b/src/sptranf.f new file mode 100644 index 00000000..18f5ca32 --- /dev/null +++ b/src/sptranf.f @@ -0,0 +1,161 @@ +C> @file +C> @brief Perform a scalar spherical transform +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted +C> 2013-01-16 | Iredell, Mirvis | Fixing afft negative sharing effect +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform between spectral +C> coefficients of scalar quantities and fields on a global +C> cylindrical grid. +C> +C> The wave-space can be either triangular or +C> rhomboidal. The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> Transforms are done in latitude pairs for efficiency; +C> thus grid arrays for each hemisphere must be passed. +C> +C> If so requested, just a subset of the latitude pairs +C> may be transformed in each invocation of the subprogram. +C> The transforms are all multiprocessed over latitude except +C> the transform from fourier to spectral is multiprocessed +C> over zonal wavenumber to ensure reproducibility. +C> +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid, +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param KMAX number of fields to transform. +C> @param IP longitude index for the prime meridian +C> @param IS skip number between longitudes +C> @param JN skip number between n.h. latitudes from north +C> @param JS skip number between s.h. latitudes from south +C> @param KW skip number between wave fields +C> @param KG skip number between grid fields +C> @param JB latitude index (from pole) to begin transform +C> @param JE latitude index (from pole) to end transform +C> @param JC number of cpus over which to multiprocess +C> @param[out] WAVE wave fields if IDIR>0 +C> @param[out] GRIDN n.h. grid fields (starting at JB) if IDIR<0 +C> @param[out] GRIDS s.h. grid fields (starting at JB) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave) +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTRANF(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVE,GRIDN,GRIDS,IDIR) + + REAL WAVE(*),GRIDN(*),GRIDS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX) + REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE) + REAL PLNTOP(MAXWV+1,JB:JE) + REAL WTOP(2*(MAXWV+1)) + REAL G(IMAX,2) +! write(0,*) 'sptranf top' + +C SET PARAMETERS + MP=0 + CALL SPTRANF0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO GRID + IF(IDIR.GT.0) THEN +C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS) + DO K=1,KMAX + AFFT_TMP=AFFT + KWS=(K-1)*KW + WTOP=0 + DO J=JB,JE + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & WAVE(KWS+1),WTOP,G,IDIR) + IF(IP.EQ.1.AND.IS.EQ.1) THEN + DO I=1,IMAX + IJKN=I+(J-JB)*JN+(K-1)*KG + IJKS=I+(J-JB)*JS+(K-1)*KG + GRIDN(IJKN)=G(I,1) + GRIDS(IJKS)=G(I,2) + ENDDO + ELSE + DO I=1,IMAX + IJKN=MOD(I+IP-2,IMAX)*IS+(J-JB)*JN+(K-1)*KG+1 + IJKS=MOD(I+IP-2,IMAX)*IS+(J-JB)*JS+(K-1)*KG+1 + GRIDN(IJKN)=G(I,1) + GRIDS(IJKS)=G(I,2) + ENDDO + ENDIF + ENDDO + ENDDO + +C TRANSFORM GRID TO WAVE + ELSE +C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,WTOP,G,IJKN,IJKS) + DO K=1,KMAX + AFFT_TMP=AFFT + KWS=(K-1)*KW + WTOP=0 + DO J=JB,JE + IF(WLAT(J).GT.0.) THEN + IF(IP.EQ.1.AND.IS.EQ.1) THEN + DO I=1,IMAX + IJKN=I+(J-JB)*JN+(K-1)*KG + IJKS=I+(J-JB)*JS+(K-1)*KG + G(I,1)=GRIDN(IJKN) + G(I,2)=GRIDS(IJKS) + ENDDO + ELSE + DO I=1,IMAX + IJKN=MOD(I+IP-2,IMAX)*IS+(J-JB)*JN+(K-1)*KG+1 + IJKS=MOD(I+IP-2,IMAX)*IS+(J-JB)*JS+(K-1)*KG+1 + G(I,1)=GRIDN(IJKN) + G(I,2)=GRIDS(IJKS) + ENDDO + ENDIF + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & WAVE(KWS+1),WTOP,G,IDIR) + ENDIF + ENDDO + ENDDO + ENDIF + END diff --git a/src/sptranf0.f b/src/sptranf0.f new file mode 100644 index 00000000..4feb90df --- /dev/null +++ b/src/sptranf0.f @@ -0,0 +1,64 @@ +C> @file +C> @brief Sptranf spectral initialization. +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs an initialization for +C> subprogram sptranf(). Use this subprogram outside +C> the sptranf() family context at your own risk. +C> +C> @param IROMB spectral domain shape +c> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid, +C> - IDRT=0 for equally-spaced grid including poles, +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes +C> @param JMAX number of latitudes +C> @param JB latitude index (from pole) to begin transform +C> @param JE latitude index (from pole) to end transform +C> @param EPS +C> @param EPSTOP +C> @param ENN1 +C> @param ELONN1 +C> @param EON +C> @param EONTOP +C> @param AFFT auxiliary array if IDIR=0 +C> @param CLAT cosines of latitude +C> @param SLAT sines of latitude +C> @param WLAT Gaussian weights +C> @param PLN Legendre polynomials +C> @param PLNTOP Legendre polynomial over top +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTRANF0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP) + + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL(8) AFFT(50000+4*IMAX) + REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE) + REAL PLNTOP(MAXWV+1,JB:JE) + REAL SLATX(JMAX),WLATX(JMAX) + + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + CALL SPFFTE(IMAX,(IMAX+2)/2,IMAX,2,0.,0.,0,AFFT) + CALL SPLAT(IDRT,JMAX,SLATX,WLATX) + JHE=(JMAX+1)/2 + IF(JHE.GT.JMAX/2) WLATX(JHE)=WLATX(JHE)/2 + DO J=JB,JE + CLAT(J)=SQRT(1.-SLATX(J)**2) + SLAT(J)=SLATX(J) + WLAT(J)=WLATX(J) + ENDDO +C$OMP PARALLEL DO + DO J=JB,JE + CALL SPLEGEND(IROMB,MAXWV,SLAT(J),CLAT(J),EPS,EPSTOP, + & PLN(1,J),PLNTOP(1,J)) + ENDDO + + END diff --git a/src/sptranf1.f b/src/sptranf1.f new file mode 100644 index 00000000..37a07bde --- /dev/null +++ b/src/sptranf1.f @@ -0,0 +1,76 @@ +C> @file +C> @brief Sptranf spectral transform. +C> @author Iredell @date 96-02-29 + +C> This subprogram performs an single latitude transform for +C> subprogram sptranf(). Use this subprogram outside +C> the sptranf() family context at your own risk. +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid, +C> - IDRT=0 for equally-spaced grid including poles, +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes +C> @param JMAX number of latitudes +C> @param JB latitude index (from pole) to begin transform +C> @param JE latitude index (from pole) to end transform +C> @param EPS +C> @param EPSTOP +C> @param ENN1 +C> @param ELONN1 +C> @param EON +C> @param EONTOP +C> @param CLAT cosines of latitude +C> @param SLAT sines of latitude +C> @param WLAT Gaussian weights +C> @param AFFT auxiliary array if IDIR=0 +C> @param PLN Legendre polynomials +C> @param PLNTOP Legendre polynomial over top +C> @param MP identifier (0 for scalar, 1 for vector) +C> @param[out] W wave field if IDIR>0 +C> @param[out] WTOP wave field over top if IDIR>0 +C> @param[out] G grid field if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave) +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP,MP, + & W,WTOP,G,IDIR) + + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL(8) AFFT(50000+4*IMAX) + REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE) + REAL PLNTOP(MAXWV+1,JB:JE) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)) + REAL WTOP(2*(MAXWV+1)) + REAL G(IMAX,2,JB:JE) + REAL F(IMAX+2,2) + + KW=(MAXWV+1)*((IROMB+1)*MAXWV+2) + KWTOP=2*(MAXWV+1) + IF(IDIR.GT.0) THEN + DO J=JB,JE + CALL SPSYNTH(IROMB,MAXWV,IMAX,IMAX+2,KW,KWTOP,1, + & CLAT(J),PLN(1,J),PLNTOP(1,J),MP, + & W,WTOP,F) + CALL SPFFTE(IMAX,(IMAX+2)/2,IMAX,2,F,G(1,1,J),+1,AFFT) + ENDDO + ELSE + DO J=JB,JE + CALL SPFFTE(IMAX,(IMAX+2)/2,IMAX,2,F,G(1,1,J),-1,AFFT) + CALL SPANALY(IROMB,MAXWV,IMAX,IMAX+2,KW,KWTOP,1, + & WLAT(J),CLAT(J),PLN(1,J),PLNTOP(1,J),MP, + & F,W,WTOP) + ENDDO + ENDIF + + END diff --git a/src/sptranfv.f b/src/sptranfv.f new file mode 100644 index 00000000..26e9d4ef --- /dev/null +++ b/src/sptranfv.f @@ -0,0 +1,196 @@ +C> @file +C> @brief Perform a vector spherical transform +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Generic fft used, openmp directives inserted +C> 2013-01-16 | Iredell & MIRVIS | Fixing afft negative sharing effect during omp loops +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of divergences and curls +C> and vector fields on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> +C> The wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> Transforms are done in latitude pairs for efficiency; +C> thus grid arrays for each hemisphere must be passed. +C> if so requested, just a subset of the latitude pairs +C> may be transformed in each invocation of the subprogram. +C> +C> The transforms are all multiprocessed over latitude except +C> the transform from fourier to spectral is multiprocessed +C> over zonal wavenumber to ensure reproducibility. +C> +C> Transform several fields at a time to improve vectorization. +C> subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param IDRT grid identifier +C> - IDRT=4 for Gaussian grid +C> - IDRT=0 for equally-spaced grid including poles +C> - IDRT=256 for equally-spaced grid excluding poles +C> @param IMAX even number of longitudes. +C> @param JMAX number of latitudes. +C> @param KMAX number of fields to transform. +C> @param IP longitude index for the prime meridian +C> @param IS skip number between longitudes +C> @param JN skip number between n.h. latitudes from north +C> @param JS skip number between s.h. latitudes from south +C> @param KW skip number between wave fields +C> @param KG skip number between grid fields +C> @param JB latitude index (from pole) to begin transform +C> @param JE latitude index (from pole) to end transform +C> @param JC number of cpus over which to multiprocess +C> @param[out] WAVED wave divergence fields if IDIR>0 +C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)] +C> @param[out] WAVEZ wave vorticity fields if IDIR>0 +C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)] +C> @param[out] GRIDUN N.H. grid u-winds (starting at jb) if IDIR<0 +C> @param[out] GRIDUS S.H. grid u-winds (starting at jb) if IDIR<0 +C> @param[out] GRIDVN N.H. grid v-winds (starting at jb) if IDIR<0 +C> @param[out] GRIDVS S.H. grid v-winds (starting at jb) if IDIR<0 +C> @param IDIR transform flag +C> (IDIR>0 for wave to grid, IDIR<0 for grid to wave). +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTRANFV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR) + + REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL(8) AFFT(50000+4*IMAX), AFFT_TMP(50000+4*IMAX) + REAL CLAT(JB:JE),SLAT(JB:JE),WLAT(JB:JE) + REAL PLN((MAXWV+1)*((IROMB+1)*MAXWV+2)/2,JB:JE) + REAL PLNTOP(MAXWV+1,JB:JE) + INTEGER MP(2) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2) + REAL WTOP(2*(MAXWV+1),2) + REAL G(IMAX,2,2) + REAL WINC((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2,2) + +C SET PARAMETERS + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MP=1 + CALL SPTRANF0(IROMB,MAXWV,IDRT,IMAX,JMAX,JB,JE, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT,CLAT,SLAT,WLAT,PLN,PLNTOP) + +C TRANSFORM WAVE TO GRID + IF(IDIR.GT.0) THEN +C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS) + DO K=1,KMAX + AFFT_TMP=AFFT + KWS=(K-1)*KW + CALL SPDZ2UV(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & WAVED(KWS+1),WAVEZ(KWS+1), + & W(1,1),W(1,2),WTOP(1,1),WTOP(1,2)) + DO J=JB,JE + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & W(1,1),WTOP(1,1),G(1,1,1),IDIR) + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & W(1,2),WTOP(1,2),G(1,1,2),IDIR) + IF(IP.EQ.1.AND.IS.EQ.1) THEN + DO I=1,IMAX + IJKN=I+(J-JB)*JN+(K-1)*KG + IJKS=I+(J-JB)*JS+(K-1)*KG + GRIDUN(IJKN)=G(I,1,1) + GRIDUS(IJKS)=G(I,2,1) + GRIDVN(IJKN)=G(I,1,2) + GRIDVS(IJKS)=G(I,2,2) + ENDDO + ELSE + DO I=1,IMAX + IJKN=MOD(I+IP-2,IMAX)*IS+(J-JB)*JN+(K-1)*KG+1 + IJKS=MOD(I+IP-2,IMAX)*IS+(J-JB)*JS+(K-1)*KG+1 + GRIDUN(IJKN)=G(I,1,1) + GRIDUS(IJKS)=G(I,2,1) + GRIDVN(IJKN)=G(I,1,2) + GRIDVS(IJKS)=G(I,2,2) + ENDDO + ENDIF + ENDDO + ENDDO + +C TRANSFORM GRID TO WAVE + ELSE +C$OMP PARALLEL DO PRIVATE(AFFT_TMP,KWS,W,WTOP,G,IJKN,IJKS,WINC) + DO K=1,KMAX + AFFT_TMP=AFFT + KWS=(K-1)*KW + W=0 + WTOP=0 + DO J=JB,JE + IF(WLAT(J).GT.0.) THEN + IF(IP.EQ.1.AND.IS.EQ.1) THEN + DO I=1,IMAX + IJKN=I+(J-JB)*JN+(K-1)*KG + IJKS=I+(J-JB)*JS+(K-1)*KG + G(I,1,1)=GRIDUN(IJKN)/CLAT(J)**2 + G(I,2,1)=GRIDUS(IJKS)/CLAT(J)**2 + G(I,1,2)=GRIDVN(IJKN)/CLAT(J)**2 + G(I,2,2)=GRIDVS(IJKS)/CLAT(J)**2 + ENDDO + ELSE + DO I=1,IMAX + IJKN=MOD(I+IP-2,IMAX)*IS+(J-JB)*JN+(K-1)*KG+1 + IJKS=MOD(I+IP-2,IMAX)*IS+(J-JB)*JS+(K-1)*KG+1 + G(I,1,1)=GRIDUN(IJKN)/CLAT(J)**2 + G(I,2,1)=GRIDUS(IJKS)/CLAT(J)**2 + G(I,1,2)=GRIDVN(IJKN)/CLAT(J)**2 + G(I,2,2)=GRIDVS(IJKS)/CLAT(J)**2 + ENDDO + ENDIF + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & W(1,1),WTOP(1,1),G(1,1,1),IDIR) + CALL SPTRANF1(IROMB,MAXWV,IDRT,IMAX,JMAX,J,J, + & EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP, + & AFFT_TMP,CLAT(J),SLAT(J),WLAT(J), + & PLN(1,J),PLNTOP(1,J),MP, + & W(1,2),WTOP(1,2),G(1,1,2),IDIR) + ENDIF + ENDDO + CALL SPUV2DZ(IROMB,MAXWV,ENN1,ELONN1,EON,EONTOP, + & W(1,1),W(1,2),WTOP(1,1),WTOP(1,2), + & WINC(1,1),WINC(1,2)) + WAVED(KWS+1:KWS+2*MX)=WAVED(KWS+1:KWS+2*MX)+WINC(1:2*MX,1) + WAVEZ(KWS+1:KWS+2*MX)=WAVEZ(KWS+1:KWS+2*MX)+WINC(1:2*MX,2) + ENDDO + ENDIF + END diff --git a/src/sptranv.f b/src/sptranv.f new file mode 100644 index 00000000..a8018dc1 --- /dev/null +++ b/src/sptranv.f @@ -0,0 +1,126 @@ +C> @file +C> @brief Perform a vector spherical transform. +C> +C> ### Program History Log +C> Date | Programmer | Comments +C> -----|------------|--------- +C> 96-02-29 | IREDELL | Initial. +C> 1998-12-15 | IREDELL | Generic fft used, openmp directives inserted +C> +C> @author IREDELL @date 96-02-29 + +C> This subprogram performs a spherical transform +C> between spectral coefficients of divergences and curls +C> and vector fields on a global cylindrical grid. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> the wave and grid fields may have general indexing, +C> but each wave field is in sequential 'ibm order', +C> i.e. with zonal wavenumber as the slower index. +C> +C> Transforms are done in latitude pairs for efficiency; +C> thus grid arrays for each hemisphere must be passed. +C> If so requested, just a subset of the latitude pairs +C> may be transformed in each invocation of the subprogram. +C> +C> The transforms are all multiprocessed over latitude except +C> the transform from fourier to spectral is multiprocessed +C> over zonal wavenumber to ensure reproducibility. +C> +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV SPECTRAL TRUNCATION +C> @param IDRT GRID IDENTIFIER +C> - IDRT=4 FOR GAUSSIAN GRID, +C> - IDRT=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> - IDRT=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES +C> @param IMAX EVEN NUMBER OF LONGITUDES. +C> @param JMAX NUMBER OF LATITUDES. +C> @param KMAX NUMBER OF FIELDS TO TRANSFORM. +C> @param IPRIME LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> @param ISKIP SKIP NUMBER BETWEEN LONGITUDES +C> (DEFAULTS TO 1 IF ISKIP=0) +C> @param JNSKIP SKIP NUMBER BETWEEN N.H. LATITUDES FROM NORTH +C> (DEFAULTS TO IMAX IF JNSKIP=0) +C> @param JSSKIP SKIP NUMBER BETWEEN S.H. LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAX IF JSSKIP=0) +C> @param KWSKIP SKIP NUMBER BETWEEN WAVE FIELDS +C> (DEFAULTS TO (MAXWV+1)*((IROMB+1)*MAXWV+2) IF KWSKIP=0) +C> @param KGSKIP SKIP NUMBER BETWEEN GRID FIELDS +C> (DEFAULTS TO IMAX*JMAX IF KGSKIP=0) +C> @param JBEG LATITUDE INDEX (FROM POLE) TO BEGIN TRANSFORM +C> - DEFAULTS TO 1 IF JBEG=0 +C> - IF JBEG=0 AND IDIR<0, WAVE IS ZEROED BEFORE TRANSFORM +C> @param JEND LATITUDE INDEX (FROM POLE) TO END TRANSFORM +C> (DEFAULTS TO (JMAX+1)/2 IF JEND=0) +C> @param JCPU NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> @param[out] WAVED (*) WAVE DIVERGENCE FIELDS IF IDIR>0 +C> [WAVED=(D(GRIDU)/DLAM+D(CLAT*GRIDV)/DPHI)/(CLAT*RERTH)] +C> @param[out] WAVEZ (*) WAVE VORTICITY FIELDS IF IDIR>0 +C> [WAVEZ=(D(GRIDV)/DLAM-D(CLAT*GRIDU)/DPHI)/(CLAT*RERTH)] +C> @param[out] GRIDUN N.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0 +C> @param[out] GRIDUS S.H. GRID U-WINDS (STARTING AT JBEG) IF IDIR<0 +C> @param[out] GRIDVN N.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0 +C> @param[out] GRIDVS S.H. GRID V-WINDS (STARTING AT JBEG) IF IDIR<0 +C> @param IDIR TRANSFORM FLAG +C> - IDIR>0 FOR WAVE TO GRID, +C> - IDIR<0 FOR GRID TO WAVE +C> + SUBROUTINE SPTRANV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IPRIME,ISKIP,JNSKIP,JSSKIP,KWSKIP,KGSKIP, + & JBEG,JEND,JCPU, + & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR) + + REAL WAVED(*),WAVEZ(*),GRIDUN(*),GRIDUS(*),GRIDVN(*),GRIDVS(*) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + IP=IPRIME + IS=ISKIP + JN=JNSKIP + JS=JSSKIP + KW=KWSKIP + KG=KGSKIP + JB=JBEG + JE=JEND + JC=JCPU + IF(IP.EQ.0) IP=1 + IF(IS.EQ.0) IS=1 + IF(JN.EQ.0) JN=IMAX + IF(JS.EQ.0) JS=-JN + IF(KW.EQ.0) KW=2*MX + IF(KG.EQ.0) KG=IMAX*JMAX + IF(JB.EQ.0) JB=1 + IF(JE.EQ.0) JE=(JMAX+1)/2 + IF(JC.EQ.0) JC=NCPUS() +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + IF(IDIR.LT.0.AND.JBEG.EQ.0) THEN + DO K=1,KMAX + KWS=(K-1)*KW + WAVED(KWS+1:KWS+2*MX)=0 + WAVEZ(KWS+1:KWS+2*MX)=0 + ENDDO + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + CALL SPTRANFV(IROMB,MAXWV,IDRT,IMAX,JMAX,KMAX, + & IP,IS,JN,JS,KW,KG,JB,JE,JC, + & WAVED,WAVEZ,GRIDUN,GRIDUS,GRIDVN,GRIDVS,IDIR) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrun.f b/src/sptrun.f new file mode 100644 index 00000000..41c113f5 --- /dev/null +++ b/src/sptrun.f @@ -0,0 +1,85 @@ +C> @file +C> @brief Truncate gridded scalar fields +C> @author IREDELL @date 96-02-29 + +C> This subprogram spectrally truncates scalar fields on a global +C> cylindrical grid, returning the fields to a possibly different +C> global cylindrical grid. The wave-space can be either triangular +C> or rhomboidal. either grid-space can be either an equally-spaced +C> grid (with or without pole points) or a Gaussian grid. the grid +C> fields may have general indexing. the transforms are all +C> multiprocessed. Transform several fields at a time to improve +C> vectorization. Subprogram can be called from a multiprocessing +C> environment. +C> +C> Remarks: Minimum grid dimensions for unaliased transforms to spectral: +C> Dimension | Linear | Quadratic +C> ----------------------- | --------- | ------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> +C> @param IROMB Spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param MAXWV Spectral truncation +C> @param IDRTI Input grid identifier +C> - IDRTI=4 for Gaussian grid +C> - IDRTI=0 for equally-spaced grid including poles +C> - IDRTI=256 for equally-spaced grid excluding poles +C> @param IMAXI Even number of input longitudes +C> @param JMAXI Number of input latitudes +C> @param IDRTO Output grid identifier +C> - IDRTO=4 for Gaussian grid +C> - IDRTO=0 for equally-spaced grid including poles +C> - IDRTO=256 for equally-spaced grid excluding poles +C> @param IMAXO Even number of output longitudes +C> @param JMAXO Number of output latitudes +C> @param KMAX Number of fields to transform +C> @param IPRIME Input longitude index for the prime meridian. +C> - Defaults to 1 if IPRIME=0 +C> - Output longitude index for prime meridian assumed 1 +C> @param ISKIPI Skip number between input longitudes (defaults to 1 if ISKIPI=0) +C> @param JSKIPI Skip number between input latitudes from south (defaults to -IMAXI if JSKIPI=0) +C> @param KSKIPI Skip number between input grid fields (defaults to IMAXI*JMAXI if KSKIPI=0) +C> @param ISKIPO Skip number between output longitudes (defaults to 1 if ISKIPO=0) +C> @param JSKIPO Skip number between output latitudes from south (defaults to -IMAXO if JSKIPO=0) +C> @param KSKIPO Skip number between output grid fields (defaults to IMAXO*JMAXO if KSKIPO=0) +C> @param JCPU Number of CPUs over which to multiprocess (defaults to environment NCPUS if JCPU=0) +C> @param GRIDI Input grid fields +C> @param GRIDO Output grid fields (may overlay input fields if grid shape is appropriate) +C> +C> @author IREDELL @date 96-02-29 + SUBROUTINE SPTRUN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,IDRTO,IMAXO,JMAXO, + & KMAX,IPRIME,ISKIPI,JSKIPI,KSKIPI, + & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDI,GRIDO) + REAL GRIDI(*),GRIDO(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRIDI(INP),GRIDI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT + JN=-JSKIPO + IF(JN.EQ.0) JN=IMAXO + JS=-JN + INP=(JMAXO-1)*MAX(0,-JN)+1 + ISP=(JMAXO-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & W,GRIDO(INP),GRIDO(ISP),1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrund.f b/src/sptrund.f new file mode 100644 index 00000000..dc1c157b --- /dev/null +++ b/src/sptrund.f @@ -0,0 +1,105 @@ +C> @file +C> +C> Spectrally truncate to gradients +C> @author IREDELL @date 96-02-29 + +C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS +C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR MEANS AND +C> GRADIENTS TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. +C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. +C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID +C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. +C> THE GRID FIELDS MAY HAVE GENERAL INDEXING. +C> THE TRANSFORMS ARE ALL MULTIPROCESSED. +C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY. +C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. +C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER +C> (IDRTO=4 FOR GAUSSIAN GRID, +C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES. +C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPO=0) +C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXO IF JSKIPO=0) +C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS +C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param GRID - REAL (*) INPUT GRID FIELDS +C> @param GRIDMN - REAL (KMAX) OUTPUT GLOBAL MEANS +C> @param GRIDX - REAL (*) OUTPUT X-GRADIENTS +C> @param GRIDY - REAL (*) OUTPUT Y-GRADIENTS +C> +C> SUBPROGRAMS CALLED: +C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM +C> - SPTRAND PERFORM A GRADIENT SPHERICAL TRANSFORM +C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS +C> +C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 + SUBROUTINE SPTRUND(IROMB,MAXWV,IDRTI,IMAXI,JMAXI, + & IDRTO,IMAXO,JMAXO,KMAX, + & IPRIME,ISKIPI,JSKIPI,KSKIPI, + & ISKIPO,JSKIPO,KSKIPO,JCPU,GRID, + & GRIDMN,GRIDX,GRIDY) + + REAL GRID(*),GRIDX(*),GRIDY(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRID(INP),GRID(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT GRADIENTS + JN=-JSKIPO + IF(JN.EQ.0) JN=IMAXO + JS=-JN + INP=(JMAXO-1)*MAX(0,-JN)+1 + ISP=(JMAXO-1)*MAX(0,-JS)+1 + CALL SPTRAND(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & W,GRIDMN, + & GRIDX(INP),GRIDX(ISP),GRIDY(INP),GRIDY(ISP),1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrung.f b/src/sptrung.f new file mode 100644 index 00000000..0b5dc925 --- /dev/null +++ b/src/sptrung.f @@ -0,0 +1,90 @@ +C> @file +C> +C> Spectrally interpolate scalars to stations +C> @author IREDELL @date 96-02-29 + +C> This subprogram spectrally truncates scalar fields on a global +C> cylindrical grid, returning the fields to specified sets of +C> station points on the globe. The wave-space can be either +C> triangular or rhomboidal. The grid-space can be either an +C> equally-spaced grid (with or without pole points) or a Gaussian +C> grid. The grid and point fields may have general indexing. The +C> transforms are all multiprocessed. Transform several fields at a +C> time to improve vectorization. Subprogram can be called from a +C> multiprocessing environment. +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS +C> (DEFAULTS TO NMAX IF KGSKIP=0) +C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS +C> (DEFAULTS TO 1 IF NRSKIP=0) +C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS +C> (DEFAULTS TO 1 IF NGSKIP=0) +C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES +C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param GRIDI - REAL (*) INPUT GRID FIELDS +C> @param[out] GP - REAL (*) STATION POINT SETS +C> +C> SUBPROGRAMS CALLED: +C> - sptran() Perform a scalar spherical transform +C> - sptgpt() Transform spectral scalar to station points +C> - ncpus() Gets environment number of cpus +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> + SUBROUTINE SPTRUNG(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDI,GP) + + REAL RLAT(*),RLON(*),GRIDI(*),GP(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRIDI(INP),GRIDI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT + CALL SPTGPT(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,W,GP) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrungv.f b/src/sptrungv.f new file mode 100644 index 00000000..cf847b6a --- /dev/null +++ b/src/sptrungv.f @@ -0,0 +1,141 @@ +C> @file +C> +C> Spectrally interpolate vectors to stations +C> @author IREDELL @date 96-02-29 + +C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTORS FIELDS +C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS +C> TO SPECIFIED SETS OF STATION POINTS ON THE GLOBE. +C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. +C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID +C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. +C> THE GRID AND POINT FIELDS MAY HAVE GENERAL INDEXING. +C> THE TRANSFORMS ARE ALL MULTIPROCESSED. +C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. +C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. +C> +C> PROGRAM HISTORY LOG: +C> - 96-02-29 IREDELL +C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param NMAX - INTEGER NUMBER OF STATION POINTS TO RETURN +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINT SETS +C> (DEFAULTS TO NMAX IF KGSKIP=0) +C> @param NRSKIP - INTEGER SKIP NUMBER BETWEEN STATION LATS AND LONS +C> (DEFAULTS TO 1 IF NRSKIP=0) +C> @param NGSKIP - INTEGER SKIP NUMBER BETWEEN STATION POINTS +C> (DEFAULTS TO 1 IF NGSKIP=0) +C> @param RLAT - REAL (*) STATION LATITUDES IN DEGREES +C> @param RLON - REAL (*) STATION LONGITUDES IN DEGREES +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS +C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS +C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS +C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY +C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN +C> @param UP - REAL (*) STATION U-WINDS IF LUV +C> @param VP - REAL (*) STATION V-WINDS IF LUV +C> @param DP - REAL (*) STATION DIVERGENCES IF LDZ +C> @param ZP - REAL (*) STATION VORTICITIES IF LDZ +C> @param PP - REAL (*) STATION POTENTIALS IF LPS +C> @param SP - REAL (*) STATION STREAMFCNS IF LPS +C> +C> SUBPROGRAMS CALLED: +C> - SPWGET GET WAVE-SPACE CONSTANTS +C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE +C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM +C> - SPTGPT TRANSFORM SPECTRAL SCALAR TO STATION POINTS +C> - SPTGPTV TRANSFORM SPECTRAL VECTOR TO STATION POINTS +C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS +C> +C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 + SUBROUTINE SPTRUNGV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NMAX, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NRSKIP,NGSKIP,JCPU,RLAT,RLON,GRIDUI,GRIDVI, + & LUV,UP,VP,LDZ,DP,ZP,LPS,PP,SP) + + LOGICAL LUV,LDZ,LPS + REAL RLAT(*),RLON(*),GRIDUI(*),GRIDVI(*) + REAL UP(*),VP(*),DP(*),ZP(*),PP(*),SP(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRANV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & WD,WZ, + & GRIDUI(INP),GRIDUI(ISP),GRIDVI(INP),GRIDVI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT WINDS + IF(LUV) THEN + CALL SPTGPTV(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WD,WZ,UP,VP) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY + IF(LDZ) THEN + CALL SPTGPT(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WD,DP) + CALL SPTGPT(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WZ,ZP) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION + IF(LPS) THEN + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) +C$OMP PARALLEL DO + DO K=1,KMAX + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WD(1,K),WD(1,K),-1) + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WZ(1,K),WZ(1,K),-1) + WD(1:2,K)=0. + WZ(1:2,K)=0. + ENDDO + CALL SPTGPT(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WD,PP) + CALL SPTGPT(IROMB,MAXWV,KMAX,NMAX,MDIM,KGSKIP,NRSKIP,NGSKIP, + & RLAT,RLON,WZ,SP) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrunl.f b/src/sptrunl.f new file mode 100644 index 00000000..d3fd42d8 --- /dev/null +++ b/src/sptrunl.f @@ -0,0 +1,115 @@ +C> @file +C> +C> Spectrally truncate to laplacian +C> @author IREDELL @date 96-02-29 + +C> THIS SUBPROGRAM SPECTRALLY TRUNCATES SCALAR FIELDS +C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THEIR LAPLACIAN +C> OR INVERSE TO A POSSIBLY DIFFERENT GLOBAL CYLINDRICAL GRID. +C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. +C> EITHER GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID +C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. +C> THE GRID FIELDS MAY HAVE GENERAL INDEXING. +C> THE TRANSFORMS ARE ALL MULTIPROCESSED. +C> OVER ZONAL WAVENUMBER TO ENSURE REPRODUCIBILITY. +C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. +C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. +C> +C> PROGRAM HISTORY LOG: +C> - 96-02-29 IREDELL +C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER +C> (IDRTO=4 FOR GAUSSIAN GRID, +C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES. +C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPO=0) +C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXO IF JSKIPO=0) +C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS +C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param IDIR - INTEGER FLAG +C> IDIR > 0 TO TAKE LAPLACIAN +C> IDIR < 0 TO TAKE INVERSE LAPLACIAN +C> @param GRIDI - REAL (*) INPUT GRID FIELDS +C> @param GRIDO - REAL (*) OUTPUT GRID FIELDS +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> +C> SUBPROGRAMS CALLED: +C> - SPWGET GET WAVE-SPACE CONSTANTS +C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE +C> - SPTRAN PERFORM A SCALAR SPHERICAL TRANSFORM +C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS +C> +C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 + SUBROUTINE SPTRUNL(IROMB,MAXWV,IDRTI,IMAXI,JMAXI, + & IDRTO,IMAXO,JMAXO,KMAX, + & IPRIME,ISKIPI,JSKIPI,KSKIPI, + & ISKIPO,JSKIPO,KSKIPO,JCPU,IDIR,GRIDI,GRIDO) + + REAL GRIDI(*),GRIDO(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRIDI(INP),GRIDI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TAKE LAPLACIAN AND TRANSFORM WAVE TO OUTPUT GRID + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) +C$OMP PARALLEL DO + DO K=1,KMAX + CALL SPLAPLAC(IROMB,MAXWV,ENN1,W(1,K),W(1,K),IDIR) + W(1:2,K)=0. + ENDDO + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & W,GRIDO(INP),GRIDO(ISP),1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrunm.f b/src/sptrunm.f new file mode 100644 index 00000000..0282abc2 --- /dev/null +++ b/src/sptrunm.f @@ -0,0 +1,101 @@ +C> @file +C> +C> Spectrally interpolate scalars to Mercator +C> @author IREDELL @date 96-02-29 + +C> This subprogram spectrally truncates scalar fields on a global +C> cylindrical grid, returning the fields to a Mercator grid. The +C> wave-space can be either triangular or rhomboidal. The grid-space +C> can be either an equally-spaced grid (with or without pole +C> points) or a Gaussian grid. The grid fields may have general +C> indexing. The transforms are all multiprocessed. Transform +C> several fields at a time to improve vectorization. Subprogram can +C> be called from a multiprocessing environment. +C> +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION +C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS +C> (DEFAULTS TO NPS*NPS IF KGSKIP=0) +C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS +C> (DEFAULTS TO 1 IF NISKIP=0) +C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS +C> (DEFAULTS TO NPS IF NJSKIP=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES +C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES +C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT +C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX. +C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD. +C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI, +C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS +C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) +C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS) +C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT +C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX. +C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD. +C> @param GRIDI - REAL (*) INPUT GRID FIELDS +C> @param GM - REAL (*) MERCATOR FIELDS +C> +C> SUBPROGRAMS CALLED: +C> - sptran() Perform a scalar spherical transform +C> - sptgpm() Transform spectral scalar to Mercator +C> - ncpus() Gets environment number of cpus +C> +C> MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> + SUBROUTINE SPTRUNM(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON, + & GRIDI,GM) + REAL GRIDI(*),GM(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRIDI(INP),GRIDI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT + CALL SPTGPM(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,W,GM) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrunmv.f b/src/sptrunmv.f new file mode 100644 index 00000000..a9b5c92f --- /dev/null +++ b/src/sptrunmv.f @@ -0,0 +1,153 @@ +C> @file +C> +C> Spectrally interpolate vectors to Mercator +C> @author IREDELL @date 96-02-29 + +C> THIS SUBPROGRAM SPECTRALLY TRUNCATES VECTOR FIELDS +C> ON A GLOBAL CYLINDRICAL GRID, RETURNING THE FIELDS +C> TO A MERCATOR GRID. +C> THE WAVE-SPACE CAN BE EITHER TRIANGULAR OR RHOMBOIDAL. +C> THE GRID-SPACE CAN BE EITHER AN EQUALLY-SPACED GRID +C> (WITH OR WITHOUT POLE POINTS) OR A GAUSSIAN GRID. +C> THE GRID FIELDS MAY HAVE GENERAL INDEXING. +C> THE TRANSFORMS ARE ALL MULTIPROCESSED. +C> TRANSFORM SEVERAL FIELDS AT A TIME TO IMPROVE VECTORIZATION. +C> SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT. +C> +C> PROGRAM HISTORY LOG: +C> 96-02-29 IREDELL +C> 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param MI - INTEGER NUMBER OF POINTS IN THE FASTER ZONAL DIRECTION +C> @param MJ - INTEGER NUMBER OF POINTS IN THE SLOWER MERID DIRECTION +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS +C> (DEFAULTS TO MI*MJ IF KGSKIP=0) +C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS +C> (DEFAULTS TO 1 IF NISKIP=0) +C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS +C> (DEFAULTS TO MI IF NJSKIP=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param RLAT1 - REAL LATITUDE OF THE FIRST GRID POINT IN DEGREES +C> @param RLON1 - REAL LONGITUDE OF THE FIRST GRID POINT IN DEGREES +C> @param DLAT - REAL LATITUDE INCREMENT IN DEGREES SUCH THAT +C> D(PHI)/D(J)=DLAT*COS(PHI) WHERE J IS MERIDIONAL INDEX. +C> DLAT IS NEGATIVE FOR GRIDS INDEXED SOUTHWARD. +C> (IN TERMS OF GRID INCREMENT DY VALID AT LATITUDE RLATI, +C> THE LATITUDE INCREMENT DLAT IS DETERMINED AS +C> DLAT=DPR*DY/(RERTH*COS(RLATI/DPR)) +C> WHERE DPR=180/PI AND RERTH IS EARTH'S RADIUS) +C> @param DLON - REAL LONGITUDE INCREMENT IN DEGREES SUCH THAT +C> D(LAMBDA)/D(I)=DLON WHERE I IS ZONAL INDEX. +C> DLON IS NEGATIVE FOR GRIDS INDEXED WESTWARD. +C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS +C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS +C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS +C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY +C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN +C> @param UM - REAL (*) MERCATOR U-WINDS IF LUV +C> @param VM - REAL (*) MERCATOR V-WINDS IF LUV +C> @param DM - REAL (*) MERCATOR DIVERGENCES IF LDZ +C> @param ZM - REAL (*) MERCATOR VORTICITIES IF LDZ +C> @param PM - REAL (*) MERCATOR POTENTIALS IF LPS +C> @param SM - REAL (*) MERCATOR STREAMFCNS IF LPS +C> +C> SUBPROGRAMS CALLED: +C> - SPWGET GET WAVE-SPACE CONSTANTS +C> - SPLAPLAC COMPUTE LAPLACIAN IN SPECTRAL SPACE +C> - SPTRANV PERFORM A VECTOR SPHERICAL TRANSFORM +C> - SPTGPM TRANSFORM SPECTRAL SCALAR TO MERCATOR +C> - SPTGPMV TRANSFORM SPECTRAL VECTOR TO MERCATOR +C> - NCPUS GETS ENVIRONMENT NUMBER OF CPUS +C> +C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 + SUBROUTINE SPTRUNMV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,MI,MJ, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NISKIP,NJSKIP,JCPU,RLAT1,RLON1,DLAT,DLON, + & GRIDUI,GRIDVI,LUV,UM,VM,LDZ,DM,ZM,LPS,PM,SM) + + LOGICAL LUV,LDZ,LPS + REAL GRIDUI(*),GRIDVI(*) + REAL UM(*),VM(*),DM(*),ZM(*),PM(*),SM(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRANV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & WD,WZ, + & GRIDUI(INP),GRIDUI(ISP),GRIDVI(INP),GRIDVI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT WINDS + IF(LUV) THEN + CALL SPTGPMV(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WD,WZ,UM,VM) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY + IF(LDZ) THEN + CALL SPTGPM(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WD,DM) + CALL SPTGPM(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WZ,ZM) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION + IF(LPS) THEN + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) +C$OMP PARALLEL DO + DO K=1,KMAX + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WD(1,K),WD(1,K),-1) + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WZ(1,K),WZ(1,K),-1) + WD(1:2,K)=0. + WZ(1:2,K)=0. + ENDDO + CALL SPTGPM(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WD,PM) + CALL SPTGPM(IROMB,MAXWV,KMAX,MI,MJ,MDIM,KGSKIP,NISKIP,NJSKIP, + & RLAT1,RLON1,DLAT,DLON,WZ,SM) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptruns.f b/src/sptruns.f new file mode 100644 index 00000000..a64a6866 --- /dev/null +++ b/src/sptruns.f @@ -0,0 +1,96 @@ +C> @file +C> +C> Spectrally interpolate scalars to polar stereo +C> @author IREDELL @date 96-02-29 + +C> This subprogram spectrally truncates scalar fields on a global +C> cylindrical grid, returning the fields to specific pairs of polar +C> stereographic scalar fields. The wave-space can be either +C> triangular or rhomboidal. The grid-space can be either an +C> equally-spaced grid (with or without pole points) or a Gaussian +C> grid. The grid fields may have general indexing. The transforms +C> are all multiprocessed. Transform several fields at a time to +C> improve vectorization. Subprogram can be called from a +C> multiprocessing environment. +C> +C> PROGRAM HISTORY LOG: +C> 96-02-29 IREDELL +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param NPS - INTEGER ODD ORDER OF THE POLAR STEREOGRAPHIC GRIDS +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param KGSKIP - INTEGER SKIP NUMBER BETWEEN GRID FIELDS +C> (DEFAULTS TO NPS*NPS IF KGSKIP=0) +C> @param NISKIP - INTEGER SKIP NUMBER BETWEEN GRID I-POINTS +C> (DEFAULTS TO 1 IF NISKIP=0) +C> @param NJSKIP - INTEGER SKIP NUMBER BETWEEN GRID J-POINTS +C> (DEFAULTS TO NPS IF NJSKIP=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param TRUE - REAL LATITUDE AT WHICH PS GRID IS TRUE (USUALLY 60.) +C> @param XMESH - REAL GRID LENGTH AT TRUE LATITUDE (M) +C> @param ORIENT - REAL LONGITUDE AT BOTTOM OF NORTHERN PS GRID +C> (SOUTHERN PS GRID WILL HAVE OPPOSITE ORIENTATION.) +C> @param GRIDI - REAL (*) INPUT GRID FIELDS +C> @param GN - REAL (*) NORTHERN POLAR STEREOGRAPHIC FIELDS +C> @param GS - REAL (*) SOUTHERN POLAR STEREOGRAPHIC FIELDS +C> +C> SUBPROGRAMS CALLED: +C> - sptran() Perform a scalar spherical transform +C> - sptgps() Transform spectral scalar to polar stereo. +C> - ncpus() Gets environment number of cpus +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> DIMENSION | LINEAR | QUADRATIC +C> ----------------------- | --------- | ------------- +C> IMAX | 2*MAXWV+2 | 3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) | 1*MAXWV+1 | 3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) | 2*MAXWV+1 | 5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) | 2*MAXWV+3 | 3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) | 4*MAXWV+3 | 5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) | 2*MAXWV+1 | 3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) | 4*MAXWV+1 | 5*MAXWV/2*2+1 +C> + SUBROUTINE SPTRUNS(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT, + & GRIDI,GN,GS) + REAL GRIDI(*),GN(*),GS(*) + REAL W((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRAN(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & W,GRIDI(INP),GRIDI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT + CALL SPTGPS(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,W,GN,GS) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/sptrunsv.f b/src/sptrunsv.f new file mode 100644 index 00000000..5d679e04 --- /dev/null +++ b/src/sptrunsv.f @@ -0,0 +1,149 @@ +C> @file +C> @brief Spectrally interpolate vectors to polar stereo. +C> +C> 96-02-29 | Iredell | Initial. +C> 1998-12-15 | Iredell | Openmp directives inserted. +C> +C> @author Iredell @date 96-02-29 + +C> This subprogram spectrally truncates vector fields +C> on a global cylindrical grid, returning the fields +C> to specific pairs of polar stereographic scalar fields. +C> +C> The wave-space can be either triangular or rhomboidal. +C> +C> The grid-space can be either an equally-spaced grid +C> (with or without pole points) or a gaussian grid. +C> +C> The grid fields may have general indexing. +C> +C> The transforms are all multiprocessed. +C> +C> Transform several fields at a time to improve vectorization. +C> +C> Subprogram can be called from a multiprocessing environment. +C> +C> Minimum grid dimensions for unaliased transforms to spectral: +C> Dimension |Linear |Quadratic +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 +C> +C> @param IROMB integer spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param MAXWV integer spectral truncation +C> @param IDRTI integer input grid identifier +C> - IDRTI=4 for Gaussian grid +C> - IDRTI=0 for equally-spaced grid including poles +C> - IDRTI=256 for equally-spaced grid excluding poles +C> @param IMAXI integer even number of input longitudes. +C> @param JMAXI integer number of input latitudes. +C> @param KMAX integer number of fields to transform. +C> @param NPS integer odd order of the polar stereographic grids +C> @param IPRIME integer input longitude index for the prime meridian. +C> (defaults to 1 if IPRIME=0) +C> (output longitude index for prime meridian assumed 1.) +C> @param ISKIPI integer skip number between input longitudes +C> (defaults to 1 if ISKIPI=0) +C> @param JSKIPI integer skip number between input latitudes from south +C> (defaults to -IMAXI if JSKIPI=0) +C> @param KSKIPI integer skip number between input grid fields +C> (defaults to IMAXI*JMAXI if KSKIPI=0) +C> @param KGSKIP integer skip number between grid fields +C> (defaults to NPS*NPS if KGSKIP=0) +C> @param NISKIP integer skip number between grid i-points +C> (defaults to 1 if NISKIP=0) +C> @param NJSKIP integer skip number between grid j-points +C> (defaults to NPS if NJSKIP=0) +C> @param JCPU integer number of cpus over which to multiprocess +C> (defaults to environment NCPUS if JCPU=0) +C> @param TRUE real latitude at which ps grid is true (usually 60.) +C> @param XMESH real grid length at true latitude (m) +C> @param ORIENT real longitude at bottom of Northern PS grid +C> (Southern PS grid will have opposite orientation.) +C> @param GRIDUI real input grid u-winds +C> @param GRIDVI real input grid v-winds +C> @param LUV logical flag whether to return winds +C> @param LDZ logical flag whether to return divergence and vorticity +C> @param LPS logical flag whether to return potential and streamfcn +C> @param UN real northern ps u-winds if luv +C> @param VN real northern ps v-winds if luv +C> @param US real southern ps u-winds if luv +C> @param VS real southern ps v-winds if luv +C> @param DN real northern divergences if ldz +C> @param ZN real northern vorticities if ldz +C> @param DS real southern divergences if ldz +C> @param ZS real southern vorticities if ldz +C> @param PN real northern potentials if lps +C> @param SN real northern streamfcns if lps +C> @param PS real southern potentials if lps +C> @param SS real southern streamfcns if lps +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPTRUNSV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX,NPS, + & IPRIME,ISKIPI,JSKIPI,KSKIPI,KGSKIP, + & NISKIP,NJSKIP,JCPU,TRUE,XMESH,ORIENT, + & GRIDUI,GRIDVI, + & LUV,UN,VN,US,VS,LDZ,DN,ZN,DS,ZS, + & LPS,PN,SN,PS,SS) + LOGICAL LUV,LDZ,LPS + REAL GRIDUI(*),GRIDVI(*) + REAL UN(*),VN(*),US(*),VS(*),DN(*),ZN(*),DS(*),ZS(*) + REAL PN(*),SN(*),PS(*),SS(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRANV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & WD,WZ, + & GRIDUI(INP),GRIDUI(ISP),GRIDVI(INP),GRIDVI(ISP),-1) + +C TRANSFORM WAVE TO OUTPUT WINDS + IF(LUV) THEN + CALL SPTGPSV(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WD,WZ,UN,VN,US,VS) + ENDIF + +C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY + IF(LDZ) THEN + CALL SPTGPS(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WD,DN,DS) + CALL SPTGPS(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WZ,ZN,ZS) + ENDIF + +C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION + IF(LPS) THEN + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) +C$OMP PARALLEL DO + DO K=1,KMAX + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WD(1,K),WD(1,K),-1) + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WZ(1,K),WZ(1,K),-1) + WD(1:2,K)=0. + WZ(1:2,K)=0. + ENDDO + CALL SPTGPS(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WD,PN,PS) + CALL SPTGPS(IROMB,MAXWV,KMAX,NPS,MDIM,KGSKIP,NISKIP,NJSKIP, + & TRUE,XMESH,ORIENT,WZ,SN,SS) + ENDIF + END diff --git a/src/sptrunv.f b/src/sptrunv.f new file mode 100644 index 00000000..83e30a99 --- /dev/null +++ b/src/sptrunv.f @@ -0,0 +1,162 @@ +C> @file +C> +C> Spectrally truncate gridded vector fields +C> @author IREDELL @date 96-02-29 + +C> This subprogram spectrally truncates vector fields +C> on a global cylindrical grid, returning the fields +C> to a possibly different global cylindrical grid. +C> The wave-space can be either triangular or rhomboidal. +C> Either grid-space can be either an equally-spaced grid +C> (with or without pole points) or a Gaussian grid. +C> The grid fields may have general indexing. +C> The transforms are all multiprocessed. +C> Over zonal wavenumber to ensure reproducibility. +C> Transform several fields at a time to improve vectorization. +C> Subprogram can be called from a multiprocessing environment. +C> +C> PROGRAM HISTORY LOG: +C> - 96-02-29 IREDELL +C> - 1998-12-15 IREDELL OPENMP DIRECTIVES INSERTED +C> +C> @param IROMB - INTEGER SPECTRAL DOMAIN SHAPE +C> (0 FOR TRIANGULAR, 1 FOR RHOMBOIDAL) +C> @param MAXWV - INTEGER SPECTRAL TRUNCATION +C> @param IDRTI - INTEGER INPUT GRID IDENTIFIER +C> (IDRTI=4 FOR GAUSSIAN GRID, +C> IDRTI=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTI=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXI - INTEGER EVEN NUMBER OF INPUT LONGITUDES. +C> @param JMAXI - INTEGER NUMBER OF INPUT LATITUDES. +C> @param IDRTO - INTEGER OUTPUT GRID IDENTIFIER +C> (IDRTO=4 FOR GAUSSIAN GRID, +C> IDRTO=0 FOR EQUALLY-SPACED GRID INCLUDING POLES, +C> IDRTO=256 FOR EQUALLY-SPACED GRID EXCLUDING POLES) +C> @param IMAXO - INTEGER EVEN NUMBER OF OUTPUT LONGITUDES. +C> @param JMAXO - INTEGER NUMBER OF OUTPUT LATITUDES. +C> @param KMAX - INTEGER NUMBER OF FIELDS TO TRANSFORM. +C> @param IPRIME - INTEGER INPUT LONGITUDE INDEX FOR THE PRIME MERIDIAN. +C> (DEFAULTS TO 1 IF IPRIME=0) +C> (OUTPUT LONGITUDE INDEX FOR PRIME MERIDIAN ASSUMED 1.) +C> @param ISKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPI=0) +C> @param JSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXI IF JSKIPI=0) +C> @param KSKIPI - INTEGER SKIP NUMBER BETWEEN INPUT GRID FIELDS +C> (DEFAULTS TO IMAXI*JMAXI IF KSKIPI=0) +C> @param ISKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LONGITUDES +C> (DEFAULTS TO 1 IF ISKIPO=0) +C> @param JSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT LATITUDES FROM SOUTH +C> (DEFAULTS TO -IMAXO IF JSKIPO=0) +C> @param KSKIPO - INTEGER SKIP NUMBER BETWEEN OUTPUT GRID FIELDS +C> (DEFAULTS TO IMAXO*JMAXO IF KSKIPO=0) +C> @param JCPU - INTEGER NUMBER OF CPUS OVER WHICH TO MULTIPROCESS +C> (DEFAULTS TO ENVIRONMENT NCPUS IF JCPU=0) +C> @param GRIDUI - REAL (*) INPUT GRID U-WINDS +C> @param GRIDVI - REAL (*) INPUT GRID V-WINDS +C> @param LUV - LOGICAL FLAG WHETHER TO RETURN WINDS +C> @param LDZ - LOGICAL FLAG WHETHER TO RETURN DIVERGENCE AND VORTICITY +C> @param LPS - LOGICAL FLAG WHETHER TO RETURN POTENTIAL AND STREAMFCN +C> @param GRIDUO - REAL (*) OUTPUT U-WINDS IF LUV +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> @param GRIDVO - REAL (*) OUTPUT V-WINDS IF LUV +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> @param GRIDDO - REAL (*) OUTPUT DIVERGENCES IF LDZ +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> @param GRIDZO - REAL (*) OUTPUT VORTICITIES IF LDZ +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> @param GRIDPO - REAL (*) OUTPUT POTENTIALS IF LPS +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> @param GRIDSO - REAL (*) OUTPUT STREAMFCNS IF LPS +C> (MAY OVERLAY INPUT FIELDS IF GRID SHAPE IS APPROPRIATE) +C> +C> SUBPROGRAMS CALLED: +C> - SPWGET() GET WAVE-SPACE CONSTANTS +C> - SPLAPLAC() COMPUTE LAPLACIAN IN SPECTRAL SPACE +C> - SPTRAN() PERFORM A SCALAR SPHERICAL TRANSFORM +C> - SPTRANV() PERFORM A VECTOR SPHERICAL TRANSFORM +C> - NCPUS() GETS ENVIRONMENT NUMBER OF CPUS +C> +C> REMARKS: MINIMUM GRID DIMENSIONS FOR UNALIASED TRANSFORMS TO SPECTRAL: +C> DIMENSION |LINEAR |QUADRATIC +C> ----------------------- |--------- |------------- +C> IMAX |2*MAXWV+2 |3*MAXWV/2*2+2 +C> JMAX (IDRT=4,IROMB=0) |1*MAXWV+1 |3*MAXWV/2+1 +C> JMAX (IDRT=4,IROMB=1) |2*MAXWV+1 |5*MAXWV/2+1 +C> JMAX (IDRT=0,IROMB=0) |2*MAXWV+3 |3*MAXWV/2*2+3 +C> JMAX (IDRT=0,IROMB=1) |4*MAXWV+3 |5*MAXWV/2*2+3 +C> JMAX (IDRT=256,IROMB=0) |2*MAXWV+1 |3*MAXWV/2*2+1 +C> JMAX (IDRT=256,IROMB=1) |4*MAXWV+1 |5*MAXWV/2*2+1 + SUBROUTINE SPTRUNV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI, + & IDRTO,IMAXO,JMAXO,KMAX, + & IPRIME,ISKIPI,JSKIPI,KSKIPI, + & ISKIPO,JSKIPO,KSKIPO,JCPU,GRIDUI,GRIDVI, + & LUV,GRIDUO,GRIDVO,LDZ,GRIDDO,GRIDZO, + & LPS,GRIDPO,GRIDSO) + LOGICAL LUV,LDZ,LPS + REAL GRIDUI(*),GRIDVI(*) + REAL GRIDUO(*),GRIDVO(*),GRIDDO(*),GRIDZO(*),GRIDPO(*),GRIDSO(*) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + REAL WD((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) + REAL WZ((MAXWV+1)*((IROMB+1)*MAXWV+2)/2*2+1,KMAX) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM INPUT GRID TO WAVE + JC=JCPU + IF(JC.EQ.0) JC=NCPUS() + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MDIM=2*MX+1 + JN=-JSKIPI + IF(JN.EQ.0) JN=IMAXI + JS=-JN + INP=(JMAXI-1)*MAX(0,-JN)+1 + ISP=(JMAXI-1)*MAX(0,-JS)+1 + CALL SPTRANV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KMAX, + & IPRIME,ISKIPI,JN,JS,MDIM,KSKIPI,0,0,JC, + & WD,WZ, + & GRIDUI(INP),GRIDUI(ISP),GRIDVI(INP),GRIDVI(ISP),-1) +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT WINDS + JN=-JSKIPO + IF(JN.EQ.0) JN=IMAXO + JS=-JN + INP=(JMAXO-1)*MAX(0,-JN)+1 + ISP=(JMAXO-1)*MAX(0,-JS)+1 + IF(LUV) THEN + CALL SPTRANV(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & WD,WZ, + & GRIDUO(INP),GRIDUO(ISP),GRIDVO(INP),GRIDVO(ISP),1) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT DIVERGENCE AND VORTICITY + IF(LDZ) THEN + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & WD,GRIDDO(INP),GRIDDO(ISP),1) + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & WZ,GRIDZO(INP),GRIDZO(ISP),1) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +C TRANSFORM WAVE TO OUTPUT POTENTIAL AND STREAMFUNCTION + IF(LPS) THEN + CALL SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) +C$OMP PARALLEL DO + DO K=1,KMAX + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WD(1,K),WD(1,K),-1) + CALL SPLAPLAC(IROMB,MAXWV,ENN1,WZ(1,K),WZ(1,K),-1) + WD(1:2,K)=0. + WZ(1:2,K)=0. + ENDDO + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & WD,GRIDPO(INP),GRIDPO(ISP),1) + CALL SPTRAN(IROMB,MAXWV,IDRTO,IMAXO,JMAXO,KMAX, + & 0,ISKIPO,JN,JS,MDIM,KSKIPO,0,0,JC, + & WZ,GRIDSO(INP),GRIDSO(ISP),1) + ENDIF +C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + END diff --git a/src/spuv2dz.f b/src/spuv2dz.f new file mode 100644 index 00000000..a27b4628 --- /dev/null +++ b/src/spuv2dz.f @@ -0,0 +1,91 @@ +C> @file +C> @brief Compute divergence and vorticity from winds. +C> @author Iredell @date 92-10-31 + +C> Computes the divergence and vorticity from wind components +C> in spectral space. +C> +C> Subprogram speps() should be called already. +C> +C> If L is the zonal wavenumber, N is the total wavenumber, +C> EPS(L,N)=SQRT((N**2-L**2)/(4*N**2-1)) and A is earth radius, +C> then the divergence D is computed as: +C>
+C> D(L,N)=I*L*A*U(L,N)
+C> +EPS(L,N+1)*N*A*V(L,N+1)-EPS(L,N)*(N+1)*A*V(L,N-1)
+C> 
+C> +C> and the vorticity Z is computed as: +C>
+C> Z(L,N)=I*L*A*V(L,N)
+C> -EPS(L,N+1)*N*A*U(L,N+1)+EPS(L,N)*(N+1)*A*U(L,N-1)
+C> 
+C> +C> where U is the zonal wind and V is the meridional wind. +C> +C> U and V are weighted by the secant of latitude. +C> +C> Extra terms are used over top of the spectral domain. +C> +C> Advantage is taken of the fact that EPS(L,L)=0 +C> in order to vectorize over the entire spectral domain. +C> +C> @param I integer spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M INTEGER spectral truncation +C> @param ENN1 ((M+1)*((I+1)*M+2)/2) N*(N+1)/A**2 +C> @param ELONN1 ((M+1)*((I+1)*M+2)/2) L/(N*(N+1))*A +C> @param EON ((M+1)*((I+1)*M+2)/2) EPSILON/N*A +C> @param EONTOP (M+1) EPSILON/N*A over top +C> @param U ((M+1)*((I+1)*M+2)) zonal wind (over coslat) +C> @param V ((M+1)*((I+1)*M+2)) merid wind (over coslat) +C> @param UTOP (2*(M+1)) zonal wind (over coslat) over top +C> @param VTOP (2*(M+1)) merid wind (over coslat) over top +C> @param D ((M+1)*((I+1)*M+2)) divergence +C> @param Z ((M+1)*((I+1)*M+2)) vorticity +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPUV2DZ(I,M,ENN1,ELONN1,EON,EONTOP,U,V,UTOP,VTOP,D,Z) + REAL ENN1((M+1)*((I+1)*M+2)/2),ELONN1((M+1)*((I+1)*M+2)/2) + REAL EON((M+1)*((I+1)*M+2)/2),EONTOP(M+1) + REAL U((M+1)*((I+1)*M+2)),V((M+1)*((I+1)*M+2)) + REAL UTOP(2*(M+1)),VTOP(2*(M+1)) + REAL D((M+1)*((I+1)*M+2)),Z((M+1)*((I+1)*M+2)) + +C COMPUTE TERMS FROM THE SPECTRAL DOMAIN + K=1 + D(2*K-1)=0. + D(2*K)=0. + Z(2*K-1)=0. + Z(2*K)=0. + DO K=2,(M+1)*((I+1)*M+2)/2-1 + D(2*K-1)=-ELONN1(K)*U(2*K)+EON(K+1)*V(2*K+1)-EON(K)*V(2*K-3) + D(2*K)=ELONN1(K)*U(2*K-1)+EON(K+1)*V(2*K+2)-EON(K)*V(2*K-2) + Z(2*K-1)=-ELONN1(K)*V(2*K)-EON(K+1)*U(2*K+1)+EON(K)*U(2*K-3) + Z(2*K)=ELONN1(K)*V(2*K-1)-EON(K+1)*U(2*K+2)+EON(K)*U(2*K-2) + ENDDO + K=(M+1)*((I+1)*M+2)/2 + D(2*K-1)=-ELONN1(K)*U(2*K)-EON(K)*V(2*K-3) + D(2*K)=ELONN1(K)*U(2*K-1)-EON(K)*V(2*K-2) + Z(2*K-1)=-ELONN1(K)*V(2*K)+EON(K)*U(2*K-3) + Z(2*K)=ELONN1(K)*V(2*K-1)+EON(K)*U(2*K-2) + +C COMPUTE TERMS FROM OVER TOP OF THE SPECTRAL DOMAIN +CDIR$ IVDEP + DO L=0,M + K=L*(2*M+(I-1)*(L-1))/2+I*L+M+1 + D(2*K-1)=D(2*K-1)+EONTOP(L+1)*VTOP(2*L+1) + D(2*K)=D(2*K)+EONTOP(L+1)*VTOP(2*L+2) + Z(2*K-1)=Z(2*K-1)-EONTOP(L+1)*UTOP(2*L+1) + Z(2*K)=Z(2*K)-EONTOP(L+1)*UTOP(2*L+2) + ENDDO + +C MULTIPLY BY LAPLACIAN TERM + DO K=2,(M+1)*((I+1)*M+2)/2 + D(2*K-1)=D(2*K-1)*ENN1(K) + D(2*K)=D(2*K)*ENN1(K) + Z(2*K-1)=Z(2*K-1)*ENN1(K) + Z(2*K)=Z(2*K)*ENN1(K) + ENDDO + RETURN + END diff --git a/src/spvar.f b/src/spvar.f new file mode 100644 index 00000000..4b6fa00b --- /dev/null +++ b/src/spvar.f @@ -0,0 +1,35 @@ +C> @file +C> @brief Compute variance by total wavenumber. +C> @author Iredell @date 92-10-31 + +C> Computes the variances by total wavenumber +C> of a scalar field in spectral space. +C> +C> @param I spectral domain shape +C> (0 for triangular, 1 for rhomboidal) +C> @param M spectral truncation +C> @param Q ((M+1)*((I+1)*M+2)) scalar field +C> @param QVAR (0:(I+1)*M) variances +C> +C> @author Iredell @date 92-10-31 + SUBROUTINE SPVAR(I,M,Q,QVAR) + REAL Q((M+1)*((I+1)*M+2)) + REAL QVAR(0:(I+1)*M) + + L=0 + DO N=0,M + KS=L*(2*M+(I-1)*(L-1))+2*N + QVAR(N)=0.5*Q(KS+1)**2 + ENDDO + DO N=M+1,(I+1)*M + QVAR(N)=0. + ENDDO + DO N=0,(I+1)*M + DO L=MAX(1,N-M),MIN(N,M) + KS=L*(2*M+(I-1)*(L-1))+2*N + QVAR(N)=QVAR(N)+Q(KS+1)**2+Q(KS+2)**2 + ENDDO + ENDDO + + RETURN + END diff --git a/src/spwget.f b/src/spwget.f new file mode 100644 index 00000000..4eb15383 --- /dev/null +++ b/src/spwget.f @@ -0,0 +1,26 @@ +C> @file +C> @brief Get wave-space constants. +C> @author Iredell @date 96-02-29 + +C> This subprogram gets wave-space constants. +C> +C> @param IROMB spectral domain shape (0 for triangular, 1 for rhomboidal) +C> @param MAXWV spectral truncation +C> @param EPS +C> @param EPSTOP +C> @param ENN1 +C> @param ELONN1 +C> @param EON +C> @param EONTOP +C> +C> @author Iredell @date 96-02-29 + SUBROUTINE SPWGET(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + REAL EPS((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EPSTOP(MAXWV+1) + REAL ENN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL ELONN1((MAXWV+1)*((IROMB+1)*MAXWV+2)/2) + REAL EON((MAXWV+1)*((IROMB+1)*MAXWV+2)/2),EONTOP(MAXWV+1) + + MX=(MAXWV+1)*((IROMB+1)*MAXWV+2)/2 + MXTOP=MAXWV+1 + CALL SPEPS(IROMB,MAXWV,EPS,EPSTOP,ENN1,ELONN1,EON,EONTOP) + END diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6bd06865..865e18bd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,6 +1,26 @@ # This is the CMake file for the test directory of NCEPLIBS-ip. # -# Mark Potts, Kyle Gerheiser, Eric Engle +# Alex Richert, Mark Potts, Kyle Gerheiser, Eric Engle + +function(create_sp_test name kind timeout) + add_executable(${name}_${kind} ${name}.F90) + + # Include openMP if desired. + if(OpenMP_Fortran_FOUND) + target_link_libraries(${name}_${kind} PRIVATE OpenMP::OpenMP_Fortran) + endif() + target_link_libraries(${name}_${kind} PRIVATE ip::ip_${kind}) + if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|IntelLLVM)$") + set_target_properties(${name}_${kind} PROPERTIES COMPILE_FLAGS "-convert big_endian ${fortran_${kind}_flags}") + elseif(${CMAKE_Fortran_COMPILER_ID} MATCHES "^(GNU)$") + set_target_properties(${name}_${kind} PROPERTIES COMPILE_FLAGS "-fconvert=big-endian ${fortran_${kind}_flags}") + endif() + add_test(NAME ${name}_${kind} COMMAND ${name}_${kind}) + target_compile_definitions(${name}_${kind} PRIVATE KIND_${kind}) + if(TEST_TIME_LIMIT) + set_tests_properties(${name}_${kind} PROPERTIES TIMEOUT ${timeout}) + endif() +endfunction() # Link data directory to find the test data. execute_process(COMMAND cmake -E create_symlink @@ -21,45 +41,41 @@ if(${CMAKE_Fortran_COMPILER_ID} MATCHES "^(GNU)$" AND ${CMAKE_Fortran_COMPILER_V endif() foreach(kind ${kinds}) - set(BUILD_FLAGS "${fortran_${kind}_flags}") string(TOUPPER ${kind} kind_definition) # Test ipxwafs routines add_executable(test_ipxwafs_${kind} test_ipxwafs.F90) target_link_libraries(test_ipxwafs_${kind} PUBLIC ip::ip_${kind}) - target_link_libraries(test_ipxwafs_${kind} PUBLIC sp::sp_${kind}) target_compile_definitions(test_ipxwafs_${kind} PRIVATE "LSIZE=${kind_definition}") - set_target_properties(test_ipxwafs_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(test_ipxwafs_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_test(test_ipxwafs_${kind} test_ipxwafs_${kind}) # Test earth_radius_mod. add_executable(test_earth_radius_${kind} test_earth_radius.F90) target_link_libraries(test_earth_radius_${kind} PUBLIC ip::ip_${kind}) - target_link_libraries(test_earth_radius_${kind} PUBLIC sp::sp_${kind}) target_compile_definitions(test_earth_radius_${kind} PRIVATE "LSIZE=${kind_definition}") - set_target_properties(test_earth_radius_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(test_earth_radius_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_test(test_earth_radius_${kind} test_earth_radius_${kind}) # grib-2 tests - add_library(test_library_grib2_${kind} input_data_mod_grib2.F90 interp_mod_grib2.F90) + add_library(test_library_grib2_${kind} input_data_mod_grib2_${kind}.F90 interp_mod_grib2_${kind}.F90) target_link_libraries(test_library_grib2_${kind} PUBLIC ip::ip_${kind}) - target_link_libraries(test_library_grib2_${kind} PUBLIC sp::sp_${kind}) target_compile_definitions(test_library_grib2_${kind} PRIVATE "LSIZE=${kind_definition}") - set_target_properties(test_library_grib2_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(test_library_grib2_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_executable(tst_gdswzd_grib2_${kind} tst_gdswzd_grib2.c) set_target_properties(tst_gdswzd_grib2_${kind} PROPERTIES LINKER_LANGUAGE C) target_compile_definitions(tst_gdswzd_grib2_${kind} PRIVATE "LSIZE=${kind_definition}") + target_link_libraries(tst_gdswzd_grib2_${kind} PRIVATE test_library_grib2_${kind}) + add_executable(test_scalar_grib2_${kind} test_scalar_grib2.F90) add_executable(test_vector_grib2_${kind} test_vector_grib2.F90) - - target_link_libraries(tst_gdswzd_grib2_${kind} PRIVATE test_library_grib2_${kind}) target_link_libraries(test_scalar_grib2_${kind} PRIVATE test_library_grib2_${kind}) target_link_libraries(test_vector_grib2_${kind} PRIVATE test_library_grib2_${kind}) target_compile_definitions(test_scalar_grib2_${kind} PRIVATE "LSIZE=${kind_definition}") target_compile_definitions(test_vector_grib2_${kind} PRIVATE "LSIZE=${kind_definition}") - set_target_properties(test_scalar_grib2_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") - set_target_properties(test_vector_grib2_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(test_scalar_grib2_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") + set_target_properties(test_vector_grib2_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_test(tst_gdswzd_c_grib2_${kind} tst_gdswzd_grib2_${kind}) @@ -98,24 +114,24 @@ foreach(kind ${kinds}) add_test(test_station_points_neighbor_budget_vector_grib2_${kind} test_vector_grib2_${kind} -1 6) # grib-1 tests - add_library(test_library_grib1_${kind} input_data_mod_grib1.F90 interp_mod_grib1.F90) + add_library(test_library_grib1_${kind} input_data_mod_grib1_${kind}.F90 interp_mod_grib1_${kind}.F90) target_link_libraries(test_library_grib1_${kind} PUBLIC ip::ip_${kind}) - target_link_libraries(test_library_grib1_${kind} PUBLIC sp::sp_${kind}) target_compile_definitions(test_library_grib1_${kind} PRIVATE "LSIZE=${kind_definition}") - set_target_properties(test_library_grib1_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") + set_target_properties(test_library_grib1_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_executable(tst_gdswzd_grib1_${kind} tst_gdswzd_grib1.c) set_target_properties(tst_gdswzd_grib1_${kind} PROPERTIES LINKER_LANGUAGE C) target_compile_definitions(tst_gdswzd_grib1_${kind} PRIVATE "LSIZE=${kind_definition}") + target_link_libraries(tst_gdswzd_grib1_${kind} ip::ip_${kind}) + add_executable(test_scalar_grib1_${kind} test_scalar_grib1.F90) add_executable(test_vector_grib1_${kind} test_vector_grib1.F90) - set_target_properties(test_scalar_grib1_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") - set_target_properties(test_vector_grib1_${kind} PROPERTIES COMPILE_FLAGS "${BUILD_FLAGS}") - target_link_libraries(test_scalar_grib1_${kind} PRIVATE test_library_grib1_${kind}) target_link_libraries(test_vector_grib1_${kind} PRIVATE test_library_grib1_${kind}) - target_link_libraries(tst_gdswzd_grib1_${kind} ip::ip_${kind}) - target_link_libraries(tst_gdswzd_grib1_${kind} sp::sp_${kind}) + target_compile_definitions(test_scalar_grib1_${kind} PRIVATE "LSIZE=${kind_definition}") + target_compile_definitions(test_vector_grib1_${kind} PRIVATE "LSIZE=${kind_definition}") + set_target_properties(test_scalar_grib1_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") + set_target_properties(test_vector_grib1_${kind} PROPERTIES COMPILE_FLAGS "${fortran_${kind}_flags}") add_test(tst_gdswzd_c_grib1_${kind} tst_gdswzd_grib1_${kind}) add_test(test_lambert_bilinear_scalar_grib1_${kind} test_scalar_grib1_${kind} 218 0) @@ -134,5 +150,14 @@ foreach(kind ${kinds}) add_test(test_polar_stereo_neighbor_budget_vector_grib1_${kind} test_vector_grib1_${kind} 212 6) add_test(test_rotatedB_spectral_vector_grib1_${kind} test_vector_grib1_${kind} 205 4) add_test(test_rotatedE_budget_vector_grib1_${kind} test_vector_grib1_${kind} 203 3) -endforeach() + # sp tests + create_sp_test(test_ncpus ${kind} 0.3) + create_sp_test(test_splaplac ${kind} 0.3) + create_sp_test(test_splat ${kind} 0.3) + create_sp_test(test_sppad ${kind} 0.3) + create_sp_test(test_sptezv ${kind} 0.3) + create_sp_test(test_fft ${kind} 0.3) + create_sp_test(test_sptrung ${kind} 0.3) + create_sp_test(test_sptrungv ${kind} 2) +endforeach() diff --git a/tests/data/README b/tests/data/README new file mode 100644 index 00000000..d5c7cc38 --- /dev/null +++ b/tests/data/README @@ -0,0 +1,5 @@ +sptrungv* files were generated from ip's './test_vector_grib1_4 "205" "4"' test case and modifying spectral_interp_mod.F90 to write out UI, VI, RLAT, and RLON immediately before the SPTRUNGV call, and UO and VO immediately after. + +sptrung* files were generated from ip's 'test_scalar_grib2_4 "-1" "4"' test case and modifying spectral_interp_mod.F90 to write out GI. + +The other input and reference data can largely be rebuilt using the commented blocks in interp_mod_grib1.F90 and interp_mod_grib2.F90. diff --git a/tests/data/sptrung.gi.in b/tests/data/sptrung.gi.in new file mode 100644 index 0000000000000000000000000000000000000000..4085532bf6fa6939386209b8cd5c4014f03746f0 GIT binary patch literal 259208 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 X29kkfAQ?yol7WxNK=1$l%hLY`zh`$G literal 0 HcmV?d00001 diff --git a/tests/data/sptrungv.ll.in b/tests/data/sptrungv.ll.in new file mode 100644 index 0000000000000000000000000000000000000000..4edf2f77469e6cf401d67dd857bc98717a9093e5 GIT binary patch literal 212424 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 >@9Dm)$Lc;6o=;^QLm*m!Jyfm`9c`^Mm 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

w!H3Xnc4^=BnsKfuX+ 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

Dwu2_aEVo?F4!L}8ssE{V4$9o6AKD0N58|8@W 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

o?$b5ZHfCJKfuA7p6Q?p6p@9 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%0D9DaVtjVKSf}EKB^W4 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÷@=gu_9We5B9C^kl`S0Y z9K+9zLeCTL2^GYy@ha4h)WTVYa^SiqUii!?pWDx~r4=82p;NPJNcmU+eEh0Jhanz* zD~!Yyj|<@Jdx9E<&KPjJ5_JO}Vt;=Ij#}IbWP%j)&yb;&dkaWYrKClqA;Y7kn%MW_ z5Ig&?oTW$DFrTBRX@l2n7~368{yC3?t>VwXmv{gC_Z&&!m~mWHM-5lhqeLHUctv}M zmqU5fU(#QwK%dp$1&za^xYjNktY%r`YWw~8{>nYx;r0k!rUs)z&k?wzBgL*Yn$g5o zo*8dA!s5PhE}r|H4^~6b%P8 zLP1_b4R3zW2gO-7T(WXJcgxtHqt}b*vK(X9tt5*Di^qjS+BUG$JcXi z+#sDQ{)DvdGKKfYZ*u?K_Q02-zfdrq&lJ|o#OM?O3flNP=BXz9n|2u|X+4Jr3q)8> zp#C+sWPg{)|(y=%Q(Zt3f?c8Y133;O=GS!1nGwI3cSEFTzYP-j{djU?oml z(~9ScgL#LfAGr4o(nc9kYOg1Q)ovmddEu#Os@w`*5mD^3u$sM&U(O`7N7CUPr^)PW zf3m720Cb-y;-aKy@HQui>*-15-mSRIvB72ZV}2I3QSt+yb5&$XSsYiq^dT&EtOT3X zWgz=%J{ARep-g-YE>LX6*pvJ&QpS|5?aievUT$<;i8to>e8X{W;kZ)}PV#fJS?~Qj zEO@R7`&@U?d~aWz;OgXDk{?(CLw*zRc3>2s#x<^MXBk&)s=7UCMf)K*-f znM*E^`R1mi=D|Mb`Z@-4--)0wLWR>k8Nh{JxXqpZhupYtoErS~ zqaSzkGd>puI235k-P>9X>SF`IsBb#CraKph+Sa2;+->xZeu~eR?8n{{d@rQkjp~<5 z(tpFJ@Q>0v{5bzS{yHE6D#tFeZOiId*=AAhBL=K<`03w`^t; znBUXHJ!^TUlb{lx_f(;J_jFuWl|UB+KPO6)8ifaW9`TW#rC6=L2d9gUWZ&nPvue1) zD(yzIeby(4CPoNmTyla_=cI9&^(ef%crKYSb|H7LEr$E=?@=;lVgmKLkD#0A05v05 z5wjVlpp()7%gQb3`3_ag3z~qR0@JX3OFdp!yN1{r`4}O3>r-Fp{Z;a&J*Usa@zKN4p zAI{M5z7R-DUINZSIl%$*7|1n=hJm>&=;r0dXuEzU@Ac*P>AlTZ(-eo<6R$$(_yGE` z<1*FS^xY4|eZHqo;KMoOq$jO`ZBzSYCCU><%jBPCEUq7?6yF5RqkIwNPE4JE99R$biaDE{b7brq}I^VuRieW&{tx&;5zF0 zOe(kYoPGP zM-h0KBuoEwpM~GI_rXKok#J1P4168(Kx<+--R!Q8KTj&*+<qs#KnNeETwJ(z*hsKR>j>$daf7TJT3^xLaRuUH&O__39|DC%cj5d? z5$=+t5#9CN94A{51oIT!^rRVY7KWow2ai&1DImK(&E!46{wS|@4?8CC8P)z>uxNn` zd+piAM85B1qh;Q5jXHzE*B_2TarP&Oj{XO?N+QA0cS(6_$P&S|doRe?u#MzW?*Q>% zo&pv zNvI%owK{lj9Ye~k4#M%^V93-7g{`qS$%zGZu+OiZx*Vy67YRyO`X~UceKSydWD{-@ zTZ1}{Rh&`7|9ymUFhVvLkFzw?Hr;_C5`pxAZwj03K-t!+am;vpfpC)nM>K91Lcq3R zD2(_3p&6ne(U~KN?i)c;ml%UyhYl%aIk0|iAUJxt^Iic9&aYXM#x4=^IFv;%_K=IPcgbS^J)%kJom{Wy%zTf!d z`W2F&`k3yzCBUdCB^)_F4!2IcgEIeP=)A+RdgCx|EAywKNTjJKkq|l0_n4(r3JqB$ zBT3pyviBYl%9iXs!g-!Il2xfRXegtkP$^pSJO8`h%XPi)dCvE_zxVyQ)oW-#<8bwB zC~{?cB$iy=OYco-rHf|$={}D+^z%v~PDRHfPW$#4PTYr3vP(rCH`ax+9OAdI)9w>g z{ceVsPIWXMIZAyUZbs#X0K4NC!^K?IPy4ML^mi2@;T0Vqlf8g!Y}`duopk7RcQ?^h zCGm8N2+KKVfBW*Dfw22@6cqib14Xt&(R~BU7XEpezA_vFab6oZDZl$TH(9=liGehE zBM*$fP9X%r)a&#)a9xhwud7{zD&B0E+RpL>w)-P7?_Q|? zT~Cw;**tstQu=B95jv3*MeAOFO#i$ROaJBTLOS+SFyM&6N%;o*eH63%;dAu9KUI`~ z_fd}Pnx~u!H$6_Yehyx~(+zE%x&ypXV<5J62;|II4aMv;l`AKVgl&}JpSU3yEh_|_ z^f<^DybHloPm%aXhV>iqa-4D=f$4K@+QlJ=zP~hz)|P)xi>^3NXY>7sZp+Ei77~Ae zvdyBmkyN(J?g*Xnb`9y`N#I<+b%*nyT8iVUV26zimw~U#6X0zd0{6}VQ1w*-ew8Pb zt&Sc#9lis^&Ral8M?2U!u>7=%e9(Wl6=W(;LE8Z#&dzVkXmP>!pxG5mZ#N|!!wl|mdJRCCs~L!i#? z4Lpc`0efU#LRHQLlC4OkmKsK)e;%%&<9;6I)<0xDB^5CC<18!_TMd2GbMtl*(;-gA?2NCB;wg2sU3>3$~X+#`sSVm=vddm}q+bwhCIR z&66Iv9uCSs7jkaO^>JQEIdT;K(;`b+Zc-~MpTS+lcW|fs0Z3IBfoGo`x-b@|D=Etb zip~kJGp!b`SLZOZiId5QF0``}!|J;L==5Xf5r`t9O_w21iyI$*26^)eF6!?!Z~_ zrzKe5mz&#b`io37ZO6YEE`QiTFAiBxzpG25`87?+!@9B^^f8BvRy65 zJ5zDq0cWU@`2@9E9blaC0&aPl!}wuc3T`A(Gn=nycw!-C^{rUn;cW zw?HzMRKdw5Ssbm(XGBYXCoVQCfoRnaP?E^NblNjmab*d7H9gLV7RsS(*Dix`S`+jK zzl4Q9+hLHu4C2^6du!f9tT(EWRQarCGYSNPZiUj+K{kKiK13UzTuvuhe1k==x6!7z z{ptUPN@*Q;ADS=dD=cvDB7F8;9EoFr93IVNmSHTz+_ZfO%U{2S^1t;^7tjvJS-+`` zmORep4M1-3kfnaRI+#!;01*e62Y4Lw7T&CjQq zpD*Zb`Ta0;QH}ojob_iFB+z1B1@t<554!#JNf^H%$?^7o%DEq5$?@i6`Tw21sHx{W z*q3y}LkR|~mQ}!7;WQL{!UpI2HM4u38Zh5K48ykBaK>GVZp~AG(S`kR@M=EcezgX6 z-(XC&mJ;j~`U8t{IAE4|502QeS)l?sv~YzzwzL+4G)@<23H^XJi6kg&lcm?T zFN9}n?!zllHV@F-1F90{@MGIqTL0ZVIpI|%b{8~p)~0}4R>jToKrW;dwlB*KX+j|rEZD1GJdf6x&aKs$uc^u_X@^o~X!dT8M{ z;JbX8R^8x5PpcHtL_CC^+bT_a&r2qM@0D?)bCWst!jA|LAzWhE4!sJ4kaw&I&Y$fD zkz;yLd&m+?jO#O%?|dQA@)PWl9E3jY*Kl2Z07lfWfomf#d`gQZw(EuHYlp0WTl5m$ z5ObW)I`@yZp46qY?AFsp<)>+F%P3mXEsx%xeV*Q7(+WaMhl%pPR?b5C^PE0y)@SnN zHO04f0;Dc>!!E^QNHlDPE+1)N-V-dlqn+~8yb15ye!~5Qci@$nI329Y?wd;6L1A<+ z)?VO`|2lTU^-m9hYho`w>zzUm*?gxjcL>v~%8t^JTU}|dah_@-V7D>M4h{Zrqul~)Afcj*A9EFOCJ zPZl`tT*Gz;uq+hW_i)m8FPYh?0U|0!>~4PrT~M-`eZKF~E~j47aApiV?1Jev)hFoP z>M8WGu2gzva4S91vmF;)vE%IXBb-BLn%4%k?C8wQIL$%Abl zA+CHS_KI+!-{vl&UnKDB#cRjVwQ5Rqb5Arq@IIUt56PgnF7cxkYksoX8$#r`i#ZyC z5gcisPI5bJU`yGn9uTU2!g@Gzq2Ia_t_it8TzxoJ)3m^cu7^NID=)2X{t*^MeT2pz z-1M9Wv7pI&62>Hq$=PoY;AhoZq~~#f-e|Lv_GR~X4<-+={6#yud3zY$y!a~3J)26) zr#RA|i=$y~uplQ%qKWf$$6-$1w>O0KM@C_kPK&*0aywO683 zv_okLy&yX3QVJct>KZNMzKve05Q2U+Y~uVm-^4lgS%agXzJpvTUkx=Ie}LIo39LKE zcD-d*LXFTWcx7$ZU(1?7RGlPcZB?+6+_qwvWj0FSeK$C6j#$maPJ zv?uVL=4GpW|qS*0uDQlmOu?I>u=}Sju_#Ly{v9 z@EQ+#1%QC(N6_NSgMoX^>^?0UX3$HNxmBK=6BYv%gDE&^%Q7WS-2j1jE&9KLRj?uX z2dImzB4ay}p=m8Y3BIjNS5a@^^uSMAX8k>O_En|bFWjL2yo{u`JdCAN;)Cf8N`kaF z%e3N(iROq;Cvo(*O_5EdtxPL>$NU`M0~*OW;H29LIsQrDe^(5ZcTHmd1=eszk)NK9 z=BJ}|Yr(o_HO;N92^AOmp>G3C{36R>k>3{b#s=th=XvqN+al}cOY zCeoK;6X=M@le9r>J@l;@Cd`9u&KglK&W`QPL|oJ!O*A}$?>rdBObVdGw*wx@M8l!S z8?mOJBVOv43|r3$(>Gs_g9-f^OecBiyYBvQma7N^%tXl^jc7O=`w(BarAB+Y8_-s* z^YlC}ouv=H45Bw|N~DGSQs{VvXu9O;PI`Dq9UNm9a(bqUINi0T9IcW_a`C|&_-ywU zD7N#{&$Sw+6z;$U^C0*>Jb?AT7gD}O9JuBvPV+qMfQ$1b>0L$Tu;6(eM5*q8C#&Bv zKa*yWS4Ry>261|=P$FIJFQR8vXG#aYN};*aV`=4Y*XS3EB52RE%Cw7%3A0oWar{JX zaZGls;e;nB5xdt1AS38C9DSPyy;)(AZ!?2b(0 zF)SLm2|4vWNVTRJXF@Qn|2c==Why`$uc-t1$I^6op)k0enTF!LX}nYG5?FomB_4Mc z&|6sVRf?X3-nDgkv?mov&o|GYB`s3vHO;%w%_Z|d{B$o8-4Kk#oNV#Az%$e?1qI#j zDnhukGa5_QvOQI+l1SD7%Nq2RBS9DYD5>l>s5ra`RIfaMhI!c_7N-Jyuocxrvt${U z1njtXJDy%xg{(fUg^hX3z~Xu{3cM7L-de4|)*o!~bdCm8iN8j_=S87rspU|T^bA4w zI;1Ll7>ga1ML|*PnV{)XMm^{q-nJ@&tUjDcl6O`RVVMs&@xd{qabO{+CDcQc&|{cm zz%np~mxAPzPU^h725#s}!aow;G2EHGh;LdAl2`LX`D7<@GBrf9u>n|0YLYoOVh>%L zlu@~5Gummi1|-5Bqo3VpsCSbp_=?ef#QivxX?z>WnDZ?mkK#hf_P%0rY9xguU600@ z0%<6tayuO65csUy4Hi-!F!Y}oyfn(vO>TF=Wn2kZ_q*_xH>qPtTwDVV9e9pBKHNv; zAqCV2i$ZMSsZ2$TdqBwkeayj6JW#~73SwtlkwxG|Lw&m*+<8!n zX3N@`>5A)Ya^41O`_YOsG^d+!@ya;+DtAfVYoMP&gldxm6C)qg~NWP`i645)W$kSRkBsnvQgvLst z-k}SO`7$7XNCT1%9!14_7UI|EZ{pFZg?Lgn8SQz-4?8RP!O5~79lYU=EY_vq^Ep9y zfbGS-m)D0p)f$mIWdVn;3Bc$xEoA1zgAKi0QRsIbRQ@7>5iNRycb)ek0S1v|j%XoS zWi^Gj<`<*$R`T#G?>4-3egJE(g+fC3T9`igk>UfHG%)G9p}H1}7d*xwwac=T+eOy6gGhBr~yoY;YVFJb;OS^>RYd*MRR3zYU{ zQ1_5{x=yxPF7mbXr_A*?;O+*i)UHwzU#qK5_%M#eNhXW^a z_5w5e4_W$dW40(H;kP;=_;;Ok#rR>N>AGk!Q)z3ok=@D~cVSa+NwC9p;T?g{h`W9tU zJ%q%bq(STr4xoWj=r%V1bdiI!d7m>Ej0>>AlsOJzcd?r!su5RRKMLomK*gL8m!rD=CC!M8eHNO0nD z^1~{JJg}iiD~~rip~eq34~yW+cr$zMrGT%wHYi^8LGvdUv)^O5Do1BlD`kdD^&Amm>Y zhUQ(%XWl*djTi4dL*Ab`MY8Xtk#uD#lAU}T@rT#Q;acs zybg5dg*ElDHm<63UeGr?hGO>$pof{asMQt?NHJOyMXSf*6YI5z+x+9CQ#Fue4EU4p zEj#h>kx?W?1;F;5Rgfl813pDN!TCNf%n_Tz`1mH^CFic)H2EU>zFto}6odg<&{n%Zbt52C0i8#{lO-mj*+?J=HzX22r2%ui*y~{jp_v?px7aYZT+f&o9tZo>7o|s ztP4YrFaKsDQ|qvsz$X0d>|W%%!vfVyYoJD}VYD)Jl5$lLAl@#ga8R-)YMuWR>F3V{ znX_!qZl^A2+JvGbh2m(+DG&{vtwR+R)682BNpe-*lgJkCB>EQv$iI8aF3OEP;ca$OguL7D;R$$LGjCJrUMt+VP`f^wWNjy?U>jkF~&!31U>Hj2& zRmVIWDH4qI-E+~hCmSG}HxYiXSq`r2ub`&VMaVcf8|~}OMBEDkao_26alqg2tU;NCduBd0vd?nP@bH{6O424+OU4Lidm%NOf|7Z~a!?FPw9D zRHz&$tyHEgwpyVznSoT1&kb~UK`Y9D>v&Q32aMTwQ-I?Kv~j-?m7E*^hwp{KuFnJL z_UBOK@j@N_+1rKQzY#}0jof6Y%z*@qSrc`w-6RtZl8q&b%=@EaP$C@?6mQw_q3BhhcJP0Ur+YflhXqOpd;&aQ`X{y!ejc3TC@d9vW5$zhPZRf+y4Mxu@2iz;;6&^G%;xZYwtx%xPm z%rn|ZxU~$4rrt_o;>MuZ2YSF`eFFp~Zo)Bn8#vau60(>rXt$X^!~KoH{=awQ`(KZt zEG?SS-6lnyx0eE9pLDyYN}Mp=^RZgkTD(SO0)2_x1*P?x2^BR>Bd#R@SYr;si$m)% zpW|}0iDl=3tkh{P7PqVWYw&{ZEXGEd)^Tn%s}oaf@?1xJA_ z*1e-E-@6X9N8(`Tk93gP>jRo*8ju=Oj~07mP;2x}@wSCsSgtReI(bwXQI?DGF3$7+VR$%%!54a! zS!P5L^}R1<;IRa0f?i2Lk?d(GT*0z~ z%$>jjeMc_Q^{CqUI!c!)MCpga@l44$q7P-H_nLVUp}W=$8q-FcZbr$vw>#|QEK-ZFgc zf@f3u-)#_^7zGe}gCVwD`+`bnFI|ZPC zc?$thIkP=K1j{6fk|MTWJ)&*_%Bs-ljAJft-@ zmT>JpLt3+MV~grYygkGpd2x<__(U4azRv}@3Om?8y9pLu&O<+IccP&;vCRCn-|(x3 z7~PQ}ebjTnA5VLap$eJrNXBt37T&QCAI#lJmUk{j=1X_O`R;PyUQ-DBK1;zDhq>T_ z5|G#sgNSl8CG}(paa^29ZrW}mK@X!a-xUgrh6#X8!DSG4&4EXsa^bY0J_wF0!%mF= zB#`ccbT+TYAtU2BV)GJYW?V_d&s@fuqf0?2q!Gn0bHvZmTA3|%=ZJjWBXqOp6wC@? zh!sqM^>OndYl;g(`>&(^;wtpdbuq)(>5{Nr`Q%^2Qlh+98=s0e$o&0H!};$KF!bRT z2+6Yy)M|CGP?iSGS{LLRexBvCM&k4{&oS?yKZ-KsVRm0#g9Bb_KpQ6x#Ti}1-@mKi z71O84v0n?|WkNXI-_QnkN&%}Fl~|w!!e~`wkHNkTh*cL`)|~i>W);DoRGo>g6B)-V=0+5)S)1SyV8`K zxYuX^*D^O$bNdipSJHw_SlQW^&DTf&NP{d+C(K#l0P`xAf}Q?-WUO6>E-#KiYn85G zXZ;Ye^=cydc8-HJcK*=)7TSbr3`1e@zng4lc{PYK6V^=>K{V@4OI~9Hf;r2< z+oBOoJ!(Mo4QFJF>hX=}>ttZ94=Jw;!WV4Ck!hO(r12(!#Gi8LoOc_-xc7kigf47n zHH<$SGtu#bS1HG1+ysujX`)_Opt1N1WInEmcI^F!pOh4lj^I5+X-E*uyb3~oy4eTOr!K;6&aQzqCmuuaK)J_$n?^}7%qr+>-;G%LeUAu;i zDkbWMnf0Jp$w3w%NoW%coZ^9%yv;}_Iv4TX z3ZzhhHQ~0pMVcQA5{oEpgp_4K`bHL*UvGexB^|J3SqeC}Y=H>oJ94rLMnQ>9sM;bE zhbrB{k8Q4@25mviYZS$BRV@em#$QNLi8Rd{8^V;J2U(XO4`*F&0`K)_Ko5CCm6ayz zQ~HQ*YurVd1=(mktfa|4GL+2!okSkBJ;IkimZPdcGf-%#04J8^b|vUBd>4wkMN1)@w2e5$UOG-gY3fxz6!{cpx7|%?KoEDcMOXW7g z!snInwEQs$xZ1-!wT&p(;9U}gCJ4(1eq@XmE%}8xzV6J|3x>#q#~*)oibiRMbK%CsFO*(W zz#ul?wQ$q{OJ;^anJoc@hj&5v5gQu(Z#CTB+=KXz)uXpOrARg-3tvesCfnSt$iDu5 zW-xm#r2Wc(-zPiZi(n6&?s@_4CsuJ4906Ap2P}>g#+S;+Fc1Qq(P?E?W6w z&y^3+xvV)*`t2FwKDq>FNF)&jpC?pAZW8d6b-{gB$Lwv~0hR5NU^(4`p3kX4i%BVZ zu$1+vT__=|&uWt_R6}J>n8QNrTCiW;12(^2!cgyB=(}}rt)Qn&$h;0FPM{ynxT}F)&njdYJ&P5eo+rvGUl3Pu zA#6_UW9NqukiKdF8Uy2K=ebA7DD*Kp^7lAWa_}Xd&9P*gD?gE8_+Vs9GN@NPg(Eia zK;ZZ|32T4ZLzb{G zZ1jGGT;w049rwiHX~Z42cP^dii<*)at76?~);}L(-wkXb8<=&CfuGk~Fp@k5q8aM& zr_BH@JT`=!PabEkjlN_xUM0lu3(Osb`FJW>8z~%-h6)#Pcp=%2YmfR7&&?}XEj=4H zKYj|)Pi{c^hy5UY=L<^O_Y(bi^a)+E5`u=Fl|b`aUH4=mqk6WP<%n%5k0QX4E~O!#p>yX1LV&5znLTVA_y{ z>e#G|pyGZKD;0?}tqMSTSuZFoh=M!V7}9U{qPOC`2+b1$>E*-7;DkN7(&JC!&6LOh z?_VUPSOj)2hruuF8)SLSz?NraU_txA9DEmr&0a$PWXjPIqcl7gZHp&*XDNZ4L8j$C z4qc#B`_QSy3Q!^y zg=%5~$g?~*;`c+Cth%iRv!b^l^XNFNQv1SsfVpWs*EIML=?jD0q3DKpJW`vnLv6VX z&Z)l2^lS4_qZTij9)|j!uX}TmV0H-QSJZ*Ej~P&kmB*P9r#fapXt?R#)LEn|d>%Y?8gXHz1$pPw#augf z4d8M+l#Y}`z`|2-^ztZ*ZhV4-Rk%PhM+f3LF8HffFp<7!MS?x#usb{B3wW|T(Z#>O zF{-}9b`1zMa$Q}Kp&MQVSG##&ZPgrp=lS$g}nVF z{b&UB#*%$j2=1kEQ0=%Fv<&8;`l&JfERQ4 zHZW<$yK(0^J$SmN7d7)rl3^KnBH;Ro8fE$MswbbqwzqNc>!%(pVD;FW^jlQ3VLj*` zSpas88_8O(Bjn#YQ_|ZKflmHRg>Bj|;bX)%_)tF$6{jA;f}8{p-SrlQ@0pACiP@qQ zlVrTVMIXD#1n3@4c+0#CU&Acb48+$j_`uO0u~ccWJo#Amg4IIQkylhH7|A_^)ar1k zc(Vka*;gU)-CvOvpCNQ{vHd4s_mY~{eFVpEB+qw#K;|x4P;Wg5lQ|z@;@k{;+RDJd zk7&>lNJh5X7NUeDRaEK4a-3!w%V-r>F>O&v4FAnyCPDWgKF03srNhqS{MYhC&Bql_ znMT6RaRx#NTs>n3x?P{Z^uc^e=*;r@2t5 zGztsD-h%G4SukB)3Bpx=FxLU0{fetleE9|D^u1c_cBWRBP@CA_s}Pf8j&N+qY!j^? z0(q%pSa`7{si-PpE(;}s>fw7J8d?TTUEaW*T92aVwxfjdC19Pv?nirDnVC>?;!|!< zwEXViaCT;o&(4SWY&X`(fj$@$oq=Vai`h;GYuNGmF=h8@DLdwXQI z-L=8J=_+!a{fb5+O(9iH7VIVe;g~BF$=Pa0vOpKAHk_>?`jG#(v==DZB*;p4gF!GA6| zRXmh(dS3#Pd%NJuodh-$A_6~tv#Of3Fqi~df#$njM>eq9 zqEf0Vu{a@x#`jo4<&ie9WOF&^tH$8cf~R0^9|=Apx=8tHZqu#l5Nz}FHtxQd-FP4} z4X+S2V(xT%R0{VBmtXo%Vr0>s@>Lwhl&Qrr<4i7gVE@&|ZFwI7%2M# zp*?qC%@6{4F%8B^c7z!o9mW-Hp?Gqc6?6X3ZM;7DBn3B@kQ(ncWNI~m;>|?Jh=eTu z-6l;9KFfp9gh#;bmIW6=)Y#cO5nb9X0u4WH;ZLV1RL+aR-;XXMf9~3m2l4FZhNd9l z+H+9|*~m_vT0DOvZ5xePejWTNf{Tql~4F=HXy>iUKh;QnO42 z)<)f?%G+LHRU>ESoX`qti-rPVM%hBz#E5T2}29l0;p&C?!BQ9?w zeHwd6=>9IuTb+PJv_qk*v4Uj@FyQ0+3-HQY5Xe)HnDQmqm^~l5`UbJFMmrXbo+`s?F=1%R_9|f3x26&L02DWVg^wv$A>U3D`JUIoc1rw2 zMWY+rUtPgmeEI@&eOQ8(f~@f4u0G5aYym4*zQgfaYw@!ax2Q8X85%m<*j;`t#8`yD zz3)lLRQNXn_kAGzN)mn;8851$JrS$M5DUgYouREN`34bPqkE zdgyHUGV%}}ZYqPZp~J9c-F4)uIS&r%904Uy3D~-1lkS|Czwve*DKP~7S?5PupDcL%uXCyVaFSiUoORRale@nlh@eKOPI}Z#o>+y zPSXId6xxll;q|39a2sj_=N}<3bFUFKpHP5(dyazq3_r+@IHJ{?v+&+gGji(nHsYh8 zPUf=N;#<*{U^aRNB38G--_h@|*EJY6$-6c+Slq!HTkt;7jkK-R zP~6sc*f4G<;fNg~p1EsD_ZmIC`i(P0p0bCWy7%x`aR8i055Uu2S^RwyFKJQPMYg_V z-|q2>xGrlW>z|*)lpdJCc6I;hhTcy>--AwIY#m5dr-`GL*;SBz@d2zpRSw(#D#MWk zKJX4Ug&n5GP~l#Ld^6ut)Qbf~Ifo`okGYfFNkww)DVwPMSU=b^iE#Zg>!7lS1$DXA~_s4u&3 z!v?8NI6D6pJaH0)8EtuZ7Q~*pI}||HA`_j9Pu6vNra^QUYLM?-7fI8n^`z$ed&+Xx zX($(VgGER9>8*=z1J}J~bkQLVPkPvqTOpD};Ss_j1HHK3MwLYD38i#0KVVJOZK#CP zx5ZAXQ+Hkc4~lDEE;!3#h!MLBM|P#aum8TFs>_=2_^K0BZyHBJOY=~E-Akr)#FV_T z)gX#u7fAQwO++Cn7JV5y4s+WgpyNM2+QcIl4#+E@<~#w+{_-o>-ha56J-3;hY@PKM;%=%hw3+$LYiYU@Y*n7b2k8ZF8xCj`a582iY=U> z@=?pJLKJ2liY1ns6XRcoWQ)fMV!TC_98!6Q)P`*!#-Ie$=KhA~-y>N+$d{&wfoZ&0 z!JkBA-(lxXHLT#MPOenk!wzrNasECjCdqgPD96SW_qiF^m0BWxhA6lUq(&JGI#S?l}_B>P$2$ zzT$=$b?AMk2Z`IhfziK5@JV|mXxLrB8@AaJA14DMn;(vyv?_3kR_HmWK`xZI8pFtvyJn>IO3Mou*1k zw~?zhO61l9A5tlKnpmz(#<59k{+R55^!?m)zc_|1_uEjy)-2qAD};PEkR)Pzyl~-? zuQ;dwC`lXCqbwrqFnT)|bF9}Q-38lG-GOpyTB+%?N<`=z!-Ofpq#qV~I2hzP;YF_j+FVD!}hwF8bkBcqZ;@MB#H>rh5$2tfa zu7f0*b1+e~5~?lSp}vv56M8L1i4Lz3@9h{o-E)|nSKUnRD|wRcvP(pkBv9c44sf9` z74~fV0h3J$fW6K)y%Z29T`c1&?Nt$8vNQqPr|A%_Z!*OAUOuz2;v{oq=q__o#u5En zr-l69j8h>G>)#aNo85)vcy=Vcdg=gr&LmK&F2HmY+WfynG^<88js2qnFtt)+AhMUXRO`*^rf4_1JTl zF#d$TF^lf@=(-lhA_Ij{3LUSao{CjNkbMI<+{}i+dKD-OI|$U;)1X;^(dU!4==fUP9#({GfCP2lM7L6BJS2qYv_;PWp#{G!yC6lUp>j+q4f zWAS^uPx=yhX1f?Ko_WB0yBvfkIGa#9RfZl0cv5o;zU#_Omq6#&dbk-H4;~t;*?Z&( zxbJls1TA#X=Ga1{@lggHa&jPC`5TD*uoJP-3nTY#$rITftJ|+3W-DFIj)c*hM&KO2hruW7Nml0hDz*pK+DAMC5AMl7gL1gmH}{3j^L`1vh*6 zu<1BFkC}pCjdD;0b2NUs5BJ9BkaUk4ykfiw|K1@_41~{<-8>^rliwOB-Hx}|uf7}k z`IR9VH#zD?V=bt<-U4BQ)R?Le$AZ_!W^3TLpDt(?45SWpEzmB$uK+ds-!snedK4_l=LjNbO75S=R-M z1VQSj<+x!%G>N*RK`fSJ;gnA@#OK#VGQ+YIPTQvFhS^nP4M$@ny-pBjPb5;|c~Q)P zuNh!xSOoVzT!hs&ns7wh3);dFj66wcTCC1NM>Y;o7R!Cff$iJKqEQ19cP5TRGuEVh zwxCvgn#yD9WSL;;`L97*I< zbcp5BZKN>fI&r(8MO>Edhshvs=wHbCMsxKWh?9#SdrVo)2D=h#BVt6eA(wSFl2CV+S(uwahD+xXG~o>w-lxIg*?wpb&4PtyOHuzeC32Zc zBPl!%xc&8N@_WrDQgq#sc;B34I`lOW_mg3KaESt>q6YL|&S~c5p?o-jZooV4FbH91 zeUoP=!11IF91+0Ok7Zd@A`Z5{F|W{b7L3keNn3 z0_O)Ipw3aDF5Y%09_ufV*Zjd)CSISYUfxcQX(|(=<{J!^wVfIA=fO2QSHS)Ap6G}F zI75=sphq$jBIMnn%0dlzgU$kPoi->$U1xqk3<^yMKnIteCR?rjiBS1^a#=5wc+)Xt z-U$uLuk#9o&U*|0b+m#(lO>$KevQcrNFwI65>d@0c(~k*@EW@k6~{r`Sgu1+;`R8x zrz`q?co`he3I$KY5}!HnrbGtUL_J5}OQLk!d83KW z9}lwkmm1NTNg?i;{$y_8Bg9MjLK)9ENSR^y5hD*m{_Gr^R!AZm9^;*@b4ZflE;8%j zPdeHYaFX;sT5(wj5tXDwkL7_7tEo%9NQ6?o^}s*54-O7H!P6zz(31Nj z%;dV?=;BN;{`fYPC~mSQANXkYu8~KEs*jP(N^Q_ji-lvWM!{9C2JVf&N1OSE@t|fg zan1_DFRe963!fg*-4H}#dR(yI_Z#S!?+Oz0cr}}476ZvU3JjaKWqrRfkRKETmkZ^g z=PsMK>DvQiyn)ox+u^#i&p)FbXT``D!AxTN$%F_6A0l1b^U2l(mN|OS9TxeNLqX0< z@VJr(ea=~ErR*kh_h$-e-+BRW`{Y2B3bn}6np0%1mKn~Xd{~WR0BdtLK+yfqXsN?z zX3p9acqDWc2G={W9gWLiOw|?IH>$F^{VB%C-3alBl%c-cdx*gN4D#xaE>ZgGOUkD+ zNk=6gNwfEZEP>}Ru&WC^*v_XQH5wJHyhv)^o*{Sk+`_%y{^VOGBK+k*GAJ>uKN+vv zFPF#gWGcZSwhydb-w2zHM#23X$xu58V3Df^YJo>#R{=NtoMVM+@@vqm#|zN{!$49I zoI*}{Ym-o$QZrSHu7R|AFudmqhNlH$ zEN^c=tXI|t&sh~}&BqYN=hYZ;h`)oi?ed6CS`Y~@XJ=XGQWCH4Pq-G&h1A@e(6IIg zB%n$t#`566GmJ0V6cCPoDV{fcobcK?k%=DR zCy6jE8p&!@&akIS1U~dx!;%{-V6uM+UN$z(dT;L{i$F#4?_4o?+;^Vr6AmCN_ZN|k zUPsB=6-Hon`~kcheg_Vox#0947kgfBCPC+~k9&*VO4`PR(zBKZPEQ}233JBjrvl+`V?6lYl4W-#D)8i>F>HSr$mZ^Y zG0*&W$S?n^Znb43*|e&ZNbPYY{;!M4A+;oO?;wKP!iFJ6kRezYPTCvh<1q@YB%7)(6r0Y!?=}^6-6qflnA9M>pAC0S~Q5ZGD@UUqFqMz%1X)>$tEJ>Irm8+MJk%gOhZZG zTao&Get-GvdA+>&JfCy!>%Ok{)p1P(ACoo3n<5r-Jpa!oqV-DDh7F?;(d|@BDFwQm)4m8w6v&+Nr#GC;9-qizp?)!01!Me*V(^m0Z3ihi7c9IcFD#$X9Zuf7J~C2m5XT`mO1yTPA+Y3%Rz1vkGM z!mXCcxTktP4)9(EzBmCyg%n^3&V!XUuCVKyCsbTYqKm!aQ1AJh{MbWMSVBqy%e8&s zcc%N}xbrc%wQ4qg^j8jVSiBT(4fjP#;<>b{>m53GMI1SFdchI5J21ZX3VgAu26O8~ z=sIQ$57!ytxh2v>pJNg5^&_zU`kzQ%_AsEZ0I1g1hdE0C`gd-I_Bw0uEI&fuwdf(O z;-c&0CXR8Q^xmj2*CXb`=bw*) zqRo8hd65M1W_1u_7Xcbe1}QJg1uw~0Cau5kW5546eN%cDI=n6vz8CEW-4G{;ldXgM zf;ON!XAW#!a-ZMPm1%rtWCRtvKS8>7rRedE2zra}i)HrvU~Bm=DD9LEev&DUk+um< zskh+kTpB~iIqui!>l84(4lwU_9^~}bf{5X%dT_|X&Rl$&|8w8~c(Y+II@LUg9@T(6g;K9wW(AOQ-Xy>#5oK_i(yDGQi z@JD^9B1RJ%?R}2iBMT_+Di6KceV_A?ibLSSn~=I4V66~?kh0srhK|9HxIv!QPy;sG zt4KUHT*qgYJ7S+DZL~c$5oEj9!mv&zyz0h2^Y)S&7B)=@o?sJDx$O zX9j$DZws~yOOSKAAeofHaf)_FZ{cMU^7D>4zWBY=HpB_qa|EA58+$3(vsT_8laws)O}woj_>+W-8zm zjZeN^KngxraJwycyhW{yPlkeEcbz{N2Bg3QEspMc?i?uaML{%9k|)3fQSj0U_{6G< zsH4jqh0XNEmR4c-Y8MY*FYiDFsr|^a!w0R{-bqK4QqaX!mFT4HBoP0R0UPeMgHz)G z41db!a&zlo{b-5FJ9vZ_$7zsxzRCE|*@O7m^+xKZ7YoN020}G00@n?T-8e{9w5vzOXc|talA8j`IUE+(c#$LiXf2ZMuvJNy^sTTFlspieMdQL5v5YGQ# zjTVn?giQzYV0~pT7`Fch>mJ6!7uoq>{m}_kEf6Ka9P2GyFaZ1PvBF-i${O_=eu?sYRK_e#mPED zk64axDJ~(aJw9WZU%PPmm_J%JXDgigoC=bz8L*D^b?BpH4|PvcNA**Mu@cUvn?7*5Nmvgk zY!+e0E!FVS)d)K6|MLHQ55=oIR*=#hZm-g6j~Cc8{`TzSU@x5ty`OX7kbMhyUJHel zJ*ph5&9}yTLl}A&U5oBd&Ef429pl|Rcmbc;9*R3Ya2eVAt>`-0iH_wq@p6m5)3(kA z^h&P^-7lU3mhveu@%;!~m?6%dTP1P#XC>gDu;h6q)ML4dC1mQxRBW=B^WN^iOD9)_ z!NBP>xZqL@!}0((mE&N>_!pXB^N@FFLILVZ!bsu!5_GxQf*-kt%ZOEmVA-eQcv4^` zDwLXtHf!1O)imm*$eA>j@-#+giNQ{UF+W%>eW#6+zE~eBk*t zfMrt*94hnxu|h+7Lp2hWFDpR@52?`MRT`)wFp)M7UBplH7htB|g-QZ0@OnNN@H}t+ zM_>0lpmrs3yhJXauB*ES&PCthq?8<6m6Z#(?oNi+#EzFU9)#^D7!v=rZ}FvIE9^4o zBVTChZb&vRgh%>$kkQZp-}Bg@=bInbDH=e|gwF0oB zpEREFo@@EFnaN*JJ%PU$da0}68zjG>9`!k^z~td%xbski-87J8Lt>#|Wc84qZC``b zt7~xdEMqdMEFX`PZCJ6Vk~0552#d{!)OXpCTnJ#bI|UN&O@->SvPNU>6j|#T@RO68 zOlq&rql|8jGv_JTw;XU{Hq-O!`nwL(ck162gy~mK&m3>fka*^_nhJXKFX^Wl{<~uX7$>F>u0e6~9r=u1~x{;bwl{jGOe-U2$rauZ81A zukkv*MSxO0g~)aC>|Nw%upU_nQ+hnAi&x6xIxRUer(c^yy|l%Dq9@>c=Vic=`_A=e z7C_v>Jor$Y3E{$tkbn0M-Iq2OJ+n?g#^ISXZ;k+Z*LI(-Uwr{bMjPQ%JBHB)o($j2 z`x<}LtcN-}UgS;Te7yJX|Kb;lCc_?h2m1@BF!F=J&%&9|yiXk!+}?~E)aH`zIwfL# zWetuETZJaQRtK||GB_NN2g;L5VOn%D3~7eJ{Lo9(LF72n*&~T=o=T@UX)P~Lu!au0 zdE*N^6|v!^HWV4CNsop^^HVcE(=?Tf=w9R`Y$#YulU}BS#rQas`A=qF#1cV#MF*Xg z9gnt%MdGDu%ZN?fU#wfP2^VXP^W8l+K!{v11O{e;)#pl1i%f>i_YOnc`z=)T`Zc7f zl)`7sjn2z?!jJEA!_(r<;@M$>cv)Kq|GkTX&*cJ4-Q|VbJlrqOmbH|^8OF6I?Tw($#T*sNSwrqvHAU*y<< zfO448EeRt0cj!=S0M1x7mHeHkOIDWb!@tiOqTMcv;5PXd97;-u7mjH#{p)qOaW?_} zXm!#v)~e{*@$39Z!;jQ)w;bO=ypvw*_P{a)k~r0hk8Z|iQ+;<~xL{$Frms5W{WqP@518clUn9j?XrbSY8r7<|xROvAm{An~TB2Ck95u!eF;T zDJYyz0~>z>a4F8eYqxr% z&)w;u{^KnuKcB#4GzQ?NLlAt4P{T5(3UK$`R;=EzjY$31gP-JV=KO{M^lVxtpvqHF zc_IWZ``-ntkytocdl52YOKH=&xhQh^bSV2VmyVv3f}x!ox%plX-xQI;NG6H$vR6^X z(EysJw+fwmXojz*?dCfe@}X7i2ly9oY%uv=Sh&Ozr0w_N*F8@#JMt<}- zs=|4pUm=sqM!M-t5r6!lJC#$vjFvlD;PUg2Y1jE?keVaNbawp$Pph{ewy&9f{}qa7 zdw;>c0#fAn_qC*bq#FMdzl!v}h{LSK>F}#12+l+$L-G22c&(HOk=2`_q*60Ei>1yfb- z{kJF;>eKY$`57aG2de3LX+gLOE9sWksyN$_%QjD(j{PLQ)~K#8pj~63{Ftm6ym^nL zag+Br%Bqfp4u?L7+#j50M6S@wILM}_rm83m zW;EJ^yJIW}ZLf!sB(76@K`JaLQHGBzFCoj*U+Bd%od4eSF1>e53u_-+fu#ng;rln- zY4HOmiiE`JHL?QbEYZgqKIUkR<1Lt$J_5DTLr@kz4o5`I&XO?-(rmpEg_dsn(r2@(W6Dpragi+>VoV8*Xy1-D#A*(yFlW5 zE|VW8P85^I@iPNEjv4+J8_rY5A-BTlva~!9sNDrUDygtru^z@!gF#*^9Lyhv(&8_o zD0lG$=$Unv|M9#mXgpeiwAfOl`u+jUPYgF{SS3V9C96^L6B}GEE)D+Q+ClV+ z5Oay|gGWe`>p0D&GMx9vU0Q*x->E?Ku3C^|Zr|`f*QZF!O9(#hz6x23IL}9I5sXj2 z1@G-+VZ#2?aPd)6O`PnfnnU(tAa`Q8#$?4uI$3-Pe)ivV{P=q}@5+KQ>R4{WQ_^;- zx%^=mRX$mQ^A+8=yJJ6`uN;FHN`r8tU5dq@NjmoHfBiMIbW$67ZVd9$8XgIT;VOK5uo?yBJt zw@E@<_(w!8U8KZ)7gbRlrj{1sxJP*^UfBH^?cBnr8?~_Y7b@pK-x~r} z!grvcss+})JqypKCxQ0EBq}&ohxY2E(qkiQ_;%+7p}SfN|BI5tM_jy7WY-<4bFYba z{MAu@(%@6H)P57zL%Lu9JuvwCFRc931I{*!+2go0Iy*y@qoG z5i$WctNus3@?*fv*$aNJXn+kP70_cD4jz#quqC;)YS1kL9r{&Ek3=3enUq{lzkip) zv-0Ke^Vqk>&R^r{`e}o__=_UEordCga?~trbIcd^MvTCq-6sea5@15}mb02ELuk6U z9MRvph*aG-BTk)*Ny@n~EGYCA9Za-_$n*9fupI z&AOF4BNSM~E=^{X6pz(J)yck3nq*jK7kRc*o3IAJFW(lU+}TkuU^^F@1503XQ4bhZ z`9XA9A#4pJFx^=mUpXO*UPx8Y+aBJuFf#+?Itk(>E`O2Ps_WE#Ul2b&KB(sTM>q5( zc0K2-x?dAyQVq_!VyrmxA)Fds$eK@yvWRz`IC;l167X?03AneH*k>#x&V~VaQjZb( z=YIo^)lLH8<@bO;zX!%n9EJyrO2AfZ5@ZxD!h`$EcrJ2Q)W`WL-D-IY?MV3#?Vu&- zm{TduFWJhACKvhr6H`(6fz22$HPhLS&0ydm%)YLE4)yESv)_@~5O_q2gv~M|3kNjG zR_D#+fcjE$Qq%;uyavA8&P=GDu>khIYk_l*T45VK4$_OWK;&ftBmd;ZXXyFoWn7OU0gcX1keWRR+uMd=+P*#P z$I2&k&zjlf)t+_4^S&{8sAEX@qw`7FZWVmbgv*7Ghr)l4-Qkt{8~E_J3VMt}0S!lj z#Hu;Gl(1R2QAe3p!vF zVQSb2qdD$#)TC$xN{8QTZk5$kv_=9Y`rbl^ zbO0FyCUCh`e|}`IG{3iQ9=bA%htJGarNwT=FlF)twj-+nR=(Q80@~GCnAj*b(zYTq zWerG4%r4S>&6KPz48*_r>B#3%8dSLaqL){+LHyeexHatrY}j883pyvjjD0uv)zi~I43V!Om+M}(khi=poSu}r!%LgZ`18eU(BbJ~ zcv&fT-}=`I^%`$M-%N@vx)Z>1e`~>EX&zbIzJo+Q~-@=ADrs^(7o0*Oc%M*&gAzOCm_|QykCdY$)wbU5T8(-$qwAf8}rA z}_z2H|NFK2y#-9$510gF&@sihge~vb8(+B~hmJ!;n&;aLC-az(`2$<+u4l(EF zLdU*Mc$7MD;<5_ea$23D?!FpXn~msIt}ojD#+80N)xdY=LdNv|IEu$2VLZY8d+LD=}$6LiA$GL*QyrZT;6 z;OCzfZl}Ys6S;YN%Ct^uB6<-IsatbAfhYVSZeMi3!L4fIlfB5>LIjz5I?&lME;X-@ zDbt<{b5LB!Kg16ahMLlRSh@5Q2&M@$8M!F7K~aP~*{Vsd@(+*}OB-_aV`61PZHt(cq75ye@nzO07UkuuwaRuGxGAcu!wa{_m5xlOS!!(Q%S;mVHxM;bN zNKbVlS~mMhXtNp_ShSNQ_?u%D<4-iv!X6%pxWlUFuOakaF|0O-2LqV^X#ORLVkSpo z)$TT=;a1M`Tj@=YKbywuOTUPUF4gkiFSnsiKW7>5AR;tBxfT6ceVO+-!wH7E+ab=g z3bvs2jO@6|^^WP$o{g>~zHm2rqv=7sQq{@II9>9hc_-eoU?Vu*n*rSiZ@_7zCs2`^ z4o9x#z_g8K+|2g}t=J!d1&q{Dz}{XH?E!uIeycCfC+h@Koj=a6pR7;4ywdpTxkda> zONY_vNKyJvOJ1SNJ5s3c`(O|_@D)Pken3Hb6q9e?%_S+vfT)E)=7W`5wGDEoyOLw zWwJ9RYRuPBjqF$BSi#tpZ&^M>|Bo$JbDhAqtv&+7%Vxp{g;tQ^bY@*%EbvlN zVBpVp{=my9+`aD*$IiRRYY@Ffe;#Y)3!YnzJcNl!=I9XLcK=ZIy_Z|)34x`^a5R=@ zc5*hHU0V#cTkk{Ke~2N)LZ)ro40V^S$awDo^8M0jl89!I7KLME6K@}0DK|z_7aM`d z_p|V8ybk!}CalECu=N7Rk0dkD&c+!0D{VghsN2UAwD6^SB!c*A*PM{u>aZG30a+UK zVL4yJRiA1_g(AN09sUIeQ#kbf5tNG5!rp8bc6db&D~enLpRzp2%d`6kHTEIuP8wtY zn~+PpIi}Ws>p=gmAhdVofxN~Y=(Ed!?$%texUK<0sz1=vGjUjAjE|I+jd&87{xsls zeKmiX9a>y@(Rl730s3H_D4jQPD*c`vgR(;`Xru6Ua2e`=E1sRO3qsk%fXmGNUm@>h z`UR45@&IYr>qV++Hj(%vV>r}&JH9c|1v=L;>bT?qRPhTSd3g#r?kEMxgeICNVvfnR z1k8HoqD2k=@$*+5rF&XpdDm?gBgqhD-pzy{{_N6iR5_rNzvk9jv_mtRdbJ$}PuDJ} z+9b`s`)4o@-Q#SbTPP;6XNb$cW2Etf4M|b=A-fAx@PVSYNb;*aXm@nenAJ_N-aQ-6 z1t)@=MFDs2I8eOf6qenWz||Boo|r~7{q)$54o#kker_A&@u?nfQeLo8o#-iQ^LHKJ za^-BE^^rO*UmFB{QElL@x0sbrFK4X>3|Y|NM3QZKjJz!MA!YpwNCx59#T&e_Uqu@~ zdB7Cj3$6h6jlz3Q@2NSS2yw+{`j&f|&b znVU$wO)~j**oBs!Z!`I>(Zbg-5C+lW3^<$91o^$&nYI*V@J*aeRaip|!w->jM}x_H z^BJUQF4v}Lj;*<{Rh7SE)&{C7lE4f6q)YYuXT#}I1|8?yLDkupHE+Gm z2Bwz76^kRJb@(Vz6A2}KW7=f5t|hT`jKmKm%%QWjm$QzQLxWH{d=Jlp7yVffI4%v@ z{x8rNm+iZjA%)+4Pvec{W>6tVhngSL0@3~0)N7`e>^Ohhm@fnR9 zY=CgTWJo!l1#CqQ#OJ5b<`uf!eJ~bF3Z$ZSoP+18Od_rJ`oz1;Ka4{B%u&qS!@R+x z&QxZ^oW2TQ$)9+C6}`jX25G1R0(IxIwCY<-aLk*@%Z#F8nUiGyogfmlcNe)j9za9y&-65S&1uayHMw1f;!N5bw+-jGUBxzWEYtKAQiJaeEzJ`3*eN`deVA<)16XHDX|1DG!r zgP)(MX)%2^szBNd_$w$lZPw(i;&%mYmJT?~P|d)nXCYzQRM-(uch8+d^X`VxP-m=o5M%@CBlzL{*5OmUo0dW#&?nve^PPtTvJ$; z^^FE_+8Py)g)@Q$;5;D_8b*a+!G{tg=i`A-JkZ6(6U32eLLGf|JH=$t+uLYR^%5FZ z)71Dla59TQ@gGhe~FueE>ez8QTGtGzk!`DFabR6B+FbPk~@W-k9yU{@t6@KWf z2HLs80?GB?K!-NoKx>NJkdp9W>b&hb$L76C>rbWe)jhVtiy5CGT#m;)v+uIiGJfpp zIuHKl$it-aN)mZj;!Gs@p=5W?C!G1+14Uez0S#ad(~HYsKFR@d>;@E0h=pI*XVaqZ zOR+7D!V(Ud=yIh!HJr+Izw4KvC)=+efs&hO@x)-%OT(z&ya#m2z;!AXv7CPI_XD9# zzd_Z(j-C11#`^QE+1Bh-9JA#pIc}LvZsh8dvWZv7Q?nNAdcKA}kCKGgqa4Geh5J-swYT%H$LM@2aGIS_DbzeT4V% zm&2|~366<<7e*(9!t)sJ-1CVA?aT&(F8s1p@O&k(Ao=*SM(4f0F4I52F1aIgfK<&a##85+0_IPJ*7Vmf$2bON-K&89rx8%3E(yYM9H%R19i9VbIA7Be zHKzWd_AWs@ubxk6(zLrMvmqZ%2^64kxt@OEX4NkP3Pw_#RyReW4@PGiaXo9dnD^2Q zc4$K*#GKtpdL*;RKgG-B@a0{^w@r`CpJIil=W1|z3Iba{PGfM*0c*8eP+=4X`&U%Z z@#mjW%$x)G!U}1;;C!NqkDv(P+wmN?>m{;<=SWJm0ktHCQ5{=RXpEBuiNftQUoG8W z*Fyo;B5cbpR<|%6RUh^@u!jl=J8<{x+a&Vraq^HCM2>sNkZmoOc)u*<;JlbWEc{de z!JZ6mKgoufFkx zvyu*%M;@fDzRReJ7U$jcn8Y+Pk1!eA9@g=BGqcQh!gEHC5@~Bja<3VYcm1*CJx_?p zs7b-56a^@*FN1&UBSA-}30~=4gF?<%*ED4Y4WF!vmG6e(KAUDFJU^M9*~jTTVUqag zidv-E^&HWOVd#Ny6P;CL0YAQ8qAw%fP;q_rftfietEeHz_oR_vZANG2F~oM_n(%n9547)V z1O6ihYm9Egu#hh#925jOrAk!ivlibOpNp03!+9^Z>3~z-J#^jd54!621N|EvLT7sF zX`baqh$y#$WBbGT>vcoG>)#|c`QJgdOza(F2T!xUF;&R2wINHNw2)xO3#7c`Jjqwn zA~7L<`M0>;C0mgNq0e(+Ro+|pFqRFgWPBik_lWkG{zhll9mms3B=A!_ogRBW56myg zU`_rPG+OivouAN#_L)q8XES`@bhRq@`=ry;`B`v%z9vgfInQ=}7+{qj*0blg7UGY; zJ&2CRYqGt_h?E+I6X8T<;xudoLjF8(zWW56lEPrZ&0f$Fz6M*Dod&%tTxRou2%hK? zh|k&nLkB-6((?}lV1A1VzP_{%RoneShW75r#6uNwJL4eF@D`oe%H{lCHNfhhD_M$F z1RLD&f!Y07!X65|$1lQS$!X!2Wce34GF}u+wtbvPKAbrMwv!LR@{>Q{LrXa16upFz z=5Uy=;S4(4#AuV7FkV0IhmGt$AoI(WG=J}ADyT9Y*MI(u+V+g1L2Et!Rv#Wnn5Ti` zR!N$=%?Y+|8i3TuJ#59iY&LCC1M6O+%$hmxn7CmX$qsHHtvT{U^6qhReoGymd}j>cF0(=K8JMA zT0uPL*bq-&6}-R62%@Ue;n=DdfJI+{h-@j`>+pt_Q+iN3ISREmEyl)PCiw4I9q(b2 zHCU*9Ma5a-SWsRFccgzt7d#X})H@2IRs_S)tyuc)#dT0>pUoVGFR+NepV;hH57x6u z8P4jiC%Fb6$SE~H@+tTL(H$k^`uTKP=CF>-Yfw01oD1$xe!#YQ;XcPKCARg>AobH5%tkt(G&mA|RDFZ# zpHqN_`oi`Vope>^d-S2e4AVm9rjB1fOYj=);b!;BA0(=Wp#_#lZL0*`FSF_x%d;;TP8}fk6k1I!_$cV5Z6Vq zEd~C~{t5Dt@t|q^0+w+3BE82KU}}*kU9++W4KEGAJvzepg85@^j$2FZ>{M`%y)d4B z=O2n0JxbrF1c9}{1Nd2%LYroDyXcR??AMXA?3FVI6w&O1O{JfRi zm?=au&wG(=lOEyhLr1t?>=J;9!w_##1BU{uAdSmy`Yb&Pi@pdMx0H<{yN}1Q_sm-; zcbhBpIXIzUZr`B7X_-m8KcVpDlOXO!3TPb$D0o;)n|kx$+*2hsV`>2N)_Ts|lCH6@ zZ=2xnj(KF){%$h$dNFw?I+vusb0GCj!uZREy->5K242*(!aMaoa2Lo0R2~eImhFH| z8=R52!EAh|&l=Y&Kj3*89D=omQaGKGc z&bI%cx$OpMt>NFB*-wz%SqA^!bEm+BX6g`oOHc;67W*D;jF6YkDH|5gS- z#^@th+vo{zyEqTR#dk1lZ^OQRh+t=Kjsj5W<@ksB88TgJoCMEVLYDpWBE$A; z$o@V*sP4)ES^u|irzH+n=l8)bw;X633j)(XNl+hogbDNYiG1dM z>Moo4U4fb2nn+ZCJRncdTN3Fph{ct>$j>QHu`uz6!iZM5lkgF;dTSv-D-$M#XMnAv zADo#W#D5vufvgVt;0(`lB-`f>=85U({B3z$X{mtEU9Clr^EN`KR>AGv+iM#4$#0QEt9e5=u~{_$tE{V8%?sD&|D92cLhl{JN8De@hfSVX~U!D*Poa=KiGHa6Ost zzmI6@N^)HgH^Fve11M@1z^j_~;Ij4xob%u^Yn5xkhRfs|?_Gzji6wp+yp7J{cHgE- z=2&&x3_NjUDo&Ykm|s+X1MC;J!{w|<5FBK1cmE$y%-hFi=Uid3$)ilgdK+^r+>KYh z@+Nmpg-qvt)*}-04iQToVSkMGjQO7@8+? z2J6%>!xnd5(Hq(#5ck^nxc-^T^d6FCK`bHlxE2K+y`H6 zkH9PLr{e}?R?!*F)}n{(yh%0dpFWlKosuR8_C6v5f4a$7?GSF6?Lh{M-e7NzC5)aA z04{z3b;cClz6$_1u^RYK&KF!FY^%?YHlp9*{J5Bak_71bSJ3WRz=HN)Va40}*>dFsrag(%OrkZ(`Z@h%*zyi(Kch;r zmK`CcNu$V*%df89-Uc)4>cNmUL$z8cT-}lfyChxVmGn_`V4)Z`vi^Uj-TbH43s}((K3`clN6% zgQZ0evoGzgOvp9>mvs9Ry*I+9e~v9Bq7z-o^ts%uUl#!D0{?=`!wPujmI1~|$#Avm z0YEd?jY7w%&6WoA;`3oFXKsvRSN^2!cb?MB@%31AFULwBn2MkLQGjcITjArf*WhA& z3G#M}FfFectTZH)6|~)9(*$2K$AgxvvalbES==PI(*;bkPm7RF7k82rVL(ccUV)n} z5=@~TVDCUC+`i-v68GPLvebF-xU_+`?W{tcyZrIN-YNLxGbK1gPx9s&>f)U9y4bGt zKQylC3XNj#;6Qmh*czw7rn496=3n5<(xsO>6*fN*Qb_G^PjaxSp(NF`57?k;*=aS`A6T8LJC zoCo{AO5w(9%J|-(HXccdM33APpkC%R4B0)0WWv3FvPBq(>9hThl9~E}A=Y*@fh|vt z2aTW0$c>nfB@&YoUzkMHAM7{!x|9oK3wSZn!`GmG*@4_$j4e=HgF;IWP?XYj#W34$0 zF`vr@y<2MlRS!DBZA~p)Xv%^LsmV+rWIoH%j$}S-8kmO9BUV|tl|5M|Kqf@y5t$re zQ;UTP`ED8_Zl;AKMTRlYsl&6@5wQvd&KpMDXINtPo`v=Hl=V@?aWiJ|N8bCT$2e6A%pGn(^ZYmXZ0&kC-jSZsa;%%!C-@UdL z`jWXk>;MBXeJX8EjZl1bCmX+HRmzskl z%FTt&cq+mIly5<7MhTY}*#UN(-~NMW5|q|FqUZW$@cN_5_;x1e%X|_?BMe?q(IZ?& zann4!l|Kvj&wEX4roV>NliA?XdJCGTs<1b!^_XzvS+;9m6?3!eV&V$^ER%N&Us!jU z#9k9K4RWz0KW&`J!^bW}(sv7V|C`Pl#xmfGT`Jh6tHYz9K3MJN4hQZ}rPsF0;enx5 zI4XVtjw_P}e%vnlF5navo~nhFy%h0}%^P5_;5|f}+=Pyk(rkoiROpj1pJqgHMy3={yz6R^_9T2J5ucI z$ZZIk><;=_x=>X51CC0|!`igFs5^N8`KLMHqgt6L?et_SF=;-w;CKuUZpxS~^hXKT zN?_KNd+=#hEfgIRX1cyAEVA7g6!DlUKbedjo)4o4iB0(V%*nj3R-W|j z1Yf*z&s;2}pnxOXeE2smaJw+I3^*Ucppq!D$iI5r^S+yHe^<nbHXA&}bKN%hM;p;DyWsYyEp<6H)8ueztT7Nz?dL}|}-9~D3L=UGd zo`gYm8U9;)iHfwuQG-l>EKk(%t$D(DTEZ^)_3a}Z?TLnL zJwBu@o57TJS+bhw7^Zr*lSN&l>{!A&79=1`ic88kT|>t7fU+^E^j}3(H*O-?+_U4L zpw4*?3gKIpGx$H12N|wI-kGR_`B*5bHqyXvgG_PytP!MJ##Kun*?=Zaa=|6-)9`Bf zR@88x@z7p}24%#JX*Oo%cqdD6pHZ9sh$4E6Z^m>!!H!+*QQ? zP|Yjo)WUx4rr3LhEDkoaM^kRr!2Ijwu+fJPs&_@$cnm)V{M-*RQgC*EP6&$0hPQUD$L`DTREU??haQ197bo;Z?XzWr>N8LD2px zDDU}3ANVvvQDyS~C_3+ln%_5!xA!g~BvFb)iK05sb02%Olr7nWPiFQArBW%0wx)(r zDB9%v_atIx9JAnIl z(}G*;9ZPSoG^9H5?L^yhfOGHaz^eg!crR`VPT8Wz7M@wfE-m+E=}T(Ze4Cf-%dAtZ z%c+9?yPgJLHfjo&CU}ChssmW7?}Cx@co;$Fc-ER#f{*^}!zXM_ zyv$ndKd~uu@3UcPlbKSI8r;<@0JDEOLK)Nf;PJ^E;_8<|rA-tb^EPH_X?bX8HVHT0 znu!tzC79`YeSBnFL|(Ygr>mpJ($ZZBtSN9Oe_YQ{x?uz@`EZ4tO#eW z$9N!Fmj#`;g+8;|Im?x&(I@{qh7EbZeRfu+@gvNr>KFsMPs5*l9vw#(xlE*Y16I+- zEOmPEz810gUV(NBH?i$%5el6o+5A^F?9A3REQn8{T%r7rwJy(Q(yJE<%v<-vve6xo zK;FWh__a_ND*&yjp>$8H3`;yA#S(@l;G>BJoZZPAcye1EZk}Pnc_moUeUH`Y^83oP z>EJ{`V5B<9D+{Fi4%yNZQN4Tyl_u9rS}|Gb81g)4tTIz)^^Pl9(1P9UkybIwz4eWs z@nYEv;Vx=h7y-v8$P33FPlY(8<*-J66YSoYVE^N;K65$Qf;q4GonB)jS8@0W?wgi| z20uLnTB*zEo0)tb+P(K=!!BR0Lhn?G$&oaw>dv$8T*YMTZv{-d*Ne9G3-Q-|4!>(_ zv*OHM?4olZ3t#?(xyim|W%vGL2}?_El}>whSnyo53#5J6 zA^iC1J5HLq9_u~C`2NKZ_RC~1Ga3`a8Yh2c-hOpV;+7J7IZhrN#uUJ{LOr3}rp0ih zQ4hZJ?{40eG`#cLgnj>6jC<@lxG{ToW2M}0JUxCArv9oTwd*|S>nJ(u$a^)H`7XhQ z`4@@Zn9Fo@xE0N)pGBUTWnq;23)Iq$K)>@1xI<*b{(I=j?^x2<2ZKS@-S?2`O*G@V z?=~Q>UjzD?szOI6NBHGF66V+qf%Y};apM|2=8~6&`?)ag*q3-zaPLC)rJ73(lcP=% z0y@9qAE^jj!e`*}%#VdL=ohGrJAAPz9d59<_%vWtfs*v@I6+2h4d?B(Wcnj^dlcLVi= z1;h8jsNv%vxAqw9ytf(O3{Ga1jW5t%pXUxwn~xSV+i+q+Fkbi?L9(uFp?Rq<$+Id? z((0~@vz*+C`-)@=MJ1To1&o7si>utydNEMjXn)3a-3 zJF|HT&#)xG2MY_HV&{_y zEX?&Fd#-nO6A1IPmV}y3h4bVUfbb)k=n(rqqD_NOB6a^ zVPtb8nhCGsl<;oM-MWOSKRLwI4ezpDLnOpk|0`v(F1)u&yaA@|_yW;eKElfJbKq~3 z1KfG;N>4QmWeo#LEaKB9bW9EAoNkNSg0&4I+_6;ewJ|K<1x5_tmD27lViW8SpKnE9Qdg^xbj?Pf`1 z__xhDcm`427RKfE%F=D|<+N$_VS0A#C$ch73&##hvd))v+-})C?AR{HJOrRbL4dYZZ{klwI%ClWV~;^VYG_{rlN zmpiNk71K4@)+RreG3P3KyYM?(v$3Cb&UeA^mMR)J)QReny*nPc6yKBr)|f8s$w!v*^OrKd4VH;CkPrF)?wA7$#m_UGJ5b? zB#oVZMDRiV7B1jt#dADgSnGEkuJku&J1?AK&ik{O?V&-Id!&<@JI9eSSzRy|mce{& z4dKsTJ9rQ?5e&Egqw5Y!v7a_0n4Bx0Gp)pDzz@HJ?!Vix=cgRDPY{tpYYSR-DT4f% zXRND1-J z+z0GsfI0PxSqO?hJK*Q6kMMkqHH=Q)01K{Y(E5(iY-+qb^MhGfACkchaV$pt`geTp zt}M6gOaswR{Z8hGEg&izkBI7Q4p7~bxm3mX67^QxPlfk3azl>(z_pgrC^(#i%PRZv zYqk$lGz?>&7ay@&b1CsIu`lZvPvO162jIa(WudWdCODTHfrP*x5=Y8nYv43ymC%mE zc(3ZBnL4F2i-gIP?i%l*%kur%SQ-x@9&3;(b_O) zjvvg(jl}lynS4)LiVF-HxaFxEaoDIzUVnEB`?uU7N3Kn#cP@F5JE&U%n@6Da*%ef; z@e>U_kJYxs$W_+m11RQ}__ThJ3lsTDpI-=9}_jGZjTH!zG0Z zJCfk!!BN7)m*zmzt6}hdrvnsUs6*vAb0+sM7PGpuxYUAh{M7LRe?32gs}ys|%W>1` z8mBeH>TN;EV!I89)4i$Bu}11#Q%oJ-7YPbmQt<7nYIO7Y$5oB2MTyUo*^%_K%%k-# z`xh|C+S-1zA)fkF$6}D4U4@{%M@@L1Ob6YE6mn&n=sq(!wx(++v&!>A;k0y44sSIIm$M)nJzSy_DCGNQ%FCBcp}G=~glc?xwXvm~k6CNty&X^A5x5jA&w?X~c5l z2XWV#88~BJEobC-4HKug;oq-1T;t4WqLZ6T7A3tBENkVhJns@{l=1`W(3L@d--x9F zbBA+BdOOhgZ2>1K3c##~efVYeDQ3Dgnw=it-#i&PvAoG@_N2L*G&Z=wjXg@jN43}B zxUm5wehGmoa_0E-pB+2BuO8nWABmn>L(t`3HV)i)i3f$Q#AaI^pA%?8_Ian3?6?=n z)y#{b*JVG`^932SYu_S1d%TvrGv+Uz+OHtcIuwJQb`s34Cy@2LNM{rBI@!33s^a$n z`_M!vNmmCR1BW@og^7_zVAJMd@b0iL1nh}J&#}PfOWeSfA64d{(sbq+;~H8)8}zcyX8_Nkz{twD5ztieeZF*I7Go61jnO(hL2iB?q@x_+y~ z^lzuRK0p4RHF7eOS{=lS2aDOV;z4F}r=LA>bEZv`pU|k$BJhw=5#Ca=f(t>*p#OY6 ztx}U^q8u%@v7OI+w)?_8tqH<&;qOqp!4!Mn?juc^EhMX@M(~tf5@|JFrv|fbQOn*s z8dTdzO>e~rUMLjegkJ~oMy5X6`?jM`@hUcCMg&{cQNye^ONwKav)LBkIzZ8de#%-lwtJ|U80+cu%gw_e<*eUjhfC$pI@tt?1W zQQX(6$M(D46g2xxg;_m{!jj-D7`4IxJX1p9$UQr>Qk}&_5AI^D)Ew+RE{muBB;a$e zCR}n@K(3#PCL_Im+mHS4smRMLkV|}DK%bB8qv1R6(Floyv^LV8t6S5H!&;O{wKxdh z9r%lT>;u@D=xnyu^EWe>))qV2rVGyYogq8IHb8BM7#pU9(K{5Wlo!n-LY zMhoMH}yyQH#MwURNQevnN*5j+G^X`wOd4 zf66UxB;Tj2JNIJom%|J*ud_W1d)T@$%HrdGu~?tZ&m?@UIj5u~RF}ww{&{1eqV*gM zyq$z@N9VHao6&f;=>P^FVO)C8Wj+(=HOl^eBKSRWFVPdGi0BC`Zcq3sF59Duo&X6* zY7o(6rC=&~dO*~D-xP8G{wqx5p=J!`pd^$i^{QviPd)7z6z#kX5 z*QhPrb3G6|9!`MiBez3f=rQ~rvVb-I^TCEE+c10RORj284*n{ z%e6VgRX=X!Iz_K;GaBWPnJv?NI{LWDojZ;n5h<(u)!r# zVu>^@@$(%`^sXnNEfEp0KT%8g;OF3=5r#N%E*@Si*R`N3%v4AgX^1F zh3D|mJ(9QM&}K%s7)=bA;gom_$N}|i{+41E+_Q+ZUb8$YzLxzf;wt^L!155 zZ1{}X#@VE z`j@5j!<07KXXypGac3pri@E|RR4@jyxexqwQ^2rKbC|xzX?$`n1TV&p{D z_av5);xrx3%lbd=bDa*?pjb!ykIF*A$p_TTHi{Z7>?;2BxEWQOZisRUj^aW6zgXtr z$NKwDX|cSn4`(?mD5|&GR{2g-kv5D%S+r{$@%dZE4}HWbWa| z?`YQOCK6~TVZsJgwtw4srg)4oKP_o-tgohco1+p)Ql3L}AO;ryQ57Ch-Uv58&4=tk zX}G?H*Isy-uo;KWpz&Wr)N(1|GM?1q?C)tPJ7Wxq^)4Vscbag+Rkw1hLPp}>JCCXT zV>Q74B;kE^A6YXv7Hby2#gQ`6oUo+=BWlgqjO}skUE^c6wdxlOO|NI;+LlnaX9@Hv zR|jda(n9vq7CirKf;7#I)UN6SzTW>0D|v6+%8n4u<*os~tZc&XgGcc5+fu zl`6M&!3R;iOe|eLrhz8w5775VW#IPHha_mrUR3f;#z_XlP(!^PSJb((_u5(P-_FlW zZ_ZyfHE|qkeE5*-IaW+r$^h&lZJ=Rd3ZFFg!Jkj(1*vrgEa7t;#tmMCW<_|+hTajS>_|5iT3}$jQDcYjD2MXyx+;`eJ^Cfk^_ko5Ui6GM-B;$cqQ!%Z` z5gq>YqIlbWCePoqY9(aE6}wf%nI|IYD1BAj7b^*S$`yq#XYjboS>vH-`$l+|a+e!u zAuLj~0WbESM?qV)AR!|O*S@XAPx8mO8}H{3al}|I{+BPe>P@<+uCbPGl2L_B<9b^5 zJcW*Y5iMw)U4uFsZ*cWeC-8#8Kb&0Q$9|7PRx6_@UaU7lyj52KK1=OM-OnX3#70GU zfAVDr{bLEU$6G;Rh9L&G*)wOAP57V3LX6qGqNI9l86K(?WA_ndk-tweF}7UI-8^xT z8`*J&`}p`34OyuN$8Ub252f7bH;L8Uj=GPiSe(q|IVa+>@#>5YTwn*jmNEr>DRF|Y zhFH30IMlfK(D`X8&@f*?=={+Wm}oAX2>wV%j19mgDI=J!e-JJYxWN^;L~zfiyv88g zEF9HPZ7)2UP4;NoaqA2=avNeL@$&6AbZqNT_#l!8g$>$t$E81S70P3jVFez& zX3kvJq_9J8pRgf^d)N>4QdS{1jxP4iqUG|9kn(sCbPw8tjphpYq_&p6T-=B+$#b-| zPDUH~hXRG#@tD#77FWzZj|X)8?F&;kkhABZ_GftguiL|?f3w{qfEeH z^eT`xaUypn=&=o7&*I721Y9sIj|7SRu*kmwgU`>$ad%t1feL8d~SnCa?- zh*{KAMRDq@`Zzi zWrF4D&u}%0u>w3f^|&yS`g|s*7;=__W&xLXwS_h>90xP4{?WL@yQx9?FVSy<8r*$a z2c2w^aGjF|TR<P7sU#W)H~BeJQfQq2ALx|;6x^w!2Q-6m zafdu}jts-V>PCU;<`honN*j7tmqKk5fq zdI(_l?Hx7UK-%DYzWw2l%wx5esOg+JX70fEADCdh;ltk*+PpF_Sd41DfaweBRayc zp?eK(-B3$6o|X{KywwB|*G<6s5kThVRMMfU$;g?_Sp4-oYNSr1WAu6b-oPu|dvGtB zh0H10XEIule|bFjlqMI?yOl|sJ=CF}pV>bSmj)hPK@L5diaM+I^>QR8}u|)pJucJ-~_6UV62pc~l+M{yhd3>i(vC+skMl?=IST zn%7uAvd52)&SHt=U!1)nkU9F_XA!>?#0E>ph;J3`fY4uhH1D<-$ebO7ul~^xv12ME ztyBP4RSR62qQUliZN%oa#U&1`QV_;_%nIboaKA<^x21d;ndIaZt$~4%Zj$L5pWe>$~%IG>03eM9}ZTo*6m zA5|r~A)~>C9k|7*bV>j#Glf%0qoAY)Xl0@zCu?^D7rJ@k!H!Bir!twnlYPuHYfvw&MBx{RCloW!Zs zZD^vmlu2C|GfkgA%=>OPliT8mvQejS!@Ku%FtZi=kMc| zpUU_-Kbfl<_aC-6ox<1Qowzpp0J}S>g1u{26n{re@ox(&*naLC*ZOQYEWG&#d}RvZ z_t}Y1eMJ{;PvU(>|D>2QwZgTkd{5Onl$yP3#?wQePb@~$>*sJPuj3hW?;LxeTE?0>zk`CYrw)36bPRo9@-_ZLK8w6^5*kA76US&3&} ztKrg_sN2f>o;Sn5VEB-|J=If~iVO zCn27dJ}hG{{a;!98*Q<|qd|J!?=78@bPtyCo`Jyf-H@bW2bcJFh_?yg9!$Wjx|8Ux zMj=%nU%PclC+0gv;QF>%+?6F) z?Y&fYm*|{NwI3~$NO!6kK;LY2NQ>43kHunQyDwAl=dUB)RXl@vr`u3s=YA$Atz?B4 z6vdn4wZub{t-xnT5=Yucfi-l&-$%J%@}C8q;Wa#l+a++hHp6<(44c_|fr1;KlQO0c z7aZledEd6<7LR(7_WgX@Ozvojty5F+j4uyq*1E~Ow^JR~E%-*GwmXs^4RTz&%q)Dc z{yYvEf5bS2AhziCeb%KXBi2}EEPj-=3P%3$rLtR(0JpIXG@UNP`8zY=zVIVmGk6s( zd_(ZnmHD_^YA!X2+r*X6QebD7JjG{QEl}l*p~!$Mv)3$Fwjb3~A~N821)Bd^!}4pR zf!8O|xy@Sq@AVZ|cyk4AvC6_t`=wZ6dID>*En_vuTG(<)9q~ZWOKQ8ggGztD1J}mC zh5nFzkRdIAD*qx{nAys+4QHXZ$6_pOh^HUzcc6N=8qY5(L;n&P?Cnn}DcrPCAT0}m zA-DE(%WlhnQm+Nb9I=FjJVUO!_bBPTKL+*c_G9kbdh}8n%QP0{v8V&D*vU(eSfAug z)~K1zWlZj%i;Q1FYWZ_0a#;lBFD)UZ^8lS3+KwWXp*Xru7oAem>F0@s*cPD1s{C>h zoE~!0#~VsUTb~!~S$#=hl5l|TO3;K~s|;b?h3OFYa|G>_sUtTf%}^`&1omA0fb+T* zGR>ri>=YYdOLu={!QI*zt$hTiSH7j&^FD&>$#S@1J%j%o0q1s3;WORxF?O5|-uBku zj5NGyq+>h!dC9Z8C$C_O>1FO*YjnxTWs!p97v}^P{ggxI|+&^UrQqq!rQ}{gD0y*VJPOn=VA#zU*tqN*>kBGnr*BJ$Wo?YaUMCmADYXcC zcEc`skntYAD_;W7y#O^uuj%pi4M<22w;|XFLuVbLbHjdfNebFbDg7O`g)Bu4rD>e2 z;JV<~eg!h($sAEyRUVos`l8Q=G38*r|3B*^+n=47VOii_LaPk*&fh3~_b{ zf4tsUY6Mej%x9T7FIiz^89RIBDhvB~m3!4(NktE;!F1R&2+v*$o`0vpA&E6Ki1$eS z+w_nN+~&lkDqo^^&Fk?>#wb>6QH({7Qg~2WhPyLKorDBTBPu3dw0DUL758j5FeQ)_1I*Z*tR>4+|>Sw)NGjsmh$&K>kC2+?Jsa#|eydQQS zG&j!%E$QKKPtr^DW8x{yU#5T-Ia^6Xwy6okSYiP8lid*~sr0AgeNRs@0 zIPnt((5$eLARROk!oHiqQ(rN0JOp&s-xu6#yZtCLwjMu~ZD+!Dl}u7XPVAVZCVt3` zhX_|i()mvs-erA&pNcm@%5)ZV?Ega-nnq%b_gU`SRBe3UKJovWz>-&9YAi*K=SXb4 zjO11tXXiXpV0vH{NmZ{AC||frAG|h$?j`zg@v92VJ-LUBykJO2jQq`6*@mK#bS1Lh z048^hF?;3T?EE$ZvC=R*(4QPdpUqnVtMuETV!|c;V0Ty zY7M5_1yHCPPG7sq)141<1+9Cg^0liTQ@-l3{mTp3Me>4e>@H%KX3?zWsUa8AbCDV@ z5W%2L1I#+K0b;DILB`UO20ng>AESLZ`IHsJwRa8enDrjDpHE`Rg=J{?X&h$o9vR(J zi^z#1kwodiCfYq#7SwM~hL*uu@GgVUu+dBDjY*e9YU==_qIu7UwSaAPs$h3N{bb>1 zU$BWqm${)4RotG&6EyqpQwT~Zg+1sDQHjIgOhzg<(n=P!hxBuGt5oUN|8hyBmJEAm zV8lp%KCU?+fv!>IB8Shb$=mibB=Yeg8h>UeTp42mTWY35M#LA=e#wU#$c*6{|G8nd zNjb)*Y-UA`51IXJDe-!df;jm#e?w@hCuzeT(Z$&<;M;p0zCB(H=68DNsUL{1EN_!J z;?EpE@zEEC$vlNXmwnr;&BAyssW7&ldmZN@VABJLOW`8&#GB8NbDaPWMoj>=MGyX5 zyGjha_t2=pL)-_IGss5?;m67TOiPDjha)=Ky8fZ!OUI|cntc(}A;ku)QahnXCK7H& zI79ZMQtIud&ALvErh6V4adrAz=&r8^@l}{9+q?K5DkVpuzgr1c6grJmX=alIliz|h zEAps8hYe_{S%dP?ZmRmPf=GUzMor6dxk~4BERbtPof`?vAW_7o%qe5#Mr{V_c65fRThkG;cHLKZs=ZW3o|B2(j&#G$O`p2w?(69MQ1;; z-qnHb-FECPujiQhb`h3j@=W5ElO*HhW3s$q6D`{$0YS-jaJ1Ed=UE+~W^;UKd004U zIwys?7ayRz<4iWr;UU}pp^JG%Rx$mZC8DMy8wKe$og{vF4J_=v4_AJzfr8#)aJ^X* z1$ogWdk0={$96hX$wb5AXk!HyrDDle3@OKC?Gad@&@D1%exxC?kd!CvqjR_FK>mFj zSSL9L4%V5_WQ}btBo9dJfM-_Hbcq0|hZ@ ziA3viG#UT%0&R3Ph0|SpzZN+O41%Po`^GEubXB=vNvs1FhZW*~N`9>6MG>>P{f@o( zt|A`x#|SzrL#b(zF05?ngB>?xz%6t+sD8|)BkT2;m+MKYv1$r={?mpQ=bT3eBP+J7 zQigqNy^ZRzwOn)ada`(b6)DYIOPa>sr9Gv#U{pE>E@rDiw~Y>U%nPLBHJ=x?mIk2w zs<$|XUSYzGg={qBv*ot!Y+vy`TD)Z*UFhruXUl(reN8ZY0`;NpR3%+xL74g_5$TYr5eM_=9-c<*^l2Lk57&zU^S>(v_? z?!BBEm8_)`gL6f$>B%_FU6Ym8+{37p6$`3@#_zA*7G2> z%9ViT%Zp&2iaQ)$kwN!%M$#HXYuf2PhI>Cd6SoacXVt+E*ly1@)>c}=no=(bzO2-w zCC*Fj2lUH8Cinr&ySWvb2Zw>P+icv~^qvge8q3W;c7paliQ~*Am0A9WnXKn%9X4B8 z;jT#oqL~$uWJXOh8LQ;S^8s|g;>jY|`ga95#hsvXBMa%|Df-m5*q0k9Ov5e9R2+Oh2Jr7PD3SFye3S6=y&o-F{P0g=#R~&VOOF1Hp;r@(xK&!6_}A2l zB}PBP_{$;aq7%%uxaJZUi@#*q+4FR6oGgrXSPoOq?uNkYEp+px9BQBvO<#M5lK$_< z@JGG{JEDG{t={vRO}L-Uf=>-4pQ?gs(vh_s?JR^NQ_CSnxC`1Y4~6{p&8TPVOw(@5 zbGk)=H2jGoE)7>@r?(53?6Ie4D!Bm3$zIX4jcLS|XTa=tjiU#WhQO-2)i7()9w5&hCQNX}Qhhu;V9fXAYB zP}KE={+Y*XM%Ric*X~E&HQ7;*c2A!BY{E{Y8L~yAUSf`?H2xHn3qJQ`kY!nAB<4mw z-6%aC)|sz^l?yk4OIZTFc;*YO-pFU;$};=Ykyr6Z-*LvpsD z8X{dshwS|WHrDBoWxWm#91o>=57gM-^~qHB;wn0Sd=@c!mWZ>j19O}w$MUvSeBMYw0uyecT7iqvJqb-yM$Em{L~p06S)CQ_YxU>cR~deO~eq zceXmSM`J$V`L@{1ga*PG~TF;YiRC9uO3I18vGa!S;b?-irw7mh+4AtXDjJ{c9p)iP=U00tKg~K zX&^Q_PtimC}4avzzKO)ax6Nntk2CCL%V$27@Bl^bH`j`5`ZvrKh-a&51kqn}kl|<@S`jLIShQ@d16!^D%KOEND0h%8lQ72;+ zSXyYgM(KEU&*^XMsj|Xwf7jW`PfsF=hAl9Xm z+zyVyA)!6QYDqRdw0I47r|l6MOa=QM2c5c1%n z7wkLK0Nc|;06r5)+dGCk)AL3U)Wih#XH#fci#m><)rV)D=dsnoGSnyOcxL5jF5>(b zGKc1o)Jp|a?5GLLG?&2Cu0SZ*Z3Pu^U+I4zq+y4{1=?BDEt)ZPI6HKpnCW5}yL%>< zefB#jco{1T_0Nuz#YRbBW>y9{75~Bh79}u?If)~_U7%Or_>pXzopj*oI;01*m~x#J zGdC#3q&PQRMiWG%o|O=#fK>9Ry_y#6(1BrF*Mgzcd6=<#6!b5Y2gAt&^uX#fRJ;2n zH~*eJGk$!RHQ1Iie8^bmrb@b+YJ*$G4tnJ6LvU0tfqmbXLHfrunxy_5Ux>2kUnZoF zet#p*d6)2lxhae1wX^~HwfODvJualRU0|LQLgK4Wk?-Z7sLYCCFuGzJ43i3io?Xh& zzjg>n-|nK*7Vo5e2@COv{B9O%mB9uzGFWkI6+7npjSi3Rq3zypscP>VFh83QdrFqW zhvdoh-@p^JdA^Z$XGhT$Z{-Ds;raNeb_TnxD#;6{n{dl54^h;vTw?TP9~lU?Cud$s z!^+!Zpy-P?#Lqqj_OAx%aOsg?)ANSfOn_hJPeV z?PtG{qOlpr$iycyB=DR%1jS9^8IHc7MYe%=d><`p)q^eG74+R@T`Cej!T^^nHt3qo zoTeRT9r2@BSgQo&7?{&p!~=SpYhb-$2n^Y04G&bWaPcQH2@8BFnD;b@hHBg4DUe_e z`Zg?_XR-ZBy@vg0MwbR&2$c#FrjA-3T09Y1xoJW6FlR7*6At0I z{JbZr0Sh;)gVf{{x+2qFbWp>RT^qQ`{B-l#T=il$wU46}3KIYy+@n4&1yC`w6h^zx z=Y1pm;-|0#*LwTYLvKB3sc{VXqr%^29~d%YFCEtCEyfvPlep|5>g0my39{g^A!#4{ z%IDQ;Kt>7A&TR_={K9*lH|xW?eF`8qB#KHpz2K~I2TM4W$V3KL*xW^>>|Q174(MFGa}@!J56j1QvOiHq?>QUn{49M48S zI>naMM>6Xx5-{GOj{crK9&VLXfpx+S7@D#WiiTY-jy>^<`+e}Z;42NHt)~^x+x82( zd71KllUghu{*2EEiY9Y3)M@*tal~*~ieR6tCirEIhRv5wLHM?VV0l3iE*~@og-h?~ zw^`firJ?co-WZ_H;sLvHsx7#7Grk%mi zG-r6esgXJyJAwDSw^7yHALN@+H#x1BhIK+sR&Zq~%WFu&8o@XmV$~$b)O=1nmklKc zbZco|kv3S&6u`N+ z#!Q%Xqn{q$a1(rIKZHLP(;&BH7WK4B!O`yH=?pCodbFccp!c}~P$7!vtOPp zbW9{WrFxkS_bFjlv=kvv-U#5UF1$Ql0)Dw=(9<*%8b-;H8*ms))2akX#)s(6qA>2n zU@JN~>#!eQKXH#^HTIfn(3_`Ulf>CFef+jsFAX7A;W#>Ameh>()`wc;P<7ALi zRfIm5D>Q0W87HfDkr{YgW@T%RvoRi_?0BO#JQ2u)&#)D!}d35_$0qPkHqUvcCw(4&so@jZDUxmh0m5rj&TY3c1!7~K1DH`xbbtq`u zItVN8ABPFY`JF@Q6exMpO}7sQ)B5$RaE4AQldMW&jgwBY9S{FvkeM;GZT&?9PpyKI zbp^1N@73$V441%Wp9BdeF2dis~sN~~AD86MvH#PK<4wnsNZbSth+oi%>Bc<5$ z{t$c__>((2<1%sD)j@1;N|Tkt%4qfUk#J0Z3fy{q9*WABLGcWIPQdQx-f2A&lr zoj#VW2)@j${Zbh@R>&rW_R~vm0QAo2!P=H|crm#Wu4j#bJbg*J_+J2q4&O*}dA4Oh zRh($)^ma78C&z3W{^6Zv@%VI{h)lYiO#VdqkP9s_0$Z3VuzqrjadIwMB~^-wPnCFv zOC=`E4@I~AmvFt(V*2rjC4J#BnOMi&p%*q7!uz^0;CIyrM2-JJ>)w$tdx1U7uX#ZS z&il~y!*Vgz;Ub%~B$;igNMIMWw$Z24DOB^!t<%+^u>ENvD3+Q+qHQ95F80F3lJ`k) zUL%QF5?S1r)P*Pcf$@UbQ+#+}2j2XW!RfwJqzCTF(8b}Vq&v2R{`YkvgdLdxBQ69$ zRr*@^!SOoOni&w%l~13ITR=nH4A|Jxv+NQ-@6BFS$c(#2!Nu!BSTKJQSTD?kg%itR zuemnZyox8kFKxg~4KuDKVK|i;eUZ}~!)G8hx8t(=%~&?t5975A=p_9CQmGe1);ZS; z3=N;qY)f-!OqvGf34zcZzZfhu1aPKfD(v#VK`q~_)7A4gva(-3?D9`PrWbmfCEo+s z^m-;-Yo82hr*1?2X9h`+4dBqEbKErFMs8A-9=1g{kUQ&Uqt-nIws2zs;-BZ}V{!uz z74Y+?zY$%XLC69!THycn7oCx926@qQ;PYEwcqd^4DnlKi`I<3EcVy7nIs1s&xU=je z&m47<-p6L*9yWaHEbt1qf`TCw=1jc-gTs@cxWEXuW~pGWpBXt>t$^-FRme`2Y`l0? zg=NZy<73eclqxL7rldPmpx{V{A9WyO#h>h%`4EsYng||-tKkJb2JfDlK*U`)a6P60 zB|!<)ShtW9qz15DjRAPV}r3tM4=mss0UDV4in0Cy~K=Xj(OzL11`!qY5$*(V>V+#l<&9sH+#gPzFaR&^w zM#FN$5bAN<1G^>q1YPMl1YA~fi6TYTt}DT2{+~yy36_8-F`J@ zpc#NU3HdxJXURT?JY@ZLr$N(fy+YI+U3P4>e zk5=q2Bipy^WLZw9nd8dsEd1RPw&BPMSbu0P9M1#revtt_=~3{;a|~F$)Ig&&H=@SxIhWV(am`~5wlc>IhpUES*Wn!8?eUCi#P6mzH^&hhkBRnzRl|92sQ_aCIlvOP z!>~GMDlDGo1v>MMA?3ggx_$5eC^`>^p8hY4YpOIPTPR8ck&I~Eb7)9qG)V&~MUf;D zX>X;Jq@|*vq>PHjeV-5w*`ut4kiGgM^t-?Rpm9H+d(QJb=Xu5RJ^CBSSR;vEJdLE1 z5n^msfH_VIu*Tj|yU^JsAC-L9;>tqa!G5AgC+lHicD9!wB9&K+IT0gAINvGt`M{*CZQx$Rzf z&vO|D-`|R;_7RYU!3;rLk9RkxQ~N{7uD^LJ$E)J&|F2XLY8ce=ei6;9;VXy0K zPV}fM+kAftTf1^5w@!8~Gxi!u66swN!!Mmz!@RHLV=-T{>8}r_X7EIVrrQvS0 zwONNwczL1L0Vlk1!3Y&Yi*VDZ6nw2Jytj7$;@4@9;X^6{6(*1La zKe*L_xk#R7;`P1o=uJGt26u8B-6uCb7BbT@e%9#65CgaEM14W$zP~&ir`Bk(XqyDVb<8AwGl(F2I0f-BN+H?EsDr}g_ScVGmn{)oYVJH zjrEVd@;{DFp)eaI61y4BH|}obM|U1!<;0i}!20T&=Wrl01pMd=BAZ~rA@wfed2prZ;UEE6GD*&$4$Z60q?^oFnPIStdpt>KB~6;A$l z4|Ghl!sGc1aYg@n%s#jockOk=_beQ973Fbd=Kl;HJ9b>fvBdJ!ln%y67#SY}R^WE>{ z;L*fvxIT0oxNBQ-`(Av6x^zc$+&%}VToW>(e_ap~`~{C>Kh9bvjvvRl!Sce96m`*- zl7*gS53@MRyAp+U(N4JSi8}t|FJNFrE-v(*g-13U@+XAPyQ;zxR&~3B-}!b34TLC? z-3L83OyDT$TKX}cBWIx3Itz+~J_!3+OY7xC#nALWN6fo38!a|%!$YH%qqA28X71RE zUnUR0390Yg0+66ZzeDK4OFP;#O_G!+`D5h79cV;zvEgGOe)dm9?;2J7=Y5hdzqGJn zx@I50u6`_gH8_nP>W`(8SM&JCib_l)@_NCBAH7c6sy$_|^vMSK(V2e)4`>=2C4jhu7 zjQf^v!dAszXu9`_zvqTlWryCja3*Vh)Z%4m`-?0b4 z?wBlG)%pr&)MsEvuNi*GS%TX?3LasU1=f_uqGPB&N<3k(r6HVc&%DL51*Xcyh9fj| z)FS-(#|-03w_sIp0Tvd=L>m-Mh?WVYsXbdQc8v%^hWbr zOj;Wjb}wN^_%^sp8==hpF(<9?3%ZHJ`1OWpg*IsBz8Oo6TyW>#81yMo$JU@6a9Y*D z+C3G?SKXSl@-r#$eFTclx5e4*f{(Md9y1;tL>GO)oY|YXNrpM+1vy`zX*dKhAZ?S82tEfJGAq|Z1qA?w@s9NiX^G~Z_jh%3(B-|=WeK5eTwc{H1 zKW^cVcWbisHuIRv%gHpuPl2*;EMXJgDzh$GAEs%R1ov*9hFP2{bk(eHOe_^enV;6U zaI+4|>v`bC##OkxHypnx@4;O$O6YS%5@sJf%(lM?rQcrG6fJ+2nQ(zp=&{eV zUpNHkr#PYW_(b%Yw-IShES`KCj1gLQ;Oc(|_%~_-$Kq`w->(+UHXNN#r_QTU(x15v zI@7xv#a|2FM%z1hbtWBx&Z~g>BMGbvQN}C2ra0sFLR59$f@3AE(W*5XU!+)|{rD&F zpRO%?7ZT0-gV)hsr-S4>!4lOQZE?Kaew;rd3m;An!Qcc>y!71+2Jiji`z8)yTOywF zr^Og6U7}1SCr44c!c_i`eRqTU=0ogDYd5$k?t*5MFI;lqP<&)P15IQ(3|?%G-GSct zs@WNTR!3t{&q7?Jb{0&OGTF*NaoV+V0o^Ewq4`^*FzA~ncF(cGTY1&Oy-*~|k9Web z%t-E;jxww7p2|i)H)Hz_D-fNLqPkdt=@#0?C;U3k&kpkAqt{)Br7tW&G}xTGsV9N$ z)AVul8hy-Ex5HtV*9*CK;q!kp5?8k9;`zn#a4jvE`I^{KtjbK9A2FZgykk(kITCl= znuJ#>&f};p2hb8sQP)U>llU}}bw`h4$)?dPo;M(g)3S8?gFo9M@rOTD7|QzXO~6F5 z0S+h_!lRjajS1VuFhYsL7i;t|{HqIER6C&0=RLU8eIGI!$_ z#;JcjjhdrJ@iIn1^y=nrG9Psp@})Ll)WZz)Yh8|0O9h_M^>|!ta{KB$p>{Mm>pGxt9f-+8;&5tX61FJ$p@>oh zw&+iToc^o4t-u`W%e7+*zW-(WBSz3ka~1lb3p{V)#4o*gi9PiC1lg70Q0^fGGhZv= zpMT02aK{`qbIs7RY743qIb%aoIQ9x!-{icTFg(bf)wT>F)Awp*GunfePl~|N7xtp7 z*=kg@C`Zk_U|e-=8@8-X+G%o_zOftd821U?WK7@S=b)XG) z8WcBakmYxWbxNFA=D!vH4DAm6jK4r?_x_|RAFJ0&|dfp#wpJfGz~rnT}Tl<-elqW#&oQhDv!rain-u6D>n4k z6!yE|3X{lLL0hb+lH(W^cI$}*`x)_?t@=?3X$q&{{2~V!IH$pP)k$M6TY^z%OmMJk z6V42D!HYowxW&sKz0Eby>5~Ju{G$#>b3AB3DUb^Cr7%EhGY%%?VUevq{yi3s8;@k* zkl-9RnfKmUYa_6g6Wy7J%m;Q?T!;D&>5_EyX`Vy}`1%1!!rPx=xMUWrleQ9kiK%$v zs{(f2UWr@%mSF|I4NK+SaOB86=;OE%cP$={k8WP$S(&h_ET2Q;hwP+OJr{hz?Zk~E z4&pH9Q2h643zljh#6RXT&?#TU?^oAj%JPNmp5H|3j*_CoGpEturXqe}f;=;w@`l;@ z|AYnC;~>;u6@FW)q4`o}?CxBPNv8I=Z*V8B;XG0CN*HG3ti@~Y|AFL$u}nHnlm-Gv z5v!a}xnK5T{LdJSbP?WB9eLOqy9+DJ_hH)j3eKj+j7^l*Vvr4gK@bAb-0=#trVq8pRA;ZK;K0q)IWSJ`n>f&2X4qA2+`>iXA$j$EM7C z#$=zlQt<{Ex-NZ@`S+`_5KCd!SC8d>+6s5*UOu3?{hslvI}>o5iZM>;amPKWK6t-< zH+~J?fpy!W@rSx4{%}o&QOj*O+fr|G$h4=rVs9uP@WrqB`FL@>psC4bVPH%)x;_-a zTjpZ0T`z%6TD^sdD}7<-yO&dW|5Vy8xt;ZAS~C64|JcTBrQk;;AU50wo|mW8w-=1Z zr(0}r%wmxlXc?Yn&3 zRXYvW9gM_|%lSBLY7CgD26B>dd)RTozqo2MoK_i6qbCbzli`FZOs8Ta%RVVjxi&w5 zDdhk&*$96;=A&z&3T}G533cl><9_>4bR89pC(nlAsWxGzf31eUGaY%KC_UzPX%wB; zSWBDNuE#@H!!UbDn(&?DiEDkfq4$9!*zn*Fw|xBxKJ%14i{`u7lUzzqk1eX`Y zql#?=+B{9c?;kef^t&SX`*RH6Z*D^C;-*uuf*0SLu^9_LWa0<$1^DlC0dCoojH2!w zYD^mqb}I!|Y55lR`K<_D>GUACA~|vcfuAiR^c}BmW@rDc=aih!Lq|y{bbkA1Dp6{l)mg0(U=#`=~PR6oI$>I-f_@_SDd?COH!?2Dl+)recsy~ZiDrLcfS2^yc6(;zblt$=;g zkAt)9UTE3q&8?X-A3x6bLEa=5@1Bdr8{P*o+%q8_41=^*T1KX-e{2M!l`8JsYNOL z4i>VyjOor%pw~WvS2({A=Em%T+A<3qH`NGdybZ^q$qD#&ZxZhMn~E0#QZV_yBn>160V7K@lv*7%&=90 zJ{zr|v!{oW^`gmiC}t^plz5)~6u4vu75_kXM?Mr?Tn9y`h2Kwm8Ctm{;boU(47!t! zO~VeOzi&3m?TSNN6J4BY^O+xxf0*}$KP+lv6)V}}fxU-P@w|E{o*9vV2{!vtqdWv( z4~l?}-9Z+*DVVw2%Ts>M7J)$}Nnt-^XC>leeq(e8kYGN3!n8ASs!F{*4C zrg`V$h~^aBt2`fVKdQp#bJy5=j~wP@sYpp*yy?H;qv*u$Z|vinWG4UY9((vQhs$|g z3UQjTAS>jc)F-dN$HTW_(4(W6^XV{ppD4tcKeF)9$#T50co)v5->}$DnjiCUA}y)k zNNwoGo1FS&PR+x1;aMLhMT_!PoCAG2reQykWyoV__Pqeg{1C`8)qaPmDVM zEg;@L6`J){;PKBH*zj`$2DE2keqk!6mrTcPAEe;XxA!bk;8SF*Ql%zuKT=mxp_fdO zOe4=S+X+vY!9YLPDVGQLHpGMJaUEC?<&3T)La|NIi2d|W;@8kxJfCwOo!y(UZdp98 zI6DqyZzu7Klpe7m$2@6RraJb|wa3QT3{2j%2xb0dqrtrbbg=J&5W7sS_|;c-pmHd6 zewa(qf+o|PF^Oihe`R5{ee6czPj=Vm7Q}u!0Usv#gPy<@o1N>5QF3u;J?|90`BjER zzZ=l>=mm5Wvgn7S!cgqZS=g7K&yPBBh^?1!r0sDII6B)8S02wm>$=(ac0@9I$REd& z!%=|#(fk;_hiqfm6gu3pn%-VFpc3Cv^q{hZsZ5ff-@n93QgSH1+(eN2#z*K~vc((q z?x%#}e zt~v7DI2&9&D;+=8B%}NHNUZx2foFO);4QCyu3!Hdi@J7`otQL>F1JL|DEutXd*52MFdJG2>{i>>c+aq{=O zkS+AA6n~W_#|LV3{GKgs74xDqh7*bFlA(}UQj}oO&)!wP0kMszKsIhAL^;d_F|t9Y zng~==JA-y9wP-Z14IgT@;lbdC*fRVe-cNY~b&is}&ej=hpbg3Vsw2jJ-;9UnX5jFF zCHV7B3TBVV#+`8q&}wYK=GzRg%hrZe7Zpq)+N&vevpfx*`ksA%r$nRML}{<0EY=(q zvP=4AAYyBPOD@=9=gtIt$Z9d~@^|pTro3hu_4Utb4fnP80fuM4{hB z^+v-X+Dr!fS#|1i&hw15un!!@m8Ub%N-G+>_$XXqY>lTKL%CN%HvREwadODDAfLn( zvNK*r5C4rJzdtwFsl0dWWT=eLMOGqo{8z)v<|RVKwH`ja=7eqEvhYPB!{I-!pke7P ze7NZecBh|1tNA;HXa7^<@BCT9ow_kiKJW}g6##v!GcospFq6*D!olYU@$ojnlV81s zFDx2Q|4vM$hws+X5z7R69X6jFvQ_9m%R$z-vWNNn^MdQoQovxRKa~1vg3&!4{4mW8 zlPU_)dJ2!l4_a^__9j*g?ZL-$iZN2s43jLBIH%Bee5k1%4L;SyfD%)bqa#@8>w~Y> z=Ar4ROnkJm6%LD7veL=pX^NC7J#-5t`{HnF6IUj^wy|{8Z7iMj`pc@Oir_EFYOsi! z3}iJK!d+)z$c9b$S)&}Wsve_ewc&j64&>K%3VHnh3LoRIwAexTe!C{XGEs(*vG6jWGJ}j7CU114(j#ZLESZFV1eRjST`iHhkI$~U}pRn@bdo!MYm?*iF|<%Q_zTu zo-p)!--_pg?_vD=24vqtu}8I@BavT?l9dMJ;M@x*4skd!E(i5a3j0WA79Md(MpvCd zC{%J_XYIAgal%q+n-oidr?bh*XAzZ+n@;6kO7u6mkNugN0%s@*+%~NM6W{;1za1Z- z-E}S&4jjT+a`pHmjNz)U%~<2xg?$l~c<;nY%*@e+?r#eGV`pPhU9OF%jsbq~%EdQP z!T9LFF>HIDf|uT$huXglY^aJhg=Trvy^vgLyO2iri^q}G7FBxctxoQxQna8#0T*T0 zfwaeMF7d)+?yAmPus?5vJD=yG^pP4IJkx;s$qaK}b>WyvCs3|M9)CR93~AFJ@_si( zNyOI@dp|f~t;aF6kX(;#sTnA8CKBhVZvs7k5t_eEgIq_3(!3dG>Eg2kEOX5L7nt`ir@-fIJOxlJedPl1k=zhOr=W$+s-b3jt190qKz2zTQFP(4Eg zlm7W(%Bu6&@~jHqt5oB(1q{Dss!Fh*k^mB) zv|v?U45z8-0ls^Np|s#(<{ha*^P#8kJ62+a{8jvIa}H1Zv%w(qVpw8j(U|*Ag|3X8 zj4O5;;(sm2F?DPxid{H{&y3=5RBr|(3K~FTmUv;Dnq^TMR+`=7y~WZ(0yqMX6cQ^ ze922-VK<(QXsu=<7Z+nm%L>8oEy4g{-Yu`lMAsR0KXZIlrV6AZLKQ9M&zB++B7aha< zR>x4Qv=tWwWTQ!02k0kMLceJp+wh^PkxN*ODn5em?p%VMf*yJDaWW40%)!3cZ;jVw zXVbJ`8wxTmq|H5@WHKU_Y@=04PgjxZU;kwe+n%#Bv!9?o_BFK5ap!v1%W&n+xiHjz z30Chf!f}2181y(>n7i|^I_Zkg+ntFcn)5U%VfM6Hog zc*{5eqf)gO-x?MiT`_&uaSIBCd>tBLPGqUm1(@b>Va02%)X~0P1y=dTB4+pmOa-Ut)=ytEr zJ@CX77n&DfuVWgk+cgtC_4Kpo$Q%LRhMUz$8kNf zNR%e`BX{9;P9)qd9tJCy?l<1uR$*+lv{$(A*oI$C3UQfS8hVaR!;9Q$T%UXfHJw*r z%K5jj=8FWs-{vo?iBQ6>pY!plPAP8wu@_%qE{f{!!v|wGgImHB`nTAMF5k(e+?rk* z&)3oh7g?I}WHQ-C>d-ok8Kk>+4%S?%gyH_*jQ=pH#ff=ELFUG97iWV0l@vG{lwoXUuE27x7lP~cRcL6Eg(EbggiKK|)}1|o5B8nMf_+=D z=K4plKk|tyR8^!Q5)Yu%%oHDYFphK${Bd7t)M@arA4?0Lb_Sz^{2fISH53jc2bu;HQ7=2Fr_{*r%9=D{}%c z?^gh-`yEC7$7N_X-vagCOX2DZNB9c@Z>O$P3eQ!}L`NYvCx*K*Z*K;=2;Gm*oiyRV zR2|Y^vW}__oF(1gqD^ZPu8_t0A+$7qER7j5jkNNF9%uuh=qc$KTvzHawzONue>|+f z{~H{R0i#23Xl5MB|8l`#e{a0;;{-}g%*C=4HSF#ihLTaqtjWfP*T1HNBUN};Mp#o<S4ixWWYa?ZA{xC%kw%XmMJ>06kmf2w!gmHZ ze3HnuOMydA&TrH9#EcyTK1q!_p!++etO?`n2^Q5l@ww;K1KNJ6XQ z!kw?6p_mr$#f~t6NuA_^u3IF~_Z)FIum8u={qG2xoDr_NmyQ~ShtTS36n1{`!cyxc za7kZ@&VF{H6$NK#xrESB>idQQ)Zer5rzTTx%RFLMvuI-6a8$qP1T_Hz+>3@;e2VB4 zHbnF%_>I|wiXS5}e4;77y1fEr%@Wb(#xeXBxCA4<$YGf12VQfwP_n-H4_uR)jN`+O zGWjm=z_AtrSic~jpBn@?Uq_4^= z(62lRI+m+(aYqmF0V;`n-UU@Ol-z~0?ENsiNe7Rtv%(~UBWRPAf)PKaV}Y?W?!HyP zu9t^!mwP7T;LI_&RKFYpWQE!5Ycv{Kj=)JC@{MK z_`LmC_Gm1c-j}U<~YEB0)thO_29>2~N{Gx@^K|=tQ}u-Kihw-lX%)T6ph_KdnJM0td}{ zp$Zo6Hi12vvT)()8h+JSJr?09flt{+oIdDy&@ljp`PI?oFEwXB;XMLQrUp$12zQklK1%{ChSG7MMkH{zV1+g*O-YH$o0^hv;Su7y6`hy(I97gaKYN zOhn>C@#eX?=y;$XE(_hy57R_JZ%_u+%>KZs`$gETv=OsxHlx__FR=U7DE{dNEqZI1 zNoS7qQqWAfrkxU5q<6NTS?-xguc3x%C!5mm@A|mfs0`|~G`RKqeb|`?-NsrX%g|SR z8wT{uMy->-!O$E~BJ?0$+vAM=o*Ebw!a(|U5BqSq5R_)BVT0dr9Be&>hSLOo-xfPO zS&|R;g&qIhe~YNk<|KWQ{Y&vOLz|ZEHYM9#3Z&UHm*#)F!)8<#GnvEh!Cm&0@c(Zz zo_E264KAGtqbIFFnK~cryEY!Phlyi%y%j3-B_oLnnZ}ecIKRLR4p#NCExngu%rZ?( zIK2>a+RJg}3VXbE+z_jjZDC$*4STP$n(RkhBJT*#Ctae9Nfs7M2kRVh!dXcbjB@%;waiN0y}Kn@IRe+jOm__xd)`s z^86T1x2lXqPv$}9;|P2p+&3glD!_Q_HJEEO6~jZM;LW`6Ed1;~YBgyg19!QmtLksb zK_ZOJy(C6ab&8}c=R+E&r=w=1AzUw+3|88{{6Y;o*5&aZjM`+2f6f3V)IWy7aVj`z zyB{8x*^9T2FT`7d2fE%(o>izl;NJu`!CbBn9v+Ct^1y@m&%hRyiY2f$!IiUECr=od zN(Ik5Y1-FeP3v}FroIcwY`yp}diL@Pi%kuowaqKgYRrBxomt5}{gBPKsjIMQzf~}@ z!3xLkR>2C-3t+lK6HkT&;h@!Ow3aeN-v_th{ceHNab5v_h;@UhNju!s%)w`p`>@MG zSWRu)!1zrdf4gA{rT84Dq`4o+R$8*@y>2oU8D3@yS!%*(zl4?g7?XYI3|#cB7>3@l z;lOuzBXQ|$ANYjrs|EOrK7RhuyXZG?7DCp{6 zwp7B0DU5jl7T-_8hUi1a5;ZpLiQ7uf%g_`JUmM}aB@e)BeG{a#EyQunJJ48r61wV5 z!h@}ILF*y0#naEhiIoy)K6V7=Raarrd^@aiA1QEqEx{_Wh>h9jNh`+@y;(4{$tUbH z6^Z4s@VaO0-E0kVUcHh|&M1ZSAKRceD;jLCTxpzA6viCS0dzb!!k7$gT>GUIc$F7W zr)Y{5MxH1iHyJe-O5m>6d&b+m64^DoVvr5|06Q)lVPL~4^vf~Bc`-w9(YPPnu{)j2 zK`WLTzg(xJyF;5E#5|&4m#OTw)hni8`I&|I$I^C~i%&mT!90Z-(D2ru_ZWGY#g>$T z#G@H#epwD*O6-H|rGwz>Z;AI-TjP#7v+>rwCy;jcH6Leuo{y|M3gr_C3I%@Gn4DuM zvrZ57?{tDpIdA;0Q=GC2vS`TJ$E0j3+9YCBO{wGOvT%248qmvU`i~qaj^)elA7%@^zruNo3HZq85lAa>;M+YED};yY)_85a=4pg)YR>~4SkDT~UU1II z1u*f%2}nMlgg=dvQA2hDj!8ZPHJ6E>1ye~xvz&A~K9G{mcdCyIrCz<=ET~VD+MF)1 zS(B$z`zm2kc~b#N`i9()`l(E%CWN`DkHEu2NPHQ=n&e9FJ@fwEYAzoVh0vxD`(9X~iVmx@N@HwP-zouo~XeV501ro$$#OhtqTmatp?A> ziunE8B9zqm3X$7Xa7CLk==@G%?Kcj?jS)?7!~7xKetZVmQWqTesRv~KnuB-JF($Dt zkggYArn>@<;QiPxa!K%J7Db0x&$SU`Y#Bz$E-&Ea-C+3a7Y!0OqVg zSh!IV?x-g9BeQuowF~U%Tb>O_Wm5c3BP^Y<2ku5_ zL3g<;uWZ!K((J0a^td;$V`3pp(3sDSnwJME`-WrUi19czYBKhF+=QPgvAm*18SfFY z9Qi9E}*pnpSR+gC>2(v zvy*labnu}u21OJ=-Q!B`PxCVVtj1sVWu+H@_IZIXV+-k(!yCO4N}%_ZBt{wZ!~B}L zc(u3$nx2WX9o3=S_&Zi$UXTP^Ev%(NfJ-qlG5Ub zq!GA|s;7nVx;NDX-pMC+zEqN0#wp_7mvwN~RD`pSo5%Ks4Y0?CL5%l_7xye2U z8Y`xpgt2#i!-k-Gf$yn@PqafJYo`jUh+6=?;%?yC9}UvF8K|>25x2B=fbZ)VI8+hF z{`RjX8?$;kn);nW4z^N+;b)ee6u}otO{LE|PV{P1GZ$LOgY)@Q@UvH zW*@i!ej%%2tk^Nbn9X*^pZH?vJMtOW@luc~P{xn%Cc>Z9liB^B-r#>Y0%po)fV<$g zSA6xwbxLQzaoPg7;Wm-TV9W7CG(J|Qma106G#7@b4TCemsTJZU`N4EwZ?E>ovGg8DqRG zc?Y}y(vUVU3FCat%NzCwz2c?11P(_`2&YnpV06kGR;-#T@VVom(O`Px+%f&!!FfW@ z)GSZ9QXYY^!n_@9PzC-Eb^=o=U?94Qj@vhoYTFyy+*L^#>aA=-;cWOVB~20A;^^Ot zN^ttq28TOK!1SU@;{v?Kc7D{OUvEEfF()H=F-aTNcX|ms_GucY6KW0fcn8Q)6qvx` z3t*~oS;PAC^Fds7Hb@;_E^v5r&~sWSUarW1LET}XYH)?ML`0JZHq$Ip3S zxsda`e89LQz@6ToEMoH8Mlj_xH|Bl3nXO(hpEW$W$X|N82zFSCW0Nprk8N$?R;g7R z=R94?Z8(+z&!s2enOo&3F8vg2%|am3CXbC4w;-pODoR|@NgGm1DXCtSewdyEr=qv) zx{f^={4F+qdw2vkU+94QEw;vElZ)BuPG6dJO2jZ2ORNpV-E6erLbkT5omt7%J%7Orw3CTX~~>N zbbM?MnLaMak9ARwp<1gcec~OtWHNMz9jiq&7 zW-C1ESa*XbTfT4xFYES?^U@X-y8PFJ&OB|{dt^Ek)rmo!nKJymABFc_qA|%U5uz(X zxhYA#Y*Tp*X?ZkL#FIPJ6`4wgSsna@X~#iqQ5>sUQbjTzyRrRo4`@poz^&AF<1`aJ zN)EFVxX=&zbuD=;_40exqkf*1-iu~B6Nhu3lr4ZW{0jd}N5F<9gWN9nd63W-4u|C? zfrO5rLxkBORRzJBb9Z@dGZ|X(`w*R;(Mm6yn&^Z`7&(;maB;#8nrx87zP*no*0Bc< zuJ{J#-%oL8^{qL#L+hwaVJ>yNT+Ae2o@5n!#HhfjmSq~`F=MkcoQ_m3*fzfdYbQnM z)Jo#g3qNt&H=Y5TD^XymT7VwC6Y)r|8w|L{v#CdC(o>;7;Ogjhl6@|)j!!NlgQPOZ z&emhK;tG@}U&GuiSKytjuh3Ac$ng}(HT~R6`pPmSnw-Vf3(VN;QA0^jkVIX(E7)&` zT5dx?8z_wvda3N)VS-XPXKSa<$-J$Ej?*t;tWF{R8U70TgXV#M|5X+R_B5oqik_xk zr$?>Xw4+s;`~=;4?$30#K$v$9YTp9~Q&oIv-3|ujAB~6H?qoH+5p>a2K*(vgvWeqf zvA}U+blI?#bu2Ap^3JK;Bl{m3g+@&(Z7D+2YKdyE}+g~QLZX=o#4D0lgvglChl zau*NvvB=b&^eBNRNsV^0ou5J;pR(AAt5fh;+CEmZri|7o2jPb)GMFcx0C!9*x%MTa zXu{@j`q>-J_B`rl%4{fE?f=bErSG!W>$b9GKa05&Z@Qs5BMy8dPlIKLJ-D@f*oUJs0(xFw?K-KIe09J#n-wjIPS|xcs8wydA(gEc`5zQ9e$WqG!>Z{f{AFc8!tYHeGt`+0NOzuE*~oe_?m60e9%{E6#CuC_QbNLvTMHtVPgrHB4y_Lqmy#(7VTUEGeqSdAg*cJ~yVu#$&s_IX@F^L4oWvmE~EB;%2X zz3}R3K9?lb%WPLT(|e1v)V-Z2_fLn38Gm7#(t6m&Uh$4Ulj!l!HRvxo4_E45g2(bP zoZ&$+%5ILLg=>b=Mv3oC=f`m2zF{m4-#f^Dy!gnT?lzLo}EUv|< z335!1f$QL3@KMNwRy#3}4>N%rJ7s(g!MN+3Hw>L1#a5Om&?WN-x;f(t>CZSv&ekEM z+J2cI{c94#dLoXi_{XhVuLvzu%>+Flf<)ewv4stiKrC3JJTEk&JChpws5AwlX2Td{OIdps-yuYVqejq-;$&j;!dShRsOopw;~ z-C7oNNm^ho8_=uivb51e*wNO#;QQ1~Kq*`jZ@f4JAGalf>4ro&da@HHcAG=^0vn7D z8G``MT$N56)5u;zhvM_8ovS9rnjCs8bZqG+FOVr-V_R?93>^`@Q4CU7Man z3PR4X%icohE31WTNxnkfaazhS@*eZqSUx`y zW~zJymo204^p|v)8GMQ>OS}kfW(;2T`J(ZpL-3>E2k);TO(p|=^GzC#%Rj(zk+)l=cCED^`LQH6_&o!q^7<|8u~bGr_EVs6sRC@4j>mGR`>^YzLzkDPrzvTx6((|k)yGS-!+gt233&X*RRyq!T# zOb$0ki=)-+B#4a&g{YgKA!^f6aO7uVS8yfVl^@F9J^jNz>~W=sCu-?(Q4WP`rPCju zORQ@3Iy`^Y0?xPYqUM?#XfC!EAEliIqoQe`7d(L~KJTEsIxAW|aVY&;wUl0}8q!iH z2?~uLNx7A64J|7B;OwN2@ZgjNo~vSTFiYScd))?>Um*0|Ey5=^)yIc36utpgx_Q|Nw6 zNCMcC1$(Y%K|e|3-_Jh z($IMBIcZN@iBLABWD6~&T^iCPi6|*V(Q|)CR<;O5MkLuIvfuaq=U?~fj^8=o@8^?6 zhhMwU$5t=!6Xv5HeSn6U$6#{o zdx%ksgtB;F)?y?A1HV=&rs7Uy}-;so)XN6h}0A5d*tM6I2J7!`9LU;hR5>U-IBI`{O4f zj}18lE(NqAGoIqwM06)I0-hgt$ISwFG4$ve{I_1{HeM1k&gm|&J6I2VncUD^T%cL_}9`(hYr+X7ElPlso< zOQ3(V0edj!32Xf)WR=q@NjfW${vHu#+;X3ow980L@=(TdIYoMO>l@nGCE}dezi_L~ z3og4$z|*T9w61nHacn4U+Y(5!8oQ`xupy0T9zhpv_Os3{!gr=!C-fXv$I?5?z^>v0 zOyQrxz)w7^H{1;pGrw|cCahuhLk9@&nI-gY@M#)tv4!l4)2Z}pG@J1~3@2Ie&^@=1 z^=1A+-^GzwY)mk!(-nd)$kJltV2a`sXx+I{Os;rp%(QxQX zJOUS=8soAbH$gUG7i3&mi5T3OI?rtNsFU#nLmp(Oa%cDfe4V1D% zo-*H!BK*`Yu87Knx`8opG+XG>#v9@4bs`w`;4ZujGy?s^e6Y<-7QYKAVNZWsQpDo~ zI`CjWO`H-+tA1{vV~twe`guE1y!ils@b4b1xLA*ijW|pjw-qif8Vm#H3?-SCRC+#2 zICHGBAg`wVbn?n73LLFKC5wkql;w49p5$@Rx7-c>8Rek6-w!pmtr70Udl24N#T6WN zhK|XXcx$zD?DQ-zx)qd9`3I7zJbDd1T5Ca9Y_ed--2iMjlgA`4zQexjdvUqa7(De( zI5*}$n!C=J@RB>}*Ot-pxq;+8Z7B8J89;^gW^ngvBZwWlphW5q_iND< z9By_5PUbxjSS1bI%#d>K;x22})7i^bUsym}_EeJJy0z4v9YsE}Ekf3J3?7}Ki{|-B z%)3t3Db6nmb4?`BO~x1gm6UUl13B^-o=+>Z^eDb0lm?p=lX0ID{j1cV|4bhs}TrX8p9iHm5@utfTr ztHab9Bk=6QPI$k17*z1Taq7!0*wb_!_PdM&N0T4`YCc8f~Y1WXH^t1dmw{=1?F08)kSpDiYW(zyuoPQ3e z9GV1w-tOi+e)O}KV-rcCZ5DNcE!7XIr6YE!l;J&s<|$~ARByGYbm1;Y5ye50>TIFk zHeJYxhr#|CcOfF7NaTAHxpSX-`HYelwrKc#y0)T_{?u%w^K<7={xfabGW;+sn6v`9 zs%v~+lB`pp!X8{ysew_~L!ek^BDY*xmGneeR6f*!f@cWN`|=aCbx{ndY|*5Pw^XU3 z6*6x3SZpw{#0%T@aDROioMM-z;0N{pKzo8Y$jq1EcHS@}ov+y>`C%e;b*&|f zZ#A^(T`*VoadY)=c-A-qKQ(>C?x^jk>U#%3)6 zzujo!g;e6(O=-6CZjz2YN_quOR8=^J0?M1&mqI-lYgEW(57k4n6Dy(l>|My;bs3hP zo(6RiRMj9qK_p4EA5smy{XwwezoabjF2tOU7Z7I^@p(6r5X2q z4n*rsm9XjZ0#01MmmL@yL~BoMrDD#E;@(tJ2!DvA{Y+@v9Zkv@62vyWw1Tbb#oVNS z&tc%n!KgMb9Xxa{gMCjh_w@7;(Llu}zD{sgRD22~)XXON=2)7M1=M@bpI!_$0|l83 zJSs5|zTEtdcS6e1Ls#H##l%DB2sKgZwq{nfE|Rp53)v^ZeL7mdfg*JGQ?RK4UEHEU z54(5qt_D^Rd~-2e*{1*w^WAX&w>Ws9(+o}L4f(v&@%%UK!7S716|=n^K@tawC^s&M zb~-vyqQHUrv-SkUPTz!=QdMC4g27J1{^jEOtYLT}$_YN-0`Z%yKTLanEPX&H>Xldj@NI?Di_fYXo%wN6khaX&u;6ig9JPlaPZ>t|5c%uB+ zQcpEnzA=_=cI=}LTX*7wGj>VKA{Mq#7Y77RLARO?2%ID16m&8bqn><)zgvHE7QHjX z^J~;8dVB(9&9Y6XaXTwz4gAu#fW)dyjae8hud<6rJz1{2@xm1p6dhnW7}09tLln-r~+>1Dq)!NO3A-TIST zIxGvzK8nG^^cEUFJ&7|%PQx1`g>N_)Pe;cnD^f zaKEe~*Xd>yl;TP=t$d(oWHpC3wrk0JUL0XzY;X*KJN=FBH5ewqQDK zU7Wr!BqY^2p>G0M0?V_&rU!laVi(mQ58QnV$ zf%En(SmW`Hk9_RQ9Hw?|ue9r9N3%jmd%rmuKJ+5_hV!(nJDGw-W65vg0J<_KM3gtJ zfFG!2CS+w5S@}&fl$L6QhD<9^nSY%>S~ruO|8|s3-#ML5F3F*7SJNq_Q^>Bb4y3Dd zW^;FKR^pmAO|%Ow!-cP|VDs@cxHnwja^yvc4EQ#&-(Y$2HCjY1OZ7=HCz{&4n`ss- zqtj8Uq!Zu4K04ZSTec2h4+J(&T*VZwUt0lveliG-k>_&1wDEhTJ(=s(R(8TTjPhdl z(z=yVR4XZX(_`n;2vbQo|2qp;xxWF`O)rF;+F{%?(Gh2_+yNX{P2Mwe z46E5UkKOz(oDITb$W~lH4FdycT(&kjAGM;i?Rv0DaW8tleFU?vNjcRQ7NC-c3dWdg z!n-r(d|&^W*PSET<<=zCC`Cu77&A3%8}5CB18A$bz{N&Y z1cfsoTd*Hu-&nC=2L)CZ9VTvxuLUnapNskEd(FR`jY^fhsRF(Id|)@>eq@C1VLvGb`qo zta>J{-SHE^W->o_x&?0d(+F*vt6^a>vU{Q=_FDQZ%U|S5HveT)%j8VzK4e0Q8z+j6Sq!m0Qs9YL_-!P^ZhexnACe~a(g(APFatmpTghX z@_=mG(4tG-vLD%q)JpMvvp>A-L~GoscaMK*VT=>pEY=D8XPKQWtw#0BaSBd2CbzCK_u;gm%z&bPUEvr-%S7DJoYk*Inv8``f-6megQcoUh~ z?Akv?>KQwh4lN!?cG`@Z+Y9MZl0KceeUHV|?h#k&ck^}kCS%*ib@r0k+Bh}t0r+lq z=MF81W#hx@S>pmV%5z#nQNxPK_vj|FtQRIGYfvK0M^^Cyy>{q2CJi;1{Ux^~Qfh?lh z9shR4ahf}ap!Bm2_*L+VKld=1&Hi|vEf%_Qc78%OadZ(m7cQcyZUZUB*@;FTZxo%C z%){a9hT+Y1?I=i!@z`I%4KS*Yd(-#{9ZS^9GOTj<*!q!tv^NH zlBL$i!OZeXjL;{0DSmx&JgR0b1Dk8VA^gfUc=F#S;l3zmBagmd$yaTu*>xv%3iArZ zeeQIA;2`?>V+55q{}u&qEk{dtP0ae)fo*ToQSxac+4_ zPt+h%R`;Pz_fkpk`YsC1G^NQeM^ZpR4Lj3q27Q_NXdycdY4Amy8xe~~@9zfj&Gn+X z)|uiS>mXjPzlvEbHK4bCM_J^alk~JmOw!UeWOuiR={_>$FL?TjmhS!s3*N@Ta=|^) zt=9=BO&np?ufuHRmMI%v-PHCAF?_vee zgZS#tf@?Bf9aK&a#mCw&;lF@&q9Zw#Y)HlnR_|j=V#75wP<=0LPFhXD#xhi%!cp}Y z8NL)lFk_uPDr%j?g-*GcJAEXc3D<)Qr^7i{w^y9I{RMu_V5 zE@?^$d%YjOn9Mf|@>?a#Pm3wUJDQ`gee*@!8zC?Tq9gKBQI&wkG0=soU8LOZ|5 zMv>NDe8f^3;^|TTE%Fk)0<{N+)2i_zHZ=McXMA6t3r)Aj2fYz+E#M#I1lqF$&3ss% zF_e3IY8SUavV?nAq|Cma8cEZ8%GqMM1N4-&QqeR&YMVZg?)x0#+s;4Z4i#+%>$R%5 zOXf5f{d^5=*5&YLQv<6$`;P7E5*(o+vuUAb0<}qPqwW!g^d);F-S#YI(?ce};GLzY zv2hmeEjWVeok94HU2%!U-1H>XPUz8nhR`$hXno0nL^i67t*@7sTA;I70v!4 zPn)-!(gqiKb}3H=bI(O%ta~b+Ih%{N&X#DyPlbZfN!-z$d-;ih-$YcO!}JI0kha5D zHfAbM_~aycpPEc*M;@}vJ|eEW`=Utu{6thZS^^<&WY9ePwJ=|rDSi~w!hD{~Qpc5P zbhBzHjh~!B(TjuW_vtt6nAap)emI(!^^3s0)`-0thwx=&5?<8&1=AgdgI)VWP9{$u z222r)x~0#v!bi$v3rOQ zWkn6#7*)r8-`~&a=UT!rkx1L>^IS0+<9j^s{DvoC)};rQh{adP!e{N=R^cfVD`$gA_=!;zQV zxymBmFk?8Rj#X!F{1|c=Ay2zpnkm=i0!5B@rP-foajt5=b>PTC(>WT)*XHD z)#3$cuXEwoTz$;O5)E}(JC1L)PBXv&;5hpyD$VyU0>=vr?AKX-mSeyVjv;}HdD z7#596_aB1ix^Zw#SrMMp#6aA(!TL)GzBp!`&XS75^0I z8(b3qGd_j^hqW=Qr3C9gti?6rqo8R2o7V*MsDT$94OuUhilS) z#Y)82nas-?TE3}^9BemHRD?P8pMS}3F*5`@RSD^_wivmm5eBS$1#)k;z|H>a%rs4n zqU~HL#A62a2-GZUucEI zpeJzC{~#xt`hbn9*P>l=0d(k-9~sy$AX^Vl(saDVO#W(9#rb#qvP1`*Z=QsTsnIwM zqOmn?0Jfm(e<{FmvziSh2iT^iQNM!jX=0wqzHpXUxc)qJ3;1fJYUPJko<@xbYt5cY9HG` z-|x6kjPEPi-A4_}liwirp4K@hA?(lsN1Si91xS*2<2Mdogzh*_! zwlt=+sM+LN;7I=|I@6Dv8szRKLzy0BtbP3w5S0*?UKxk=|57pNkTXVmUWCqE69{|d z%-uTL4nqsmL2q3VORRp%JfiBUyS;}F7bMUuCkNVg*NHt|KM20&GjKmA_-y{&f-{?X zAoR9A#CKj|Usbf|&I^(7ZRIPt6zpig%gL10_=5Eg8bNwTy;(gD@>-a&ESxW7alwe*Hn#k~^Gc|Gmp! zFbWp>hsn4*cRNNjY{EA(l346}2u?<+!y?Z&e7M&o_@lJ~?(6)=oUIH<;qeXOjQp6g z7R{vZy<_RT*<~?>D#D~Y8u&ukr}sa72R8#Q!OAVF?7sLuTbrdtMiN1E`>iA8Ot+;6 z>Xx)~VhLLk^_Pu3^uj)CMk&r6<%jm#>8Nr{;3@a?!rwP3@L<4QZuLbuR4BO!&h~2H zd03KKZ?C56hBk5$U8H3TT&XTafvPP#MLEYD!KHr!YF<}C*{*)DUA!OW?M!6z>OQmd zH|i7@HlM6L&1u0jbBbB3P31eTvI4JWCVNH$rpk)Z=ARL6oSTUY#Iy0P_XoJaN5YUB z`rKbq#*i&{z^JTOWH9VKo10ijGtWMwhn!=z`8|y|>&VpHFAY3cer$!X`s-FeClO##4Og6&myx^2;#+W=ay!bT< zov+&9-R`dtuecDNI^7emjaEX3$S!Eu{hDu?)xpNRI!*O0Z%A)pCYgB%vyzrv)>W6u zb)0Mk$7v$`sPPdjQ$9e){8Ub6^J#YQiYB#8GAHpQFUpo2MImKlh3rrT3tXT~7t6hv zp|&Y*7<&xGmuBOglQAfpr;a`~-O#3mVC;XE*ZVGu>d9}RTqTCpx_)9NPFHB`t#|Zv z#zxw7cQPezab~j~Q=kMZ<33}l>)O!TQU|`?^=&ag|gW6_9E!_NkZpSO{OT4zzpZ-a6{rG z(^{-UGqmoIV?!6&Mf=msFf*EC^_Kq?e~CM&HyWjrEm6MuFT4`^A<{|?Y)N1z6q$GJrDzi#KGcSVs`am4vn4vf*wshNrT7PQH`f0?GBgW=dalf z+wyJESYkMa-jT-W6<;|u>msHTD@*P^N_6kTY*PIxPj7{PyBw@!T^iq+<=ad)I#>=p zMl$@j!5W8i$=JTb92;5{v2A-4m>6{P?ULhg={$8@y7)P_;_^vWCSOO^^WTxq!U9SY zczX?2S6R%pi{i6e+9666anP(m*uC*LcFAkQiQ~5~#PG-%oa#Fg_X*eA;IRWJcZnZ%-I>XjRTDIztNuKE5R>htFrj^NK`K({xeyw+QDHDB@|m zBQRIWnMJ>?V!x9HQT+|!TleT#^2~qCY=m=fXWewRSMfY6v#RBy3afCfyeBFS%@KTi zi?Fdx75$%_fH{eM;w{Uq(K>1rE^Hr;0mtUEou6C;U*lu4^lzh$`&{U&z9C({XUHOd zcXBO8=J?5E5)Kbg!Qj8{f|n|s{de~U>uvePtmPJwf0#U}G(Ttbtc;ESe1sj}Q^_VC zsE6gQO}K6A1e{cpjV~)au=lDa%6IOC(ESq3Y@Y+hy)nS@^lzZhy^PJ@wUd5Meno3C z#gx=!O)aN~(zl<=OnTo|m_OYCua6#wKl_z1@~J=fVoDrq5Bbf4PX1+r{h3-1KVYen z-ORqzn4P%Q$yP4j&wN7-1b%!YZc25)yKTv+>u-j>W7P4qTNF&`5iuPrTeKc*i)*gb zfZdBFY>n1I(sB4e_un0)S7bp+ultzB6h*df?{!%HpELG`>Ea6sSzKedogWaLz}$0` zXoiy-4O!w&Z;l;dhZ{Rt)`~5B;oX<40g{>VuuwD>mto?qmAGntG`44G;vdHWDEUqY z^k5OQ9AJjcoi6z7mj}Ge+r8KhJ@K9XZqDv!3!DGu7U_Dup|;E6WboXQj=kQ; zL?2G^EfG4nPr@AsSn6Q)*Zoj#sn5m<-Jf{J|JcBt0Rm%j2wB+VvG0R3ncWsmW>|Wh zUA^&>TXLlezfE<*Sl@j7PkkQV`JjbkGLFN2uQU9Z%t`3`)dU0doUm%UnfU!^O>))dr#a^g0V-eoSWH-5qh> zPkZ5d2rQy%ECNCn$kA4EPAg-8^xd!DKvO{03^q-{nutT+MO$_-_l6Skvzww&!mk z?MeI0LfiFOxMVjUHu@GH7qO33TkF7?Ap*-ZRp6sa6=GlYER>w3fmK4sc)Nx)OKQ>+ zI(GJ`$}hnm5!2zAeka>y`h+xJy`-*^g|r?_2__Po!W`7C6cB?V zbu7~ehvFZ8tg_ky7x;Q2$p&J*yAu4av>@{V?`YlXHd?a9m5N$*C~;*oYj!OZ9e-$v ziKRYhl52#i54s!=s>oc5-Vkrm+GcdMIh^f=m9@ zAbakD3O{$^f}s=ewYxn2y{!X{>g(CNoi^B`GY?m1x}tMv6PK}n8@0IgQGpH7)irjs z^vVz#_Vqe5vYQOzSN14M7rvV-)$r-sh5Xb6Jyv@BBhz|3kgQi(QQx$5zEI%t*S?j2 z((%dciBbvkR^E>F8mNemVB)T&+;Q!A7W~8(V|!O)#_MtDUJ4PzWGj;zLk`B(1xTErG>8DEjC}sUI^7f+_TgV8{|Jjlcfv)pxlQ|jC{{_zOX z>#lIX+dZ4He1yPUiLB!HKOidb>?5NYnbc!zO?&P8nPiukop9@cH6NYv21i8hP7}9KoD?1CZuF4nB zy;Bm{R?DDpf+{n$QpS=?E_m@|H1@>ag}vWXn3O^X`JZ}6n`+ikxZy;yZ0u*h^0Qfy z(m?c9_7d0yi08j5gT%Ov;%B=H*v03KY~bz?N{|F5lM%zqln)2534_?1(+AkXZ&G-C z+ezGbVjPBF$-;-)j;L!Oi$4Zvz_Vu_%qD#-T4v6`gzRYC+gA!nFXSll!W+7I@hL^U znk8`K^k`d#6iuD3&+MVI*FK4VWufc5sV`E`#GZ4h0*XfarD@{H*f(AYsNb?oei)%OOpjJR2vPoLFLn2nZ=*CC>m*HL3 z-XKRYhjd6oLyx<5WJ1#@<4J-WS(D`@$FqT!n{e~>JoFq8hjT_Q#_OMk;qqfu@VPZ! z{6uCeTXW79zu2tD?4=8kGgF0E2Q$go=m#~#pCnryph9(J8Xu!XRzsyhYLp?moScsl zYCqtaQ=;hQ0t=RJdxt5dPof(i9_YlRI6C(*zMf@;mm&)>T+`2gBrG- z^2Y{oCR%%cgbe-5tiiR5jyb-fpJACcx%#FMh z@0h;3lvNA97_-^-R5#O$t9YNmX+PNk!){3N#}#AQVq*tf^{xgJd*`6fhjn;wz7FP{ zu7mtbgZPubr?FbmI5haU6z_h@z@pk(IN)te`<}k1l-j$bw`3|!i`1fdn@lO>Srk+I z+yf(i&B2OTf!j3qy(n*BF+XloEgQX7n)Lh!(g4q|oM@UHsNV{Nu$C=iCsiFrw^rdM zpFDx{l!R_o{*PYw+ib zJKVLe#k4n}kAh~DP<-_iau}&i;6IVP%ojEteHtg+XXGIT-Iw@m@&mlT53<;UFODgFGffB#^DekkyNN*ojXl477CtRUA&o*#l8NZ$X^!vX_FrPViuEnS>TefARQhF zvV)SKW3wW-D>jSGa|6+9y1eyBY7Cmbx0gDIIaSb||JQwp%b7|o4%(xwpS znwNr=@Ov-$-c3_=&(hxrU%I?}EQN2GK}oh3S%TFz_&L-EW&cRx5Qp!aPy0>&{*Fwx zGDw$}-`&pK`%GZSh9c0sxDDqdc1p!yV?93SlVfevH z)AE?rPhs9!D0D3!rlObA1TamHp)$QU#GNW8<$oU3r({Z_HKvpOlXUj7eh)mh^hRsV zdPo!Ill8OYn9tEPw&%Vr#ofx`b03<(I-xtPvm+W}Qj<9E+oe!mbO7HDcfgGidxac_ z2)Euk1nHZ;@^@<1u^A8Ff|aQ+%E$`)?)Gr}IyG5jU|mer?Y$I=akNVxi5&xK_3Ey(xoT>g@UIyT8`;q<+axw02?L}U8gn1#%H zCh32bMO-n0e_f>z^5QgTU(12xUeCDWgS~LlS>b#gCotoedZ5C%$8hbM7B^x`8I#Z` zV=vCw;2Xy^xPIFaT%CLyvJ{1WVxREd`R@!>Hu}(n(($xw$qI_L*QW4`;o@2A#-a2i zNp!2zga=|ro_Al!bcC5&{=%7TyzfM)zQe=O#0%iLJ{me7FMxoGSk#j7$Ie{`@OYvS zzm%_p$m+ZN@bib6&;1iD@x~N9c6TRwYnGz5Q#4Ge6w%Gv2jrkwNOhCEDR+c5Ilf#$ zN7NKZy~~i>@Y4i0l{JC>JTGX`P2(e{tY!I5!nQ^xc2M!Cz~vtUu=j2>Hs8@jiOea`9d?AhxLV7yN=M zc9ex*lcheRe(r~LHhg;e8vYjb!dQuMAn`&G+XcsKsBbbhs|VnL3<*3sritrzzsiP* zo7wyl6D;zYjy8F9ShLR#b!Tg_?!Tq?ie+|CggRj9)L^tYauSCgQ^4LGdsxM<8rps1G#yEICH1W)^v5ug zRw+!Q109KMQkak*8{Y@7RBWL`Jx+Af+=#7sJ5YEpO=l0qV?o7S@BzP3M$MEuaL`PK zH8ui>wbupLR0+Sq14lHs+XZHWT-o}q&shaLXZ8zS(9L599#j@~FA--!?nMv#UM(j7 zxdl`tWSVwoSknWcJD>jAQE)ZPWaKA_7HMZe<;D`h%VghlL2nv6B|nN*UrFZY&2tpG zSHD1CUkhi;WJ1nNA>*pKTX6Oue%q6aCk~tAYb75rGCj;1pY*co^BOoWL-0Va-;Il< z_F>o572qQ5XKlV+rOA3i9#7kajvjZT_WK*DFwl^We0#@Re3C+$t1+OIu@Y`X3>9+^ zV%R?gHEQ&f;SA<%gv&b=u%mAbjvTrPn%!=I=kpx=YaE7Cj&H)+ldAYRSsp&7cCeFD zzu5I!GaNhI6*s6H#1|h^@R`9s&f&ZpP5X75lC`H%gtI*zR zr(^e1eIndA16X|~C zassc-G~~WCU0EgvQC~j7$LjHLweK${o}J43?!3>ejKz#4N`cJI4p^IOD!gZZ!Q-;0JeOc{O1a1M1M}dIbS3<;ih=m@d7RRg z$*j{(nH)>o_$*5=sF*nt*NZ%Hc4Hx!Z>|8-nt1#?(+!7R%0f>QLkzs53ai7eu|G#f zkh%h(R-hj?UP{5b{^MvP*#vVm3)r5*dKwk7gG3dM^kcRo{awC|4ovo;Q@TgkhsPC= zGGr4}=O#j*tr0gz;4GazqDbL3{JD$0Y2epuiY@Md-nZl7^~W19=+QO|pB;z0qr$L# zt_)t+uHvHgf3ub^dQ{av9YZxev8bpNV_NrN>B$V(V)B~pI&g`k9{7-!vo+1{_o0#x zF?4R1Ew!hGuyplf@Ulb%FOP;o*R&YXt%`D1zv4IhS(d|n8*&LWirui7^w4qh4lp+x zgo*0Yao)aiJmTwxqf<^msCSt-`{-cmaGXe1CX4WQi#r}zb{rEACgITN<=|>DngT{# zqra!jX^3$4aC$V4gcB9T%`+n2`T-y7R|VVx5qz$;ga}s&o_}zQZC1R@r2GDH6fK3< z{w=^K2mgc9i{qiA$qr`;U4u@O6S(KC13tSP2sU>O*^-Uw6#mSdPM5Dlqe(MR>*-lc zlb?^_(H5Yx+lRI`^HkC*unVt^rDUJwZ(RP)OmdfpU$+v=W7)q|H6Lu#?OE{ zLiH#-Cls~(R^z(c46S0v;gtIGT-c0QO4O~O#*GsMPrV*_U5y~Q0UL#Ek}}PDmC5~g zKL*-fWP;g)CUm zR$7n{LT{G-W&6T@bBfv?(C<(H4Q6TFXq64@`64+AU%GyNr4#Z?1#g{g24Uo zBf*{HhZ_rbn&|0 zr%itJ%w;@T{dJ@ef!WgiP}tWC7b!bc2h?>L0T?HO5dRQ zzy?fPFSy3W&xB)fs_40CEKXQnC+tm~@#K=7@MvTV?_jD%r(aJez3^mwDKQ@tosQuO z!BO^+U4g-@ob?ZDA%`o5w82(~MDKmbAYmu99de{0aV2cV4|5QGp8_7o0%23@WO1eC zRTkZNgS~at0I71pOR2XL^CDkCu6Zy>2XMGodN9_1KZ74u+v1EH1HrIm2D`@e1+|I~ zr5B`Q)tJTjGG5>%7)N8mss`u~vWNSWF47Mnk075olFnJqqsPLz@7tG&l%5g9w(lJW z`}ajdzw>B;#Zkh`HwoU3m~0jyw*vl{x(c3`1Prdtg7ad>!&IdaJFSISEKZi2_YT&y=M=$O-;oKk5aMf&_$#U9lR}^)AKhaQrwVK zaz3U`oRl!%y}XY0Z44uWZzD-+a{=#i?JZ~ayb??YmT>*%YuJv-5_EG&m3XSmE9fhW z!|`=qXrwj*jK95uUMWM&k~oO3JLjP3nG+DVx6ILK#~^A{TTC0}%h6z8BJR*AMO*$X zKFJ)6pXQz5yo-*|{ebD@);EG~`B^3W;VB#tC7^ef#=e3=7HgOXRR=2Ts|5lb*1rJ36H9WL`aI}aI*M1|E^qv(tB3W zu44kry*3{879GbwBMu3iq5*iqEs>9VPgJWnnvCxcrK>{c%`+m7F28dpE%Q(8i_M*L zS6^9yu#ADNV-=b%(|I=K&{bxA-XBQc6%{>pV^AXx4$mjTmN_DHwjO{7?9X9}`6OIA zJb^o8zlkN@H>F1Vd1Sbx1|44sEUhFlrfo{W++7mbvmlY3es+P3UP#fmPDM%+Po+=2 zaa2)jPfz-A0@9=m&PWH`ZEG+l~xXnZ81I0-G&(L{?WA%n{+-^x`N=XQ*5Q-4z zzTc?OKq@LNM4~+u$;=iqG76c=DkH>uo<~VWNkoHwEh!}}h1T!<@8Y^%=RM~+_x=5T zKKLcKmFZ$Rw|46=1ZTA1>kG!%N$xVsoF;JoXwD~HeT06LYscs*xp-8i2De<|fP-nX zP~Aida+I&r%u5_MUQdu#IvddWxxRGTS{u6RfgByfg=ErX87S`Zh4VG(rmC7ZNb0nk z#Nx^Y7^?BY2J1vj+I1OfT*X1%RtFcR$fKlk9UAs6#x6GAl6=<#0e9VP{b3ukcm|B0qg zR64kspe+>{HKOuUJ5W=&7=>1~pv@^yy!~Pts@zE+U1}V=w%``2T_Z}@WNo1C@xFAo zp)n1^_oPftj!YBG2fLtmjO@eT?Dy%NjLR7;-))B1*t-u2kp#$jEalyV`yv@=2kRg$ubK(!u$g~FpEazMbhEl zw@LDnX>{U$+`DG$5qf#sQrg_oNZcg)SiytkFk+p~lq_CPwgf&PDaGE5!6ReTZp^@+ zX=>P9Q_l#A_Q9OvU%^kljq7Qx#OmqmVM&@fJ90^ut}OJXCgKBVKhT2ZUIgd=X3=DH zF)}XQtN9ao7 zAv8JAjGl+?;=Yk0Y)V~#OJ1eIlhzBgYR^P!(Eo&tZqTAF$(~fNZ8P2adI6VLNh67N zl$pKu3?#J$nl1FmBVdt54mGyHNu4m%Ry~J11hSz+QwZ8uPeZwQj<+~?1CzOTkfYO5 z_>%D#i9N>y_!Yi|He?UsqLr;UBjp}Got=QOZ5mvMa0cjW!b{~@2=*#K! z@TDa3#`p&rdv8ux*B#;BC3*CG-Q zpX{*CO$HNuZ<11@0Q%1_j_i0MM(<@=)0C1!)V11-MkoIy(mywo=A%Urt5MAej_8wT z*=0nE2!ND_6Z&1wLQgf$!BD6SDKoBuz4R#jw<$d$mQGe4kfo{pHgrw42kkm-O8+Z)N@fZ@ zWWC>Ag1aFh%!^~(dDAnCEXn6~J&}PNZzBnR+6==xTN%(ax(#<^=VQYC4!js?gd-26 z%}zbCAaS;OH2cj#Dy{w(>%HG&SlTn3(pH8ot%fML@G+dJJxI$cev<`-MI>jDGCf#`6UE|)>$5@{x(6U?KRxCF%%c(ay+ZMHvBiwzL6x{I0jrn>tj-v!@cY0xzc~jt?6MkC0cv2l62pW26m$YOpHur zO%g7UzrM1jqrUcNt&@#y-iy)W!DT4wH-#%Tz2Mx^gC;GTu=VC;IGY#FxBV(Z|LgOn z?{bX7&w#Dm}!qxV?B?Oa=dqOOlCioT**dI?}iQE2(SLr`4Z5Xqek7I+;I( z($F}fza$GJCjDT#_ezt!W^ttM;A)6C>5YGur{k0!IlLJj1%{5BK>dIm%DTM7)WwKj z_-`0Z{aSYY#07LufFG6G@eijg8^cYWU$J^`Gp>oY$Brekcw_W25uL_)P}??#9OIOnOB|pjPZED2XI1MJ(@R?g**O1ZLK+^lV9mEzzVdalV98H;wi+8v| zd6qkuf7yv&3R_X%&jf{McGfTd;Z8I^BGtWnmO^ zvEz7Pe#0c_&T%5UPJ;SQSx)DUxlrCbbDERaPonO8s(+Ie29qofGO?Quk-BDUGBarw z{ycwy5>ATN1^CZxft*3m@v4AM_=Vj zk~epoxIDW&?YZbge_OAmD&}%j)Fy{4xt$0vq~`-peatSryr0ah4280gV4S`+9w#&^ z{G&63w~qW{}@rn?hv~D@HadlHI4#ZV&CwY+ihIy&UxL8|AEU}8T#yC2058xOv3s;k*R~4 z)LeZV?Mw!$dh``pTGh?y+C{;STQis`zt@pLK`Zw3A18dqPsYnd+#GL63m5NR1RA{^ zP&Vx?hRolOch?Mp-X`7phmst(XL}f3w4L)&yncmhCKGsi+_OJ$Wd+VRU55*`Z-P#; z8r2v<@=Ng`DNFoHTqKNW;<61?efDDdGX6eM+~Np5ivBRJdw}n<&W==zePnz-bG(be zcwElcLXQYVywWNJCmojJ;pC6_anpJfeQ=Q5OK7r7&S+Eo7E6hEH_q>SgZA&lc+qMf zvGc-ZEHE<1q)=1HKBGdz%UfCJrLn|yc!a2YTTMkr*KlmRSv0vZk1X|whL@(>xc){k z>yx&Id_P|R%ZJZmxk8+%3A7L;UjKut?9z4!*_pZi=F?q>~+}Ug`1<`mq zTeBBa#y(=ws4(w)+(-Oj6ptZ|%g`pQivM-BB$tV_Vk5ZxVrBI&a?jPCe%xq9rS43i zQ#RNTN$X1xwQ>=}%zn-)2O5w*Zr_lf9*L{JbB>rWa}<>2oU+r_!kPp=R+4KN-L)L; z`ZenQ(Z{z z@P(<$wav8p_bRTR@r`K2?PYiR&x(w_bL=O_6E^QTxNII2(Dkf2UmVv}N_qyKIB++`5E!pTM za4&wepCsCrz0+lvQ!<2o=VBuMh`vO|<9N!9e zc5P*fT8C0Dv8|1$L$BN+Lu2c=X6coz=-!zE(HXpp)A)BBs5!%;%?XqUTLuG(rM zPuhrUF6X7{2deOC3f&%NNse>5|0`GR;pTVty zxo%3sJG|7CjqhhJL$NbIO$)yM) z`lFQ0YD|&Yf`zFEgB^K*`LcQzX zxoiI)HvM-FA1bP2^&BrEXPisYLs+xP`;UC~G zE#14Q)Zy!RUF93{Jb&P?)UQ}@EDZThLbyHrIuUYOLVOFe_@+H!L}yrlO0dhQgrFV` z=FXrO^_D@&dah%ye}oA(Sw^l*v4ZVpCvlWLiucq2B}29FRmKnum)*kOMlVsrfn&d_ z&W14e+w2;_jr9ArDmpFs60VQGflJE1;_lMF*!iOmUp))N?0wh3{ZS8bd@`B+EpUc? z^*4pYoSsH)*XmJ{r9yW*CXuZDanudh$*)D(D-t*q zGZ&w9d_k+8oA@`z3Xd2rWnLaQMNXUupyTEhw6CK8U#)7u$Jw7S@0SQqX+;yxnRNnF zbPb@^>Lr5r3)IP?HytXZa+M|B(-1aYD@9KQAV2UbA z|MtL*DVwmcW)psq9fPZnobiOC7;hhU4ojP(g%fiV%=E_}ku$Za^ig6y&7Yr-O7HIB zxpjj$A~T66CtQIB7kA)LWV+cd`4%$r;RWNJ_?2ZN%E_{w^XT}4#aw?@fa*U#!KS(2 z1Kn6N;1AWZ$&U5x%KhuGV1qNZ39iD-L|goO^&i|nkbzujl-CsLkFqaE!D06~vr`t+ z={%F`^ghSW*tO#_#vJIzLr30Y-@S>vZL0a$9&L&V4nNp#>GQ;}?hZp%D3Ai5dUA+! zLtS&!r7fpk5<9m*29=+|{qquV+E{_usmL?OU$`KD#ZL5(W$^uO6U=K-z;mx2qHpR? zeE-ZHD`lc!(=L{Oy%gxVrUq)|;7%Vu%|b`hr}(Y-6OPUn=Jl`{sB%ySYi=AMRkNm% zfJzs}dW7@jeQqUL_1ry&+b=JA#wV3AOCZ0w6CPb{XDSmdh*jPWn6JJEg_5>of+P>4 zT)F$e@in;jngGw(t`ieNwqS7fYoecCfZh+jORwz;$MYTeC^qFOws(wSeF=B% ze@Vg70nV9alSv-U`)B&{+Ez0&<~Z4S>jl|#LxCQBq)LnU@nqN2XwW}c14B!knaO?Y zNly4v*dot)$#NWV`t{WqA2|UB*>EiNn8uU6U(E4FS74&AG}B>ufjr{8U*YdLCitpk zd>nHPL;v;Qr9xp|)AwGiniz-oRvZ9<9i=3r{5?}LoXUTh97TeCe-hKune@eTIa*d? zNLu4=LPQrNwKoUd{%c=UU=^*@<}PU=_zUmg2QfioeJ~)oJlgmlpw6?(YqbA(BOAXIF z9KgDW3A{8hf4m{y0wJ1v%nI`7Q_&}lRJ1mpe)yA&%QOhSd-fPVHB92Yyvd^YI|mGW zD8j0{JCf70WubicHCA*}5|NA+qeeUxx>o5uId<{2ZkD`lohqJJ-hs0(P3EzQgSf5S6XzLP!P;R1=>1$BoDrCz%&h$r>vW`q5(^J>Nh{`%we<;{5@t z$ECq7&xx2DI)nE%OYCp4M&Fd>Si5cts(K}3TE|S@vBM4Mld%~s3(hfTE-WJ*LuYB? za3`&0k71X7CeHZ5%{N{RqF2gqY+PTCy5|R=@WCpgp?Zkf%K9?#^+0~M=5ezLLAv1C zT)H(Po`l4ohwQ$GP+XJG6wB=*MRDy=IL8?0b2H=wiRBo*T?C7o?r^+2MP7SC7G}sS zL7`g>X3b_*M0!IGU6Ou>x+ZbV|KWTLl59Yi@}D?s`bYGdTY$%8&w-!cP7>{-2osXN zo4pisCdw8yMCOek4Y!r2zN!Y~=I9;hKFl$&=XKS$u3k*Cmr8Q)cv=|kY>DDgOVQ#R z$Ny>^MV(R^9vcyb(^d##?$$&z^`0qox*?&uLdA4MH4ZcEi@Dk6E%cu#$n(?t53@xQ zu~1){W3=(e=raVnrl93X8}@PcpceAiV*<@roJ8a3A@;`JVbCl|fK$!SS$@?;_U=hd zv^&l@*=hh699P5IKs(NfBg1p=7vMP`^T*z232^A>+xnnPQ>weWi>geGpg}(8@wh@M zMyE6(&rFy%tEdP0e#fxfZ9d}|)W`N|>4A~mbau^+-6UdH7nyu<8r|OTiFoq@7+)75 z^olwLuAY|UVd!pVz1U*>`c4;J_AJ9smnHG=hj^^&P~mNs=|(ShA2tvCU^Y3|vtnNl zQ&Rnmdag64dp;-QLqBz7M)M1^=Wem_J;(iqvWzkJVM38qg1CPBme5>{hu8)^69 zo)-(JQzzfsB=+udNI55nW&O+G%`$JIF=`J*d<{JG-*PN?p@+>a!nn|?5&v3g@XSt^ zVZ$kFM28P%%k_^D=hh^8-J*-G*u4|uFJ8h1y;2;m>Bg)dzfto`D=I7yM8%&e?5?W! zOwFuYOy-~%ciz}bF1_s}IeX;k-+S@oVpl2*zx@Q;PE%%5x)(|OTm|H)0+usv#*ja%MCM8`nX|2jV7C<2+_Qv~1U!V*CJ*7>-AnwRPZtrl zj&ES|fMeB!Bd!%!#}Fq&Y=0rkE9;%YQw|B|96XJXdy(^KsVY%vj=kU@m_hxQMd1D) zxp?w-B}V*skMMpNn=JA$^cw>^FC1oD-L`@P)nukD)gX@@l8Iy3Yts5#lumu(%DUhC z3ruhYtm&Of_F9Isl8dGw4VaFX_8X!5u9?^v?T`1Q)OjC|yu+7`e%PF_91KF7*y2ok zYA^7Ven~sPxg26~I>)2T`dEt&bH3m_$stq<55>UbcIM;CEv9cdR`}R*4Kt$!3M7@6 zONiG9*&;niKHrUE_A7~_>-q#JQSu;dJZI+LS_x!MsiM)+#W<2S72nOihMFmhcon87(PzovT_f%w87>m(wSE7k=YBt0i7Q@)BwT$@c zgXBERVl}2cNfKPU|?%KXe~6EpC8U&IHC%bQd&+_Ast%E7>W6Mug+IkaOz7w1e}c zEkFGn#HN3PYk!Sd|7d0MaDD@vk`qLiM_h;8RvC?XThJ+0i8s%F6fKvXMPD^8({$dC z-9EB}UOdx5zb_1>9)A8PboDY;)Rke!^M@$B;t$u|FGt~W7noYiDMfHQXYd5g;;^n{I*R<~&HBeZB5}H9^wx(G zx}VFG7jC|Ux>K|8UDi!>wfv4Fy+dfl&cLVAFPP;;wlFl^5Vpsfn>w4_Vkhm0Bb#RQ zk}vB|6T#AAm@^=Yop$kz?{Rm6uf5>Xz-tiuPZy*2%tL{^mB_Y8@UHO$dBHhh7{|X3 z-43*75CX?p}0i_&UI+SnnYpVgT@-1 zO#(n5ToQEuMnEq&L)=twpN|F$$duw#a(G1(F^PM~-;pYT(@F=RLEnz7s$RlwKUEAj z?@qw))$`FsQVT`Da-ZowMc${P0%RAsV0>VMX;11&vbi^q9$b2x9@{KV_bU0LaM?w) z>$-`bV>>V?QiQk5KM99Zm%{Z!ny_(SG+Zfq!pyk(lOO88o;cjeB;t-G^KpoTbLcdadu+f95Mn6{_N|9m??g&OS)k zdl(cf{TbQPldR68lSFu4HmOyyB6XtGFd9D>l_tz&3Wl~2aa~iGp7IR*k~J}CfhNl7 zxuM1`QC^C77tT2zi1z1pz+n$fQeOC}X%bE}-9rNv-e%$)r!pLT!pCz@1bHbH zPjIDE9~@86hk%}Nj`?H*CLi^fqVYO*uDd_Ezd4N@_IkwbPyYc6&82Y2_Y2!+FGNz0 z9D@O)?_g4)j{D{;!9QXV_-e)!p5cu`3{*ahX6KPv+Hy&=b@gS ziIT(h_~ZF)4B08h^SD)u&HeG9V{Xo6v(q4Pzc!S-=rAiB5GMV5{mGi5XcD2QV0tY~ z4%MB8VUN8R*>rLad#o)1Eb1m=>2!{5>3~>!AQzvgP2gQAjN#62mgo`Xz;derGR5Z{ z4XZ7pKQ!);@NqZP4!eZT&P~`g+<^y{b92_Q3wV~XgOC$8K?Z$DPG137Lo?EhxD44N8s(@Z!4nV{Wkl_|M$| z3p8_J>+YY-#mZ3r`s9^lhR$AM%2<%hP+w5$)WSe94N#T~Ba5Zmm|OdrV2jBdTy3d} zlfOITf}kfTEzyo;A%0kyoemv$G&zr}7S*k&p?h?8Pq`3OH|OW*+ByIX*7e;h;cSq~XW&j3<9vYFN%s^hvxYV_-V5fq+t z3E!-#!CY1Dd&(2$MMZSs2kUWoB5e=aT!;L1tPdDD6f%9DF>I=~Gby}cNKQC;vHG9> z!I3>OIN^*kNzVVpUjMNb?z7|YEN3<W5}wmi~+y16S4B(Om3fNgY|Y9Sf~C3Ww?2# z?N>D%TR_=$M1a~YK@CpnKR1)e5#{nrW@KuVFe!RD6&5OJ;f33A5Pjf08PdOQ*0ZS;EY@&7_j(2H zbKiw(R;5_}iI2>yL-_7UD{Nmsom@V>fSWCq(f`c$P)}=7(kgTsmCSN6$*Kp#ItS6| z%qYeVpF*?j&7ghM3nX9HK&}2X2zqBzzcgB%)OX4e$7^k@{|(L~yHyVrwsbPuw?c`W zWiB&M{yuj;;N~+gRB*?Z!>Dks7DaV3xjgg%TzXd%#8&Jfm1QTwO-wq_B%wLFH~ zO~m5l+%i0*+Kr~q#_{On*NFdCpqrT!XwC|NqYv`IDNO*3!Up&+Pa_Gw-_El3XV@sN zlOiyvfxBKsu#p`b$aHH-FbErfV|pnMv3-zRw6;1RlS6yja^)q-7XrE$94VbB{&gwEk`_*c@)Oy6M6 zdcU?NUIBjWzH=IUx0OP;&}Awfl37Ql%%4JrRX4)2TVr51O$sBMdHB*R0;|4Mq31^r zE+1lmOldyb@9~?oaR2w5{pqyMoRF2`vY7lQ16|x6;AC#jacq?kFI=-6-~8)@T4{gC zK2QoGS2jawY&LVchwCKBEhm|4CD=3Hk1|z*iYPR(6)LRGk+k}7_G9Te@YWQ<@Cj1b zR%Xw+*5Z+$nTIp0cj67h5ontrLMFASQTh7?^kVNxdT2&4xi^c4(>G`1jJ;2BT=^9? z&L2m)&FR>E_!9g$;1Az3DMXrT!)jq8CMch>$`7Uys+Y=FE}Q}7T{@ZX95hlsv8LXiH-}*^s zgTVEe9uBt>Gp8Fd#4^c?iLYpfi{FLuw4V|>zBq(KA*m=Pd>jwnbi|QcVvKsoc{0uL z5S^%EyGi5?`aLja1BU&58`oCB#@3y&%K;_t^vIO)`8 zE<3m!lmE+S@fLShd=y2uF1$h$w!S9vKkMK_KliSsdK)bwpP=8YUl{zCMW63lXxR}1 zd16TrurV6)11G@_lPLbZ5M8pYei3v2v@~D~x%yB8q>?gf~K2 z}UTdxRN>mvx_GnIk*nTt_I-HrVql9)xz)f&TvGu+2T4iG8z02|xy1k5JWZfxVO%YFOIrg+1Meuz%)a{8=N8Pir(tPy?66bV{Y?dNSz6U+>7tUzJdF{5+nBZQy2c z?dV$d4*yD5;k}qOxVy6mj8e}-L~{%@tuTTQN+V_y^2LbTd~v84yuyqmjll-D9_aa( zK~m3eC!QPhz|gV@oECk84rP73yYV1Cn7j>bqZXm=w`^#>yn@(lSU@eVme66=pGM2I z5h;C9EReW_BRiULg=;(dUVe^?YKzdjM;UcamVvP+$B!^S3?+-yAX)u^nM+tFyJ2WC z%us&9te?g)Jr{C0o%hwmv00he9rA`5as({#7YM9Hbg$o!30DyXKP*I*ggi#|rWgn9$7W8-dc~bUS3uS-i;aZ^&gS7yDC@KV(z!I=N;0!x{ ziNcAF0n=BF6WO7lWpMr3Y$&!~h+%J?>(-g`$*1-@R!Bby1XtgLZZA=6G+&4NuDYYt ziuoAsr_5!kdsv-@G_r2s7)_nYQd^R`!KGmNb>(lBtcD_O%N`D+tPNNWs6= zPvC(1C2%Pyh4I||pzYVqVVehNHmIZA!zJWkawX|<&*vZJ<{qcc z*F%bu1Rl?Jz^ctosFo{-vu_Hc_2NyWWaU#b|2yZCoOg}B-ZzoH{kRl<#CxNQOf~+w zRgam)U6?Yp5-WOlN4JY`V2rvO{#UWM;26L7}z zG$QSkO`c8J&iww914(gBkTEKc$=qJ`g~S^4un@PrSbOVO?^Idr2;5}o7y zmz?!01Lxn7nB`NCcmLeLAcJ-s^eaJe8+Y6sc@G>^;^4^nWKa?c1g9p-Fz*hqx?1~S z$Ev9yxOEUfAs1fUZ6FTz5oCga0Gv0;05ijGNZg}}{JLHEoZ~S(K0gts>9S0z#aZI% zV?e$3-k`%GUi8DwXT&1*C$I%6xQd&Bxje2!C$&a2Ie8V|yjYG0I@&<^L^5=-v9NjB zAy{y#fqCnl!xxeXhoj;WASfe)lSQsGDSx|2=8w&!@$7P#do~638ude;^a@Exjvfs-k62*mAP2{rwS)jRpHgGHK;qY05hv+ z;9r9Vn8nY8?1@QmBh?mYdLeV*!(k>`KZ-l!se`xgJgm9?kL7*tCIRX)Yr7eM+&`Bop281X16h6jmI;;tjm9%OIxy2j1jbqI9)2$~<`uA9CWL;8O;fvO<94Ya~#GLj`olMM)Z# zp#e%-PPjLz3ZE!s;hL#8uurrQAKZ$=_>@nuTs|Efzg>ZzEhS)edlAThjVlQLU-IH{}gM<1mTZ$0_%OjHT@d2PZUMBB0CguS%wqR+n^wzlCjxcK)U`Z z(U@I@^s#0H)jTkPj{Bs7t*}2@6yLzQSt+=Hy^gm;uHcqzAFL662d_2bxIAhxcr7l0 zfs?urb=!j}kj{hKmbUPR*8^W(*}}1resXJTCP~@o!{jEM0(T&=Vy*-VoZz1I9OqMW zO)Y%*HNZ-IE+Y%?n$ZKsH))`_1GUnBLYCyV!Hv~%=y&ZJiuNU<(flG*;m$wrJZ$jV zj+bDN6$f1xtAL-91y!y_Fbus+l*w3 zgQAxL4ry&hb4MYZ2wdLAFOqcpZYG1}+o`TFq2!$wE#_|_CnHDU_UtSicFn~E=Ooc^lD+;TS+B#8 zbCL4Up%Di0a`(Widp~gPkQvf}H05*!oi}3^mGMev0;IXQ zTTU^K{Yb=#OE2Iq!OM7A=Q3{KJQh|hwIKfZ3OH4D!RW^T(3oTdZVTfeD!vpQ<&9o8fwY` z()4RVy)Og)o{NLN<{Qwk`zsMy-9+M9cXp>H!i4#kVP{GQRK4Zl!m&kYuYLmb-@Raa z?>!)U#kFZgOA&REJ5FbEofJ#w4PY_29aYE5v5N7j^a#?+cUH| z54Rg`L6f`z$Pi2bnX@k;Mvp*48t3I(5Ce%R-0$`~2^;^8fqmy1j;kR=D|MpC$7Dl> z9`OY6p3AUGZv=FIT4Sl@V@Uh)p1JtBfwb@aL!6>q=%)46lzlmu+I@e@mWO1**Y*qO zdoUfx?2luzZW2Dy%0;cGOK^X07p#Al2_N=;g>CzbfWPz-IQ%PzH>SNXzJ3qva+SpA z(G8^Q+$ixq<3NthFJhiJ21D7IL{JZ%gdJRONn7zeZ0d|KtB`#`l77h0TvzoSxy}P<~}@rQ-DY2MB)T%Up$?ZjG>1vp@shpRGL-~9s6&9mHs&Ff1L%z^eU)1 z_rS`84$!{f1*4yZaZ2A9iDO@p;-j<3b(0aMHt`(nEjtUGfF47~4e+eNVyHauoPE9Z z16e(J0o|dON_9_%(Sw_%>6N}BGZDwhSasw&+6SM&4$A=ia5ELJ)Wu<5p(x5e%>$jB zhcJ2hcS!r43v5|E1nwFJ4UYLOYt3Ga@;5FjKZITuuu9D z&P?&geW72WY(**vGeaO%_!6GE-GG;t-H_iu3P-uKaM8X}5cm4QPCq-9K6+h1Jmsv| z(0MDt{8un|{|SPdPCEEH{2S*MPBptxeuGGz5Th|<16?dtLG?7%spj!`a$F#X*)p^j zPbwDUt@B&(I+s5iK9qs2;akyp+jCG|nGRh~1#nwf3s^sY07Fl|f`8=?_f$25ESMdy&vM}?Qc*L5F7!A+Wdp9# z(pfU}?ujI`&G)}DgOj2$XhkM|cHWAEvm;PL_#%!@TZV(B&7jg#1Ohx!jB=}mp~xZd z92G_FTSM@HoQ1nu!nkYNA9CW@7*Pq>LY|*iX1-nt1nHC0!0Pigm|3(CSDUH8vlrjk z@i!ynTCEm!s1K*#FQ2D-Y@{eYx(;mv4zOWu7Cv|zi<>6z!du5E%*M@yNIpFtqFE{*AY z)D8}*oNK%4lbK)ZX0p+X^Yo}7jTzzQOKaU}l$tn~M|#L^cDl)B5KECi5Qw_s?s%X! z9`nN^FxFof4=>CC+2@?gL*_HQRK5=Q3Gy#{TVlnE&56yghWBt$KQqXg7${gXwm(IIfVoYA>d;FZ;OsZwH%e zCyB|KRk-fuA-raJ0Jpg&V$)=A)ZhOG7Oc1khu(4Jv!9Qk!Q>0*IjCS|wJ3Iftb=E} z(_wq}H6m9pLvI_Tk%M2;*q&X6kZYgG5Q6jRaaqj{s;DydkfK<&vB_8_t0*u zs}!G1qfg^jk_Csl*r(f9q4lOJ6a+WSv_FAUwGvUPe={CF*$mk#*-)k`g0XKY96Bk1 zjXev|D{KtXXXb$h=Z0FbUVt8Mm`HbXY?(!TY4*=PM<`GCVU~9*0u-!wE z90>eK;>7gmc+8k!VpVVv(fuy^7-%JLjPR8f{%dVV1_gR6+h*(avbX}h67!i*IZ zFJZzYzrdd#O7-4;R%G3LVY*6w73E3C(Gn?tde}&U3Ru4d#aJuG_*fFkZ^*-ebY~1u z48hM$5h!Cj6H838A?IHkY`?*M_hY+YL4h%@RaVEdsZU_?G49Ow?>A^CD^jt~ZG=mn z63gNZO!}r(;E*j%zFeCC84;~8`H>*Wu?;4{bQ=BS??})1XVQbkJn9oPfm&vHk+&(k zq5otd{`WEsf82KABJg2&HZTCYcl?2@6DhD!;0=5nc>s?y|H1EBYcTiybbM~u0>_UA z!aU7h5+*!{RzEHvx&gziUe_(=Sf?PIJ?%h#f764(h0zd{X-%4c7m{BMO4Q-32bFo0 zPcOfhrES`G$n4}mGI-`0+&xo+HrzG;t78uyvxvZy2v6*A?0~~s7vQ%07ub5V1|9{> zM%Ua;SQI9L5w162^ZIZwpC?A^s2rWm&DPx`%GmXxqVQR{)a*JDqr**`iL-+zD;h2fQg3@% z^Qx1?h?8>MKr2#Z&kli~AQ(S7k9)Hxc0 z$v&L_<7+Uk`m_{-(k_5>PBCbV_JZ%0R?zZyK;>Unxa4FzC=W(KY(h8)yi=sf(wxt1 zg(mU&^OgVWl`#0GA16CSUC0m7#bD8DPuAV`C;VsAXt2)?YV$LNO4K;fXGf%HU!oAU zT;0!p{u_$Sf!p}G^9dD;?BIIg|Y5lYLDU7_(4RUmi1=*fRnf;QNNXBfA8Ev6LBNYx) zGm{*;_oh0{+&Y13%aoD}EB-NQhFK`Z?X;%p9>Wu2zWB!T5dJ>$4IFgO!qon|5Nlch z{U4O^w3{DR?2*U952X+^^)N_wJS4JQ_hXV*GHE7{SX-||GYyw;zQDTIWN*=YBKrCb z-%6pJe2c9k8|)0|YVNFiFg1sED~r)m$s1&sVjY=$HV;}8t5J?r;YVXnteJ8eM?H4o z98JzusTd0U*UcQ~I}2i8tj2mre{{b419U%Kf@QN0g7X|<%4*0_XW~g7npLuwFFrP# z-!D#LX8k3KKjn#0nh~Lo%EI7EUphT$Zj<1#I+GN<8dXVUpYQ*h0_9`D6%0MXn& zx6%Izo{>L|V|pGK)3^y=b4=*9N*m$Fhd9_ClM7KlPNA}TG+ONY4}!r5`kS|aRZTx@U>P1bW zhd7p~(?gCMdHNxoCT(ba$ zbbj(Ai!;scrLA-(wejK3&+Eg<#W*SKI`Nvzk8%6->n=z+hRVG{ZR|~32ft^o0h`yS zK<&N)F8Q8{mz=iZ3CnocZm=5O7=2+JuFKNl$xq3v3%%^9swDB`ZzB-GeHUbr<`+v+ zH978lZSk38=~>eFU%}K}qkw9CUP?3b73r02@?4*`m$kSI=-~PVg*Yy^vcPU!%`v&X zpGjitl*ORdVGj9yeo*JU4qwV-;2PP*_}a-2YuFvi?m(^QIXe_%^~C|_rHtUgZ`1a*>~bQO(?wWh{XchFwXCG@AI89i%t zni?F*qzOwxDQADB|Fy?6yl*UdYM2iFWdwIEeS>S}`s4Q#+c9&O2|8$cLH5l*jQ<}V zY|oL!43EpWWaJd4ie!P~Dh<$jV-90OpULR~0lKtRip;4KA#>A9$RGKir26S*T6A{< z{jci;Jtwq?<|=NZZb>0@>%n~5@^&k&ZC9YB*`46B*N-?Rb-@y`K18=p+#}9q9?BeW zY-AoDJfy=h3fX+Bm=S&vW=3?WtXK!0$UNn@sRocUgobiax{Zf#EP z1T~RVAqmR3bDcid-IT2hq;k#L^xNJebbKs|CP!YOo~yL!fjntCxndE%FQsgIwj@rb z!}x6j!JJ+DaN{o<>y9&0nY=^VAjbR7x5MQiA zo@#%uB7EL<_N{Lyx%%=M+1IX2*MIP$m4zp0+>b!|d>KQl-2>?A?+H|PESsL$D@D)r zcaq~|kOZ0QFj&75owoku{(dnUopHyiv{l%Cz7tAX`F2`!aAD^_*iEg z*n9&}_Hu&zHu^-PQJya1W{lk0h@DC-*e9Md_M2DASWKb!8mj|#Qj$89rVr61o-nVfK2&0M3%*- z5OXfq)DW|RXv$oMH_f@sf}^7FUl^B3md+uyZ-dCsL5@H9eKLf}xWks7YqWWI5^maS zM@6T^vp>#1qn6WuQPV1Gd_sM&?P46-EIfwKzn{QA_d@aXU>0UOokL&S@z^us2y>cB zsqddvu%Y7``Mzv`$X|;jD$g88I3Zu|9}|vocoE|Zxi7d{d@3CTp)g#n~Jkk-Ed<;FxEFjV9Tv* zSQcc9Po_(vhLa3wc;QCpWcovq{5?`G-$^D51ryJlO~m?wB3Zp>1{BPi%7mN`hs{q; zkv@s5q+4?-(NFLLxiBTDmlTENcceIf;Tsxdd5Kj~*+d_F9-{{JwuDmOfVcdPsR`7@Lj-%W zreRvfIm}f_!g-I<@VTKM?#Yb7ng3lvsY|J-ST+H#sM^yVs(sXHz|W*|U;;5a_>K&U zRFg|P&k#k98|NE`5V0YL@tB&#Bo<8~dwyjSzlac`6!8{ht)_!xoDbOVGNiel3K-4x zn8)AU#+NH&sY(OYP`$r3l*I?z*2t1N{6OT_#L^GWvyx|jzLy1?= z$<_na=5^9>sl6b<6j2-VSZ3wYKw@OjL)y+?A=!%^Nmqap*|KjF{I+V~)z0^WV9CS8 zX9?HqnPyDhPmE=`<(U4DJE;`%<;{@y(LCr=1Z zDof#D$|*cCCmpSAOY!Yc3YtHjPb#VL}_snx!vqXw)uR9)(#%rFLeant`xpj+hkO0 zuBTm{(!7%6T)r*gAMMyQ6&FkkM4y7|xQo4oj+r@V>Ya(Lf0A)$a2(F?9HzbdI3CvW zH&n48m7Ow}0>z58B;4^n+4?ht6wlNlbGGM0y=w;J={w4(;WEN-8N*A;JBYtR4K&Je zPNb*=j(u)T!BHN4eq>Xh3DcOGFWI!S>ldA3XMmsXUO*+C5_~zO7|(=oojf)T^LM1; z;hlka=w3NpwEH0}ifE=Y-yUVBz85AtH6D^8+iFtF<;(Bfo=j{D0wIjIm8l+ahx2NC ziC%3YIbyVs7!>8e$k_@;DlZ$f)9%nvkMUR?e}sN}-NpMC#ZsF$->Jsj^=KLxhpmm3 zSTA-9cU&yR(yJ-RKb?y4JV$JO?LxPmG9=1HRaE*!9IMxDM274i6Lpai@<79hq__$Z z(=}`1-mHa;fle(<74ai|L!rd~l@u8?4u{4q4a}}<9CsmZgeK?wqiZ6>sfBDb|5M;o zdfRt|7QJ^x8P`-C6{|*byp8+iZ{t466hx0?JX*U9Wfq@dcfIGnWe&+yGANUM{qr#A z!+uOeEOLp+uoWreyz*^_rh`y{AMR91(a%lvgYX0l3qOxOX4lZ?el<3_@zE=&1Y_5ypig@&UKkpW@j2Xn z+CG}hTjxo~eokX&4u+HZ)<;AmGldLya{jNLa?l$5$yh!Rh8uScNY|N*#P>cSR*pB} ze%M5aF%E!nXrI zjTHRi6N+ic<nI(#e;?n4zR(vVE|gyf_-k?GqJA{DK5H@Vt&Gd3Xel zeB45KNx@{-BPF8m6a$C&$xKGlO?Z3gAhijT!*L3^wAH4Q`TpLDZtriPo4QtFw|)$I zsaIf0B%;-)M`&S}ho2TFbKk)e_+p(dmErmnG26Q7U!m=Ewt@@nbjTsklxj%GwsYjp ziT^;c^Czs0mN_J?vlRFpQz`pNZ+`QYC`T3;+Si8scp8YsHk?KOfHho~0 z8yuld@7rj{Oh>%(G6~zf@8bBQ^;q!ZF|M0&4I6*Nqcm%a4da(F)&{4Dvh*t|?{bpX zd~b%LwFP8UNJ zawQ0B>hRmyUfds5jrwk>*qP~tW-Cpp%W4aqA($f7zPfe5PZ?J~cN@3`l_Qm++zFIJw z@RHu_6~{YGTWE06R(QEEigl_krOR`DF*Pt9pQ%*g)TKJhAM+EnA1@rC8MNM+qFcpfM$HDF; zp`f|Moa|m;PRevLp-du)iP*o8$673f(orQqcNO${@|xxrBr*lzQ{hKd6&tIkjLEJE z=+<@<6VwIxuGtXM6S6>TJ?YqZEV>t%4m$&#@)wqhmPlc26A&DL zpw!;Q{I2`NhD5K#GUhVQc))#Y4?o6lok9Yu#m~@_JNNoScA}g8ITMkCfh4|#%hBFc zK+*EYwD7hx3Ez-KO!gioqnkS6JGBArJ#tV#DoTP^ZzOJ+BQUc0GE-yxk+*A8GMn;L z0L`a^=+?iJaPyL6+H^MpZqG<(qVCP1XQJJ(Eg%j52A1QgiJka;yRg7j_7N`Bj7E`1 z1j9aO0-KXST6z_*{--L|$Z?$A{JA7vz&Unh%}AYX74+Au!u?QyoIEYU^D!d_r1HSD zG|5DEvu5?}^!ea1ENNX?8-PxHavD6bKfulPTET2-n|2K?uO6&<-JiLd44++yP}RN z)W+a{7q4Oe+iGObiVF7h4&!g_*{<0 zTO16A+~LoNKJ)hB1hoH=h*c&x(Y@;)R;Er6tZV&@t38V_Hp~{|gMPE3mqJO|XKrTk zXeG|(m`iRS+nI6xM@g~JRFKP_k#>&!S}B?a-wdIxh*|OW(p7(25gS8A0JlA1*FVLz_M$ z{FP-5Hm@&{)p9C$Y?l=_z1PI^i`^mA_!w!}GneRzl)}>R$#8JP6u2&`MphkLLbmC- zK$xI_O;XEbKXi-GOY5s3)-#Y+=1JkW=m?rWS^}+(Q=mLvf_8Wby62Qiv_tONuKci0%GVm|j`J z&H|sZx<*3Sr-bVaA;w z?AVjjXf^*bF0`n`x&kr5=s9VD=ekxrCUC`o=+E@j!HvXuM=GfuwnpWMooMRXPlIo~ zgUK%}$h5yraKbSdOf;<+$ql)n|B)g3fBWHB%u>FEtq4uHE<-;AZD3ZJ2ZBnq1TN}( zMRm63n`jRfL;0CMjK0xvT6G}+HH6Y}N-(l$HgTRRL&i2aGiMKIP)%EL+G{Y5!sJ|-w%41wZTd&`FZj`~*Pno6 zvpQ@cEsW$E4P5Z?JQj`IOkknVXf^S!SBFwO)zFabWR7_mjXT z;XY+7yJ^Z{Y1;p$jq@Lf031Kdq|923E7Se(Q(!6jTFM9-Gn55?LVNK}=UOznoJ`+W zxs#OIX!87*I|>(s;DEL%23}atq^o8@$NE)Je|kN5&)v)aQ&0_u7U`3zdT}uPubItr zRHB7P^=Oo748!Mb2K~C9bmyZwD*y8&PvmMX>}(f?h7`~0O3o?zX-g2ARk5g`I8ETK zHd$a-{1kP1v@vC80y|%nyHkG%CZWZ_xaw>KcJpQz=ARMFJfFbGKNaP;8pSj>U@6r3U51UfR6*-xKKp#l z67*8JfWG=oD7s8baKmJxV59aej6N!f(_U`|i@%8^``TGDdt)@#r9`9Sm<(RNYQju` z7Uu7|xsYg@#B_69fPxnaWYk5HME^X;3|`QtKZm}u&#YCc_6I*mcgSQt*NoAKz!VzA z&0@I|5EOmPA*Fg2-T!SKR@TMfnuVWGy=s=Aq(wq7`DQfcH?`BuG7%0Rlt4Nvtx;?& z0nhG_MTy}dTIfH8zkAm>ruWc%@D7ePnY&yap6Y3kdcOwHwL8z>Vyi)CeE-B=cu>JU zdk_Z2)dy&K-5Waa*^5Scw17m8BwQNj4(!3b9KS{vzdI(QyQ8?kalMvc=dm#~v)zZw z9$luwzgCm5hY@7^@DbebIT_c*Mx&mfovxF)!A>pMvEq`tCgh#bXHR-vglr=X^8H&R zTyczJ<;o|~sWzjmhF7=oia}?Hl`N*#vjuc`M3L+6zJW(-6^!zgFi^eXO`V+Q;&5s< z)|n~@WQ(T@mdxkwoNMM{wa!GEyZ0&|pnz(zKI(=T9Z2VJ9 z2)?>nvjry}L!GQ5xjMEGVpZR;2S<9?ql?9;eBo0@W0xF6-*2O864$Bzi4FWKA0EN} z7nC_UD-PDid(s0AhWNgx1gq}O5Ew*F5$t~Y0G}v{p!eHc=9O>+sSfZUX)lscJu3%Y zgagn+s+0Dn?4T<}>v?HP5lmjq^Xf|~|6tYRQIM1?V|WVURJ-dco814Cb-!f@C5K0N zD>~m%&C(?L=-MPOwMc`l#}whspLiG z4sB01&ZLmV>)YX1{B5?Tvz^vUN7DM5NEn)E1In}ApFLz-t?`eODxV(3$q%KEN^F)Ta-YWUo1RC z9_{XT!!ajeL9~Io;Ln_2n7Wyu_L2HtVK=jT_?5h}$GuF%T-ie$due1-74TXu= zbD;pA>Q$w@WnF0QO!@BmsGotXK~lgZ@k8Svw62>oH4fWf^=0`Ux4fs|VXHu%=k zT$yd)?G-@&ecDaNhOVL^_a4h!aU0u)Jn&kZ3^skMW*c`stadqL#=KzufaQlg*bwQ# z3`Uo+MR5xJC+8QlYaO_(nszw<>oox_PxYbt2aK70&oe;GS{S6AbcxY$E_{zEpp8dv zVoQPZB!8cfg-K<9s_|GDWyut_Hh2N-*ZxS^R4tjJ-Y9Z1Cnq ztf`O|Oyt;&uj-t^Pjx)wkX6C@%ueM^6!PIqPE>`H@y%@DpHg};+K)Q#GJ>F?jUc1! z2c@u_cr4F@-mI52{{DT8OjixVvm_-T8#_Ie~V*AKvha#?8qx|P=~6VDph|K=q}4D!xS?_-M17#d!X zNIzc)qOS}R!MgheGgr9{*c4N;^k_P?Je5G%nQu_sPew2|pcCz{PRGM1Mc77L8{!-4 zM$SJ8$E_R>tLSJup167oEz7-8(clK9@gMomkKN`keozBC!8Kr$e}gHt)ZnKsP+}LH zXyMt6CNrBZJ21=o1L!67qx8V0vviG6CHNoHU>1p}k_jG`5 zC_54k{pZNc$dhMZPtfNjY&pfN_i1HzG4HF#52aEA<<-=DgBcCi<$6z!a*UYgDspq4 z6A$CmTfVjM-+d7&)%bCiSK5j zyZJUoU1`L%(>`F%_j2@lI}eRAWaxVtVE=SR0lTUhwvoHc-jrpG@uTx>n_nUGYAl4e zvoMA^6#tXmlodxqdfceIfe@D)bA}JTCm~pqWB$GeQl$BfCzce0E)`!;YsO@w=BAR^rU*Js9xhBfizYg}-$s;M^l$SkwO&R2P=ifS~+3YRsN9I{t+fW_f3BAmLII4MN2 zW(7GYGSJDnop0fiEy8H>cPA4W&&ACXcat)g2>jv2Idl$v$0@c0IGUV;;)mMkXiY0? zdh{yOozV@it~kTzJ085%hqZVOzbmSb%!^@^gI6)ilg6~SQN0#^N^K;Q{OriD+6>(8%10t2 zB-r?R0L>d?aJ2s#-J?>)Zd@k^4Ebiq{=k>R+%;Pqm`Qd?v2ToF_p)wfr zv?KA0w-8^Bg*E@(eLOEBE;!=#5kKxch0;<%)b7kN)?GRiI_W*&31pbJd6LYs{TtW~ z4=AIuSd914>n`tIMJM}YUj%ipm`snA22wfBiTu1EjS*gPp0LXTh|DZul3)ClI_6!+ z{^wcP_{#*1pHHC2690qz7duGeE?Z)zUXE$YTQNy_oWQ&G4ZZo~jHrQPF4y z{ZomsM7WACEj5R6_X$ets33rcm@vavw%$j zk%V7#iY#mC0Nd)RcvmzThaIEQpX+FZn&t6#D@-GI+U-blh8rgAs^r`){b-ylCGaw6 z#yRRUQA2`9(Yb+PeIH&;N=wH54up%^2&S(jBGX=hYj%lRT_W7yCled^=7f*OV= z(K?efe!8<3C@!c13(grVY3)Sp%t~NU?IJ7<4MxjcZ;YDwiu1kpF%kC{kUeBOk$W17 zSzVQwBKsfyOp_8+3{+##>oI!WN167DIfC2Zd&qK#Wn6ZuvE3d1Ca>l>m{=wHGxui? z@n7WkvR;SnXi4ff_9wSPKSFz%@%Pi2hH_aV?-);J6>+bgQa{LYF+!amuK3~lX7n}A zrk9WSL1O0$5*f0EEYnFvhtazzNRbo-J(U#Leb3_l3s2}eb!0{Sib4EQEi5d|;%oM8 z_RSPnlKP_H0lz<$Y0JmV@YOwGbdZ6N^zb` z3-(=?6BMfa#v)4x?5l~Q1tay0W#lN_?2?DqYueZiosW42{*kP2N)Hp8P|r>{{+XRF zp+-Fi9O&j9%V|e>G0pMjI$YJ=%*2&`9ACndn6&7Vd-}lEtsI~!6 max_magnitude) then + max_freq = f + max_magnitude = magnitude + end if + end do + + ! The frequency bin with the largest amplitude should match the test wave + if (abs(max_freq - freq_hz) > 0.05) then + error stop "FFT frequency does not match test wave" + end if + + ! The first component of the FFT is the DC component of the wave + if (abs(w(1,1) - dc_component) > 0.05) then + error stop "DC component of FFT does not match test wave" + end if + + end subroutine test_fft_real_to_complex + + ! Test inverse FFT. + ! Run synthetic test array through FFT and run results through inverse FFT + ! to obtain the original array + subroutine test_fft_complex_to_real() + real(real64) :: AFFT(50000+4*IMAX) + real(precision), allocatable :: w(:,:), g(:,:), g_new(:,:) + integer :: i + + allocate(w(2*incw, kmax), g(incg, kmax), g_new(incg, kmax)) + + ! Setup test array with synthetic data + do i = 1, imax + g(i,1) = i + end do + + ! Initialize spfft by passing 0 to IDIR + call spffte(imax, incw, incg, kmax, w, g, 0, afft) + ! Calculate FFT + call spffte(imax, incw, incg, kmax, w, g, IDIR_R2C, afft) + ! Calculate inverse on to get original 'g' back + call spffte(imax, incw, incg, kmax, w, g_new, IDIR_C2R, afft) + + do i = 1, imax + if (abs(g(i,1) - g_new(i,1)) > 0.05) then + error stop "Inverse FFT failed" + end if + end do + + end subroutine test_fft_complex_to_real + +#endif +end program test_fft diff --git a/tests/test_ncpus.F90 b/tests/test_ncpus.F90 new file mode 100644 index 00000000..53d798cb --- /dev/null +++ b/tests/test_ncpus.F90 @@ -0,0 +1,16 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the ncpus() function. +! +! Kyle Gerheiser +program test_ncpus + implicit none + + integer :: n, ncpus + + n = ncpus() +#ifndef OPENMP + if (n .ne. 1) stop 2 +#endif + +end program test_ncpus diff --git a/tests/test_scalar_grib1.F90 b/tests/test_scalar_grib1.F90 index bf70080b..4c131251 100644 --- a/tests/test_scalar_grib1.F90 +++ b/tests/test_scalar_grib1.F90 @@ -2,8 +2,16 @@ ! ! Kyle Gerheiser June, 2021 program test_scalar_grib1 - use input_data_mod_grib1 - use interp_mod_grib1 +#if(LSIZE==4) + use input_data_mod_grib1_4 + use interp_mod_grib1_4 +#elif(LSIZE==D) + use input_data_mod_grib1_d + use interp_mod_grib1_d +#elif(LSIZE==8) + use input_data_mod_grib1_8 + use interp_mod_grib1_8 +#endif implicit none integer :: num_args, len, status diff --git a/tests/test_scalar_grib2.F90 b/tests/test_scalar_grib2.F90 index 5e5d1be4..d7c7ab63 100644 --- a/tests/test_scalar_grib2.F90 +++ b/tests/test_scalar_grib2.F90 @@ -2,8 +2,16 @@ ! ! Kyle Gerheiser June, 2021 program test_scalar_grib2 - use input_data_mod_grib2 - use interp_mod_grib2 +#if(LSIZE==4) + use input_data_mod_grib2_4 + use interp_mod_grib2_4 +#elif(LSIZE==D) + use input_data_mod_grib2_d + use interp_mod_grib2_d +#elif(LSIZE==8) + use input_data_mod_grib2_8 + use interp_mod_grib2_8 +#endif implicit none integer :: num_args, len, status diff --git a/tests/test_splaplac.F90 b/tests/test_splaplac.F90 new file mode 100644 index 00000000..b733e330 --- /dev/null +++ b/tests/test_splaplac.F90 @@ -0,0 +1,47 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the splaplac() subrroutine. +! +! Alex Richert, Oct 2023 +PROGRAM TEST_SPLAPLAC + IMPLICIT NONE + + INTEGER I, M, J, QSIZE, QD2SIZE + REAL, ALLOCATABLE :: ENN1(:), Q(:), QD2(:), QREF(:), REF(:), QD2REF(:) + REAL :: TOL=1E-7 + + M=2 + + DO I=0,1 + QSIZE=(M+1)*((I+1)*M+2) + QD2SIZE=(M+1)*((I+1)*M+2) + ALLOCATE(QD2REF(QD2SIZE)) + IF (I.EQ.0) THEN + QD2REF=(/0.0,0.0,-0.25,-0.333,-0.417,-0.5,-0.583,-0.667, & + -0.75,-0.833,-0.917,-1.0/) + ELSEIF (I.EQ.1) THEN + QD2REF=(/0.0,0.0,-0.167,-0.222,-0.278,-0.333,-0.389,-0.444, & + -0.5,-0.556,-0.611,-0.667,-0.722,-0.778,-0.833,-0.889,-0.944,-1.0/) + ENDIF + ALLOCATE(ENN1((M+1)*((I+1)*M+2)/2)) + ENN1=1.0 + ALLOCATE(Q(QSIZE)) + ALLOCATE(QREF(QSIZE)) + ALLOCATE(QD2(QD2SIZE)) + DO J=1,QSIZE + Q(J) = REAL(J)/REAL(QSIZE) + ENDDO + QREF=Q + CALL SPLAPLAC(I,M,ENN1,Q,QD2,1) + IF (.NOT.ALL(ABS(QD2-QD2REF).LT.1E-2)) STOP 1 + Q=-999.9 + CALL SPLAPLAC(I,M,ENN1,Q,QD2,-1) + IF (.NOT.ALL(ABS(Q(3:)-QREF(3:)).LT.TOL)) STOP 2 + DEALLOCATE(QD2REF) + DEALLOCATE(ENN1) + DEALLOCATE(Q) + DEALLOCATE(QREF) + DEALLOCATE(QD2) + ENDDO !DO I + +END PROGRAM TEST_SPLAPLAC diff --git a/tests/test_splat.F90 b/tests/test_splat.F90 new file mode 100644 index 00000000..29685b1c --- /dev/null +++ b/tests/test_splat.F90 @@ -0,0 +1,50 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the splat() subrroutine. +! +! Kyle Gerheiser +program test_splat + use iso_fortran_env, only: real64 + implicit none + + integer :: j, jj, jmax, ref_j(5) + real :: slat(584), wlat(584), ref_slat(5), ref_wlat(5) + real :: tini=1e-5 + + jmax = 584 ! t382 grid + + call splat(0, jmax, slat, wlat) + + if (slat(1) /= 1d0) then + error stop "slat(1) should equal 1.0" + endif + + if(slat(jmax) /= -1d0) then + error stop "slat(jmax) should equal -1.0" + endif + + if(wlat(1) /= 0d0) then + error stop "wlat(1) should equal 0.0" + endif + + if(wlat(jmax) /= 0d0) then + error stop "wlat(jmax) should equal 0.0" + endif + + do j = 2, jmax-1 + if (slat(j) < slat(j+1)) then + error stop "slat should be monotonically decreasing" + endif + end do + + call splat(256, jmax, slat, wlat) + ref_j = (/1, 20, 100, 292, 584/) + ref_slat = (/0.999996364, 0.994503140, 0.860138953, 2.68967217E-03, -0.999996364/) + ref_wlat = (/1.25922097E-05, 5.63323090E-04, 2.74388562E-03, 5.37929870E-03, 1.25922097E-05/) + + do jj = 1, 5 + if (abs(ref_slat(jj)-slat(ref_j(jj))) .gt. tini) error stop "slat mismatch for IDRT=256" + if (abs(ref_wlat(jj)-wlat(ref_j(jj))) .gt. tini) error stop "wlat mismatch for IDRT=256" + enddo + +end program test_splat diff --git a/tests/test_sppad.F90 b/tests/test_sppad.F90 new file mode 100644 index 00000000..f1b69edf --- /dev/null +++ b/tests/test_sppad.F90 @@ -0,0 +1,51 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the sppad() subrroutine. +! +! Alex Richert, Oct 2023 +PROGRAM TEST_SPPAD + IMPLICIT NONE + + INTEGER WHICH, I, IMAX1, IMAX2 + INTEGER, DIMENSION(6) :: I1=(/0,1,0,0,1,1/), I2=(/0,1,0,1,0,1/) + INTEGER, DIMENSION(6) :: M1=(/384,384,1,1,1,1/), M2=(/384,384,2,2,2,2/) + REAL, ALLOCATABLE :: Q1(:), Q2(:) + REAL :: TINI=TINY(1.0) + REAL, DIMENSION(18) :: W4REF, W6REF + + W4REF=(/1.0/6.0,1.0/3.0,0.5,2.0/3.0,0.0,0.0, & + 5.0/6.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0/) + W6REF=(/0.1250,0.25,0.375,0.5,0.0,0.0,0.625,0.75,0.875,1.0, & + 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0/) + + DO WHICH=1,6 + IMAX1=(M1(WHICH)+1)*((I1(WHICH)+1)*M1(WHICH)+2) + IMAX2=(M2(WHICH)+1)*((I2(WHICH)+1)*M2(WHICH)+2) + IF ((WHICH.LE.2) .AND. (IMAX1.NE.IMAX2)) STOP 1 + ALLOCATE(Q1(1:IMAX1)) + ALLOCATE(Q2(1:IMAX2)) + ! Make all test values positive to distinguish from padding zeros + DO I=1,IMAX1 + Q1(I)=REAL(I)/REAL(IMAX1) + ENDDO + CALL SPPAD(I1(WHICH),M1(WHICH),Q1,I2(WHICH),M2(WHICH),Q2) + ! When I1==I2, the arrays should be unchanged + IF (WHICH.EQ.1) THEN + IF (.NOT.ALL(ABS(Q1-Q2).LT.TINI)) STOP 2 + ENDIF + IF (WHICH.EQ.2) THEN + IF (.NOT.ALL(ABS(Q1-Q2).LT.TINI)) STOP 3 + ENDIF + ! Non-pad values (i.e., non-zeros) should be unchanged + IF (.NOT. ALL(ABS(Q1-PACK(Q2,Q2>TINI)).LT.TINI)) STOP 4 + IF (WHICH.EQ.4) THEN + IF (.NOT.ALL(ABS(Q2-W4REF).LT.TINI)) STOP 5 + ENDIF + IF (WHICH.EQ.6) THEN + IF (.NOT.ALL(ABS(Q2-W6REF).LT.TINI)) STOP 6 + ENDIF + DEALLOCATE(Q1) + DEALLOCATE(Q2) + ENDDO ! WHICH=1,6 + +END PROGRAM TEST_SPPAD diff --git a/tests/test_sptezv.F90 b/tests/test_sptezv.F90 new file mode 100644 index 00000000..0e9b82be --- /dev/null +++ b/tests/test_sptezv.F90 @@ -0,0 +1,79 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the sptez() and sptezv() subrroutines. +! +! Kyle Gerheiser +program test_sptezv + use iso_fortran_env, only: real64 + implicit none + +#ifdef KIND_d + integer,parameter:: iromb=0,maxwv=7 + integer,parameter:: idrtg=4,idrte=0,imax=16,jmaxg=8,jmaxe=17 + real(real64) :: MAX_DIFF = 1d-9 + + call test_scalar(iromb,maxwv,idrtg,imax,jmaxg) + call test_scalar(iromb,maxwv,idrte,imax,jmaxe) + call test_vector(iromb,maxwv,idrtg,imax,jmaxg) + call test_vector(iromb,maxwv,idrte,imax,jmaxe) + + call test_scalar(0,126,4,256,128) + call test_scalar(0,126,0,256,257) + call test_vector(0,126,4,256,128) + call test_vector(0,126,0,256,257) + +contains + + subroutine test_scalar(iromb,maxwv,idrt,imax,jmax) + implicit none + integer,intent(in):: iromb,maxwv,idrt,imax,jmax + real(real64) :: wave((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: wave2((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: grid(imax,jmax) + real(real64) :: avg_diff + wave=1d0 + wave(2:2*maxwv+2:2)=0d0 + call sptez(iromb,maxwv,idrt,imax,jmax,wave,grid,+1) + call sptez(iromb,maxwv,idrt,imax,jmax,wave2,grid,-1) + avg_diff = sqrt(sum((wave2-wave)**2)/size(wave)) + + print *, "avg_diff = ", avg_diff + + if (avg_diff > MAX_DIFF) then + print *, "average difference > MAX_DIFF: ", avg_diff, " > ", MAX_DIFF + error stop + endif + + end subroutine test_scalar + + subroutine test_vector(iromb,maxwv,idrt,imax,jmax) + implicit none + integer,intent(in):: iromb,maxwv,idrt,imax,jmax + real(real64) :: waved((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: wavez((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: waved2((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: wavez2((maxwv+1)*((iromb+1)*maxwv+2)/2*2) + real(real64) :: gridu(imax,jmax) + real(real64) :: gridv(imax,jmax) + real(real64) :: avg_diff + waved=1d0 + waved(2:2*maxwv+2:2)=0d0 + waved(1)=0d0 + wavez=1d0 + wavez(2:2*maxwv+2:2)=0d0 + wavez(1)=0d0 + call sptezv(iromb,maxwv,idrt,imax,jmax,waved,wavez,gridu,gridv,+1) + call sptezv(iromb,maxwv,idrt,imax,jmax,waved2,wavez2,gridu,gridv,-1) + avg_diff = sqrt((sum((waved2-waved)**2)+sum((wavez2-wavez)**2))/(2*size(waved))) + + print *, "avg_diff = ", avg_diff + + if (avg_diff > MAX_DIFF) then + print *, "average difference > MAX_DIFF: ", avg_diff, " > ", MAX_DIFF + error stop + endif + + end subroutine test_vector +#endif + +end program test_sptezv diff --git a/tests/test_sptrung.F90 b/tests/test_sptrung.F90 new file mode 100644 index 00000000..8f0c30b8 --- /dev/null +++ b/tests/test_sptrung.F90 @@ -0,0 +1,41 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the sptrung() subrroutine. +! +! Alex Richert, Oct 2023 +program test_sptrung + implicit none + + INTEGER :: I + INTEGER :: IROMB=0, MAXWV=89 + INTEGER :: IDRTI=256, IMAXI=360, JMAXI=180 + INTEGER,parameter :: KM=1 + INTEGER :: NO=4, IPRIME=181, ISKIPI=1, JSKIPI=360 + INTEGER,parameter :: MI=64800, MO=4 + REAL :: RLAT(MO),RLON(MO) + REAL :: GI(MI,KM) + REAL :: GO(MO,KM) + REAL :: GOREF(MO,KM) + REAL*4 :: RDGI(MI,KM) + REAL :: TINI=4e-3 + + + OPEN (12, file="data/sptrung.gi.in", form='unformatted', recl=MI*KM*4, convert='little_endian') + READ (12) RDGI + CLOSE (12) + + GI = REAL(RDGI) + + GOREF(:,1) = (/77.3174667,70.4562683,72.8935242,51.0591698/) + RLAT = (/45.0,35.0,40.0,35.0/) + RLON = (/-100.0,-100.0,-90.0,-120.0/) + + CALL SPTRUNG(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KM,NO, & + IPRIME,ISKIPI,JSKIPI,MI,MO,0,0,0,RLAT,RLON, & + GI,GO) + + DO I=1,MO + IF (ABS(GO(I,KM)-GOREF(I,KM)) .GT. TINI) STOP 1 + ENDDO + +end program test_sptrung diff --git a/tests/test_sptrungv.F90 b/tests/test_sptrungv.F90 new file mode 100644 index 00000000..fb772369 --- /dev/null +++ b/tests/test_sptrungv.F90 @@ -0,0 +1,58 @@ +! This is a test from the NCEPLIBS-sp project. +! +! This test tests the sptrungv() subrroutine. +! +! Alex Richert, Oct 2023 +program test_sptrungv + implicit none + + ! + ! + INTEGER :: I + INTEGER :: IROMB=0, MAXWV=89 + INTEGER :: IDRTI=0, IMAXI=360, JMAXI=181 + INTEGER,parameter :: KM=1 + INTEGER :: NO=26553, IPRIME=1, ISKIPI=1, JSKIPI=-360 + INTEGER,parameter :: MI=65160, MO=26553 + REAL :: RLAT(MO),RLON(MO) + REAL :: UI(MI,KM),VI(MI,KM) + REAL :: UO(MO,KM),VO(MO,KM) + REAL :: UOREF(MO,KM),VOREF(MO,KM) + REAL*4 :: RDRLAT(MO),RDRLON(MO) + REAL*4 :: RDUI(MI,KM),RDVI(MI,KM) + REAL*4 :: RDUOREF(MO,KM),RDVOREF(MO,KM) + REAL :: X=0.0 + REAL :: TOL=1e-2 + + OPEN (12, file="data/sptrungv.uv.in", access='direct', recl=MI*KM*4, convert='little_endian') + READ (12, rec=1) RDUI + READ (12, rec=2) RDVI + CLOSE (12) + + OPEN (13, file="data/sptrungv.ll.in", access="direct", recl=MO*4, convert='little_endian') + READ (13, rec=1) RDRLAT + READ (13, rec=2) RDRLON + CLOSE (13) + + OPEN (14, file="data/sptrungv.uv.out", access="direct", recl=MO*KM*4, convert='little_endian') + READ (14, rec=1) RDUOREF + READ (14, rec=2) RDVOREF + CLOSE (14) + + UI = REAL(RDUI) + VI = REAL(RDVI) + RLAT = REAL(RDRLAT) + RLON = REAL(RDRLON) + UOREF = REAL(RDUOREF) + VOREF = REAL(RDVOREF) + + CALL SPTRUNGV(IROMB,MAXWV,IDRTI,IMAXI,JMAXI,KM,NO, & + IPRIME,ISKIPI,JSKIPI,MI,MO,0,0,0,RLAT,RLON, & + UI,VI,.TRUE.,UO,VO,.FALSE.,X,X,.FALSE.,X,X) + + DO I=1, MO + IF (ABS(UO(I,KM)-RDUOREF(I,KM)) .GT. TOL) STOP 1 + IF (ABS(VO(I,KM)-RDVOREF(I,KM)) .GT. TOL) STOP 2 + ENDDO + +end program test_sptrungv diff --git a/tests/test_vector_grib1.F90 b/tests/test_vector_grib1.F90 index f503cbc6..7e1fbbdf 100644 --- a/tests/test_vector_grib1.F90 +++ b/tests/test_vector_grib1.F90 @@ -2,8 +2,16 @@ ! ! Kyle Gerheiser June, 2021 program test_vector - use input_data_mod_grib1 - use interp_mod_grib1 +#if(LSIZE==4) + use input_data_mod_grib1_4 + use interp_mod_grib1_4 +#elif(LSIZE==D) + use input_data_mod_grib1_d + use interp_mod_grib1_d +#elif(LSIZE==8) + use input_data_mod_grib1_8 + use interp_mod_grib1_8 +#endif implicit none integer :: num_args, len, status diff --git a/tests/test_vector_grib2.F90 b/tests/test_vector_grib2.F90 index 8ea7f2bf..4d48845a 100644 --- a/tests/test_vector_grib2.F90 +++ b/tests/test_vector_grib2.F90 @@ -2,8 +2,16 @@ ! ! Kyle Gerheiser June, 2021 program test_vector_grib2 - use input_data_mod_grib2 - use interp_mod_grib2 +#if(LSIZE==4) + use input_data_mod_grib2_4 + use interp_mod_grib2_4 +#elif(LSIZE==D) + use input_data_mod_grib2_d + use interp_mod_grib2_d +#elif(LSIZE==8) + use input_data_mod_grib2_8 + use interp_mod_grib2_8 +#endif implicit none integer :: num_args, len, status