From 1c75dc4e29904befa8eeaa0733988a679e6e87eb Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 12:56:40 +0100 Subject: [PATCH 01/31] ci | add important_settings --- .github/important_settings.x86_64 | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/important_settings.x86_64 diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 new file mode 100644 index 00000000..e7797b8e --- /dev/null +++ b/.github/important_settings.x86_64 @@ -0,0 +1,52 @@ +#!/bin/bash +# A central place to put all the important paths. You probably have to modify this to make things work. + +# the fortran compiler +FORTRAN_COMPILER="gfortran" +# required compiler flags +FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" +# extra flags, for debugging and such +FCFLAGS_EXTRA="" + +# optimization stuff. Go all in, sometimes +OPTIMIZATION_LEVEL="-O0" +OPTIMIZATION_SENSITIVE="-O0" + +# the flag that sets the default real to a double. +DOUBLE_FLAG= # "-fdefault-real-8" +# The flag that tells the compiler where to put .o and .mod files. +MODULE_FLAG="-J" + +# the header to put in python scripts. +PYTHONHEADER="#!/usr/bin/env python" + +# Which gnuplot terminal to use by default. +# Choices: aqua, qt, wxt +GNUPLOTTERMINAL="qt" + +# Precompiler flags. Selecting default gnuplot terminal, and make the progressbars work. +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" + +# These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' +PATH_LIB="/usr/lib/x86_64-linux-gnu" +PATH_INC="/usr/include/x86_64-linux-gnu" +PATH_TO_BLASLAPACK_LIB="-L/$PREFIX/lib" +PATH_TO_BLASLAPACK_INC="-I/$PREFIX/include" +BLASLAPACK_LIBS="-llapack -lscalapack" + +# I use fftw for Fourier transforms. +PATH_TO_FFTW_LIB="-L/$PREFIX/lib" +PATH_TO_FFTW_INC="-I/$PREFIX/include" +FFTW_LIBS="-lfftw3" + +# Also need MPI +PATH_TO_MPI_LIB="-L/$PREFIX/lib" +PATH_TO_MPI_INC="-I/$PREFIX/include" +MPI_LIBS="-lmpi_mpifh -lmpi" + +# I also use HDF5 every now and then +PATH_TO_HDF5_LIB="-L/$PREFIX/lib" +PATH_TO_HDF5_INC="-I/$PREFIX/include" +HDF5_LIBS="-lhdf5 -lhdf5_fortran" + +USECGAL=no From 2651c54bb46eaf81a236f825241ec4ad1eb9bc1e Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 13:01:04 +0100 Subject: [PATCH 02/31] ci | dev --- .github/important_settings.x86_64 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index e7797b8e..9f81b913 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -30,23 +30,23 @@ PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" # These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' PATH_LIB="/usr/lib/x86_64-linux-gnu" PATH_INC="/usr/include/x86_64-linux-gnu" -PATH_TO_BLASLAPACK_LIB="-L/$PREFIX/lib" -PATH_TO_BLASLAPACK_INC="-I/$PREFIX/include" +PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" +PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" BLASLAPACK_LIBS="-llapack -lscalapack" # I use fftw for Fourier transforms. -PATH_TO_FFTW_LIB="-L/$PREFIX/lib" -PATH_TO_FFTW_INC="-I/$PREFIX/include" +PATH_TO_FFTW_LIB="-L/$PATH_LIB" +PATH_TO_FFTW_INC="-I/$PATH_INC" FFTW_LIBS="-lfftw3" # Also need MPI -PATH_TO_MPI_LIB="-L/$PREFIX/lib" -PATH_TO_MPI_INC="-I/$PREFIX/include" +PATH_TO_MPI_LIB="-L/$PATH_LIB" +PATH_TO_MPI_INC="-I/$PATH_INC" MPI_LIBS="-lmpi_mpifh -lmpi" # I also use HDF5 every now and then -PATH_TO_HDF5_LIB="-L/$PREFIX/lib" -PATH_TO_HDF5_INC="-I/$PREFIX/include" +PATH_TO_HDF5_LIB="-L/$PATH_LIB" +PATH_TO_HDF5_INC="-I/$PATH_INC" HDF5_LIBS="-lhdf5 -lhdf5_fortran" USECGAL=no From 693d0d077e69a82a5bf09dff5edf1994e0b385c4 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 13:18:40 +0100 Subject: [PATCH 03/31] use mpifort instead of gfortran --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 9f81b913..341d7798 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -2,7 +2,7 @@ # A central place to put all the important paths. You probably have to modify this to make things work. # the fortran compiler -FORTRAN_COMPILER="gfortran" +FORTRAN_COMPILER="mpifort" # required compiler flags FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" # extra flags, for debugging and such From c751a1317e652f8a54cf7003fa82f84922f7232a Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 13:27:25 +0100 Subject: [PATCH 04/31] hdf5_serial? --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 341d7798..32741d6b 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -47,6 +47,6 @@ MPI_LIBS="-lmpi_mpifh -lmpi" # I also use HDF5 every now and then PATH_TO_HDF5_LIB="-L/$PATH_LIB" PATH_TO_HDF5_INC="-I/$PATH_INC" -HDF5_LIBS="-lhdf5 -lhdf5_fortran" +HDF5_LIBS="-lhdf5_serial" USECGAL=no From 4d52cca9daaf17594461d7641b1a4003cde878f6 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 13:37:21 +0100 Subject: [PATCH 05/31] correct hdf5 path --- .github/important_settings.x86_64 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 32741d6b..486cb9e5 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -40,13 +40,13 @@ PATH_TO_FFTW_INC="-I/$PATH_INC" FFTW_LIBS="-lfftw3" # Also need MPI -PATH_TO_MPI_LIB="-L/$PATH_LIB" -PATH_TO_MPI_INC="-I/$PATH_INC" -MPI_LIBS="-lmpi_mpifh -lmpi" +# PATH_TO_MPI_LIB="-L/$PATH_LIB" +# PATH_TO_MPI_INC="-I/$PATH_INC" +# MPI_LIBS="-lmpi_mpifh -lmpi" # I also use HDF5 every now and then -PATH_TO_HDF5_LIB="-L/$PATH_LIB" -PATH_TO_HDF5_INC="-I/$PATH_INC" -HDF5_LIBS="-lhdf5_serial" +PATH_TO_HDF5_LIB="-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi/" +PATH_TO_HDF5_INC="-I/usr/include/hdf5/openmpi/" +HDF5_LIBS="-lhdf5 -lhdf5_fortran" USECGAL=no From 3567fb58926f2b35c6008b9b73880e7dc9c4cf31 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:16:08 +0100 Subject: [PATCH 06/31] include path --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 486cb9e5..083781cb 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -29,7 +29,7 @@ PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" # These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' PATH_LIB="/usr/lib/x86_64-linux-gnu" -PATH_INC="/usr/include/x86_64-linux-gnu" +PATH_INC="/usr/include" PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" BLASLAPACK_LIBS="-llapack -lscalapack" From bc8c28c2509d607097c46194612e598569435026 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:24:20 +0100 Subject: [PATCH 07/31] scalapack-openmpi --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 083781cb..918200d2 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -32,7 +32,7 @@ PATH_LIB="/usr/lib/x86_64-linux-gnu" PATH_INC="/usr/include" PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" -BLASLAPACK_LIBS="-llapack -lscalapack" +BLASLAPACK_LIBS="-llapack -lscalapack-openmpi" # I use fftw for Fourier transforms. PATH_TO_FFTW_LIB="-L/$PATH_LIB" From 6ae92466523631d929898fa3c07768250ee09449 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:29:56 +0100 Subject: [PATCH 08/31] link blas --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 918200d2..1f73ab66 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -32,7 +32,7 @@ PATH_LIB="/usr/lib/x86_64-linux-gnu" PATH_INC="/usr/include" PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" -BLASLAPACK_LIBS="-llapack -lscalapack-openmpi" +BLASLAPACK_LIBS="-lblas -llapack -lscalapack-openmpi" # I use fftw for Fourier transforms. PATH_TO_FFTW_LIB="-L/$PATH_LIB" From d1fafbe84121e1e7aaae84fdd0f03e0766868b85 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:55:27 +0100 Subject: [PATCH 09/31] ci | compile with O2 --- .github/important_settings.x86_64 | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 1f73ab66..8a956455 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -9,7 +9,7 @@ FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" FCFLAGS_EXTRA="" # optimization stuff. Go all in, sometimes -OPTIMIZATION_LEVEL="-O0" +OPTIMIZATION_LEVEL="-O2" OPTIMIZATION_SENSITIVE="-O0" # the flag that sets the default real to a double. @@ -17,16 +17,6 @@ DOUBLE_FLAG= # "-fdefault-real-8" # The flag that tells the compiler where to put .o and .mod files. MODULE_FLAG="-J" -# the header to put in python scripts. -PYTHONHEADER="#!/usr/bin/env python" - -# Which gnuplot terminal to use by default. -# Choices: aqua, qt, wxt -GNUPLOTTERMINAL="qt" - -# Precompiler flags. Selecting default gnuplot terminal, and make the progressbars work. -PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" - # These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' PATH_LIB="/usr/lib/x86_64-linux-gnu" PATH_INC="/usr/include" @@ -50,3 +40,15 @@ PATH_TO_HDF5_INC="-I/usr/include/hdf5/openmpi/" HDF5_LIBS="-lhdf5 -lhdf5_fortran" USECGAL=no + +# some less important things +# the header to put in python scripts. +PYTHONHEADER="#!/usr/bin/env python" + +# Which gnuplot terminal to use by default. +# Choices: aqua, qt, wxt +GNUPLOTTERMINAL="qt" + +# Precompiler flags. Selecting default gnuplot terminal, and make the progressbars work. +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" + From 0f8881e8fdcfd3cc932f33ab2467e917c13e48e2 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:55:46 +0100 Subject: [PATCH 10/31] ci | add debug settings --- .github/important_settings.x86_64_debug | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/important_settings.x86_64_debug diff --git a/.github/important_settings.x86_64_debug b/.github/important_settings.x86_64_debug new file mode 100644 index 00000000..eab6411c --- /dev/null +++ b/.github/important_settings.x86_64_debug @@ -0,0 +1,55 @@ +#!/bin/bash +# A central place to put all the important paths. You probably have to modify this to make things work. + +# the fortran compiler +FORTRAN_COMPILER="mpifort" +# required compiler flags +FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" +# extra flags for debugging +FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" + +# aggressive +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" + +# optimization stuff. Go all in, sometimes +OPTIMIZATION_LEVEL="-O0" +OPTIMIZATION_SENSITIVE="-O0" + +# the flag that sets the default real to a double. +DOUBLE_FLAG= # "-fdefault-real-8" +# The flag that tells the compiler where to put .o and .mod files. +MODULE_FLAG="-J" + +# These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' +PATH_LIB="/usr/lib/x86_64-linux-gnu" +PATH_INC="/usr/include" +PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" +PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" +BLASLAPACK_LIBS="-lblas -llapack -lscalapack-openmpi" + +# I use fftw for Fourier transforms. +PATH_TO_FFTW_LIB="-L/$PATH_LIB" +PATH_TO_FFTW_INC="-I/$PATH_INC" +FFTW_LIBS="-lfftw3" + +# Also need MPI +# PATH_TO_MPI_LIB="-L/$PATH_LIB" +# PATH_TO_MPI_INC="-I/$PATH_INC" +# MPI_LIBS="-lmpi_mpifh -lmpi" + +# I also use HDF5 every now and then +PATH_TO_HDF5_LIB="-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi/" +PATH_TO_HDF5_INC="-I/usr/include/hdf5/openmpi/" +HDF5_LIBS="-lhdf5 -lhdf5_fortran" + +USECGAL=no + +# some less important things +# the header to put in python scripts. +PYTHONHEADER="#!/usr/bin/env python" + +# Which gnuplot terminal to use by default. +# Choices: aqua, qt, wxt +GNUPLOTTERMINAL="qt" + + From c29d4eac3928ebf09a691538c9be42c6824337d0 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 14:56:33 +0100 Subject: [PATCH 11/31] ci | compile production tdep with O3 --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 8a956455..755c3b84 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -9,7 +9,7 @@ FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" FCFLAGS_EXTRA="" # optimization stuff. Go all in, sometimes -OPTIMIZATION_LEVEL="-O2" +OPTIMIZATION_LEVEL="-O3" OPTIMIZATION_SENSITIVE="-O0" # the flag that sets the default real to a double. From 6643816e70e9c7ef1ff93fb02f6191fa1c56a30c Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:01:22 +0100 Subject: [PATCH 12/31] gfortran instead of mpifort --- .github/important_settings.x86_64 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 755c3b84..3a1d9acc 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -2,7 +2,7 @@ # A central place to put all the important paths. You probably have to modify this to make things work. # the fortran compiler -FORTRAN_COMPILER="mpifort" +FORTRAN_COMPILER="gfortran" # required compiler flags FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" # extra flags, for debugging and such @@ -30,9 +30,9 @@ PATH_TO_FFTW_INC="-I/$PATH_INC" FFTW_LIBS="-lfftw3" # Also need MPI -# PATH_TO_MPI_LIB="-L/$PATH_LIB" -# PATH_TO_MPI_INC="-I/$PATH_INC" -# MPI_LIBS="-lmpi_mpifh -lmpi" +PATH_TO_MPI_LIB="-L/usr/lib/x86_64-linux-gnu/openmpi" +PATH_TO_MPI_INC="-I/$PATH_INC" +MPI_LIBS="-lmpi_mpifh -lmpi" # I also use HDF5 every now and then PATH_TO_HDF5_LIB="-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi/" From 16da4e5421fc8cb411ccc41ba679a6adab3cea6c Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:05:25 +0100 Subject: [PATCH 13/31] only add debug flags to file, not full thing --- .github/important_settings.x86_64_debug | 55 ++----------------------- 1 file changed, 3 insertions(+), 52 deletions(-) diff --git a/.github/important_settings.x86_64_debug b/.github/important_settings.x86_64_debug index eab6411c..d57b0cd3 100644 --- a/.github/important_settings.x86_64_debug +++ b/.github/important_settings.x86_64_debug @@ -1,55 +1,6 @@ #!/bin/bash -# A central place to put all the important paths. You probably have to modify this to make things work. - -# the fortran compiler -FORTRAN_COMPILER="mpifort" -# required compiler flags -FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" -# extra flags for debugging -FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" - -# aggressive +# debug flags +# FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" +FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" - -# optimization stuff. Go all in, sometimes OPTIMIZATION_LEVEL="-O0" -OPTIMIZATION_SENSITIVE="-O0" - -# the flag that sets the default real to a double. -DOUBLE_FLAG= # "-fdefault-real-8" -# The flag that tells the compiler where to put .o and .mod files. -MODULE_FLAG="-J" - -# These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' -PATH_LIB="/usr/lib/x86_64-linux-gnu" -PATH_INC="/usr/include" -PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" -PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" -BLASLAPACK_LIBS="-lblas -llapack -lscalapack-openmpi" - -# I use fftw for Fourier transforms. -PATH_TO_FFTW_LIB="-L/$PATH_LIB" -PATH_TO_FFTW_INC="-I/$PATH_INC" -FFTW_LIBS="-lfftw3" - -# Also need MPI -# PATH_TO_MPI_LIB="-L/$PATH_LIB" -# PATH_TO_MPI_INC="-I/$PATH_INC" -# MPI_LIBS="-lmpi_mpifh -lmpi" - -# I also use HDF5 every now and then -PATH_TO_HDF5_LIB="-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi/" -PATH_TO_HDF5_INC="-I/usr/include/hdf5/openmpi/" -HDF5_LIBS="-lhdf5 -lhdf5_fortran" - -USECGAL=no - -# some less important things -# the header to put in python scripts. -PYTHONHEADER="#!/usr/bin/env python" - -# Which gnuplot terminal to use by default. -# Choices: aqua, qt, wxt -GNUPLOTTERMINAL="qt" - - From 0f99196d75e31e37b6c1c4b343faaa69efb60071 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:06:37 +0100 Subject: [PATCH 14/31] debugflags | remove shebang --- ...ettings.x86_64_debug => important_settings.x86_64_debugflags} | 1 - 1 file changed, 1 deletion(-) rename .github/{important_settings.x86_64_debug => important_settings.x86_64_debugflags} (97%) diff --git a/.github/important_settings.x86_64_debug b/.github/important_settings.x86_64_debugflags similarity index 97% rename from .github/important_settings.x86_64_debug rename to .github/important_settings.x86_64_debugflags index d57b0cd3..410b5f10 100644 --- a/.github/important_settings.x86_64_debug +++ b/.github/important_settings.x86_64_debugflags @@ -1,4 +1,3 @@ -#!/bin/bash # debug flags # FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" From 0b7adbf9ac75de5f147bd48212e668a5b9439b27 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:13:19 +0100 Subject: [PATCH 15/31] w/o check=all? --- .github/important_settings.x86_64_debug | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .github/important_settings.x86_64_debug diff --git a/.github/important_settings.x86_64_debug b/.github/important_settings.x86_64_debug new file mode 100644 index 00000000..42b8a4e7 --- /dev/null +++ b/.github/important_settings.x86_64_debug @@ -0,0 +1,7 @@ +#!/bin/bash +# debug flags +# FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" +# FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" +FCFLAGS_EXTRA="-fbacktrace -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" +OPTIMIZATION_LEVEL="-O0" From 720bd4133cefd0f4f5f0dcd9cd6fa2d34f639012 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:16:19 +0100 Subject: [PATCH 16/31] fix --- .github/important_settings.x86_64_debug | 7 ------- .github/important_settings.x86_64_debugflags | 4 +++- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 .github/important_settings.x86_64_debug diff --git a/.github/important_settings.x86_64_debug b/.github/important_settings.x86_64_debug deleted file mode 100644 index 42b8a4e7..00000000 --- a/.github/important_settings.x86_64_debug +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# debug flags -# FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" -# FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" -FCFLAGS_EXTRA="-fbacktrace -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" -PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" -OPTIMIZATION_LEVEL="-O0" diff --git a/.github/important_settings.x86_64_debugflags b/.github/important_settings.x86_64_debugflags index 410b5f10..42b8a4e7 100644 --- a/.github/important_settings.x86_64_debugflags +++ b/.github/important_settings.x86_64_debugflags @@ -1,5 +1,7 @@ +#!/bin/bash # debug flags # FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" -FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" +# FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" +FCFLAGS_EXTRA="-fbacktrace -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" OPTIMIZATION_LEVEL="-O0" From c114ffde62d084af94a7327d4bde813b821ee5a9 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:19:07 +0100 Subject: [PATCH 17/31] try w/o aggressive sanity --- .github/important_settings.x86_64_debugflags | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64_debugflags b/.github/important_settings.x86_64_debugflags index 42b8a4e7..cb508ca4 100644 --- a/.github/important_settings.x86_64_debugflags +++ b/.github/important_settings.x86_64_debugflags @@ -3,5 +3,6 @@ # FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" # FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" FCFLAGS_EXTRA="-fbacktrace -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" -PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" +# PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar -DAGRESSIVE_SANITY" +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" OPTIMIZATION_LEVEL="-O0" From f50b48442c3453d6a5dcbed9853a509e640f57d5 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:29:17 +0100 Subject: [PATCH 18/31] mpi lib path --- .github/important_settings.x86_64 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 3a1d9acc..23be8e44 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -30,7 +30,7 @@ PATH_TO_FFTW_INC="-I/$PATH_INC" FFTW_LIBS="-lfftw3" # Also need MPI -PATH_TO_MPI_LIB="-L/usr/lib/x86_64-linux-gnu/openmpi" +PATH_TO_MPI_LIB="-L/usr/lib/x86_64-linux-gnu" PATH_TO_MPI_INC="-I/$PATH_INC" MPI_LIBS="-lmpi_mpifh -lmpi" From 1bb6bc3a386d9c334bd91df32b4db76deac62453 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 15:31:56 +0100 Subject: [PATCH 19/31] ok use mpifort --- .github/important_settings.x86_64 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/important_settings.x86_64 b/.github/important_settings.x86_64 index 23be8e44..765c1cbb 100644 --- a/.github/important_settings.x86_64 +++ b/.github/important_settings.x86_64 @@ -2,7 +2,7 @@ # A central place to put all the important paths. You probably have to modify this to make things work. # the fortran compiler -FORTRAN_COMPILER="gfortran" +FORTRAN_COMPILER="mpifort" # required compiler flags FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" # extra flags, for debugging and such @@ -29,10 +29,10 @@ PATH_TO_FFTW_LIB="-L/$PATH_LIB" PATH_TO_FFTW_INC="-I/$PATH_INC" FFTW_LIBS="-lfftw3" -# Also need MPI -PATH_TO_MPI_LIB="-L/usr/lib/x86_64-linux-gnu" -PATH_TO_MPI_INC="-I/$PATH_INC" -MPI_LIBS="-lmpi_mpifh -lmpi" +# we use mpifort so not needed +# PATH_TO_MPI_LIB="-L/usr/lib/x86_64-linux-gnu" +# PATH_TO_MPI_INC="-I/$PATH_INC" +# MPI_LIBS="-lmpi_mpifh -lmpi" # I also use HDF5 every now and then PATH_TO_HDF5_LIB="-L/usr/lib/x86_64-linux-gnu/hdf5/openmpi/" From 99db5a1172cdc4b8d45802082d16582b16a54264 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 18:25:17 +0100 Subject: [PATCH 20/31] add fast compile option --- .github/important_settings.x86_64_debugflags | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/important_settings.x86_64_debugflags b/.github/important_settings.x86_64_debugflags index cb508ca4..c559cf9b 100644 --- a/.github/important_settings.x86_64_debugflags +++ b/.github/important_settings.x86_64_debugflags @@ -1,4 +1,3 @@ -#!/bin/bash # debug flags # FCFLAGS_EXTRA="-g -fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic -Wall -Wextra -pedantic -Wcast-align -Wdisabled-optimization -Wmissing-include-dirs -Wshadow -Wunused -fdiagnostics-show-option -fcheck=all -Wstrict-overflow=0 -Wrealloc-lhs" # FCFLAGS_EXTRA="-fbacktrace -fcheck=all -finit-real=nan -finit-derived -fmax-errors=10 --pedantic --warn-all" From 2e54ce32aa363ac168d1fcbaf66fc4c2eb431a64 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 21 Nov 2024 18:32:59 +0100 Subject: [PATCH 21/31] ci | add fastcompile settings for testing --- .github/important_settings.x86_64_fastcompile | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/important_settings.x86_64_fastcompile diff --git a/.github/important_settings.x86_64_fastcompile b/.github/important_settings.x86_64_fastcompile new file mode 100644 index 00000000..deddd009 --- /dev/null +++ b/.github/important_settings.x86_64_fastcompile @@ -0,0 +1 @@ +OPTIMIZATION_LEVEL="-O0" From 5ca3ea9f71a49200381cf7ffa9761692c5fa2d6a Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Sat, 23 Nov 2024 14:51:35 +0100 Subject: [PATCH 22/31] ci | more generic important_settings with PATH_LIB from env --- .github/important_settings.fastcompile | 1 + .github/important_settings.generic | 51 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .github/important_settings.fastcompile create mode 100644 .github/important_settings.generic diff --git a/.github/important_settings.fastcompile b/.github/important_settings.fastcompile new file mode 100644 index 00000000..deddd009 --- /dev/null +++ b/.github/important_settings.fastcompile @@ -0,0 +1 @@ +OPTIMIZATION_LEVEL="-O0" diff --git a/.github/important_settings.generic b/.github/important_settings.generic new file mode 100644 index 00000000..4eca1461 --- /dev/null +++ b/.github/important_settings.generic @@ -0,0 +1,51 @@ +#!/bin/bash +# A central place to put all the important paths. You probably have to modify this to make things work. + +# the fortran compiler +FORTRAN_COMPILER="mpifort" +# required compiler flags +FCFLAGS="-ffree-line-length-none -std=gnu -cpp -fallow-argument-mismatch" +# extra flags, for debugging and such +FCFLAGS_EXTRA="" + +# optimization stuff. Go all in, sometimes +OPTIMIZATION_LEVEL="-O3" +OPTIMIZATION_SENSITIVE="-O0" + +# the flag that sets the default real to a double. +DOUBLE_FLAG= # "-fdefault-real-8" +# The flag that tells the compiler where to put .o and .mod files. +MODULE_FLAG="-J" + +# These are the BLAS/LAPACK libraries. On OSX with gfortran, use the built-in 'framework accelerate' + +# -> exported outside +# PATH_LIB="/usr/lib/x86_64-linux-gnu" +PATH_INC="/usr/include" +PATH_TO_BLASLAPACK_LIB="-L/$PATH_LIB" +PATH_TO_BLASLAPACK_INC="-I/$PATH_INC" +BLASLAPACK_LIBS="-lblas -llapack -lscalapack-openmpi" + +# I use fftw for Fourier transforms. +PATH_TO_FFTW_LIB="-L/$PATH_LIB" +PATH_TO_FFTW_INC="-I/$PATH_INC" +FFTW_LIBS="-lfftw3" + +# I also use HDF5 every now and then +PATH_TO_HDF5_LIB="-L/$PATH_LIB/hdf5/openmpi/" +PATH_TO_HDF5_INC="-I/$PATH_INC/hdf5/openmpi/" +HDF5_LIBS="-lhdf5 -lhdf5_fortran" + +USECGAL=no + +# some less important things +# the header to put in python scripts. +PYTHONHEADER="#!/usr/bin/env python" + +# Which gnuplot terminal to use by default. +# Choices: aqua, qt, wxt +GNUPLOTTERMINAL="qt" + +# Precompiler flags. Selecting default gnuplot terminal, and make the progressbars work. +PRECOMPILER_FLAGS="-DGP${GNUPLOTTERMINAL} -Dclusterprogressbar" + From acf90325a9a9a484fee1cfc388c485944ad735ab Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Sat, 23 Nov 2024 16:27:24 +0100 Subject: [PATCH 23/31] pytest | ignore netcdf warning? --- tests/pytest.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/pytest.ini b/tests/pytest.ini index 233f24b5..58620ffb 100644 --- a/tests/pytest.ini +++ b/tests/pytest.ini @@ -1,3 +1,5 @@ # pytest.ini or .pytest.ini [pytest] norecursedirs = optional +filterwarnings = + ignore::RuntimeWarning:importlib._bootstrap: From 8198e72af6aca75904f1ccaf8c0e5721ec411bf9 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Wed, 4 Dec 2024 15:47:06 +0100 Subject: [PATCH 24/31] ci | add a simple test workflow --- .../ci_simple_compilation_and_test.yml | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 .github/workflows/ci_simple_compilation_and_test.yml diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml new file mode 100644 index 00000000..6ecd6050 --- /dev/null +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -0,0 +1,78 @@ +name: Compile TDEP and test binaries +run-name: ${{ github.actor }} is trying to compile and run TDEP +on: + push: + paths: + - .github/workflows/ci_simple_compilation_and_test.yml + - src/** + workflow_dispatch: + +env: + ARTIFACTS: tdep-test-artifacts + N_THREADS: 4 + +jobs: + Checkout-TDEP: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Check out TDEP code + uses: actions/checkout@v4 + with: + repository: tdep-developers/tdep + ref: fk_github_ci + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + - name: Install packages required for building TDEP + run: | + sudo apt-get update + sudo apt-get install -y \ + gfortran \ + libblas-dev \ + liblapack-dev \ + libhdf5-dev \ + libhdf5-serial-dev \ + libhdf5-openmpi-dev \ + openmpi-bin \ + libopenmpi-dev \ + libfftw3-dev \ + libscalapack-openmpi-dev + - name: compile TDEP with debug flags + id: compile_debug + run: | + cd ${{ github.workspace }} + cp .github/important_settings.x86_64 important_settings + cat .github/important_settings.fastcompile >> important_settings + cat .github/important_settings.x86_64_debugflags >> important_settings + bash build_things.sh --nthreads_make ${{ env.N_THREADS }} + - name: compile TDEP production + if: steps.compile_debug.outcome == 'success' + id: compile_production + run: | + cd ${{ github.workspace }} + cp .github/important_settings.x86_64 important_settings + bash build_things.sh --nthreads_make ${{ env.N_THREADS }} + - name: Create testfiles + id: testfiles + if: steps.compile_production.outcome == 'success' + run: | + cd ${{ github.workspace }}/tests + make + - name: Check tests + id: test + if: steps.testfiles.outcome == 'success' + run: | + cd ${{ github.workspace }}/tests + pip install -r requirements.txt + make test || exit 1 + - name: Upload results + uses: actions/upload-artifact@v4 + if: always() + with: + name: ${{ env.ARTIFACTS }} + path: | + ${{ github.workspace }}/bin/ + ${{ github.workspace }}/build/ + ${{ github.workspace }}/tests/ + ${{ github.workspace }}/bashrc_tdep + retention-days: 7 From b2d7c58a4bd5f4f6363f5314a63a23cf3147d97c Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Wed, 4 Dec 2024 16:13:35 +0100 Subject: [PATCH 25/31] ci | rename workflow --- .github/workflows/ci_simple_compilation_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml index 6ecd6050..e0e28391 100644 --- a/.github/workflows/ci_simple_compilation_and_test.yml +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -12,7 +12,7 @@ env: N_THREADS: 4 jobs: - Checkout-TDEP: + Compile-and-run-TDEP: runs-on: ubuntu-latest timeout-minutes: 20 steps: From dec0394384661538094f7d482a6e81ff69fcf972 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Wed, 4 Dec 2024 16:43:49 +0100 Subject: [PATCH 26/31] ci | only upload artifacts when tests fail --- .github/workflows/ci_simple_compilation_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml index e0e28391..e47258a9 100644 --- a/.github/workflows/ci_simple_compilation_and_test.yml +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -67,7 +67,7 @@ jobs: make test || exit 1 - name: Upload results uses: actions/upload-artifact@v4 - if: always() + if: failure() with: name: ${{ env.ARTIFACTS }} path: | From ff9778c815c7298a62e2d4387d268e8ba9194c0f Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 5 Dec 2024 10:00:33 +0100 Subject: [PATCH 27/31] tests | test each variable separately --- .../test_thermal_conductivity.py | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/tests/thermal_conductivity/test_thermal_conductivity.py b/tests/thermal_conductivity/test_thermal_conductivity.py index c8f36bfa..fcfa598a 100644 --- a/tests/thermal_conductivity/test_thermal_conductivity.py +++ b/tests/thermal_conductivity/test_thermal_conductivity.py @@ -1,6 +1,7 @@ import numpy as np import xarray as xr from pathlib import Path +import pytest parent = Path(__file__).parent folder = parent / "reference" @@ -22,18 +23,34 @@ def test_thermal_conductivity(file="outfile.thermal_conductivity", atol=20, rtol ) -def test_hdf5(files=files_hdf5, atol=1, rtol=0.01): +def get_variables(file): + """Helper function to get variables from a dataset""" + return list(xr.load_dataset(folder / file).data_vars) + + +def generate_test_cases(files=files_hdf5): + """Generate test cases combining files and their variables""" + test_cases = [] for file in files: - file_ref = folder / file - file_new = parent / file + vars = get_variables(file) + for var in vars: + test_cases.append((file, var)) + return test_cases + + +@pytest.mark.parametrize("file,var", generate_test_cases()) +def test_hdf5(file, var, atol=1, rtol=0.01): + """Test HDF5 files by comparing variables between reference and new datasets""" + file_ref = folder / file + file_new = parent / file + + ds_ref = xr.load_dataset(file_ref) + ds_new = xr.load_dataset(file_new) - ds_ref = xr.load_dataset(file_ref) - ds_new = xr.load_dataset(file_new) + x = ds_ref[var] + y = ds_new[var] - for var in ds_ref.data_vars: - x = ds_ref[var] - y = ds_new[var] - np.testing.assert_allclose(x, y, atol=atol, rtol=rtol, err_msg=var) + np.testing.assert_allclose(x, y, atol=atol, rtol=rtol, err_msg=var) if __name__ == "__main__": From 7e6783be506e31460cfc1f43c0a0e064b139eeb5 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 5 Dec 2024 10:12:54 +0100 Subject: [PATCH 28/31] ci | changes to test trigger pipeline, also pull requests --- .github/workflows/ci_simple_compilation_and_test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml index e47258a9..3975a192 100644 --- a/.github/workflows/ci_simple_compilation_and_test.yml +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -5,6 +5,12 @@ on: paths: - .github/workflows/ci_simple_compilation_and_test.yml - src/** + - tests/** + pull_request: + paths: + - .github/workflows/ci_simple_compilation_and_test.yml + - src/** + - tests/** workflow_dispatch: env: From 206b2cbd0d8a1c4a72043214ada81c888d98d69c Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 5 Dec 2024 10:15:02 +0100 Subject: [PATCH 29/31] ci | only trigger in a PR --- .github/workflows/ci_simple_compilation_and_test.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml index 3975a192..96ea3a61 100644 --- a/.github/workflows/ci_simple_compilation_and_test.yml +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -1,11 +1,6 @@ name: Compile TDEP and test binaries run-name: ${{ github.actor }} is trying to compile and run TDEP on: - push: - paths: - - .github/workflows/ci_simple_compilation_and_test.yml - - src/** - - tests/** pull_request: paths: - .github/workflows/ci_simple_compilation_and_test.yml From 7620cfb632b352453f346507c4fae9e4d17d29a1 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 5 Dec 2024 11:28:34 +0100 Subject: [PATCH 30/31] test | check if thermal conductivity output is consistent --- .../test_thermal_conductivity.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/thermal_conductivity/test_thermal_conductivity.py b/tests/thermal_conductivity/test_thermal_conductivity.py index fcfa598a..7b4bd2f2 100644 --- a/tests/thermal_conductivity/test_thermal_conductivity.py +++ b/tests/thermal_conductivity/test_thermal_conductivity.py @@ -53,6 +53,24 @@ def test_hdf5(file, var, atol=1, rtol=0.01): np.testing.assert_allclose(x, y, atol=atol, rtol=rtol, err_msg=var) +def test_conductivity_comparison( + file="outfile.thermal_conductivity", + file_grid="outfile.thermal_conductivity_grid.hdf5", +): + """Check if the thermal conducivities conincide""" + data1 = np.loadtxt(file) + + # without off-diagonal contribution + kappa1 = data1[0][:3] + data1[1][:3] + + ds = xr.load_dataset(file_grid) + + kappa2 = np.diag(ds.thermal_conductivity.sum(axis=(0, 1)) / ds.number_of_qpoints) + + np.testing.assert_allclose(kappa1, kappa2) + + if __name__ == "__main__": test_thermal_conductivity() test_hdf5() + test_conductivity_comparison() From 60405b2ef3d22025dda98e2d13358df9d609fb76 Mon Sep 17 00:00:00 2001 From: Florian Knoop Date: Thu, 5 Dec 2024 13:58:33 +0100 Subject: [PATCH 31/31] tests | only check final thermal conductivity (#110) * tests | only check final thermal conductivity * fix https://github.com/tdep-developers/tdep/issues/108 * ci | run correct test, fix * tests | fix paths --- .../ci_simple_compilation_and_test.yml | 1 - .../outfile.thermal_conductivity_grid.hdf5 | Bin 70277 -> 0 bytes .../test_thermal_conductivity.py | 43 ++---------------- 3 files changed, 5 insertions(+), 39 deletions(-) delete mode 100644 tests/thermal_conductivity/reference/outfile.thermal_conductivity_grid.hdf5 diff --git a/.github/workflows/ci_simple_compilation_and_test.yml b/.github/workflows/ci_simple_compilation_and_test.yml index 96ea3a61..d5360133 100644 --- a/.github/workflows/ci_simple_compilation_and_test.yml +++ b/.github/workflows/ci_simple_compilation_and_test.yml @@ -21,7 +21,6 @@ jobs: uses: actions/checkout@v4 with: repository: tdep-developers/tdep - ref: fk_github_ci - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." - name: Install packages required for building TDEP diff --git a/tests/thermal_conductivity/reference/outfile.thermal_conductivity_grid.hdf5 b/tests/thermal_conductivity/reference/outfile.thermal_conductivity_grid.hdf5 deleted file mode 100644 index f8bd4e9e99efeae7129d27b1a147e1525c6808b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70277 zcmeFa2~-nH*Dj2rq9UN8A~Hlo!8s}_$P^U?8~_0oK_Q|dh(H*G5JD0a1q20A6d5BT zG6@lx$1sCT0hz}zhcN*HWKRBOI^Q|xyXXDhd)Hm-|KESntLfUccU5)w)4O)MF>%?sr6fw#21+`4LkwVYp;-(4aWrF?weOZnK=mOZrl=bh{Jl78#rPlomLv_yhrsThI64k*$TD(<7Lj(_%qUKp%wwa;Z9>!x0yY z`%hqwhizdGESB2(UnR@>YP)u^ru|Z(O?=u5)G9!qHv!sh=WKh=!VwC42sM8KvvuOz zyq*u}OY__Ah2yGKi}jb!znm_06QGTMYVV%8-GhI>y>$y`;{)1TfD5?at$({d2Yc8f zyC+Mq{M*-w`lH=ri}%B~VF71b3n!~52>U-EoX2^-YcJoQrsnlO$}jMi1grS=FY;F} zGM3w4G7Efv&+`Kq&zIb?8v>kneml!|QjqT?Z>hpsfIBZ=&A-^7Am8qV{1WT{JuhFy z_rT(zjrkJ`zGa-&FIgu3)%*oZy!lhlx4LketxIQ{Z~Jw&n&qbD>*kw3<9a@4yGKs| z5#QhM`#AXAJR8uC%?l}gF#)c6aWmA_yRZt-kj1CY$9D_1B>0D9QM>v0XzKq^V2QnS z8a^fQe_d|(lDKE@zb^Oxb?N-LG5=hb$BX53bpC<;i%n_EUxk0yw?!TMYnheY3IZz# ztRS$0zzPB@2&^Emg1~<+0{_nY;wIqsmfgrd-WOdFZu58T8usR6@{KjeH(dZntvC6+ z#+CdmaJ6>qQ}5G9?}~vp+qf6@X|MU(BDzX?q9H@*&KFYJ5r0kD5n(SbWso~JI>q^P zccMILL-V@RI za_>#Jife(&N3&%jHkn?7P346X#9d>n=qTGh&+e_$pWx=0|`6( z@0yOV8fzMo6!ZL*+@TbkQ%Pu$^{CZm`PrLKc@>#&oKKDljw_UCsFkymbfjZR`owzp zXt0~C^r$f{j#TNDjC&>Dyy3~GijLK07UCIC&Z>a}6lKALf+HL)we8p|Fb-FBxN0oc zuOf&fma8OOyLR&39^n>onnd@@P&YqL#q7FnTGkgNN-anZS5l)YGNbxQv~=tszX)|3 z3C+TLpxjQ1Md39Gnx^kER!coqEHBTJ7)zXp>D%tqN;=v+oHL>NKzab{%5C#M=-&;? z(@P<4k!R(zS(}(bt%FWjBXynBdk}Cd_w(~t zol}aw>l$|dZh`R6V2jQwys7>3dUU{@_F#Xq^7ix}X1Vpr4RO+!@wZbR;OK-X-FwuS zmQUeXJ$qM0E2vvQjQ1g0UO8K@DvlY5(!Fy{Iq0~?y+qR57}fpZQ(70SM*6FC4QWzf z)Gk-w2eV(Zy{^w1b=R_{)ts;mNA^#A{&IIVlbYF}JE!7fLOfbD(&Xt0YA1ENRAwh3 z-&xM-$As>Xqq$^;**jut6arq7zKD*+trA7lkQXcvVMO zGMJf$eWZNLNIA=}N)O3fa^1N-58N$Fty`Re!pLM5RcFNX_L%Q`J?hBM$8>Y-j=cT^ zMYfKh$#~108UHgnVU}<42IO2rGeSV-sqbQ8)ADLbR27F`kK&(eeHcCSyZHTenqn$S zFhrU3!caCaUG0lLs)6?Iz3va^hL7Ybdy}MT-HYvBW4asLy_~UW*e8{w9os{)Xt@nK z5ekxWEL+ zfeebhuG8L!;5ALS(a!Wu=`&~J-3+?);u$Hn**Xz5N)xFt%tP~URcB&49?Npy%oh0XiSLj1Cdi*sy>vq_9;tnVsC^0(TP_wy7JoEL(XPU$ zCJ_a0BR!i3i|-y1@p40`w4=Y-v20^wyb3>dTS-NDB%;4MBk%rb@=vuB*)+=)j^pG+ zcAI^1W~eq+6-P=#Q>BSJZTc0yeuVI?M%TnI>eKlNwA6Zcvqyqade&;h*~5^^n-*oS zpCemXJ*jCEcTNXIWTmIag?>X+o-TUyCNWr)ZLr$bv_EFY$6TA24aN{(q7(dN@dy|e zaXAm#eV0|*cUA8qQuWv9C1;Vi(L?@ohi$Wyg>-pL1KE1}*tXLOs)79#X}gpX_vKs~ zG`*W?JN2Wt9I#pBzWnI6^x}~+_)wZqdg$eEr+L9QA0wLzDk$&n z``FTb6RWrt&g~|ZmJbiAMqD&gVj4zs(PzbhVyPv;!r-MFS7A2={6(}e#Tq8HD)Bm`&;wsGdF zHB;u4yS6hVj`8^GAk@T*aQBMH*Le9R&essaPflpAw?;-{0hjRv4ej}iDGGR?FpjL?A+GGDpI7G zwD2tb%PhU@t^`&ljlGHwDr258uRc$oItdFQvI*jnb&uBV8C=zOSG4y(cPRdkyz=>Z z<^|ti$wBz1`OM{c#^w2?<^1xz;M1k~x4VBs;s3&XruMGIHs?=0f7*YT&s?6*{qOUc zfA)X0-FELcx3hG%F?T$$*z8|t$o^>_?%MJM_hP00cHATSSJvNg`s-Q#T6QJ3g1`y_ zD+sJ0u!6t}0xJltAn>1u!2h(a|L@Gx{j0c+ReT%&=BF>kiSREv?tk|;{~mv^?5{8L zm;Lr*Cl;}``Wxi`=YIR{g_ihNubJGp*ygg|{zojrJp2DN9>Es881eB>emZpC+5b1T zPfPc`T=bvtTk+eM5n4%C5LiKA1%VX=RuEW0U9n|+A3-PiS#x`GW@3Jck`KY|FK!4Yz><*!e?A;RQWSvs! zm-8j|i6$dH_x$j7daAMCwL+-Z^@01ED<^&Io^6pyK2dFA=<@MRq*uuHE3K&_L{>JT zd#o*Oipbz_5py{R0+LKsr8z@sEgD$$H?t#dgR@7v)7t#XnH|=%M*XbbTOyw9-vP*n zIOWuiB=6a8*0X-M?YJDBBZiz?--)=J9ovZhB}~@}NUFJOL%L8EXMkzV(MoHtTxEKN zkegZ7KAHgbryNO6_hk3@y{YkvsiCSRbHAC`V%#z6%|ROImba1p%IF_WO@ zD@Dz`%zC-&kI60j9+yGfAC5l+T~Exy=WrQzthYKHs?C8oHPqDj5#D=nd~=`(Hn)w) zVk@x*TOhZn91l&?Ji9)eiCVKe_xZC78wr;#xiQ1USFj>Awot$Nluo7>-n>&je*+C* z<-O;)w)zMB>2Ryn|2=2<0AdYi1{~5;ztPImmjSh6&hb#NG_mO+g3idDxnD!nk5Dyp z2A+FjNUPS--A<}gZSH;tiT>5P28(x@q?lz+auZ#2(uN3F6Gn@3gHZ1&HMzf)D>x6@ZAxu2DS7JSgd^$TWB&nf3W zJ%rUS4_ce_RG~*O^JhVDij*i;4wlx)I62{_7q0g{BLYW#)IJ;Ttge%@&Od;6d|Z?P zDpvm!@e8$w*WW7t6C}v`MHOOA{lL1bkCzvrrx`y0)+I!%zZYi!S%f}3EZJvx7oo3wZhZuRd0i?Iivz<>ZHxL1J^A^?Lh&v5GGM=6n?sY}w%g8Y!5MatFcy!xewoi?=9 zd{*ujM4DW2;a7RiIV-GkFQ<^UnmA?JsMrb)UAUT~^H+0VRHA#TY%C`SZkN0ds+{j! zk(I@OKe^-Dk_W@M=e-GanGW}pP%+H6n+_AeBTW-#AxN9*$1LeeJf#AQpDrP`s9Hl% zk9aLf*0;l^Rg#!fuL&+EJAxp2R^w%cYOIq^v!HA*3|$;M)tG)<1m>D;iR}|*enr3a zQWxgz7C~)do|9(oobgbdaTpdr4BxNwryBHx|F8aLpMvhG^?2P9q02P$qrI21boaYj z?&?2e)j_RWup;B$1Ob;9)JUf)%5|dlnI^^Qyz9gYQe1w3V?1mC8Jqu%md?xe19Jxqupiy1sW<&(R>44`sFjdhX!BZ0)Y&)b<1E(HS{RGYAq&fUKK5>pe0O$Cq z_qe~l)(eQIr1OPJJ=1}hg~tadQ{x462)oi5^fx{BZ3UOqJXiE_-Q|$dBP5oqKVa@1 zS}5@)-+W=$9~Wf5jfG{#!uH~PmD0RDdi*bjnUtKHEZ?K+?B}sDe`DS!+-EWB_L+P6 z&&{fh>IB`_o*8?o2V==pE~&EUyec|z{4U>D^yg!ONp6-x53#OO9E zW(r4e&gc_+lwF(4;|PJI%cyUu3Zn{x)JDt8XJ&(^)fz1;Nrljicj`U3$Cp5pEeC!J zu$?7F__@kwnNRVW0qPgc^vjX{xqdWvaIf0n3!1w~uNqdM`vAl_0GnO01coT%QSB9P zhES49&M-E6dEZ6T1D-ugd-hGBAxd^|Q6~&^XN5#(-+ZC?IsG+x9GERK@Y;zkQ+9^E zxnC0P?H~*(QSt)a3rhig$v)3jZQ5?2>-^GPq-nbw8k(2%mJ*r0nx-edXmyTGTC9ea z(fhLAe7I-F&yXS5N^WzKs1QLcW_Cli&1QeG^X6<>PL#!Fl||>qiz0MdoeFRFD9r1? z8SLZ0Gs2bNJ2QHwf7%s5{aI`3VUB;=E7cFSgg-Jn)UOfJQb~V1ly*Y>DETs>IPD#f^CW2(j5Wd%B;Q z`Z6`QPzsVRqKYq~WbyqC9jcm)N9tOPN25AGs<+T`4ec5_gkXs7{el_&(;niommD+c zj`L-hiBj|AhLEP!v>~o<|pEQ z2A~kq2r0@V%nMqeXg6{^6HpLoS6E=Kl%u+QJ;eD>`zbQ^Hz$y-5=#hk%*MW(|D(jH zJE`l@3}2HXa!NWChO`i5acYz*ty5+w;y9$ziSP-uovMA2D8-T;3h?1>nA573&HAL( zH?Q)edzMrWFzUg0LF7@k-?G91ng{5dgoSXn{?L#NDN87u^43Y>2~mc0dN^NWTC5AM z&Hcg>K9li`Dhf2;wV7*DExX-WgZ}uq|Mi((B{Q4AGrNI@#EtX)ul-T2gEv#tfpUH( z^v?2rg7+ve3#&eJuFH5P+=nSOTKk1^y)jB3z5^BWo%jmzbq`s_JvwaigJY3VJ*JZt2Z<)7S0yr}3}vb!}YB*x5I~Gb&J#nZ}(h_qmRRi#AN08kC7OD5;_! zCC6;b^;0tG)H~qHSp|Ne|jzY zzpyMMu=rxN@MY}$Y3Kj`SY`S9ve5D}mDW|D6tF#AIL;rIKM?(cu|WLOvQWUDzn1%_ zT=~*@mgWD1(;pYSTyP~_L0|=e6$DlgSV3R~ffWQ+5LiKA1%dxK1UB*g^JgS~4$u4J zXPIm)oaO`4HZA=i&c9kN+5wdNUoRKU|J2fvg*7ABuryO-nBQRY$BE58`yJ!M4KF}l z-U)~9*s2_>EhBYZxZWjxTx#Ql_m>O1ias8zI1^L-_LOI}lHUE-4aYWlUKURN#pu9V zn$p}Uv$c6dILnp*8KZSl^C{F!HCkG8cC#~1o|>!=lNwdMC8!89LSDn?DZ6!f#RzY| z`W}ryE2%n@j@dfiZIux41l3)}HpAwIb8Ua8UTX^ve#5*>Gc@JBy|!D&I-)8i55voI zG=DJu`iq1>MJ$qZvg3?psEu|)efGFF|4+0{SIgMV4scsgNGGaqDALWP`5hDXAgF$q zMAbmzkBPV6-S1a>fC;>-kBJVw`MbP$v54W!5zd}cFB`~S)qD$5cV-Z!m7)&aL%-8X zYw#dsQG#aJX1h4jejP0>?mdj)j#;dbiPZQ<%a_;Vk578}oI*DSZtyjfI$n*Ls~1T zuD)zk_LpC+0s^m%6N8D3xg+7@*N><;^?j8nv(P5w8V^#)xdz$$_HuVASjU|93x0Bd zGk!krB&N#AP=!*D*<_U&iRgdQ*7DHcS2h*@eybwkYM0?5jdgJ7iKB@%HyOtotu;Mr zi>X1a@yP0j>u#pksNRmcR3523L5TC$G3F(v-T~#fB-g&XFOh9WRDnm|ObSi^={9~Y zIE1a6V&Y)@?o^s3bH9wkEefBd3{Lhp_q_jj0f?SK94)ads{c-8eTw)wc`2yd(>9r+O4-0FiX zEmO@hNa{+Do_-;9m${m#BZ(8L@H zl1r>k-|*cIcO(5=Xd(6&SrLC{W`adcLmz`!Q)N#BhbaH?@RrH?oE^iDb;yV)oma{4 zq^kYf*|9bLt?c0({s<^~n4IjER4jjyGMcI@ymr3YJ!;fxNc%TpouC997i6bqHrn}> zu{v>EHBe`<;*rxJ%ZzpDZ)@Jy2o7DcMX#YA-`5ylv)J(0J4Pdo3Mq%5Q`@meF>ONWwF^blX7@c( z+!joXo%2`Da2eC#7kE(d?k?(8A~<Gl=eTUEiMxJ6lG zbCB@Q*#~2rNDJo$s+`K*QY^Dd*j(Kz;;CZ6pQyD9ypl=HO8H7oh-3I;Nf#<7kr8Iw zhqUOi&h(Bsy}dRYS)JNht;vsmp~!Gdcs;Hw@%`zSrt(K&ZD^g#WG5npXHx%o-4Sge zR-UrcyN_l{;oIj>G}gr{G_D*fF6_AP)M=rIkm>Of6w|Y97k1kjF)@WJMi~%R$#-4B zfrJ9!@SG6G+W0ob@5w> z#P;sX#F^H(+aHq{)6pXmC)IwOp*guU*WIZ3Siw+uR!X1wBo?C1eUe^#jAfiM?nlEi z&NXb^k^9a79&jD%&^B6$Z(@#klF-ffx93Anjo4?icif`!A}Kn=x>4p~(|bGmCsOd= zPi9U!Cf+~I`GxiX9fhBLr>+O%~L##kRu#s?EkTg7xPZG zoTl3tiaafmN11_}?EB%UW$->RIV27n7*Deq>@sFL+>LIXF=yr5C2L@I()u%_6X9e2 z&pwnilbktEEgUDObQmz6s{T*@F|xwglQ_*#m6-j9%ZL&7@nz8!wEFMfeRD=LX|$1g!E9-w!AI52BV8M z%Ls*lKqcpx-lgXzNdu(8<5UuUt;1W@M-H3WXBdbYiCsLaRVoDTm^a+T_!`_A#xUN z`k=Xs*eQkd{mR?lQk!GbMHhov+%V3!!}|$;PgUbqNYEm%TU>~PkVID!L|1yY+uzh^ zM`$ViLJof93HG>)X^I{Do;@}MoT)cu+CpwXLdyB^(Uvv$I@upTf!+r^Zf^&ol+VR zx@%5SpB?4uH>t8=uCt_`>OopZsK4opc{h>uDud+R2P$<+ZS2GTp6l$iBWx*!kk9-i zX}urMYI{xE4`>!)3%OxZO9V*#3l<2VSjp%r zz{D}Y#&@!YUhS|frpi;H-K;|WeUnggtO9Sa%>T6=Yc}UmM{&}9Zq*zA??yA7KTh@H zExA=lNVM--2fh4zky9dl(k15-pVPIr9wGl)Uju-1pzrf7YsVo@WJ*pOW}QQbSy^;gRh4epCVfGu|o+zx4Xtb*{pbXa8KIZg(GQ zo!4}NA5h^1Ppm3u&5r($m{)_)dkA1%FpT`m!~PaG`XeTbV9bri8A?B31etILBS2O7 zl4)?;=r0yvF^Z?bh!4~1Rrn`sy5##J`nRyf`amUW8D32A6a!qMHnqgq5XrsLijm=- z>ok;W#JnoUZ0L(7ZY>?E-T z>HM9mgjZpdc&oX5@N59EzAAi(5yG-0z~EK;fgX{rTyacn87O zdvYSCyv&J~-B|`?c5d;bp>S+PI2Nu{lj}6k=#L79n+2#qDE1);%gOp`75j~F_98?5m$gw_Do}$^GA^|n2d-AzDS9^bNWbaaSu*Oq~Bc-v6H>Mthf9v z%t3k`rWELZOCpVYAj95HGMA+E)sy8a-X2Qb=Ojy}g!?`#W$TrkQ}X}l zHRLMbuz6ne6ym8uMizkR;Me?^O>jr9lqX~o>W)>~(_8nU&%amq0DFpSGdn0Gp@nm`*#(%cImj1F$zA~LPJR>D4vvR<}d|@_BZK; z`}KP`BfZp5+6T{_ROvdrz-dYpZ_-s{-}LX|6?}FFi8PvvLA-Oow$H9{8b_3dh^hA6 z9}+FYU-faEk!P}14=Q8bY2++Sz=9ZUcZ*w{IyILy^Wykwz+10Fn-$PWVU zV^@dD{Ml6vvhb1fDRh;=?RL4*y?s$PvBgRN?LL{LTPz(10=GScbe)3RG^sQ@nDvgn zRG45T11rHsnM7iyve(o10K9_v-jqJ@xCi9t;_8$QYr@#N&$=DpvJVVZ}^sph6ndRlvZ zbxg}hkb7X`L{pfX%vC85gdUMkAdTEkIPch+o!NMw`?BA3=oicqjp0sQ#=!9~s_Z8m z-rqI8D-C*tR^vs>Z*j-|)~K=z=v9k(ec5&gR#ZR$C#vR^;8q5ri;fV}{z02IdW^&{d~tx{^5iPwSY+O2InTEpB=UdQ*U^DKPd-S-zW zKAcj0FKkAl{quAviHPMG?-afekKGZ4@OCMK-NHQ6PsY|lTpC44_nWTQ7Dc26Thki@{HH3w1pv78{p+& z_DuEg%ju&7=3z#=MaIt0dt|kT-U5zVk@KQ-6GLoSoN!@Le2eIt37Gz}1G>3=bO8sE zzTK}4!-mVY0FS3gsq~d&^rFwQGe$}O8HBE~(073z9sXl11sH;RfZ>Z>sI=6hCk23~ z;HhFxE9MH)J)C+rFEGMwOlQB&mN8l^3$uSa1AiMH#sR({&S^tX%ZHf_%^&iuK90ti zGmO#`6L#&>Xpta6`JX#STX;Bsv-Oybz7BC_v=jorF=tzt{my5hD!5q<2o1r!Z)i&< zGpxw0(6CxRXF`V)kvQt3U&Vq+{Iz?r#OK9~Ol>h8Be4ZX`)nPvMZ6dv)i^-fNlcf}XN4kt&r`MaeYQ|I}6&?HxJPEJ4(zhY|fO=>lTe)vJWLzAk)m@^RkzktgY7a zfNMrA zs)g@e%B~_-&u1g&J(Bae)vB98W&Dgjt8x_ukr%GPh~1NF)%-GM52d|D`k%Qwr1pmg zFBT)+t|)#BGY=z;Q1pky=G_;-VWE~Vc1#}|xV@8v*d=O#E?ml$tIBYbGs{sTQzA3e zom%Ys4tlkCi7EdP5<}hLf{#biNkA-bgT4hJXnj>$4|sxw#5i<_0>o2sY=aj7CZL85 zA@%@b!d_1yDI0hItLz!1K&oeRlb#gdG-`?p>vI}=>t5qGUC#RSZhuE**!ZW6ng?;y zH;a#+ICAL`FK(<@AAPlqs-~{@Hb?z(LUWSQPxXw0RCOs;BddAo@qsqLM`!FY^gk_m zn(6z@!DKKZIVd~4YHK@Ylxcqz+kAI&`_Ip9&28GSO3hJ@JbIqMGw5< z+^&91UpZKchGHP4O%?oUr?NPX(8M#_LRGE9b%kthsa7!G(BAJl-Gw&~7Cyx)Uk7GO z(#nsSW;XcZLwKFZetJ5;{T?d5!RmjT^GI=pzV84Vxt0#a{etfsIr30JdSsGW>zHs$ zj6Bn4Tvkp|Kugmuu|gcD{h#``ls-JJ%L>UI4h) zZ2K-Lht1TN$jKe(La-@ftMfOwjW}Kg+)HmZZ7il`YM+9(%^O+<4FH{O-;<4G> ztpy;quziIQ1ckL1Py#wj3$*V>(b8kyE(g3I=yR@T;V*>MRJn(MNAWVn&k+Gz3v-8| z)ox7KK#x~V)wKma!vj$d2V^ld0KX#SuGs*tFt@_%p&Cc=}e>CS4+B3flfZs`_@% zjd^>>UF%dJ)VATABpdg8Ba6tPh}uwXf4=b5Ea#GQ!P{s(VI1Z1b0X^;^yt|$C7}5Z zQg$h3w~^06UjfJ-v{)v;WRcRywxpeyrvU1&-|H5>3DvzEx>foI?}TZf@P;S)*3A9; zy3bT&f^{$7I{-E3S!C}&9v=8f-3MVw!e13z8y>hfbYFKH1Ke=&oV+k<8?{#0Ka;YK z>0nP3Y81@+pD9;YQWS%@$>=b4+#m~f=lOo^9yw#M)lHD>m)E}0qc2>P{K@bzk6 zw4n0eRbEKfN8tn;q|W;f*SBmSnO2mm(j`B_WkA%P6xN;8S#WL6TYtplnZuOx>O+N= zG>+96v=dg$w09kgSx7H@$7*(X$+n{<@&WD(l;2oP{akMkhukVa>A?7K$hjgBqhd+Y zo_|nftgd8{?hM{GRu=-K+62C%wrPp#M1Qbiaqot)xO`rju+@OA&WG$IzRrEO9>ITmpo`W@*h9pX&* z1Pp@nrAQuuc&!`}S%W;^a)&#KsGR|$runQ_E}*ibmEgm~^gb*k zY^34?sXa}4T{PTH;&CEJs}H+KT$hrIs>2 zY(b956da4@XNWOD_f$<=EYS3p10uy}T;g@;H)b45eGZAb|UD<2p~@~{B&Da7Hc-e=}Z2?1{4Zpkmqm&GzYgbTmruW|Nxi5$yC zcmZRN*!0Ud)w`v?7nsQ&R2LOU{knzuEb$*NdL>tvAIH6 z<5azJ0cA17DPoTT7@cYsiviCZafE%g1U{U(-E?@C;>?a5xt*HXcJJXrEuWDupBpyy zD`fJ@vd;qj^IM2|WeY~*_S)?IoD|~*Ee2o%59f5(l;G%0*mt0Zo1Cn>^eE;mXmAW4 zdHmVY%VnRsB!{EiIf{GR^AiAVPUv~2%26z0COsFJo*}-qVkO-RV=ZQ`k#jamR{)mN zhInB5m_J%p!0St+<#fK`fVnhBvvo1`1iB>)@48q*BPub6>g;eK-pe#GJBNba(^UK= zG3S2nzL8?U`g3B&)&ny@xk*no5|@dT^^~Xck^&Ggo9ErK-G09(FdUSO`OvV;Ik7sH zVUjE6*~Fo19hN=$dK5heVg_n0Q@$N~mZF!{$61?>J8OeIrzzWwf-Fb7>S6YpcM+!6&l)y!IwO#r#?prGtXKZmAQoME=gG5% zL4*`?%vFF8(@P=CpQ17267Jh~dbn0(@B;fIN;+xSY`2}|YA9e{a&%@!lD1oVdIB<- zDKG{2t}pu|lCmfe=c&y!WV(7?H#e`7(#AZiHBOYU1r1xV)L6n}{8Do$@>0H*1&kZK zHwjJfZa5@>31i2gNDiMV>uCLFJ3VI0P>OZ_9xS`Nc@9LOnf{)92{u|_rmF`n349#V zy==q3D*|>IE!hd@AA95MRVVAll+B`A(J;y6&2ASKZg$>61GvDWx_G4vW}6dGG@Yc4 zdb+16$5pbtX_S9kT=!rO){4dFfESwSot%JN#0!y&djXS#mgw{*U~Zu%p36H5CbvTN#R$oXaM~R z*Sh@&?^Cz9vK5rG&CRm;+`L5_36J!cYtoB^Ka`rcXbmbU!tD(hepK>H=eh{4#MTKU z9JrmXbJ9a2^LHRMVE%V*BzuWVCQ2m=4`1%bCPedR|E9~ENL@>19d&PcRRVz~qQn5} zUjpI9u#Vb4g+Ejep)MKO*Ry503UsTX@H4#Clxp{rBxtpYhyTNF@v%3HX8C>|gPDNr z#`dX;*NP9ya$fAZgHIe zuprwQEw+oYKJ3S@QIjKzn|Yfel>nn|KSj9e6XVVlDuGBG5S|`Zyu+qSl>!gfvx73b zd4ZsDP5_3K<*pg;wF>Z6=qiBSYgx+;jHFdv8QLnW&ofg*Ge0_tN>^m) z>aC+3cn6Kgnsh!WHi)EQ`#2Yv)%~=6*U1@IMb=Ob{B97zpNcj}bUsgklp^P5+ImnI zeplKErp#~+b1n4@jam>HhO^s7#ByV_ABI!fGcOZQMgz^LA>FF-Ac}XUacmpi$%sAT zb=-7iY?JFJBF2X%I#LfbGo4_J)C;I%=}kqbF`z$-k8=J4KQOSeUkp21{@tm6>jQ&W z_r*$27Zc$4zxRPb=>PD4s+ODGzx+kP5@R{L`~k*ty7Ga+GGZ&~3IZz#tRS$0zzPB@ z2&^Emg1`y_|G5bKzyE>3gsG+Ljnd|ItIqlCH^{ql_WEV^wE}G+-N|$Hf=2oWe7+P# zU($ao98jxcwKZCEcjKDXv3p>6kEa6&P1EO|DU`Ff#GIGE<1byO zt{Hl>5N|j*5|pn_PKW?=zYt@+l~AzB$NR*J*#ev-m%3|B7F75@HX)(-}WYaQx`Ja#X5ZLP*^6Sq0PgKgr}~R(VqAkEBYRa#e=$vv+ChVxQN5Qfp@$Ff^anmF-dGV%+%Z zPmi})TQG0n3emTn%YGd+k5Lr*ZPb}aMV?#B@;_Mb7^NG3ax&_GA|dvrqWpvJ>s8~@ zUzpl7v0rt&mHZS)?8l-Lu8>k}8*cDWry?YwBcI9oPUi+Xo|QNG!1J!abDQ*RSu~I4 zEbNCgis>Y77mgI{5|CrT>pmSVTY14xDaj;wP7R)LhDWG`2G5$;Ta1onN(+AbI?*iP zIOl(w)6ednQVHLP`IM=J8T_z0Sw{7IVr3hoa>k#ERNTc=t)u7#>H2cY-}>RgZU_QZ zPH_6^8KzQ>ZmnTYW^eZ2urNBR8p|3Q2iY>qv#`e+z*K4+X5)>#p&YpGb8D%VUiXXJ z6O4u=p|wgLn2ScgAfoBz@c|!pyy?!AI|n(lx14V9(ESV-Zj@ENz0BC$++B#kB+W&n zyqkG7oLSJ?C4c>V?NoF%-7yI&NA_fE~T%}G$!RaUpIAs#%#0q&H;HSw)ebUE!^w$TdzRE)?S<6 zt4ELdYecL^nCY7XYJC$}_t{%V%Nd&=MX{K>?2<%8T%#uG*L2U(xfv?TaI1PnW00xz zuE4CRSSn(&+A=3x@^{f0U02$L1kM#(6?oUZ3_`DzW!{-dL zZ{`l(W>x)Y$cE)*_s2|JxfX7Qs{7f(%PXFIt-z@res`nxga2ip7QO7-bIc!dX(!0& zWYs%}(2vxFNHPk=ecpU&`*~;rV%&1ppj04{PV=;xdqnD*@iwzIsl{~|nl@zPR3i;^ zx9jFLIA`cS$r$Gx4q>_J@QUl*CNht}?J(j=rsR*aJo_(%DccQpM@yMqQQsx>=wQTTS(br@r#o*0-Df9$^;jsuilFEi3#S z5==UdeJm<)pyXU9@$rz8#Sr2R!faID1Jd3jfjg^am(eykJ0xdTp^f_;t3%ISe|S(^hPy%HY7OXW-#JvHu?uZ zY@`~gC}2uM5Q5a5Bz$8v6j_~{R$6^Oj3@AryYUpY`MiR^19vejiT`M^$a0+W32ieU z)uq6g0t>pVhz9p%E)Y{`FV3wfF4FEk1uY<*-b?veO41~gG+PvpkZ8FGbYBSJ33y#0|KO((4y#oq0NTe=o}C*0e+p3m$CBdk=H3b3{iq+!4c$o;cdl zPn&eXcUZi~JI^|2^wE3+4;rR+U&XZe0$n&4`RxPNl$>*?|8{Xrjn~>42}(mrmk&{^ zlj>=~_Q)iis$xqy=>3?dWrlO5U5YyM@57Y-X{ z@E*}M0BdAC?UjPXD?T)beS}ok;v;kqZ4W0S)QUlF?%3(to~Q$qO_)kxcKus!iWBAq z{OF+`g+XAY)395d8wg(q(gBt}4ZDqtEUCFlSP!pn=$^x z09uh@C0)jlC4NEdB>B7h4w;8R-oU@o1s?Y8K5q9J2>ab#i!D>R_+o)GmH#Lg2)m;S zaCdf2g;`dx*Rqdi_V?jn{hW8S{XLz-8WHFo#}?e^r|vZlk(#y@7j!FgG6T)zeznd zA)^&2hA|uTRG3_eAq!)JLvwm7hZlt)N>^egHC=8K%as5JS0jK zP-q}(n<2{$=#$>L7>=uiSq!{&;1+-!4|DP2odF2j52EnBKwM-`>kh9?WN$Qg4cyU7 zQ*qrRH~J=Li*oXG>7xVIeopy!Z@#5Otj%#|hIQ-hRr@HV2y2Bi zW8UO6j}~b_jaxVam*>#J+j2%SqKaYToG`K($Je07Z&TYLE9&yWr|iw=e5Rxb53dKto-{X+ zPD6)_x00wYAnAG6<1UmNGQZ?(r^tV{7#9Rnl%fGEs}|L-unV4N^~R{*g#xR0?bAxg3HY%AN}0tbdd0n))rbU1@+zs??;glwho z^YiXkv97&uE-v6{=ZXNMtzWe2;Sckl2`TYR_AbFzl)Mx?ruv!+zOoRg3fVLtks2oN za4({NApqSzqU2Sr^FnkgVyk?7ZrMWMd9Ug#(NmKGSbiY(LP^hI_^Aa12pHZp-wRZi z@az!*5Da#gBg>l1_IX({M}-El&OwFHXL#QQyA$ zM=}r}d@mse^TSm0iR<2<~&+a;ZBc%_-4c=a&slH}|OUAX3XZlYYt zMI0>wWl8r6%;?6nJG$6L{&&3%wG_bX^ucJ+LymnR-KZDu%(gBaA}+a)P3CKD60Kd- z^>X}2Vkq~Or=A1u zoa^PrIrm7BdkF?N4G9=uCw@^--RI>XG}u?9ySUG+TxAWzUcOANc2_N1as8F09CgWa*VkRE z*@IcF*wMos+19X5X>EgTf(xgj!93q4hJgRT;=MmwvR_|#+*8*j>~ak66qkkaw>Z&v z@<@K_hYY!;=&>t#c*ooF*q@nljvaMhi!N2{~A(8ZRM{(zv(b z`YIk>i@XXWyz!x@zv9;Cuec?}2KM_p{h)k(i=_~34`iVK0Ig?$)=HA*my~O=(Y7R| zNo@ZlCQk2@OaGKFFSyVZ+DD!;lnGVY4c}d;}51>H*25hEgTo$_uhFpIOk|ootXtIz%Du% zr9o6}cm9MJd~JBS03(&QBZ+0x_z-u}bCBJ)J-%ojRNha%b6KX++0JD{Zl&Nt<%^KS zLgnv$cVHemZ)}cv>b$O=haCdEfgTRK1h!Ju56}Xf16hYId2OX4zZV)G#|AX3oZu$Nvgi^8wB^)Ie4WZW9=g|-zC860kvjm#82lRn9Q2puowjR2= zsy~d86+^DB2J!CJRx0vVCCh3b$jel#>kT@4>JDMNj$@_yom4~bTJUs$AN7iy(0N0N z84VZ|yp;s@bjn$_%u!D)pkJ*z!E2g?fO<_E1(fP3PwcN@yltxQ^8u4J!?AX;TT+g* zzUPkmq;qVe|0mZ$P*GHMMuaK@=#?p7a zf`9i5XcNCc1hd0X#+Pu%n&GW9K$EBHBzgv46Eh2Zmuo`JXh7ZdXYiCYd8Go?k>^~W?U zz&snT-MmopE1FL_!5uI)62C@l1=VoPiI&4)M$J>)fS^prT=f-GhH}d1MlF6E+U@^> z7xv4|{y^aLW+K02tQ%7&! zIRmsAi-sT`(BrN2Sz}J>S>HY?j_03#gxk$hR-FmM@gpM0j6j?-x$^@BFl@#hJ7f4z z2k5ukozTJjcv;nBy1CE0!@s&fzm}=^W8E1tTO{*g0A+T?S-mV~&GJDf&panj=hXhl z+UHr>%l28tXr}X*LT~t;X0@h{YEQiG0d?9Bg`EX{4!N_9J@IieVRdo*r6p!lVuOHR zqSJTfq{6y-e%82^_~EE;0#Qjbmcggq8%XYn6R;2k<6 z62+%zm`y_aOKf#2tf4@X?j~XOsU8=`Rwunp*s@%hOd8^KNvi4KH7d-Za>9Tdb6&e;B$kA>yZ{*NrJ=b=^NO zA9)?uI|w|V_S_`tO_IkmL;5gl|FB%&5|r{eTmTc-wWz75TaebZ2+$_jA?GtH^0naU zq@*kXDpcxs4+a%7c#9aM)_xj?ii}bm88)Gv;ttZW!&jQ>F_&2R^tuWOm1p4cjOI zUaKeOt=BHjkpY`NkPJXrCKNM|PGYuFc2e6*ojhHpB4>z}_4)p-!yQwRdEx*z_D9`I zcFK)naVYO39S(T#6_3O6=;HV-V+TKx5{sAI6VP^kuF%E)M8KZ_M!AV-bHDX2V1S|M zAu!nRiM0KR!LJ{ryPWDg;_@*N<65qrK%Jhy2eWDP5krps_C@8PUiuoWP2|T57NOb> z(48cY_qxENaw{dn6O4V=#wVWJf20R`WR-@@Wo2#mWqeTs{7Xr3vS{qszUtzXttBTb zxo?!twy^Q?d+F-q+9R8Kgon|P{TU)-+%*;FF7t`<&i%XjUHYGi;)%YuIE!;J*vob= z*ehec>1A%W>HJ0%ucWJ&`-T(;vK57}3Eq9hc~Y{!ZSlBu>O0rG`Tu;2$KPGY{?D!5 zyJqS-q~}WqyqNy-HtSk9<)!xfn!QVY19@wwGxD0MbJQFHa|p~KFo(b#0&@t=A@J{xz`wHlXSZzs`*6*aO}%^r zY-S^kgHn5!NbMERWcaV|+3}~{|21J6WJ!sV|NoZVe`uz{X6=6I>}kfdwJ#<0cXssj z)y!o6C&62#zcOcTf9irIDRXx8U-6lv<`9@eU=D#f1m+N!LtqYpe|H4_V`|0Uj~B}T zH#s~03~abCwNdxKvcG>HkNutgzcB88k}zF4|K)La$q@AHeIG+j7dC5u2Yi^O4^9Vv zYkwd77vtC!Gv&+_Gqu5=BtAE#eHM|qa1Mbv1m+N!LtqYpIRxeq`2P!m|E|A=cl6ai zO68jq1x%rrZj03E!6+q~B+9r{-IBXN;e$}h^HZ@A2o z=)3$LFv3fUv3<2I+|w_w9-EmeP3 zPGXwAoEcpFxB_=h{P?C}8nCLL-?3%bvkls5R9quNtx1?TKzQ^V>!4y7pb34L9(#`c zB${;g*DXq{$E}cp1pY1|;lBAzNBrlikJ+c!Yd8ixL)_DCvg|aY6{`N67!E)BFzVW_ z&%?);!Ou258CE^}Rp)FCczEncy6@3TLjC%2NEVG<)*Kt>$=%iRr6SIzD?AUM){apg zrrN$q(z%2i{38SG(5bq{iKU*^E^S;wGQKHxNzISEVQmOvjk~5+D`i#dENbU0P3s3q znTMTjl(e4>%eEGr9`^2Ce@#O!iSi=lbnCkfl<=_&t{wNl-)>`(Mnh>uhMletMYdo4 ztVdkD(?4`l92E+$_xP?mU*oAGn4AcL?55acS8~j?A zeUrL&iEhi=0ra_7?+;hI^!F45Ej(0pI|}njTN`;cS3C4+(I-QbPAx68eHsCe>kM24 z_VV?jwL`nyxlf+umUQ-QPS;xXvFbLV_G3ZRWLmq!$KVA`a(Zp1B-e8XPQU)1U7mz4 zuS3qey+gGtCk@T0*x$8FY^oX=qGCc4KP6o1-GtLf8>L&`?(6*)Ht%-l8J-d$w}5u( ze9`6$Ce6@-ow6xOUb0&ao;=TIw$->_{k61U|I`7S?R9I^`B+}g6jW}C@2U^KG!^C^AH0sO73FDibhr^h& zOrR`lqqBb;>67OlG4IlReq|LW~hVN^{ZfTX$ao`msnvp!?3k{%#l5NVovr0$?ZUbjk27PZ&M@1yQqKE1C!6~{dWE@h zUhI;5OQ?KzHOVV(?Bq?}`kmZJ8>;^W7XSL522fhRG;lqVyxxz2t83TD)xyhI`JBAT zQ8?+C@iO zQJ*e?YYLx!;UU1MHI6h23J`IQ!l9jHH=TK=H2xXXg}d&Z+!K~G=i{;_k(rG_4e-3% zA)MwLmtc46*Vn$aI{h=vvMA;=qKRYae~pz`h&#v1+2I>8`k9;`E1RTI=dH4WXI5R< z!Ftxa&1{)&R%u@Emj}%8W_D1ms1s^U=Dq4lzmd00ulZgC#dS$X^Bd7CcTI<8drwD^ zX=nNhLSt5z`iF!Xjcu3e_?%llAAMA4>G|z@YqH*Ffo~R*8?QCxiq;!Y&mGAuWN8%{ zsqR~}k9NZf6fmi4N2_o=bql6DY^i)X&(<(D*|F2zk?n_Eu1UL`VjOnGYHt?)WXJB9 zSBWk$pE0I*Qp5yfQ8WAm`+~~x+(H&ur$^(YS6UhMz^R~{&%n=s zjf-M*HJlQzLM?_f>OOvb)f`r0tL%$RwX%0N{Tbzw;R4mX;L%l%O>d5gR>cy1Qy;E3 zOyotLV@euX56~W;yox<;3QN2Pk|;cESgznCjj`5=>VFP^5Py!Dk2#?3ntZCA#{@ZwbGV7iZ{- z=f5TVMtaZC`ZM3>e@p(844#Qql>N#2r;*w3?>83w)8s#yFJ@v-X7Knk;lCL9JAZmHSsX&DrUH#cPh5LtqYpIRxeqm_uL=fjI=`5ST+?4uLrY{#_9GpRF$= z`Ls0qmCOR-d{S~xOQjA<0)YSb^8zGGu*~NB%Q`ZW83I$Y1f-!~tS{mC6DmQEO%~#vh z`^xPX{`_k<+2G(c%NsX@pV%03_u*CrdwIfWHPxzPWenHe;HubsumrQ(nM}wS^&;`n z`9C;VZh9pLi;0cnt4w?vvdCiw)EC%8tFr1@_Z&JlbW-+)K^qEgqr^Gpm_oW~Rv9K^ zugir9w*(JiB&E4ehP9?Bg&mnl3!)022xLfj{?H>)=3Y^zYTsHa&%|LpeiVVPdg~DV zyo-(u~v2^_L%}+0}1$hFK)?;VEzJg~dg?OGxBp)nQR@f7J98Ib2Rr z?JT9yXvh?|kDe@{49$`4vd$!l&F0l=dc|@OAY4sD0UBB;qM~9Z+1B{I7}uN7UZJcK zo2JKLtQz&7+m0u>NsXLOp*FD)$+@w4Hi#0;Kq@X}J$)@M)9V~b6Qa-iv4uiOA_r>_I_z`G z{KTK~i5$4E%Vj&}gaUIyiRrY5Uwx7eyY9WeZonRffaYJV%l5Fe?Vu55Al?PlTCE1k z#64*g>wLd%jtGZNhA6X(UTVhLQ+!8bZ+*9fT*ot?YQUr3beTbO>Kdp9R;DjV!p*+L z${f+){vn_7>nX5+LFZT*dXZ4{gjeS>#xzkKOR&Vg(D{U41ECDu+o3a=(tI`gJ$vYo zKE1#ntj{Ykq=Ya#IH;xWG`^crVeE@8@kk7bZ{D|Y(AQvmvfm3qA+yt~y-Qc?JL}%y z?iVqv>}{~+xK6=a)*4Vcy;{A2B})~i!MnJtN#quhB zdjgN=+vH8gAIXM8?;VNEET-Q+O?JO36g^jtXz?6E=8Yk5<0&ItMT)!<^4%>D>C=L? zT!I&3{XIi(@?)!H*suL)zy38_q6^1~%8E2vLP`^`uPtkUJZU&A?e)X7rj8xuP0&wJ ztq_R|>A^N71NZ2DBgMjOtJ}`HnX1+~M0)s1GA@x_4Qb~*r16M7C^3)M^|o5Tc!~00 zBRM^e)e|VqrR#KW5_GWQSITE2Y;U3|%TAIh$LJKl>O@Chk;7|5-q!}4%G>Hmw~=`} zOt7WU9rrZ3he!nz76`}U;=X1g-+D*2ZZVPWn?%#3{eXzx)5wCpJ{NAPB2U1pW>)C4 zhE{9xM2|{H<0menYHvrBs2KK8(yI&J5b3LvXs|?f5w<6(E;Hw|6t*=P6jR8$N~;2s z6DaJYc|{1mQJwB>N=+w>z$`3EQmrs#p|QS&B1;s^4ttT(9b0+bR7M@P1$!S78A;ZMU zUQy`bACnE{&*|R%Tf|H+*R#+zCeYf`sOWCDa_T*rEM2CXf0DY+JKD9d2UX6W6s<>r zX9=|)R3rl<)g_~<5$#eC%fK8f=-ONizQgvfmQ7L4)+h!mX0uC~rTo&qz=maH#V(L6 zxhRk=%`l8X?2bVIzh==0qATX32Zrl`IpT)lmUCA%aQhp$t3Go3mkdUp9JDw#7^ygD zu{9c@6@yTVL7a|8#JOUEJTMK?o^wAGlBVcc#psFNNP#tc*N8oPa z-gx_ohE^@3?z;B9Z~7zghguE#Dh=}Q`(*3(R5|is?fUq^rx)_?D?uY`8qoBU@p*!cl-E}f7*#@KDBxdVdz%XCob!l!M<6l z&RC3wwHLyM6v2nqb&YXZ`$zYC$DkI7Tprvu&i7@z2MAZO*6bGdQ}x1B>)?hwCHKM+ zkz8!371Dc~6H&Q7F2&cnKlx&F@<@fM zV?OJ25@{Lr`~t96luq_OkK69Iply1Z2F_VFCE-|uoj@sG7Kt=a1HS-94XPF~I8;df z7BX<6gYx;eQW3fjIAv;; zJNC;WqfI!y>-}LbAO=quRj%bqI7N|^s^#h8-gD*3E3rLZ_b87P$1Jv1A~-QUUO$fr zRxKG*!q}?`!=r;qMrxvR`p#s^Bc(Bmos|eRVeMs}%8}(*u8|;!^714}U89$UzQ=0#-C)a-TSHxApl}WY8H;1Yl`ICgg)-u50ys;G)w~Zg0)q((NPmmN z2K%4)LKyeDmzODSBpMYjv{^pZ(z6olud^Uxaje4Fs$NY-NN{yt^6%O1ah8rLc^fl= zyJeRn)Vk&qg1wiHt^K{IHN81;Pho2hb65SeLY=j7lKzt7_k7&uQ-B)juHTYz>rbI- z;7O$~ST*de)%_L^k!w%-yd8TAr^304Kg%8>4iOh}vp+utSsmpv!}XHmnjR=F|9+z6`0Sx-gzP&eIi64r z0=udnNscWIK8s7j)Fp>$GV_n(M;M*Vh#MZM^iukks1#$gjK|tm10zZq3C8z5g{2F; z(kD~|McZoCCsc05P89V}@bz8{I-#6f;iLJpOc%DF2$jzftf>XpI;w%HxNonv_w5QL zxr$tEmiX+djTq@t#aRl1m^kL8PXTV2Ot|m*>)hSZuxPT8>I3Fg-D+Lfz1hTHZzgrW z^+LM!2Nss8?;+_X#-!+AmUF^=4l#niL2e@lsbPo(#H%(61{;~7$oI^ND#(1wZpdQQ zN8FEAZ9b?zC4c%0r3De61icS#$98d!%$CGCtq(^EHde!fGtRERKIj`#wMt136nrsWHea2IW4cG6qI|PulZi zkhcO&bO{cAtH(^Ar<^JX7(13&d|gUajre)|sjSy7Rkx?)rKReXIv*@Y{GO;6gO9UU z`?K#O_o!Hvvw&WBQ>WE}E)C*m4<}i&c2`8AZ)hpMQpX=RpYn4tUBABMKsUNKs?^vY zd8L?sjD1~ln(nw#orUH6Oy4D?{AkLn9phFPO)Bj)>QQbO+J;Aza=ndOv_rIy+^n}7 zNkN{6FHf3Zg480_#JelDnp-uvI{N_OuA^a{tI#k8u3KH3R4g~XlhDA_rMO~jDb)uS3Bm^-*&hh6 zJrIrbbLn}-++HxiTuKhCR@SY~ipZ^R)iNoC> zVO;jdgJvZ(Bn&4~$K=pU?F?!WHwfoPO;XD9riip$3`Du6g(Hm>lpNQV2E3D@GaK2` zlT@Y*ZF6SG6oFA=(XHkesDH@&c#Zv%&S%$^H1RVi#ogc$y3oEILvU-u6mgp~eLExR zjN9V!Z8)2^1$5<_n9&b?QHrGE#(|eUt)D?1q}Mn~&w#o-@AE^SNp_RhL>zf%7y6zR zs%~M!etsonM0EA*plJ+L7&L%J3MzaMU^HGBgZbdt$vmygQX!M*cUZBsqQ+S8`y;v> zD-f*b_7E#Y)kJWmuv5%T)<+P9nh|?-UhMNIdqWpC4;;Wo)@a1SSejlmcje4|zkKPf zY}c_Z)uVo_xQ34Bl;R@FNqB88UrBT;6r$=m@pQl(iHW0+M%29#6NFma{PybT!dS5= zR|SQ>iShCSH9@?5yITy^VN~qIN174=Tb{1#T=oR#!fyjL53lp?{7mVhPM#XH>fys_ zwgqcw&zd25B|cCE+!$&@S7A)=?o1tmOz$om zP^FdoR@Dj=6SYCUk9DwkA5M}qV&5{jzIIzjHRitiGWJ_UJ?0*|wlBII{VP(J>@ zmI%!MO+c%AM&K94bXwvci?{+ym@0zV0&&ak@iC-4CgxkF!r!8GslGAa*|%2>n>#^Y z(^m1iuE!aE6m=%jJ&h>sI~!A4NPyb28S=FX;;rnfdqUJ%j7H|1!C%3{sJ0+fGV?Wrk z>1;XiuOUCZ*SRtME7>auj?4{pAIJ9gULWvXPA8t`8U6gA8+)|FPiw3s*egOEtu}sn zJzU*o5j~V&Nozx?{fBV)rrE@<5RT12l!B5rWdYH3{@DHC$d^c?%isJIIpym2;fITX zSnrjAs8S{Q4Tj6d_ApI@Lti52BMRJoJDmQ54Ay(}E}sj<V$+Se`5{wn9DR9&Vr8o8=hD?C8I1M;?RS+cHo82eFO@{}DwW?yiud8M$fqRh%DV50BXfdBzpI9E+<_XV^;9%H6ajK-~i! z!QR=*lP>tMk+P8|eT}El3(D~e9RfY1;)7w|#x>(%cNB&5)>C~~VTX=UzRpC~Oht{% ze_9=eI(3WIT@|5XcCs5n8{v?%Fz9)WufmD>tcE23No!E!Q5O!UD5c_Unp2D?{<(}l z%FwNZ9DW|#Y zX&{7%)?dcnAN*mV9%V8y*v&f`rO{-1of#})J1`Sb)lRBE@By?fp%T`u*mF9T>7-nK z2R?u++qhXHwxZUY0q(#_3uM@J2d!`Q9{6RjP+W%AEyeDF`4|4IbZ;4)_gC7W8&&|4 z;eZA-&O}Cg%U9f=rX!Lv1~rX<{LDMzZo~E6u#0eGp3Nv&;TT0ZkVt+)B)g;6P<<1= zv-RrPdf6a#G*UrgA#`OLKA0#m8}e1B`bv{=kBHzczrgopH)^;AJr3i-+nr z3t8*9Mm4$4D+{4&W2ct&X6%WP;cPd<_Z~)vXmmzF8dJQ@@a2U%h*bDkykU?hl6VIH zScrK|-_U8bwK3%y2|T2KjJ;ZpwXKyd!;`Nsc}WZy7f!N64Au-*mwwH0xdTuJ<9|eh zr6F~N^S-bNUrdtzAKx>Xb^e;jzle~9iq?{4DxhOIpC^Az;x+`&6 zuTsME-}#)wt`EWgde)ohq}l{dX_%rb06J@@i?JVI@R{&z24DtM-;(ca6kzuC{zrU| zxM#}ZBLfw@T)cd`Q9L3>aw87%x;9Ld_yY$Ah}-B>Qn7>tQOQe$42$j=k0qptN@9h2 z08>fms{*iokq-%dV}>ZSR4j5}HlBth*puXkDYPSE8xuf|?|DXS!=x#&wjF9rSumWj z0;mYH#+1WAY{@_8*)*oOB34oAZdBP3Z!+Yt&In$CzIqb%>fZMTS4zv{*yJ+Qx{eg0@1)NgRr(pMF(a_SK_w2~ zhHnmS-rVcM2uyG&d5s@FP77jrKj$gm)p(F=^Br!Q%qmB99271qQ|vlMTPSQ)%(b}~ zv8s`xV9;Z92{M#2KTD~(4?2uo9P2tSOKHOV$&HeW;y~R8p7R0+M|}JTO?B!DrOKI; z#ih*TD0^$E9v@$uZl8vl9IZQyVkm@BOdYUPItUnjO5R-_%*+T417w}Fq|X7&@96{R zd^XJ-;0Hd8@1Z+NImz0#R(#0s z{ASMfZ1`KD732J~?u-IMyQTwgP{i~VeyhkSEe3Z9=?f4aS=;tUbZ2ZYvv5O)jJ4b) z+}wrOJZv5fR2qQ#8GP>%^ogH_ETBi#7&f2JPMdy8SA2k@;|w>4@SbK$A|LNdB2WxI zo|v(MWxedY#+Kot?PipwGoDxe1#8`9%4Q5MkFwjwWPKitwNEA-i;FceDD_rxy9iJB zl?os9UP^vIUXC*zAP!J@mMGORsXot2Tlg7-dpAdU$fr_TlDcr%QGPw??o7^>O%hV9 z3avxUHygZkAJuxI@#}^7+GjL1re^9;a&1iNzR zP%F6qY)?)-o@2vFI0*V8+FB%sf2LZ=HUi5*xAGI-M6@5Ml*xg~O}zdUvB#8?xm1G~ zIc%H5yA~2@tY)+S^44Knb@BnFVcUdM+_KAqmx14S)%~|(+~ZXD2cudtYd@R;DFglK zg~11u$WrA)-C?Vl52m`qHQx-b&Oid3qbCRP3a~)hC=+zTCgBO2(zZ6E|kYU8W$nA5PdFD1oS=$ z??e-`%rCqKcNhfFC4q+9Y1j&3F`#Ig#rHfyPJsJ?r~)rFQ@o6?(*Y4EZ$(h$xL>^Q zFp#hPk{~~K^lj{+9ORy`_+)Vp9fXzc-+@*`tgTfNEqhA%#^b-kN&|+$MqmqW_9{%U zB{s}9qk408H|_2@E&QPb-INa|LO8frGO=&zBBMt+c{inar7w%Bdixc5GK zzaSr3Z*Hr4wID)hw$8Eg{F83bOd-~DiXQQ^Y7m``pKA20**!qd1aw<_UhrL4PCYgb zZs2eubchmbo91YR*_7@}`i#~El;!Ehlw6>jXV|3(i-Bj{;M!D}F}^ut`2Ginq-y>66yPFN{q2~{qAXkZAqke;~#!~M_6(%-ySAp z`f2I2EG`&EI{qR&7<>lTJ{lK_^hhNPQo@9_`i*2Jy=s7Z22n>+mJHiK#V$^<@+{U_ zB~mgEH4ya)qQBU0jT~p!W5n&1oL#FKwi`&lHZW|rc2^w3w3>BSTr9t#@_QYz08QN}uq#-bW#|atUp)H2?;Cli7AJz_Ku#d9hr=JSz?_y6R z%Ovr>oT8`+%=bXIHd$Qf$palepi`6v%K%7#9wJv4bRiY)7H^pJ(dP{SoFV{RZ2(~7 z11iYDO*L~$1%3HriuJBgwh8naunGW}<^gbz`y7VdF+!i%ACcY%D5lIYgCIZ=)gIyQ z4nS-|6KXw{XAS(+D(|}!W^u10#w!-aZa|;gIg}tU^4B;9 zUM0udnjcZBm>3bV5dAb`fg~|m!_Hv0dADr6i5==}wi4=Kqf*#v&%;+!!9V=cm3w&` zv(-`0#=i>FFgKQ@L*fNF{V%J}K+QnuV52VYH7w-abGwAf>ulxrBN#=0^k-hqqOu?+ZUzlCz5Z7;!6EcZ{tKY$t;kU1z^ zzlU_V2mhEm?+gt04PrKvM~!)MrDz*KU8H<5LML%|ED^7ySy`qM_G0aN@K?|~mav`; z5Oxa8cS0`AGJW3uDM_hfJ&T{}1++$iT=4snN|a=hSO~cVNIRg52ruABYZX7=Y|;i^LamBU{J&m@FoE058=e+IK0hkQOTicL4O`w?*|-`ia{|V z*8Lb&KQBwFJi*y~p^@D-V1~vW#>dNv%+%Y_iBAz%HVantxVIRI9R)%;QsuqzlZiy~ zWYM2e=(Z`TkC^+8`TPe*IW@?GmP*;oUQUfT0RXOH5KIvOw(C)9-^B61(ek@B_*+6oKc=rV#PKxmDcBN&dM<%FzIexs70?JmR7 z@fMzU7h$D?-;<~*Qk5j&~-dM(51UiTi)WvGgD?zB1 z4a2rj^8Hnkjzw#{=<|dw(1&EuH{k*3n zOS3*ZE{2{q9(H?N`-=B-U!ZDA8ESnGc_0vB6$-qvllDUdZI_}oc5vP=>>)S*G_ah8 za?9XnIgImZ&inVe@Cyt_rlgJg>=B3pu_210Z5=wzs|4o740sRmEwNkD7li;;^$t#o zF3>RnFG@>9+giDSdWQAvDxhDwZ5S6GF;S8|C3s>}iRn&Gigyow#c`w}AZWu$0X~vc z0&)tXZQ&F90kIXpS%A+WKzR#*@_@JF7TA$SPdD_5M6`AWNYT^!GX4rPmAA``44Bjz zy;f%6EyINch93vaShn%mp)_+R)$`!w;lk!z@Wm8i+&O&OX})oqp?SRY zJLTC1KEZl0gK8~p%i0e1Ih(9E-9ndJ{E&b({S*Lq?$lwirk67NiYVr6py*E(cD^UQ&UZg_) zwIj%}*{%B(*K26c(Z__9-agH4cO)r=OMgCb0~Z_6bW7>l;&8{wXXX27x~??>eUG*1 zPZn~Ll&vsp+jBl|p3=XJAJ_=n!u$hTX|NGi{A3_73@UJCq86qE&Sh(wZH+Zp&7JrY&HA*HlW1|&nO_>5YK?7 z{I8iiyW)x4gX;n*wn+l{M;2RzPaBtS?~JS8CP%6`!ByEvIK|u6@71D!!F@me{upet zXW$91RF9By`kN~x;|>#>mlNhq-)~#T;j(v86`)i_Q{0P*`>MRkx;&a3)FbFP?i25D zgW48!JkD?|aaPU}e?zY_5kB!d7|;sMEG8nEA<+Sh7?U>=Y2Uk954_oMs<6^q2mcLL1~FYcebKWs z<)$W`{qO9ICz)C|d*3G@Q;v&&?u^$EISur|>EO>_H&>*Ci-)_^^;>pso^~!*9qgvJ z#F-4hlBG>DN<5SwjLf1 zSM7k3B>U>Q1L-byUJlnhZp`e!=WJ)|f&fl#hj6u(Fg|B5v5(dLXXay4nKQ1*FX0@9c^nf8N;t