From 0b67f1e5f5adb91035905e538f73dc37d1842837 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 25 Jan 2024 13:25:59 +0100 Subject: [PATCH 01/13] updates and reorders utils/ folder --- src/specfem2D/compute_Bielak_conditions.f90 | 2 +- utils/create_main_repo_example_movie.pdf | Bin 291 -> 0 bytes ...o_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt | 0 .../configure_SPECFEM_for_Piz_Daint.bash | 0 ...sfully_configure_the_code_on_CRAY_machines.txt | 0 ..._final_version_Dimitri_cleaned_may2017.tar.bz2 | Bin ...n_directory_utils_in_the_SPECFEM3D_package.txt | 0 .../meshfem2D_circular_canyon.f90 | 0 .../meshfem2D_non_struct_2.f90 | 0 .../meshfem2D_non_struct_3.f90 | 0 ...ad_Aagaard_to_make_Scotch_compile_on_MacOS.txt | 0 utils/{ => scripts}/SEM_save_dir.py | 0 utils/{ => scripts}/change_simulation_type.pl | 0 .../{ => scripts}/compare_kernel_correlations.py | 0 .../compare_seismogram_correlations.py | 0 utils/{ => scripts}/compare_two_images.py | 0 .../{ => scripts}/convolve_source_timefunction.sh | 0 utils/{ => scripts}/createTomographyFile.py | 0 .../create_sinus_Paul_Cristini_ficsinmod.py | 0 .../create_specfem2D_gpu_cuda_kernel_proto.pl | 0 .../create_specfem2D_gpu_cuda_method_stubs.pl | 0 .../replace_use_mpi_with_include_mpif_dot_h.pl | 0 ..._calls_to_a_subroutine_called_stop_the_code.pl | 0 .../su_Seismic_Unix_seismograms_create.py | 0 .../update_headers_change_word_f90.pl | 0 ..._pressure_in_addition_to_displacement_2013.txt | 0 .../read_parameter_file_Ra_Cleave.F90 | 0 .../save_databases_Ra_Cleave.f90 | 0 .../create_gaussian_profile.f90 | 0 ...te_pressure_plane_wave_with_Hamming_window.f90 | 0 utils/{ => small_utilities}/decimate_mesh.f90 | 0 .../{ => small_utilities}/deriv_ricker_spatial.m | 0 .../filter_input_trace.f90} | 0 .../program_compute_mean_seismograms.f90 | 0 ...of_external_mesh_for_plane_wave_boundaries.f90 | 0 .../rotate_mesh_for_absorbing_conditions.f90 | 0 .../recombine_all_slices_from_binary_dump.f90 | 0 .../Makefile | 0 ...ute_gradient_of_a_field_with_the_SEM_Earth.f90 | 0 ...gradient_of_a_field_with_the_SEM_rectangle.f90 | 0 .../constants.h | 0 .../define_derivation_matrices.f90 | 0 .../define_shape_functions.f90 | 0 .../gll_library.f90 | 0 .../lagrange_poly.f90 | 0 .../obj/.gitignore | 0 .../recompute_jacobian.f90 | 0 .../README_HOWTO_use_this_demo_code.txt | 0 .../create_color_image.f90 | 0 .../createnum_slow.f90 | 0 .../define_derivation_matrices.f90 | 0 .../define_shape_functions.f90 | 0 .../gll_library.f90 | 0 .../is_in_convex_quadrilateral.f90 | 0 .../lagrange_poly.f90 | 0 .../libjpeg/jaricom.c | 0 .../libjpeg/jcapimin.c | 0 .../libjpeg/jcapistd.c | 0 .../libjpeg/jcarith.c | 0 .../libjpeg/jccoefct.c | 0 .../libjpeg/jccolor.c | 0 .../libjpeg/jcdctmgr.c | 0 .../libjpeg/jchuff.c | 0 .../libjpeg/jcinit.c | 0 .../libjpeg/jcmainct.c | 0 .../libjpeg/jcmarker.c | 0 .../libjpeg/jcmaster.c | 0 .../libjpeg/jcomapi.c | 0 .../libjpeg/jconfig.h | 0 .../libjpeg/jcparam.c | 0 .../libjpeg/jcprepct.c | 0 .../libjpeg/jcsample.c | 0 .../libjpeg/jctrans.c | 0 .../libjpeg/jdapimin.c | 0 .../libjpeg/jdapistd.c | 0 .../libjpeg/jdarith.c | 0 .../libjpeg/jdatadst.c | 0 .../libjpeg/jdatasrc.c | 0 .../libjpeg/jdcoefct.c | 0 .../libjpeg/jdcolor.c | 0 .../libjpeg/jdct.h | 0 .../libjpeg/jddctmgr.c | 0 .../libjpeg/jdhuff.c | 0 .../libjpeg/jdinput.c | 0 .../libjpeg/jdmainct.c | 0 .../libjpeg/jdmarker.c | 0 .../libjpeg/jdmaster.c | 0 .../libjpeg/jdmerge.c | 0 .../libjpeg/jdpostct.c | 0 .../libjpeg/jdsample.c | 0 .../libjpeg/jdtrans.c | 0 .../libjpeg/jerror.c | 0 .../libjpeg/jerror.h | 0 .../libjpeg/jfdctflt.c | 0 .../libjpeg/jfdctfst.c | 0 .../libjpeg/jfdctint.c | 0 .../libjpeg/jidctflt.c | 0 .../libjpeg/jidctfst.c | 0 .../libjpeg/jidctint.c | 0 .../libjpeg/jinclude.h | 0 .../libjpeg/jmemmgr.c | 0 .../libjpeg/jmemnobs.c | 0 .../libjpeg/jmemsys.h | 0 .../libjpeg/jmorecfg.h | 0 .../libjpeg/jpegint.h | 0 .../libjpeg/jpeglib.h | 0 .../libjpeg/jquant1.c | 0 .../libjpeg/jquant2.c | 0 .../libjpeg/jutils.c | 0 .../libjpeg/jversion.h | 0 .../libjpeg/libjpeg.txt | 0 .../make_Fortran_2D_axisymmetric.csh | 0 .../make_Fortran_2D_plane_strain.csh | 0 ..._Fortran_2D_plane_strain_with_ITZ_for_Ting.csh | 0 .../plot_post.f90 | 0 .../plot_post_with_ITZ_for_Ting.f90 | 0 .../plot_post_with_modif_KH.f90 | 0 .../plotall.gnu | 0 .../precision.h | 0 .../prepare_color_image.f90 | 0 .../recompute_jacobian.f90 | 0 .../specfem2D_axisymmetric.f90 | 0 .../specfem2D_plane_strain.f90 | 0 .../specfem2D_plane_strain_with_ITZ_for_Ting.f90 | 0 .../specfem2D_plane_strain_with_modif_KH.f90 | 0 .../write_color_image_snaphot.f90 | 0 .../write_jpeg_image.c | 0 127 files changed, 1 insertion(+), 1 deletion(-) delete mode 100755 utils/create_main_repo_example_movie.pdf rename utils/{ => infos}/Cray_compiler_information/Daniel_Peter_here_is_how_to_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt (100%) rename utils/{ => infos}/Cray_compiler_information/configure_SPECFEM_for_Piz_Daint.bash (100%) rename utils/{ => infos}/Cray_compiler_information/here_are_more_details_on_how_to_successfully_configure_the_code_on_CRAY_machines.txt (100%) rename utils/{ => infos}/SPECFEM2D_implicit_with_MUMPS_from_Zhinan_Xie_2012_with_mpi_third_step_final_version_Dimitri_cleaned_may2017.tar.bz2 (100%) rename utils/{ => infos}/for_ADJOINT_TOMOGRAPHY_TOOLS_see_in_directory_utils_in_the_SPECFEM3D_package.txt (100%) rename utils/{ => infos}/older_or_specific_versions_of_mesher/meshfem2D_circular_canyon.f90 (100%) rename utils/{ => infos}/older_or_specific_versions_of_mesher/meshfem2D_non_struct_2.f90 (100%) rename utils/{ => infos}/older_or_specific_versions_of_mesher/meshfem2D_non_struct_3.f90 (100%) rename utils/{ => infos}/patch_from_Brad_Aagaard_to_make_Scotch_compile_on_MacOS.txt (100%) rename utils/{ => scripts}/SEM_save_dir.py (100%) mode change 100644 => 100755 rename utils/{ => scripts}/change_simulation_type.pl (100%) rename utils/{ => scripts}/compare_kernel_correlations.py (100%) rename utils/{ => scripts}/compare_seismogram_correlations.py (100%) rename utils/{ => scripts}/compare_two_images.py (100%) rename utils/{ => scripts}/convolve_source_timefunction.sh (100%) rename utils/{ => scripts}/createTomographyFile.py (100%) rename utils/{ => scripts}/create_sinus_Paul_Cristini_ficsinmod.py (100%) mode change 100644 => 100755 rename utils/{ => scripts}/create_specfem2D_gpu_cuda_kernel_proto.pl (100%) rename utils/{ => scripts}/create_specfem2D_gpu_cuda_method_stubs.pl (100%) rename utils/{ => scripts}/replace_use_mpi_with_include_mpif_dot_h.pl (100%) rename utils/{ => scripts}/script_to_change_all_stop_statements_to_calls_to_a_subroutine_called_stop_the_code.pl (100%) rename utils/{ => scripts}/su_Seismic_Unix_seismograms_create.py (100%) mode change 100644 => 100755 rename utils/{ => scripts}/update_headers_change_word_f90.pl (100%) rename utils/{ => small_utilities}/Ra_Cleave_record_pressure_in_addition_to_displacement/email_from_Ra_Cleave_about_multiple_receiver_types_in_SPECFEM2D_to_record_pressure_in_addition_to_displacement_2013.txt (100%) rename utils/{ => small_utilities}/Ra_Cleave_record_pressure_in_addition_to_displacement/read_parameter_file_Ra_Cleave.F90 (100%) rename utils/{ => small_utilities}/Ra_Cleave_record_pressure_in_addition_to_displacement/save_databases_Ra_Cleave.f90 (100%) rename utils/{ => small_utilities}/create_gaussian_profile.f90 (100%) rename utils/{ => small_utilities}/create_pressure_plane_wave_with_Hamming_window.f90 (100%) rename utils/{ => small_utilities}/decimate_mesh.f90 (100%) rename utils/{ => small_utilities}/deriv_ricker_spatial.m (100%) rename utils/{filter.f90 => small_utilities/filter_input_trace.f90} (100%) rename utils/{ => small_utilities}/program_compute_mean_seismograms.f90 (100%) rename utils/{ => small_utilities}/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries.f90 (100%) rename utils/{ => small_utilities}/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/rotate_mesh_for_absorbing_conditions.f90 (100%) rename utils/{ => small_utilities}/recombine_all_slices_from_binary_dump.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/Makefile (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_Earth.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_rectangle.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/constants.h (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_derivation_matrices.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_shape_functions.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/gll_library.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/lagrange_poly.f90 (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/obj/.gitignore (100%) rename utils/{ => small_utilities}/sample_code_to_compute_SEM_derivatives_on_a_mesh/recompute_jacobian.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/README_HOWTO_use_this_demo_code.txt (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/create_color_image.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/createnum_slow.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_derivation_matrices.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_shape_functions.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/gll_library.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/is_in_convex_quadrilateral.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/lagrange_poly.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jaricom.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapimin.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapistd.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcarith.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccoefct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccolor.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcdctmgr.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jchuff.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcinit.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmainct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmarker.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmaster.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcomapi.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jconfig.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcparam.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcprepct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcsample.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jctrans.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapimin.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapistd.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdarith.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatadst.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatasrc.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcoefct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcolor.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdct.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jddctmgr.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdhuff.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdinput.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmainct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmarker.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmaster.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmerge.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdpostct.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdsample.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdtrans.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctflt.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctfst.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctint.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctflt.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctfst.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctint.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jinclude.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemmgr.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemnobs.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemsys.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmorecfg.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpegint.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpeglib.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant1.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant2.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jutils.c (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jversion.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/libjpeg.txt (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_axisymmetric.csh (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain.csh (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain_with_ITZ_for_Ting.csh (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_ITZ_for_Ting.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_modif_KH.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/plotall.gnu (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/precision.h (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/prepare_color_image.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/recompute_jacobian.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_axisymmetric.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_ITZ_for_Ting.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_modif_KH.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_color_image_snaphot.f90 (100%) rename utils/{ => small_utilities}/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_jpeg_image.c (100%) diff --git a/src/specfem2D/compute_Bielak_conditions.f90 b/src/specfem2D/compute_Bielak_conditions.f90 index aa4f4447c..1d2a4e947 100644 --- a/src/specfem2D/compute_Bielak_conditions.f90 +++ b/src/specfem2D/compute_Bielak_conditions.f90 @@ -78,7 +78,7 @@ subroutine compute_Bielak_conditions(iglob,dxUx,dxUz,dzUx,dzUz,veloc_horiz,veloc !!$ !!$ !!$! derivatives of analytical expression of horizontal and vertical displacements, -!!$! computed using the "Mathematica" script in UTILS/deriv_ricker_spatial.m +!!$! computed using the "Mathematica" script in utils/small_utilities/deriv_ricker_spatial.m !!$ dxUx = (sqrt(3.d0)*a*((-8*t + 4*x)*exp(-a*(t - x/2.d0)**2) + & !!$ ((2*t - x)*(-2 + a*(-2*t + x)**2))*exp(-a*(t - x/2.d0)**2) + & !!$ (2*(-2*t + x - sqrt(3.d0)*(-9 + z)))*exp(-(a*(2*t - x + sqrt(3.d0)*(-9 + z))**2)/4.d0) + & diff --git a/utils/create_main_repo_example_movie.pdf b/utils/create_main_repo_example_movie.pdf deleted file mode 100755 index 24b35035137dca45e57f76fbda3928d2c2d024c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmaKm%TB{E6h!y=ilN=nxCv1z$`S#UDjr3&T}Q5S6JLm9%XXpseG>^5Y}k!PXGUjw zksY|t4l?K@nc|)eN6&b)Mn;Z7=@fS_Z`%|rFMCBPiu~$&B#(hGF}9Dgr3o5u4c2DJ z&$4Cp@k`v6=wx39CEc+7(yTN%K)8X#vMf%En?>^T^0$R($r_6O8?$_tLqzTf#i@h{ zgQ0_Hyfi}tQIm@rOKkSL*Zrz JJ<0kX=nR+4U7P>_ diff --git a/utils/Cray_compiler_information/Daniel_Peter_here_is_how_to_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt b/utils/infos/Cray_compiler_information/Daniel_Peter_here_is_how_to_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt similarity index 100% rename from utils/Cray_compiler_information/Daniel_Peter_here_is_how_to_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt rename to utils/infos/Cray_compiler_information/Daniel_Peter_here_is_how_to_configure_SPECFEM3D_on_Piz_Daint_jan2017.txt diff --git a/utils/Cray_compiler_information/configure_SPECFEM_for_Piz_Daint.bash b/utils/infos/Cray_compiler_information/configure_SPECFEM_for_Piz_Daint.bash similarity index 100% rename from utils/Cray_compiler_information/configure_SPECFEM_for_Piz_Daint.bash rename to utils/infos/Cray_compiler_information/configure_SPECFEM_for_Piz_Daint.bash diff --git a/utils/Cray_compiler_information/here_are_more_details_on_how_to_successfully_configure_the_code_on_CRAY_machines.txt b/utils/infos/Cray_compiler_information/here_are_more_details_on_how_to_successfully_configure_the_code_on_CRAY_machines.txt similarity index 100% rename from utils/Cray_compiler_information/here_are_more_details_on_how_to_successfully_configure_the_code_on_CRAY_machines.txt rename to utils/infos/Cray_compiler_information/here_are_more_details_on_how_to_successfully_configure_the_code_on_CRAY_machines.txt diff --git a/utils/SPECFEM2D_implicit_with_MUMPS_from_Zhinan_Xie_2012_with_mpi_third_step_final_version_Dimitri_cleaned_may2017.tar.bz2 b/utils/infos/SPECFEM2D_implicit_with_MUMPS_from_Zhinan_Xie_2012_with_mpi_third_step_final_version_Dimitri_cleaned_may2017.tar.bz2 similarity index 100% rename from utils/SPECFEM2D_implicit_with_MUMPS_from_Zhinan_Xie_2012_with_mpi_third_step_final_version_Dimitri_cleaned_may2017.tar.bz2 rename to utils/infos/SPECFEM2D_implicit_with_MUMPS_from_Zhinan_Xie_2012_with_mpi_third_step_final_version_Dimitri_cleaned_may2017.tar.bz2 diff --git a/utils/for_ADJOINT_TOMOGRAPHY_TOOLS_see_in_directory_utils_in_the_SPECFEM3D_package.txt b/utils/infos/for_ADJOINT_TOMOGRAPHY_TOOLS_see_in_directory_utils_in_the_SPECFEM3D_package.txt similarity index 100% rename from utils/for_ADJOINT_TOMOGRAPHY_TOOLS_see_in_directory_utils_in_the_SPECFEM3D_package.txt rename to utils/infos/for_ADJOINT_TOMOGRAPHY_TOOLS_see_in_directory_utils_in_the_SPECFEM3D_package.txt diff --git a/utils/older_or_specific_versions_of_mesher/meshfem2D_circular_canyon.f90 b/utils/infos/older_or_specific_versions_of_mesher/meshfem2D_circular_canyon.f90 similarity index 100% rename from utils/older_or_specific_versions_of_mesher/meshfem2D_circular_canyon.f90 rename to utils/infos/older_or_specific_versions_of_mesher/meshfem2D_circular_canyon.f90 diff --git a/utils/older_or_specific_versions_of_mesher/meshfem2D_non_struct_2.f90 b/utils/infos/older_or_specific_versions_of_mesher/meshfem2D_non_struct_2.f90 similarity index 100% rename from utils/older_or_specific_versions_of_mesher/meshfem2D_non_struct_2.f90 rename to utils/infos/older_or_specific_versions_of_mesher/meshfem2D_non_struct_2.f90 diff --git a/utils/older_or_specific_versions_of_mesher/meshfem2D_non_struct_3.f90 b/utils/infos/older_or_specific_versions_of_mesher/meshfem2D_non_struct_3.f90 similarity index 100% rename from utils/older_or_specific_versions_of_mesher/meshfem2D_non_struct_3.f90 rename to utils/infos/older_or_specific_versions_of_mesher/meshfem2D_non_struct_3.f90 diff --git a/utils/patch_from_Brad_Aagaard_to_make_Scotch_compile_on_MacOS.txt b/utils/infos/patch_from_Brad_Aagaard_to_make_Scotch_compile_on_MacOS.txt similarity index 100% rename from utils/patch_from_Brad_Aagaard_to_make_Scotch_compile_on_MacOS.txt rename to utils/infos/patch_from_Brad_Aagaard_to_make_Scotch_compile_on_MacOS.txt diff --git a/utils/SEM_save_dir.py b/utils/scripts/SEM_save_dir.py old mode 100644 new mode 100755 similarity index 100% rename from utils/SEM_save_dir.py rename to utils/scripts/SEM_save_dir.py diff --git a/utils/change_simulation_type.pl b/utils/scripts/change_simulation_type.pl similarity index 100% rename from utils/change_simulation_type.pl rename to utils/scripts/change_simulation_type.pl diff --git a/utils/compare_kernel_correlations.py b/utils/scripts/compare_kernel_correlations.py similarity index 100% rename from utils/compare_kernel_correlations.py rename to utils/scripts/compare_kernel_correlations.py diff --git a/utils/compare_seismogram_correlations.py b/utils/scripts/compare_seismogram_correlations.py similarity index 100% rename from utils/compare_seismogram_correlations.py rename to utils/scripts/compare_seismogram_correlations.py diff --git a/utils/compare_two_images.py b/utils/scripts/compare_two_images.py similarity index 100% rename from utils/compare_two_images.py rename to utils/scripts/compare_two_images.py diff --git a/utils/convolve_source_timefunction.sh b/utils/scripts/convolve_source_timefunction.sh similarity index 100% rename from utils/convolve_source_timefunction.sh rename to utils/scripts/convolve_source_timefunction.sh diff --git a/utils/createTomographyFile.py b/utils/scripts/createTomographyFile.py similarity index 100% rename from utils/createTomographyFile.py rename to utils/scripts/createTomographyFile.py diff --git a/utils/create_sinus_Paul_Cristini_ficsinmod.py b/utils/scripts/create_sinus_Paul_Cristini_ficsinmod.py old mode 100644 new mode 100755 similarity index 100% rename from utils/create_sinus_Paul_Cristini_ficsinmod.py rename to utils/scripts/create_sinus_Paul_Cristini_ficsinmod.py diff --git a/utils/create_specfem2D_gpu_cuda_kernel_proto.pl b/utils/scripts/create_specfem2D_gpu_cuda_kernel_proto.pl similarity index 100% rename from utils/create_specfem2D_gpu_cuda_kernel_proto.pl rename to utils/scripts/create_specfem2D_gpu_cuda_kernel_proto.pl diff --git a/utils/create_specfem2D_gpu_cuda_method_stubs.pl b/utils/scripts/create_specfem2D_gpu_cuda_method_stubs.pl similarity index 100% rename from utils/create_specfem2D_gpu_cuda_method_stubs.pl rename to utils/scripts/create_specfem2D_gpu_cuda_method_stubs.pl diff --git a/utils/replace_use_mpi_with_include_mpif_dot_h.pl b/utils/scripts/replace_use_mpi_with_include_mpif_dot_h.pl similarity index 100% rename from utils/replace_use_mpi_with_include_mpif_dot_h.pl rename to utils/scripts/replace_use_mpi_with_include_mpif_dot_h.pl diff --git a/utils/script_to_change_all_stop_statements_to_calls_to_a_subroutine_called_stop_the_code.pl b/utils/scripts/script_to_change_all_stop_statements_to_calls_to_a_subroutine_called_stop_the_code.pl similarity index 100% rename from utils/script_to_change_all_stop_statements_to_calls_to_a_subroutine_called_stop_the_code.pl rename to utils/scripts/script_to_change_all_stop_statements_to_calls_to_a_subroutine_called_stop_the_code.pl diff --git a/utils/su_Seismic_Unix_seismograms_create.py b/utils/scripts/su_Seismic_Unix_seismograms_create.py old mode 100644 new mode 100755 similarity index 100% rename from utils/su_Seismic_Unix_seismograms_create.py rename to utils/scripts/su_Seismic_Unix_seismograms_create.py diff --git a/utils/update_headers_change_word_f90.pl b/utils/scripts/update_headers_change_word_f90.pl similarity index 100% rename from utils/update_headers_change_word_f90.pl rename to utils/scripts/update_headers_change_word_f90.pl diff --git a/utils/Ra_Cleave_record_pressure_in_addition_to_displacement/email_from_Ra_Cleave_about_multiple_receiver_types_in_SPECFEM2D_to_record_pressure_in_addition_to_displacement_2013.txt b/utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/email_from_Ra_Cleave_about_multiple_receiver_types_in_SPECFEM2D_to_record_pressure_in_addition_to_displacement_2013.txt similarity index 100% rename from utils/Ra_Cleave_record_pressure_in_addition_to_displacement/email_from_Ra_Cleave_about_multiple_receiver_types_in_SPECFEM2D_to_record_pressure_in_addition_to_displacement_2013.txt rename to utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/email_from_Ra_Cleave_about_multiple_receiver_types_in_SPECFEM2D_to_record_pressure_in_addition_to_displacement_2013.txt diff --git a/utils/Ra_Cleave_record_pressure_in_addition_to_displacement/read_parameter_file_Ra_Cleave.F90 b/utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/read_parameter_file_Ra_Cleave.F90 similarity index 100% rename from utils/Ra_Cleave_record_pressure_in_addition_to_displacement/read_parameter_file_Ra_Cleave.F90 rename to utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/read_parameter_file_Ra_Cleave.F90 diff --git a/utils/Ra_Cleave_record_pressure_in_addition_to_displacement/save_databases_Ra_Cleave.f90 b/utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/save_databases_Ra_Cleave.f90 similarity index 100% rename from utils/Ra_Cleave_record_pressure_in_addition_to_displacement/save_databases_Ra_Cleave.f90 rename to utils/small_utilities/Ra_Cleave_record_pressure_in_addition_to_displacement/save_databases_Ra_Cleave.f90 diff --git a/utils/create_gaussian_profile.f90 b/utils/small_utilities/create_gaussian_profile.f90 similarity index 100% rename from utils/create_gaussian_profile.f90 rename to utils/small_utilities/create_gaussian_profile.f90 diff --git a/utils/create_pressure_plane_wave_with_Hamming_window.f90 b/utils/small_utilities/create_pressure_plane_wave_with_Hamming_window.f90 similarity index 100% rename from utils/create_pressure_plane_wave_with_Hamming_window.f90 rename to utils/small_utilities/create_pressure_plane_wave_with_Hamming_window.f90 diff --git a/utils/decimate_mesh.f90 b/utils/small_utilities/decimate_mesh.f90 similarity index 100% rename from utils/decimate_mesh.f90 rename to utils/small_utilities/decimate_mesh.f90 diff --git a/utils/deriv_ricker_spatial.m b/utils/small_utilities/deriv_ricker_spatial.m similarity index 100% rename from utils/deriv_ricker_spatial.m rename to utils/small_utilities/deriv_ricker_spatial.m diff --git a/utils/filter.f90 b/utils/small_utilities/filter_input_trace.f90 similarity index 100% rename from utils/filter.f90 rename to utils/small_utilities/filter_input_trace.f90 diff --git a/utils/program_compute_mean_seismograms.f90 b/utils/small_utilities/program_compute_mean_seismograms.f90 similarity index 100% rename from utils/program_compute_mean_seismograms.f90 rename to utils/small_utilities/program_compute_mean_seismograms.f90 diff --git a/utils/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries.f90 b/utils/small_utilities/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries.f90 similarity index 100% rename from utils/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries.f90 rename to utils/small_utilities/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries.f90 diff --git a/utils/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/rotate_mesh_for_absorbing_conditions.f90 b/utils/small_utilities/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/rotate_mesh_for_absorbing_conditions.f90 similarity index 100% rename from utils/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/rotate_mesh_for_absorbing_conditions.f90 rename to utils/small_utilities/program_rotate_edges_of_external_mesh_for_plane_wave_boundaries/rotate_mesh_for_absorbing_conditions.f90 diff --git a/utils/recombine_all_slices_from_binary_dump.f90 b/utils/small_utilities/recombine_all_slices_from_binary_dump.f90 similarity index 100% rename from utils/recombine_all_slices_from_binary_dump.f90 rename to utils/small_utilities/recombine_all_slices_from_binary_dump.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/Makefile b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/Makefile similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/Makefile rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/Makefile diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_Earth.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_Earth.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_Earth.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_Earth.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_rectangle.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_rectangle.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_rectangle.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/compute_gradient_of_a_field_with_the_SEM_rectangle.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/constants.h b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/constants.h similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/constants.h rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/constants.h diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_derivation_matrices.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_derivation_matrices.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_derivation_matrices.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_derivation_matrices.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_shape_functions.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_shape_functions.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_shape_functions.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/define_shape_functions.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/gll_library.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/gll_library.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/gll_library.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/gll_library.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/lagrange_poly.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/lagrange_poly.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/lagrange_poly.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/lagrange_poly.f90 diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/obj/.gitignore b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/obj/.gitignore similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/obj/.gitignore rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/obj/.gitignore diff --git a/utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/recompute_jacobian.f90 b/utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/recompute_jacobian.f90 similarity index 100% rename from utils/sample_code_to_compute_SEM_derivatives_on_a_mesh/recompute_jacobian.f90 rename to utils/small_utilities/sample_code_to_compute_SEM_derivatives_on_a_mesh/recompute_jacobian.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/README_HOWTO_use_this_demo_code.txt b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/README_HOWTO_use_this_demo_code.txt similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/README_HOWTO_use_this_demo_code.txt rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/README_HOWTO_use_this_demo_code.txt diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/create_color_image.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/create_color_image.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/create_color_image.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/create_color_image.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/createnum_slow.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/createnum_slow.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/createnum_slow.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/createnum_slow.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_derivation_matrices.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_derivation_matrices.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_derivation_matrices.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_derivation_matrices.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_shape_functions.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_shape_functions.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_shape_functions.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/define_shape_functions.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/gll_library.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/gll_library.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/gll_library.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/gll_library.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/is_in_convex_quadrilateral.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/is_in_convex_quadrilateral.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/is_in_convex_quadrilateral.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/is_in_convex_quadrilateral.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/lagrange_poly.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/lagrange_poly.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/lagrange_poly.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/lagrange_poly.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jaricom.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jaricom.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jaricom.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jaricom.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapimin.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapimin.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapimin.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapimin.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapistd.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapistd.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapistd.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcapistd.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcarith.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcarith.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcarith.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcarith.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccoefct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccoefct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccoefct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccoefct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccolor.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccolor.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccolor.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jccolor.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcdctmgr.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcdctmgr.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcdctmgr.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcdctmgr.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jchuff.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jchuff.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jchuff.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jchuff.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcinit.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcinit.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcinit.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcinit.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmainct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmainct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmainct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmainct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmarker.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmarker.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmarker.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmarker.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmaster.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmaster.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmaster.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcmaster.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcomapi.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcomapi.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcomapi.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcomapi.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jconfig.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jconfig.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jconfig.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jconfig.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcparam.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcparam.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcparam.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcparam.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcprepct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcprepct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcprepct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcprepct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcsample.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcsample.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcsample.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jcsample.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jctrans.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jctrans.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jctrans.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jctrans.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapimin.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapimin.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapimin.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapimin.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapistd.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapistd.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapistd.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdapistd.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdarith.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdarith.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdarith.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdarith.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatadst.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatadst.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatadst.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatadst.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatasrc.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatasrc.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatasrc.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdatasrc.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcoefct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcoefct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcoefct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcoefct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcolor.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcolor.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcolor.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdcolor.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdct.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdct.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdct.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdct.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jddctmgr.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jddctmgr.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jddctmgr.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jddctmgr.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdhuff.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdhuff.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdhuff.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdhuff.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdinput.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdinput.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdinput.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdinput.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmainct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmainct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmainct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmainct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmarker.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmarker.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmarker.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmarker.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmaster.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmaster.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmaster.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmaster.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmerge.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmerge.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmerge.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdmerge.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdpostct.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdpostct.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdpostct.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdpostct.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdsample.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdsample.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdsample.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdsample.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdtrans.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdtrans.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdtrans.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jdtrans.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jerror.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctflt.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctflt.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctflt.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctflt.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctfst.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctfst.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctfst.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctfst.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctint.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctint.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctint.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jfdctint.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctflt.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctflt.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctflt.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctflt.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctfst.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctfst.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctfst.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctfst.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctint.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctint.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctint.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jidctint.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jinclude.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jinclude.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jinclude.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jinclude.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemmgr.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemmgr.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemmgr.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemmgr.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemnobs.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemnobs.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemnobs.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemnobs.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemsys.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemsys.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemsys.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmemsys.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmorecfg.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmorecfg.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmorecfg.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jmorecfg.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpegint.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpegint.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpegint.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpegint.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpeglib.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpeglib.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpeglib.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jpeglib.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant1.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant1.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant1.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant1.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant2.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant2.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant2.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jquant2.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jutils.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jutils.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jutils.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jutils.c diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jversion.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jversion.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jversion.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/jversion.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/libjpeg.txt b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/libjpeg.txt similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/libjpeg.txt rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/libjpeg/libjpeg.txt diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_axisymmetric.csh b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_axisymmetric.csh similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_axisymmetric.csh rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_axisymmetric.csh diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain.csh b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain.csh similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain.csh rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain.csh diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain_with_ITZ_for_Ting.csh b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain_with_ITZ_for_Ting.csh similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain_with_ITZ_for_Ting.csh rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/make_Fortran_2D_plane_strain_with_ITZ_for_Ting.csh diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_ITZ_for_Ting.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_ITZ_for_Ting.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_ITZ_for_Ting.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_ITZ_for_Ting.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_modif_KH.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_modif_KH.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_modif_KH.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plot_post_with_modif_KH.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plotall.gnu b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plotall.gnu similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/plotall.gnu rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/plotall.gnu diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/precision.h b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/precision.h similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/precision.h rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/precision.h diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/prepare_color_image.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/prepare_color_image.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/prepare_color_image.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/prepare_color_image.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/recompute_jacobian.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/recompute_jacobian.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/recompute_jacobian.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/recompute_jacobian.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_axisymmetric.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_axisymmetric.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_axisymmetric.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_axisymmetric.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_ITZ_for_Ting.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_ITZ_for_Ting.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_ITZ_for_Ting.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_ITZ_for_Ting.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_modif_KH.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_modif_KH.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_modif_KH.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/specfem2D_plane_strain_with_modif_KH.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_color_image_snaphot.f90 b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_color_image_snaphot.f90 similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_color_image_snaphot.f90 rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_color_image_snaphot.f90 diff --git a/utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_jpeg_image.c b/utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_jpeg_image.c similarity index 100% rename from utils/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_jpeg_image.c rename to utils/small_utilities/small_SEM_solver_in_Fortran_without_MPI_to_learn/write_jpeg_image.c From 557a7ca2f304fbfb0557179009a40627b12b8399 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 25 Jan 2024 13:29:42 +0100 Subject: [PATCH 02/13] updates config files --- config.guess | 1783 +++++++++++++++++++-------------- config.sub | 2729 +++++++++++++++++++++++++++----------------------- install-sh | 424 ++++---- 3 files changed, 2709 insertions(+), 2227 deletions(-) diff --git a/config.guess b/config.guess index 35d50dbed..f6d217a49 100755 --- a/config.guess +++ b/config.guess @@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. -timestamp='2012-06-10' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,33 +17,39 @@ timestamp='2012-06-10' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] -Output the configuration name of the system \`$me' is run on. +Output the configuration name of the system '$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -54,15 +60,13 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -90,57 +94,109 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 +# Just in case it came from the environment. +GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. +# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still +# use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -152,22 +208,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -182,41 +248,80 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -230,163 +335,158 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + set_cc_for_build + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; + # Japanese Language versions have a version number like '4.1.3-JL'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -396,44 +496,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -442,95 +542,96 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux${UNAME_RELEASE} + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux${UNAME_RELEASE} + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -541,76 +642,77 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -643,13 +745,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if test "$HP_ARCH" = hppa2.0w then - eval $set_cc_for_build + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -660,23 +762,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -701,38 +803,38 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -740,136 +842,174 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case $UNAME_MACHINE in x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -879,171 +1019,246 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) - eval $set_cc_for_build + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-gnu - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility + # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1051,12 +1266,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1066,43 +1281,43 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1110,9 +1325,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1121,226 +1336,290 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + ;; + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv${UNAME_RELEASE} + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi -eval $set_cc_for_build -cat >$dummy.c < "$dummy.c" < -# include +#include +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif #endif main () { @@ -1353,22 +1632,14 @@ main () #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" + "" #endif - ); exit (0); + ); exit (0); #endif #endif -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" @@ -1408,39 +1679,54 @@ main () #endif #if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); + struct utsname un; + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif #endif #if defined (alliant) && defined (i860) @@ -1451,54 +1737,46 @@ main () } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +echo "$0: unable to guess system type" >&2 -# Convex versions that predate uname can use getsysinfo(1) +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +our_year=`echo $timestamp | sed 's,-.*,,'` +thisyear=`date +%Y` +# shellcheck disable=SC2003 +script_age=`expr "$thisyear" - "$our_year"` +if test "$script_age" -lt 3 ; then + cat >&2 </dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/config.sub b/config.sub index f328f0d94..2c6a07ab3 100755 --- a/config.sub +++ b/config.sub @@ -1,36 +1,33 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. -timestamp='2012-04-18' +# shellcheck disable=SC2006,SC2268 # see below for rationale -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +timestamp='2024-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -38,7 +35,7 @@ timestamp='2012-04-18' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -55,15 +52,21 @@ timestamp='2012-04-18' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -73,15 +76,13 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -97,12 +98,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -118,1196 +119,1167 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -psos*) - os=-psos + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown + op50n) + cpu=hppa1.1 + vendor=oki ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none + op60c) + cpu=hppa1.1 + vendor=oki ;; - xscaleeb) - basic_machine=armeb-unknown + ibm*) + cpu=i370 + vendor=ibm ;; - - xscaleel) - basic_machine=armel-unknown + orion105) + cpu=clipper + vendor=highlevel ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; + # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att + cpu=m68000 + vendor=att ;; 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux + cpu=we32k + vendor=att ;; bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec + cpu=powerpc + vendor=ibm + basic_os=cnk ;; decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 + cpu=pdp10 + vendor=dec + basic_os=tops10 ;; decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 + cpu=pdp10 + vendor=dec + basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos + cpu=m68k + vendor=motorola ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 ;; encore | umax | mmax) - basic_machine=ns32k-encore + cpu=ns32k + vendor=encore ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} ;; fx2800) - basic_machine=i860-alliant + cpu=i860 + vendor=alliant ;; genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 + cpu=ns32k + vendor=ns ;; h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp + cpu=m68000 + vendor=hp ;; hp9k3[2-9][0-9]) - basic_machine=m68k-hp + cpu=m68k + vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm + cpu=hppa1.0 + vendor=hp ;; i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 ;; i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 ;; i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv ;; i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} ;; iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) + cpu=mips + vendor=sgi + case $basic_os in + irix*) ;; *) - os=-irix4 + basic_os=irix4 ;; esac ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs + cpu=m68000 + vendor=convergent ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint ;; news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) ;; - -ns2*) - os=-nextstep2 + ns2*) + basic_os=nextstep2 ;; *) - os=-nextstep3 + basic_os=nextstep3 ;; esac ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem + cpu=np1 + vendor=gould ;; op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k + cpu=hppa1.1 + vendor=oki + basic_os=proelf ;; pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; pbd) - basic_machine=sparc-tti + cpu=sparc + vendor=tti ;; pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc + cpu=m68k + vendor=tti ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + pc532) + cpu=ns32k + vendor=pc532 ;; pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + cpu=pn + vendor=gould ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + power) + cpu=power + vendor=ibm ;; ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff + cpu=i386 + vendor=ibm ;; rm[46]00) - basic_machine=mips-siemens + cpu=mips + vendor=siemens ;; rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm + cpu=romp + vendor=ibm ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks ;; - sde) - basic_machine=mipsisa32-sde - os=-elf + tower | tower-32) + cpu=m68k + vendor=ncr ;; - sei) - basic_machine=mips-sei - os=-seiux + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu ;; - sequent) - basic_machine=i386-sequent + w65) + cpu=w65 + vendor=wdc ;; - sh) - basic_machine=sh-hitachi - os=-hms + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf ;; - sh5el) - basic_machine=sh5le-unknown + none) + cpu=none + vendor=none ;; - sh64) - basic_machine=sh64-unknown + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be | aarch64c | arm64ec \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb | arc32 | arc64 \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | javascript \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | kvx \ + | le32 | le64 \ + | lm32 \ + | loongarch32 | loongarch64 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips* \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nanomips* \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | thumbv7* \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | vc4 \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1315,203 +1287,226 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x"$basic_os" != x then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +obj= +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1524,258 +1519,452 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +kernel= +obj= +case $cpu-$vendor in score-*) - os=-elf + os= + obj=elf ;; spu-*) - os=-elf + os= + obj=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os= + obj=aout ;; c4x-* | tic4x-*) - os=-coff + os= + obj=coff + ;; + c8051-*) + os= + obj=elf + ;; + clipper-intergraph) + os=clix ;; hexagon-*) - os=-elf + os= + obj=elf ;; tic54x-*) - os=-coff + os= + obj=coff ;; tic55x-*) - os=-coff + os= + obj=coff ;; tic6x-*) - os=-coff + os= + obj=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os= + obj=aout ;; mep-*) - os=-elf + os= + obj=elf ;; mips*-cisco) - os=-elf + os= + obj=elf ;; - mips*-*) - os=-elf + mips*-*|nanomips*-*) + os= + obj=elf ;; or32-*) - os=-coff + os= + obj=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 ;; - *-be) - os=-beos + pru-*) + os= + obj=elf ;; - *-haiku) - os=-haiku + *-be) + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna + os=luna ;; - *-next ) - os=-nextstep + *-next) + os=nextstep ;; *-sequent) - os=-ptx + os=ptx ;; *-crds) - os=-unos + os=unos ;; *-ns) - os=-genix + os=genix ;; i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os= + obj=coff ;; *-*bug) - os=-coff + os= + obj=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ). + +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + llvm* | musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # See `case $cpu-$os` validation below + ghcjs) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* | tvos* | watchos* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | oabi* \ + | ptx* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* | mlibc* | cos* | mbr* | ironclad* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + # This refers to builds using the UEFI calling convention + # (which depends on the architecture) and PE file format. + # Note that this is both a different calling convention and + # different file format than that of GNU-EFI + # (x86_64-w64-mingw32). + uefi) + ;; + none) + ;; + kernel* | msvc* ) + # Restricted further below + ;; + '') + if test x"$obj" = x + then + echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- ) + ;; + uclinux-uclibc*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) + ;; + windows*-msvc*-) + ;; + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 + ;; + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) + ;; + *-eabi*- | *-gnueabi*-) + ;; + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) + # Blank kernel with real OS is always fine. + ;; + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) vendor=ibm ;; - -os400*) + s390-* | s390x-*) vendor=ibm ;; - -ptx*) + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/install-sh b/install-sh index 377bb8687..7c56c9c01 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-11-20.07; # UTC +scriptversion=2023-11-23.18; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC # This script is compatible with the BSD install script, but was written # from scratch. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# Set DOITPROG to "echo" to test this script. -# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,22 +64,16 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -97,7 +87,7 @@ dir_arg= dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -114,19 +104,29 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG -" + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Report bugs to . +GNU Automake home page: . +General help using GNU software: ." while test $# -ne 0; do case $1 in @@ -137,46 +137,62 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; + + -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; + -S) backupsuffix="$2" + shift;; - -T) no_target_directory=true;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -207,6 +223,15 @@ if test $# -eq 0; then exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -223,16 +248,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -250,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -266,178 +295,148 @@ do fi dst=$dst_arg - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst - dst=$dstdir/`basename "$src"` + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac dstdir_status=0 else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else - mkdir_mode= + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; + trap '' 0;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -450,14 +449,25 @@ do else # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -472,20 +482,24 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -493,24 +507,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 @@ -519,9 +533,9 @@ do done # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: From 46a4e3c0bfeb361ac57c7646b170bdc9cb1a5d58 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 25 Jan 2024 13:30:01 +0100 Subject: [PATCH 03/13] updates utils scripts --- utils/change_simulation_type.pl | 1 + utils/compare_kernel_correlations.py | 1 + utils/compare_seismogram_correlations.py | 1 + utils/compare_two_images.py | 1 + utils/cubit2specfem2d/run_cubit_to_specfem.py | 53 +++++++++++++++++++ .../update_config.sub_and_config.guess.sh | 20 +++++++ .../create_main_repo_example_movie_pdf.sh | 11 ++++ 7 files changed, 88 insertions(+) create mode 120000 utils/change_simulation_type.pl create mode 120000 utils/compare_kernel_correlations.py create mode 120000 utils/compare_seismogram_correlations.py create mode 120000 utils/compare_two_images.py create mode 100755 utils/cubit2specfem2d/run_cubit_to_specfem.py create mode 100755 utils/infos/update_config.sub_and_config.guess.sh create mode 100755 utils/scripts/create_main_repo_example_movie_pdf.sh diff --git a/utils/change_simulation_type.pl b/utils/change_simulation_type.pl new file mode 120000 index 000000000..61bd19202 --- /dev/null +++ b/utils/change_simulation_type.pl @@ -0,0 +1 @@ +scripts/change_simulation_type.pl \ No newline at end of file diff --git a/utils/compare_kernel_correlations.py b/utils/compare_kernel_correlations.py new file mode 120000 index 000000000..8e6724051 --- /dev/null +++ b/utils/compare_kernel_correlations.py @@ -0,0 +1 @@ +scripts/compare_kernel_correlations.py \ No newline at end of file diff --git a/utils/compare_seismogram_correlations.py b/utils/compare_seismogram_correlations.py new file mode 120000 index 000000000..9683188e0 --- /dev/null +++ b/utils/compare_seismogram_correlations.py @@ -0,0 +1 @@ +scripts/compare_seismogram_correlations.py \ No newline at end of file diff --git a/utils/compare_two_images.py b/utils/compare_two_images.py new file mode 120000 index 000000000..620fbdfd6 --- /dev/null +++ b/utils/compare_two_images.py @@ -0,0 +1 @@ +scripts/compare_two_images.py \ No newline at end of file diff --git a/utils/cubit2specfem2d/run_cubit_to_specfem.py b/utils/cubit2specfem2d/run_cubit_to_specfem.py new file mode 100755 index 000000000..6e65bc9ac --- /dev/null +++ b/utils/cubit2specfem2d/run_cubit_to_specfem.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +import os +import sys + +## CUBIT/Trelis +import cubit +try: + #cubit.init([""]) + cubit.init(["-noecho","-nojournal"]) +except: + pass + +version = cubit.get_version() +version_major = int(version.split(".")[0]) +version_minor = int(version.split(".")[1]) +print "cubit version: ",version + +os.system('mkdir -p MESH') + +cubit.cmd('set echo on') + +## This is boundary_definition.py +# extracts the bounding edges and defines them into blocks +import boundary_definition +reload(boundary_definition) + +boundary_definition.define_bc_edges() + +## Define material properties for model +cubit.cmd('#### DEFINE MATERIAL PROPERTIES #######################') +#cubit.cmd('set duplicate block elements on') # allow for multiple occurrences of entities in different blocks +cubit.cmd('block 1 face in volume all') +cubit.cmd('block 1 element type QUAD4') + +cubit.cmd('#### DEFINE MATERIAL PROPERTIES #######################') +cubit.cmd('block 1 name "elastic 1" ') # elastic material region +cubit.cmd('block 1 attribute count 6') +cubit.cmd('block 1 attribute index 1 1 ') # volume 1 +cubit.cmd('block 1 attribute index 2 2800 ') # vp +cubit.cmd('block 1 attribute index 3 1500 ') # vs +cubit.cmd('block 1 attribute index 4 2300 ') # rho +cubit.cmd('block 1 attribute index 5 9000.0 ') # Q_mu +cubit.cmd('block 1 attribute index 6 0 ') # anisotropy_flag + +cubit.cmd('save as "top.cub" overwrite') + +## export mesh +import cubit2specfem2d +reload(cubit2specfem2d) +cubit2specfem2d.export2SPECFEM2D('MESH/') + +cubit.cmd('set echo off') + diff --git a/utils/infos/update_config.sub_and_config.guess.sh b/utils/infos/update_config.sub_and_config.guess.sh new file mode 100755 index 000000000..a649da9a6 --- /dev/null +++ b/utils/infos/update_config.sub_and_config.guess.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# +# see: +# https://www.gnu.org/software/gettext/manual/html_node/config_002eguess.html +# +# +# updates config.guess from GNU config.git repository +echo +wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' +echo + +# updates config.sub from GNU config.git repository +echo +wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' +echo + +# updates install-sh from GNU automake.git repository +echo +wget -O install-sh 'https://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/install-sh;hb=HEAD' + diff --git a/utils/scripts/create_main_repo_example_movie_pdf.sh b/utils/scripts/create_main_repo_example_movie_pdf.sh new file mode 100755 index 000000000..24b350351 --- /dev/null +++ b/utils/scripts/create_main_repo_example_movie_pdf.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Dimitri Komatitsch, CNRS, France, 2017 + +# use "montage" from ImageMagick + +# use A4 landscape, which is -page 842x595 +montage -page 842x595 -geometry +0+0 -tile 2x4 -strip -frame 2 -depth 8 OUTPUT_FILES/image*.jpg movie_of_the_results.pdf + +# acroread movie_of_the_results.pdf + From 1e93f1bd6cfb99a50431a6db02dd165ce24c5500 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 25 Jan 2024 13:30:30 +0100 Subject: [PATCH 04/13] adding CITATION file --- CITATION.cff | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..b8dfd6c3b --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,106 @@ +cff-version: 1.2.0 + +message: "If this software turns out to be helpful for your research, please cite both the article from preferred-citation and the software itself. More detailed citation suggestions can be found in the user manual." +title: 'SPECFEM/specfem2d: SPECFEM2D v8.1.0' +version: v8.1.0 +date-released: '2023-12-20' +repository-code: https://github.com/SPECFEM/specfem2d/tree/v8.1.0 +url: "https://github.com/SPECFEM/specfem2d" +type: software +identifiers: + - type: doi + - value: 10.5281/zenodo.10415228 +license: +- gpl-3.0-or-later + +authors: +- family-names: Komatitsch + given-names: Dimitri +- family-names: Tromp + given-names: Jeroen +- family-names: Gharti + given-names: Hom Nath +- family-names: Peter + given-names: Daniel +- family-names: Valero Cano + given-names: Eduardo +- family-names: Bachmann + given-names: Etienne +- family-names: Bottero + given-names: Alexis +- family-names: Brissaud + given-names: Quentin +- family-names: Chow + given-names: Bryant +- family-names: Cristini + given-names: Paul +- family-names: Cui + given-names: Congyue +- family-names: Gassmoeller + given-names: Rene +- family-names: Gineste + given-names: Michael +- family-names: Halpaap + given-names: Felix +- family-names: Heien + given-names: Eric +- family-names: Labarta + given-names: Jesus +- family-names: Le Goff + given-names: Nicolas +- family-names: Le Loher + given-names: Pieyre +- family-names: Lefebvre + given-names: Matthieu +- family-names: Liu + given-names: Qiancheng +- family-names: Liu + given-names: Qinya +- family-names: Liu + given-names: Youshan +- family-names: Liu + given-names: Zhaolun +- family-names: Luet + given-names: David +- family-names: Martin + given-names: Roland +- family-names: Matzen + given-names: Rene +- family-names: Modrak + given-names: Ryan +- family-names: Morency + given-names: Christina +- family-names: Nagaso + given-names: Masaru +- family-names: Rosenkrantz + given-names: Eric +- family-names: Rusmanugroho + given-names: Herurisa +- family-names: Sales de Andrade + given-names: Elliott +- family-names: Tape + given-names: Carl +- family-names: Vilotte + given-names: Jean-Pierre +- family-names: Xie + given-names: Zhinan +- family-names: Zhang + given-names: Zhendong + + +preferred-citation: + type: article + authors: + - family-names: Komatitsch + given-names: Dimitri + - family-names: Vilotte + given-names: Jean-Pierre + title: "The spectral-element method: an efficient tool to simulate the seismic response of 2D +and 3D geological structures" + journal: "Bull. seism. Soc. Am." + volume: 88 + issue: 2 + start: 368 # First page number + end: 392 # Last page number + year: 1998 + doi: "10.1785/BSSA0880020368" From 518c8d0fd4430b34a4ec2ebaf582782cb3265ef0 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 25 Jan 2024 17:12:06 +0100 Subject: [PATCH 05/13] updates example scripts --- EXAMPLES/README.md | 16 ++++++++++++++++ EXAMPLES/README_EXAMPLES | 14 -------------- ...thing_in_all_the_Par_files_automatically.bash | 0 ...their_format_when_new_parameters_are_added.py | 0 .../view_all_parameter_files_to_modify_them.bash | 0 5 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 EXAMPLES/README.md delete mode 100644 EXAMPLES/README_EXAMPLES rename {EXAMPLES => utils/scripts}/change_something_in_all_the_Par_files_automatically.bash (100%) rename {EXAMPLES => utils/scripts}/process_DATA_Par_files_to_update_their_format_when_new_parameters_are_added.py (100%) rename {EXAMPLES => utils/scripts}/view_all_parameter_files_to_modify_them.bash (100%) diff --git a/EXAMPLES/README.md b/EXAMPLES/README.md new file mode 100644 index 000000000..7f316075e --- /dev/null +++ b/EXAMPLES/README.md @@ -0,0 +1,16 @@ +README +====== + +This directory contains a set of examples to familiarize yourself with different modeling setups and for testing purposes. + +Each example requires a `Par_file`, `SOURCE`, and either a file of interfaces OR an external mesh. +The examples can be run in the current example directory, using the processing script: +``` +./run_this_example.sh +``` + +If you're interested in how to setup and run a simple SPECFEM2D simulation, +we suggest to look at the **simple_topography_and_also_a_simple_fluid_layer/** example. + +Please **consider submitting your own example** to this package! + diff --git a/EXAMPLES/README_EXAMPLES b/EXAMPLES/README_EXAMPLES deleted file mode 100644 index 75fcef6fb..000000000 --- a/EXAMPLES/README_EXAMPLES +++ /dev/null @@ -1,14 +0,0 @@ ----------------------------------------------------------------------- -README ----------------------------------------------------------------------- - -This directory contains a set of examples for testing purposes. - -Each example requires a Par_file, SOURCE, and either a file of interfaces -OR an external mesh. The examples can be run in the current example directory, using the -processing script: - -./run_this_example.sh - -The default example is simple_topography_and_also_a_simple_fluid_layer. - diff --git a/EXAMPLES/change_something_in_all_the_Par_files_automatically.bash b/utils/scripts/change_something_in_all_the_Par_files_automatically.bash similarity index 100% rename from EXAMPLES/change_something_in_all_the_Par_files_automatically.bash rename to utils/scripts/change_something_in_all_the_Par_files_automatically.bash diff --git a/EXAMPLES/process_DATA_Par_files_to_update_their_format_when_new_parameters_are_added.py b/utils/scripts/process_DATA_Par_files_to_update_their_format_when_new_parameters_are_added.py similarity index 100% rename from EXAMPLES/process_DATA_Par_files_to_update_their_format_when_new_parameters_are_added.py rename to utils/scripts/process_DATA_Par_files_to_update_their_format_when_new_parameters_are_added.py diff --git a/EXAMPLES/view_all_parameter_files_to_modify_them.bash b/utils/scripts/view_all_parameter_files_to_modify_them.bash similarity index 100% rename from EXAMPLES/view_all_parameter_files_to_modify_them.bash rename to utils/scripts/view_all_parameter_files_to_modify_them.bash From 99c6efcc6e0620eb919c8c408c277a90cd5f344c Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Fri, 26 Jan 2024 10:55:10 +0100 Subject: [PATCH 06/13] updates the interpolation routine in example Industrial_Format_SEP/ --- EXAMPLES/Industrial_Format_SEP/README | 13 ++- .../SEG_2D_SALT/SEP_manual.pdf | Bin 0 -> 511089 bytes .../Industrial_Format_SEP/interpolate.f90 | 74 ++++++++++++------ .../Industrial_Format_SEP/run_this_example.sh | 2 +- 4 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 EXAMPLES/Industrial_Format_SEP/SEG_2D_SALT/SEP_manual.pdf diff --git a/EXAMPLES/Industrial_Format_SEP/README b/EXAMPLES/Industrial_Format_SEP/README index 5e27f095b..b5044fe46 100644 --- a/EXAMPLES/Industrial_Format_SEP/README +++ b/EXAMPLES/Industrial_Format_SEP/README @@ -1,7 +1,18 @@ +---------------------------------------------------------------------- +README +---------------------------------------------------------------------- + +This example reads in a Vp velocity model given in SEP (Stanford Exploration Project) file format +and interpolates it onto a regular SPECFEM2D mesh to produce seismic traces. + 1. modify interpolate.f90 mainly to change the location/names of your SEP/SU models 2. run interpolation: - ./interpolate.bash + ./run_this_example.sh + The script will compile the interpolate.f90 file and run the xinterpolate binary. + This binary will call the mesher xmeshfem2D and solver xspecfem2D to first create and output the regular mesh, + then interpolate the velocities onto it and re-run the binaries to run a simulation using the + interpolated velocity model (in "legacy" format). diff --git a/EXAMPLES/Industrial_Format_SEP/SEG_2D_SALT/SEP_manual.pdf b/EXAMPLES/Industrial_Format_SEP/SEG_2D_SALT/SEP_manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b35669fe6127ce6c1d74798a442960b459b9270 GIT binary patch literal 511089 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

9$8SM)YrjTjKiMDimtbG)W@nL@>Yc^^LrUn@&l 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≧{9 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 z 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 z zw0rF_MI*yk?|q_(g;Owssh1jba^t9UzpYWX1nv0};ThyO4uxLZ-Y)kF!&Yy?Mm8P2 zy^FU_g>LjX(Vha`1|XYpWgDv|sMlvrCT_U^#7e*CM)ck8?ljVVZ;>?(XT3Ow`O;rADYSz_ziDujf5;c#xH)WDacmOEwAS?jw;FBa__PkmC{xx> zXp8{t)R4DcFW#89c$envQmK^U?#Rh{LpyXCkxefp0?bOVt2mz)ddZ@s8>UNF^lA{g z6wq0=1ALy`m*K*)Rk9q*#=yt>PLxjXjgOT*ku_PYD>^-yLRk_p`r$$|DVC!TVSj3h zZE8Ts)REq;91_SdB!dEcu$)U)Zqdje+ywMgvmyL+&Xeo&QPWAU z-Nq*dkEu(9!?LTNx5n zk3TxW!@1^%Ys0Be%ZZlFs%!H3k)s61jCpsX94-R{ zgoD96sVUf#_VD(b8o*C z-VNWOOY1T*>}kY}cAx?M(bSQ!e>f+r*c>mrjp`~Dnq{#F1mc|?5V$vT$J&{8rzMG* z>r;PD%&5-2etjiLl^+_U@BD9Dr#g=>iAWRmS=~Lq6dhnca((29W47F68s4rGwt9)V zFkk#0oC7(EO$HSC&tSJ^q%fPp%dA2YH`Ry&SDMWvf9OY8?_srHO8#h-2>)f?*v-*% zS5mZc9cH1`)E&+vS#@+^;UTsB-p=^RE%zHaCe~$Je;*V2n5i3JHhjS=3ZXS%* z9C@w23srfe@j@jFsX(4$Sue#OOP`G@1|wEu$R4yvf`#sFNQYWCg~zxik;#E0v-;XN zs@Bj;%9h5dpgdMhH9|daRUl!aWvXO{#79n+=&GJS@fmd|nZ#5ml08_}ddRwLjfP78 z_7)Byu|s{fQkDN=5w>wzzi0+Z1pnJMRK6riROt*0T!k4k#)NfugAs?w%rMAhn3At- zZl!&*x$AJ%w*j>llgokjoI43+yq9YSMZ0+X{=GYHmAR74OHm_;NS;pM2vhEB3u$VD zr9rbrtS{v;ioQaL8~R&Alm!D1EEpwNk)@LLuB;Y_@Wo7x3IjE*xGD8*S*dkxiW(HP z7r0sN>KP9k^}X^kVRms(@e8V?S8`6STP7m;>PekjtslTa0$ryP$@K}CoT69ml6Pd+XurQyj$2BLq5!f73 z(I%g}_-}r^!<3NHlHh$cvnw=P-89MOFgk9=_YpvWt=U;H78jsN8_P%;B`&PjF|5@i zbRaWk8&m$gHhTziIWWM=sm|;RwR&t1#oqdbg%eZ0=074q{3=RdgjM_5(o!+P9bVsA>#qwogXZt{mqh4<9mE)c~iU_W@*~ zeuGg_<@b?CJt%^V)>XUPmaiGw1Dq%^?Vy!j6z0Y_0CmQ~??P-bL~X*=O=*$8@oE!x zX+ti>N^oTHoXlIv6BCccrT|S7gu+fbUx1>9+z4!&3!V!2Hj1jz@9OCp5M5dSP8Z+d zd`=1?jGLp{g-g;%!^MSItJ00Z4>7?z!^R_nGBK(kneQn0>uIAZn6KOo?~+-La}^izb0Z+uIV19+A3x}0yvqwZQLAf_T+qBNtKA9S2lcX zaY5fei!(>A+8)oA{{8U@6i_A-ne+8v+xrF-69C?mbWyk=LLWBP7L}dMDfoKx;^qa{ zbtY#wAXVP%_VyI#YDMbv?fKx+nX%ucQ=zn)@hpE=z6J$@vTAcOW7{z2mF+h?cha&C z%u;##3-!qFZ%X}c9?>O5bA3Yxf&FU0C#n7GB3Cf8?yw#7-9k#g18vozWZTw^93j9) z4vlTcR;l)9nKsGYqVQv53ic6UL+({tAR8UMOy&MxQhwV=b;9gFFvH(IGYcc*zp|Wc z41cI6{}*QX!UIyG*><&Y_tQ`$c8Z+ED_A$7HQmvAOLVN!NdA`nyxFO z7axsW7CB9KVDGK3(d8gNAVfBZ(ShW0zZU)Ow;<49aiKtULnByo$WgUVZS9Fspex}bn&UfN^at;ua%FOut0$ga9gm|SvAmm zswY{8uJ!WGS6*^=1+wM5qHkTQ0?aNzu0Sb-uCNhRQ%|xLX;WuXhz6}KBHF26g9=^0 znFGxD-LVeCzJ#Xl`)u=vZb7gJ&9Ji6_>rStt~KQ^>-D%fc^!gw3HE>ll5_q-Vg-Zp zZ1Im_qoSjyBS45qKwY}^uaS(~oZ?g5+_$P?ens+62kc{!m*W6%GXdzIdQ zS1(-k`m_xy1hHH~vec)p^Ek4g8qH}b0FdIv-q`4inl;nCgc({*VrC(;qbb;ztoOv5 zF=N(~DR|m>BG5cm<*iKRX4_3_53=n%EMduh#2QINUpP=o%!{+iu(V-Q)+gOVo$QyA z;!I+h2)r=WJyT1TL6aQL9pMc4$vMvePq@-x-pAxnFaeEK93A%7X1IwK=;VL#KKpfC z`feu&D$`~Gj@82);T62DRU#g>5_wELS;+mCGZ65lR)Q>tS%WbFv$8{!p}>)c>cwlI z!0QaN;Gw@2z(=S5*{kokeS@?WOUT9MC1HoJZ{&9*I#=rnX6x>QPsoETY=*Yv(U5Vy zUQk<@>DCsE7Cq`30zLWbrVx+(0A$6SV47P2M)R#Vo(aQa5cLENVW*%oNnHh;sBBl!!Li(ri{Wr+{np)e z@#A~1Ej={C<~n%{g;28yO;Y!8E>Gr5B1SoT1}TZYGQyyJRj|~i+m54He)v+}vkgxh zdBvt_-S!7BWUJ9OK>+4Xkfr{*N&2?6SL{@iM-9qf~(nu-6NnAUaEMyzx)@bCH z6TGwPl`?>m@iFjctXMN?i$9O^dl+HP%4=L9Hf@@0EO%R)wb{KQ_D&=1qSdid>*%e} zjuk1uEcEDf=IxtD4yeZRd8CYVqfXY=Kd~;~gn+RLUY_{E9c(P(g?cB*Is$DC$5}d- z<}-`1qV*NE*#?p?ptSvgaZs~~Hqq{S&#DdA2}07{X$KY~WGCLLyI1Gg3Zk%wrG2wh zghjw3v#VopYA;jXv78Pl-Ll%<;C!xdz!aZ}ItPFcNcn%ki`VuqAYsi!wX+}2SM;sE zD)kVpc1+93bH&o&`@y0cYwjIPz=ewGOlUWlsBXoU^cX>0GhS6~afLE+%4ZWeU=Gh*zYT+77OU1N zZ{any9KJAB*5tN#ofRb^zy(P^Ui~&4Sy`#@rmXsWqz*9+np%R#oH(Q@-~lw(AJjlA zx-f~TKsGiWu4I1B8I|1+i+uGk5v6*B+-<2X+2RwkK7(d{xxyTGk#~=`6?KjQ20sQ5j%zzDhA(}X>IIJ3L zLIc2P1>(Y;)_lbJd+Tx16NCiozeoQ#JRqTj05l?_0eSa5fn;(8AZ+}3e3TiNoayft z>4jMWiUSg9Z2Nv=E*0Ta?fuwA;ABTTr2UJMl~Mph-6uFq5;7ot!_GE>lmrF{G8cgz zw*R}0*_rnK)!XRGb=+ETFexTuF99*CqnIcF*W@$dy(-m5@GZzGS zQZ}zhf@Y(v_}kTQCeO3%7_NZz$rXv=dzD>J&mUI$yK7dh5ya?8#OU;Rn!BEJ_J`vS zsLejnQ@H^n1Q-TmYiIh&b#;*(TV5W|+LLs9E|*&#p<&!J5i5fx%6A(-RWW_8j7}!j zj&@B=dSLjv`5)ghr_Cjo(-^Khv&%Vg$}>ATr&%+X)0BXJuN|^FL0CnuA9?j%+W$O< zuLg;Y_5deVgLwHBd|@CrY|Ity>ke^JeP)JG8tD|6o`P zK(WNK>Z*-hS5~ueqkunYtJi1xJ;BQTt6!&a(8F?R`?Wtgm_+P z(J}hC;9=mviY40yS+h7Q1KI)cV^cWsTm2wl3<16oA<5b`%c{*t?5yjXMN=A`cvi!v zYkc9YIk%;>F@=HYZqW%0DqOvu;+W2-dl^u)IYkm@gV4a_rBYgO5tYlrY5JzfqN1g* zDa)gV$+QsxaEJ_}L^@dgv$AKS;w^GcpDk?=ld@2mZbc_?I#i;4Sfy;R8YV}HLY8%R z*=AFOYfrJI+hwyn)srNfORFe+6gW z^QeMB8WltmWX=X<3Tj5|a-Qz7l6oZ=Ui7}c-m^$OtmfxWu_WP-GUfateOD=2%Tv>2 zC8dEY9(uFi>(4D5X@~1jg@?`kkAc0=evbS!IKmR=R4}Nsn#dtNbu+7A~OZMc^8 zesL`OOHTbZ7MU0*eezSl(?6r`= zyO($y<{4;O@Am`UPMd)W`2;}Qe}=Ag-vGUbVvtuwzH{DRshFYh2!$HNm#q z+5`|Q6&=vz>6HPeD!(Q{w^MS?J2IX=*4f^W4+EmYuVTH#j!@n}4XA0xJ+k3_@0toa zOSglt6?iJfp7U<8QrCBZ#)w_7+hy?}5c*N<_E6GGkb!EBua+d@{wjv>l@Te8<1l*y9UV(G~#*pEwfmC*+@99j33i-e*;2d4JED~`SZYe*! zF`V*-N37}M#hc5!B-1&Z6u|-WelnM5mvB4j*AV${Mx#ZT#>2t&xN77e|9)sN41@!95gaM0xKYZ$7?y zJT|<411PxGvae3Q{qVVq3v$S&B85X^ta^T_;8CA=7y<{622d4jMJ;H`s=V19bgr5# zScodnAZw#ca+`WB{&8litovd_wS4WC)Ysu}9PxureL84eFsL2nna_@p)BLyvFq2@8 zQe4*haIQhso)IfMy4VF*adu&LefKn{7*;oz4U8JjMtzbd5dRagG;RGn`#5FE&^` z;yOaU!B3YC&|SQeLkIFKq}XvVi_{-v=J4guSkntGY>3p zF3C0n7kR@?3WBPb`;A$0X;U6O6#n4PJMO-BR8u#yg#`rR!ytj`a0TEr=2Jeb-|(?RgpdToT)pn-(7T7}D7G-!Rb^ z8qI3^6@t=;)sfb35f}h?9I5-yU4T6!4%!6hOzzQ`)&;vG3l}nE&5-M@R5Q-t!Ao!9spv1pt{HuF-3DONPQg{<2+W`hvE77F`-(}`E4QAW3^|CD7 z9DXdk3zd1Re08o9)a|gvX4tgGq0)#LID5;eIM{4y6bKgF-66QUI|O%k zcXxMp_u%gC?(Wby!5xA-e3|#$c_(+BIrq$WSFh(sueM)ZReSGxYAc~L8%hhHr<+KZ z@R!@@XUER3SW%Cet^lJIspG!VoT(d^vw5AEz;QeJi^XCMb9xag?EU zU9Q!69AS}qoi+RB73+k?sPY}c=*lzm$bf4?@+sW$fp1W=Qvz|GFc$DC_sne6S zO**|Lrr=EKt+J{av^da>XA-wD|G9e`6VL8GAa$%zk@PDxW5}>_!hB`Coefl3)1rdv zE3BSOtr*#no4~5q?bM1hs*_>z+O5Z}#}6=Q(!9`r1G<0DM;V#_C7T)kXtMkdp!@&r z$YlL%^Y=f%oSU2OpZLr8AB{>c)VKeUI9$$QN6j=qrF%mg;?n91&f*e?RnTsqiCf zU$-tge-L#*6Vk&ZI&B(5L;#+A^#IF20^0d!s{^oHJlF)khTrD}Fc3EBpA`UCcf2x; zn9Tk$%vz(oM?^4E3#?G_nc-4;`bKNPVx5q{L|D|iS#a89$cEU*?edpw1mpll*A5vm*p=uP8=kK!3$su2u@B0h67SF!!E zAwZCcN2K`}P9R9X3eRtbl*gpsBenN+_r{M^x}5nb3E4s;e&9b>;fuwqM5p}WriEJL_P&U{iePE5zQk3bxWnq|F&*S4G2rC zeT7Y+S3}7Q34>{36wfidv<-{aHP;+s+%Q>noZtTTel^xjq(+CGHmKQLnw0BsLKKsZ zFRUYxC}F@_argcRqjB$A@$tAMi`i&!?NZ<&)dT@NK`$G8SZkFEx?{3ATjzDF7FWa% zY$F4Shg_ls2)ML6=LAeEfy-I8#oUk#S~`iSw3p0}iLC$fukYs>jJpg^rE>zZh)i)y z4-LjgjAbodvRL-lV3H+C)pBeQxn-8=YATnW%7xl46bP9!llyk#hzsS}iq#$-cjC^nGe0HcfE@WUedaSD3b7%<>&fN?Wmh{<-G zUC3~&qC}G}PG9?()+!$_ZKBw9tpf$h4y_x2nSo4@FHM_pELVjgTw|Fe3)eue)a1 zg*xrhLAK0zUe`CR#n32TyYEoAjvYtAyz^tSwP1;kvV#gX+8^9G_-YN|p!&1|i zsn3hlYg4?x&;Mc3IHIy1=bA9amB&=VGk5U`>mLVp-p?{{J&Ow`I>2|^G5C`8GTo+} z*MTbq!4^YRukmhivZv?8f)!JkuI)pvB~2^RN(4#WfK?q?|FufjU~Y=L z;I`70?YC)*bI4e(?HGtE;%o-1FBCc1zX&)01+!02d1|81tgt-2jD6&z5|E#R1(a;E z(VyIq_0mco!YU(C*K8m8~^4q%;wS6K)`tx z3Ek1)^~r=v2OPEM!spEE`~j{|aM%3bIqxqX`m4}jW%&C-0xRPmJ)i%9^Ztzql$G(1 z`s8n-`wu78+m4y+e-WKgv7<~ix!CSepl!$+`{6VM#c=9Lv?=%EFoUXQAwTJbudg5^ zNOD3k{G-FdzW=pFQ^$+TqozO9Pr0g(XGc%0e?<2Pl3L=eFZ|MGZiR|x2tqh+*M}>3 z&)otFZHAI!W@f4K5H9J1G`J^vDVc8p^9DMBXCK4>F~i){PHb~TZqsj41o&55fG@?m z1jfTsVlDy)jqcX3&qi{8W>668VK$GU;}k;!Gb)dYuuYN<_R>2|8uvLLzo|o%<>kS~ z6&nh1C+TDN&a1hZCbn@s7pw))=%t5D(TD&y*vuMgL|dJ-CnFF7S+{qgc`#L*rBxX) zr&7GIRfKW$1L-#)&ip7UJ$uTZdyaBf$TbEIESB=ennl!CR^y&`Kh~*1lX2_rE=7ZdR8q98m&Zfu*ERrBp476iGRMY`rM5y=Td}G{ z9rI2&I-7fDUH`UJFD?sapEx+uxM|eyq9_`pD{^9(;)_&tqBD39H`qZ!R}QA(Jj$G5 zAl6+dG6r8vpy3s_JiUOJU>HBjEtZQDJ5wWMJ8ms70E9IU7H0*^59@mCkXq6K3tfN_ z$mlDkHdc{9uxQ$HVOUOdNz7GeVd0b{T6#=sDcJ6C_}o~R75vCXCFKFMx%^9V39FJw zry8n?Z9&w8tzYJ)VvFSr@Aw7G+2{pWx8EW70aN7hzKk4rutE zl2nSlfY(J0PnIJO^B2mH8GIC(tMaMuybCRH@NOHWSUU<=4o|$(O@dtTg7>t9+a-iO ztCyjMs!rfampAkD{oKbkB;wM*Kj@I)GTHN}z)w1%HTnlUD$b=!8qvONtJf+h`B$|> zHAM9eAMNf4G@3YhRQmqK~GII@ih<^FH zsV+CN$v1yhVNBBAni7Q`Fbt}V|`^v{^%|-kG3Y4K?iF2e8nOf8H8?iM!Lt8;rT6Tnqmz?isIUZePl3;e&gTg~>*4#6^#t&CY;(|N*sCV|U(!GT@YuMwrsH_cKxSznMKk55I(Fg;b zXtxg#&v$2me&|+TwS5d$-A<@-J%2lB6-|u+QX5$5qKRXSZ5d01IxYVtaO)fNluW9j zpxR_JkP}YbAURILS44t%v_R;Il6i=NJhqu)T=3J|^wfIW+K?z?rKE^lN<2N>MfN&X z(E;f-eXGbdn7xT<%sAt6=B6fBG>BH9;W7U@N8si<&6-b~Aijq&j>O!ojtRn2?1kyx zkSLp>gbt>DqN0?dVP$pm-g~qmv_ohekW$^FB@S!)P@8v!RIjxSNNxFGu|Q8{IHq^F z;=O4|UDr8Gmh>!`WV^d}8j!H=JlxEeYwy&ECHWHWTz0&h@QY&!{#f4HTIyVMBF~JGO^$SAL~SdxTDtNPQJWq~`tX zie}quRj;O)sEp_N{MIQ;a;?Ys1P%fh*+CUg_)8%Qht+1i#HR;Z4#|9LT-?uw!p3eO zkR2XA@@%eqq4>^(7}HguY*G$MBF`!ta9C>^1*IH|CzyFVu0WmPM#Iifb29b9jq}GM zj0f9<8uP+^zu5+Y(oduPV#!UjC!b$Fzv#}6oL&A6!Tf9B&Hi^Z94q4=Evf$-g88Es z`du4>MXC785nZx2tdqih}9gMV!g0T)muOi&Lu#zw#-^$Ubn}z zdS#M7VY9js$r|4b-jO5qD(m(~pJ1!yT+gm!`?1%V*O>unBL0HNV{ECTmvyLiRQ#ET z4_o_%UN`JVU`JlCSH~F_+51lZpJIa^&y0165fWRX8`ID}mLdJ8#k>;>CZxf;b zZaSx6@_ZtAu)zmG!d+~JdT;27Xu#1NCTb!AM-0^rc6joNG8Nws?RdrJd7-@M0~S@l zsRbbZv9km3U3^Hdsze<+r9CCmN-(3@AmABp2iICoKJm7`?JxPXcXVq>6+ z0W^^5?HJEBgKRQ9ex(g(Zj{xNcK^kR-R}Xjx5@M#z7PJ|L0<(@(3$TH#5pdNofA@w zKUubML2I$;$6WE1C)~zygg{W9D2Hq#6`sGvJ&?V>Lghk1o^5Xnkca@$H|te!$BFCZ zH2r|4eM)$emc_xxKS`B}T;kS;LL9X|c~|uZahj;7z8rV! zqXz;Wv>}M?p%@?D`N_ftsiD@|xt1$SiRzI(GWU}}(0}X8mo8RT~PNRT$js z?vT+8K2K3n>kn9owf=XTlZKe5nae$PD1z*mg}a~7bH+dp^Ow%)OJ)3s_Dh6A<9_)b zDX0DFDoY~I1QC80p7lkWCby0AvNH4Q)H63+xD3O473bf}2MSx4t~*z4o&^SC4$4J0 z2xmcQ&e`anpozhwaDrr&ioUr(BX|T%MjB9DLXU#`Z7(Q<79sXk(x~P;K2^8C4~T1x z;8doOCgS4Zs5SLMs?F0&l>#^f%4LrG>4VbrRwHHToI`!|D?(dyZ2RdE-gZ(gGqwHO zX_PjIvSn3o(_Fy;VBOWEsKmp!OS>UtgL@b?k^~Bj_*hbu6V61cLauX(vB3!?;nHnc z(s0ZvgWt0kDs|l*!!T@MQJrF&q-%RhYu5Df;Ooyql3P>OH zk(${I$Ie75vB@B^o0X>0t!u=WMDV#fm%Ce{n;5agJO=zdu~o8JkNRg(^k16be-aC$ z{mzQ>#!4?@fPqie3nkg89jI61md`nygC!b^UABZf_!006_$PN1ewp)kb)UkOig_dQ zG$5BHK@9#|5?bWn(c2$fw$y8o#;r9M3E=vyT9{{Epx`ogVt5)vrrN3pR?4Xr=3SJE z)iBNzhQmipMc->j?tHcHTzC1Ey@?ZT;XvkFO?Dn1e#_4v2VD)CWp*W3G%Kqv;qWDf#^k=$X0Mr#D`cf;spger7al1o z;K4canl7GIZsmYdY^UPd=|jhN&JV2qjF2l&jgUs%=CITW=ACDn9*#-Yf;!j~9icHo z@U*5o(u3I!UR!{|@~^kdxuIaZGD__PBSBAquu>dD1>l`Jw61#w_nc^ZZIOu8+R z6wy~Tu$S;$FYsgJ9Dig_^<7Istz}`a#7t~L)gejTOFzKuPS< z3_J6i%|b2~6hh!|KI6^!-`n-y)@N*-6&@LXZapco^6qf7zI)QsVVcT68Xg%Q+19jB zEBzaC`+LyNO8>8pA>;qQK|9kQMb|&cjp;uev|ImkOoO#@?!@|!F%9Y{1dBY@m-Gt_ zs7?@Y7=Q{&Rr7&_#QZ)WmM)(t`BZY=TVoxB#e*c)^>JgwkUa?cm420+ zQ#ua9SYhoevbr%jeE$~R7`FprglGl$5kLx-qTj)4M{S<%YTpM>07YJCQ$`jG=hhI_ zu=IKmdhFxgv33~gQ_r`75@^%iiH^PwDz`uh?*#GKCKm|gM8y)x>($ibqg3NU7lZa) zi&Gd49D{2ZLBo%r?g1x|XfxN^X?+P6i@VlPjx9``g63uNV_u>-eI#DfoM&Ow?YWG` zB4-yrYVG#I{QLFy3wPFtYel)JoWT4*pa5qSUFx2j?^pv+>x4zw5*wXO39Pj5^>^Zw zAAzqyw`poX#2TT;!FLENi^}DXC)z~=?t{6<;cLSf1X}6xMvpIBL{&+gzs+YF)^|!P z=&Lsf#uJb0PVfG7icnTj@8O}hq475?@a z8U7b&&x5xOK;13v;Z_Gf{PX0ajHD!vmN|a3BmrcZALNYYVzx(K$-os@-@eg)aJQVb zke)&XQJ=h9bxzu}MiRiP!kWia!53|`yaYjRP3lcA-x4dhov%P|1A1a|q!2{^Jm*Q^ z=hRkmmd#Ft??8BV_QHf*j}0$Y&hKT+r`Vjuczbqy)VO-;#|f0ose8~a&f)PwR8b_^ zLQw>@>MVfxhvD&Hjq7rIkc9GwzzKlAFH#Jt;rrTH`lSlhifMuRtjp#$aX7dU&x-S@ zGdri|T^}!v@DB}IJ3{#uiRPadhGSIjb64M9xA^CWOy<~}+ufSzLTEba_1=mAp=SIq zCR+)2Q>Y%@-}=vQ0rJ4LN@?j#cSv?qdl zUN#muXaWAK9s{ZomX`q=&np$JuOW|>}c;VNgj6;q;Ypy|bJ zmW1nQIyBV77o`( zlPr@Gix&H9LOySCpTL-YL|~H|dU(5gp-=Yaqg*xGd>tHHouI;%h_r?Sly(;E^ge^t z5$nPD;2xY{KBXl>mWkO~A>YVY#P=O2qxUH3t&-*pb#1fQ)1|hX>^xWZGg2v`o|il2 z$ZSVZkQHoA&z4-)*96qrv`Ru>4_GY2<%_dXdr&Lfa!qwS6mgvFo?W!tBbHwM?;ZEs zL9kn*pl|gmRnLe~qDyC-c2;tHc|hQ>hqUg3OH5(CG5xtIE#Rpxjh}h9BoYFE^2#%8 zJHBjcUi11Cp?~#NSFYhX^mWYlXqUcLw2J7lMh*l7HR`bKjcLgyX`Cz;zEwoluuX+i zBZUJS?qv*&EwL4+bWl^|J6N4CmUMhMY0HibocbyAsEz~B?pCoa8#YO~8sXp8GGdGG z#)P?K)E=*i)C|cpa;&tCNpBr$Jyx8*fh`?Hm4LxMW8m74Gph5CYkhcBYE6r82P1BM z)Z9s}gk|}59hTa-;RROAR$guy9Z$TV%#?^B5zauOlDKcBVO%g;E5b*oW;+f}hyK0GJL5v79@H(dA*tVaJT#1GmmB&{J zh#cd)7w6cer*U3;)FSqmblJyE5b!Xx8SSXqPlRSSUgHP0eqVq z_LohPGq(3W|ERO%R%he!qjLLyyDBxUYy0LiY?aL*uXK z-Vb#tt0M*nIZ|CaL1OrZgBY>zC()snOiy248HE|H4JDQg+i$>;M9geoI=&O3C=Lra zx8H#urAmZwPg3_C5k+Py zdEQ%sU&|IFA&*{{FN`q|QAJLLDPX;MOx$~vfVscbd6(mY#v}rguJFJSX#)G!Eex8l zH%^qBMuaB8m&<@8*nzK|b+QQAuOOEi8VMysJZ5cg%&7a}khxz`NSSkn07OdyvvgVr zGL4w1#2*GJo*$iyUhEMQej#kb+1GY9Sb&Cz658*QU%o_6gtM-~onoGBw(&JzQ0@E> zT!sjzA6_IyRRg&o4H3J9T$*6Dk-UfIsKS~YA}ti*$CCi4Se#6xrctY`s)&jy*k+=P zPSP~fkeI`GN3uSNfmL$q!A8==*Q@;boy27%@+k5;{wh}WWbjDt31@qlQi7nRPa5BO zSh?U<^|YGQwFcqJo&B04@stDbjWFnWJfv`vCAJ*Gh-Kr7QRg8NO?5C(%aRLBf%*?q254@j>= za=gxAXO;kCOBCG0rXOruW|ce?ju#ML!n1PJW_AEit96(yHsF|L!9a=Oi*GfP$Dpog zT#80yEK+Ss9Pd9iTyjwr-rq{fgZlX8N7tP{m^0qA;F;*zMUjqs@93HII^+hZmnfHc zd<#&NuQBY2pPLaGZXBYBbJ34n=+!JMBYHbw3Q->LLKQy~5Om*TFm(%hTBO*s8f8S;vJUF|&whl7wO$#;=i*RHx{ z7Dr09ZKI$xwN2J((mjN3_^d6YjXax(OM1I*0bBF1d$hhyl#@x+;nOcpSdS*0Q3-)Wgvtx5FEvvzdXJ`d)WP&CETF0 z@CKjwe%E9b<#oa^|jN;KLnbrGNCW%50yi#L?S@*t_^7ph9lIali)ug%bDQ^S7VZ0MC$?5Bsn^L_G5tp2YEboMMSe%h;sX{dXSVsQ6MxOYLdAg zUY?pQ?Q^8O#3VRcJh7>1DOcb3drRT3nev~BK6EYUJz8&!hWa$08aAfBJzYk@pW{zySuN+ zl8GWDU|(%j(NkldSc)MHH;S7c*=%jMKki7a4hJnv=R;HV>4-PvQc|i1en=ryC5u^J zZEbYEF;JQdxbEt8U||Uj+q0S!w~f+=#| z6~Ov#&ZF7Qvk5sboFFq z?cC`jX!zGxS2ooe(ON2@N^Z}E?hV{W*Hq;6u;IW18www3508I#=8oejnZ|F%;;i88*)fslk)RqJ)kQLXLC*9W+3f#deM zh3e@tnl!iutUiXbDA;OUmz=l!5dm zKHpC_;>5ntu0MG#N)71bDi}c0v5x;8bAl z%5sH6BE3NX<{)v{E=s<71|IMLC0RlnjN{y0_0;84*yYdF0Eca&dprD>0O&zuO`Ef{ zQNNB5=*2SW$+>{+Cs>n!Xx&h8j755vd#)(*`2#L`jw#-#HZ|iy zlObs5Xyr!*2km}3`Qmj36lfzL72V6ney@gK6fz2_T#pBiRVYbfigX_`^VdW+35zPK zZ(a#V>b8NKHTBj(o_=86upLxe=N(ayGz*5&)0RZe7|apeKlis zf=yAsZft;PLuM3B^^Gy1Ye zxHuOw=>~O=v`JqGw-pJfy&RKtx)dx4MdHq=4AVN)EYXyM5=D z5RZ)^`PV1@I<73fc-ZKG9PR^IO4`?IkK)~&iBtV(I`D3WW6rDX%6t}Z)6p|=RQ=k*DqGBZ!WDa5q3+B70m0~v$MV2G&&kV}CD}|RYvd!cujySi6b-ND?GC$VH32@}K zCu(!*=bsEZ2iwqLvfViP_tTQXE-I3@0q7C6>vCPI6o3ubYq z2Fw1*;r3~Tz)48U?mMSn{R)w9s55_}nI!R`mmxe(*4+YnsZZK1i}y_8cC!nn6gO0$ z+BTb_r1C=}y}jOnA?Q>Nx;Luk8-NPNXJ`vB`_zmw@Davenaf{47Yx*t03vYrHj9}S zgobAJUl{CPbmlC1>voE9Y%{Th^*UD%!VL&<#8fK*zjhnGw?V~Okf*{(Zz$n67)=fv zcUnSX${6v$UPl*{=tp1q%BzAIQjxY<*RAik4KXjDm#*|SJwZY=JU=1ESY`pmh9)`b z4d=55{RZm`bMp)6Vf5iHn3rYfkfo&Kglm23HMXXFx^G_Bwv?Y#>i=Dd{UwS1QS&k~ zvi_^)W&Wcz`adYKKLRotfBP|i9|C#;1v&+0R%WQ*=f9pX&~rfjKL31$;rA>5_~zel z`$NdFGD5NbXPS=rk5c?^P4^%9U8d9}ZTE)}!Lu@HpP?Ni(PkT0uP!k-&N1)clKIk*go>gf z0jjoqEB#f_;!ZB-JzKio?Qh4jstG75bx+5y6RxVZ@8SVS$|xs=pRM2Ilz)^$S&R!J zQNp1VX|>}@+Mw2fX;KH14nGxaHSc-1=x)DCGS4jzao1q66Ij zyii0KW{Hg*Z@%aZX5NrZgoF19N2G`E7EO`2Z33eFeMK&>z6aPU6b3(buC zt__IwZiBUVJa-riFJugFp~$qxE)0A!;1rp#)=qxyJ0sSj{TU+V$vb4D7O0taI2Jds z(rE3qgmp&~B<4i2FU#o+a6RkZu*$ettEdb^IW9!uWq@XHI*GWP#vjtB!PVV#l~#sW zK+A1X*=i(W!V5EJ#Gxkt&&fN5gVieE`bU4XyIP(^wfs9ZgU(buA zphhVngF=Tv<((bVj^MOz*N>{3sBB6k&!qJ@l|%Y9PYHq~EFN+1ARMYU2z>d3jw!ED zG?aO3yIy~3+wp#Es11U^A2L+3sNr}UGRThPj^lo7@r~)W8+H}+)jXnLv)Y<6M|{AF z-XfHSTn{(+kW}4}*7UVLTICSgC}~w1ox!?PA8Dc3;<4g*{L3U(yL2zY7d8E2zeM_4NX0d-ae3%rU&$pW+3}SiCrhk4%{$Hf;TXgBoqZkm8w2rt{Un($?6qKI;96&)267+aDLYu=OUoxWdiF0} zGOO|#d2ws#cq$59w0u!V3EDHdS4Lzl>};5JbD)M_h#Mt!kTX9PU6h$fOKG5j)*LjO zV}+P9@g>WtpZdOGBE-fS0|=K1-Y^YAje!NzWQ_HeO@)%sC&@U7HfNi9hDWKAdRsz| zF{xzdu*ro&wp!%sh>qw%XiyZvenk{0T`_rrWS}G8Yy!3Av)R%butHfZfWbd9xO6QB z`^cn8x0J89h5d|@i;-_hFA~yO8i0b0g^no$F3ThyNPv#RtYq^4-7+`uQmllH-)9#S zyt%2Z3f);m?P$k;e7_jvMIjEkrqEESE1oa=HHl@Q9CMI`%l%O>_sMGsk;*+3j(ZG> zct$#ijWTi6Z;fr;mn32me{RUUX1W#c%yIr2){9q%=+9Q?5MoEqloB}|Kd6xM<#6hm z%dP!p-jQ5cDpP0xPvuVbKoONDzqCzup7&tc8Bv&65MqoMnhe}+@wAv|R|0^R9r zFeqeWKa;vVidsu7VG`<^c)J>iDATn9)U^U*G~6o1MQl z)$~va#ez*@gh?epn&~uTPZ{U7X_PtbQ3rBZB}JCqUI76n81{(^(@fF~;HTX1t)cBh z;VOoLNG6K{m`$iPC0jYZ4Xx;Z20S z;T+5B&O*gzqBCo8gl%%~c5?;6ob^*5A@4kJ-XB@-77)M@updNP1j#Zs*GgcT!GEN* z3z`Zk-Bz%!V5?BHD1P4_@_>1U;lcAD-*0eY@Z_(7C!?w`dHM#F74TH>JsGxMrLHVF z8~HxWOW-z5V0^anR56)sc6@qF5Vl>-4rb=77KgBt!tv^usOTYU#1=hF7emUK9y@t3 z$af&NBm9ihZc8DUz#`O#s zD^EMleWBo@ud}90mg;X#JrM* z75DZ6?7ss(wX@I}Gn!K2>uMfbDE$d{{Kjj95`g7pPgToWxU=&5?xnDJOyQxGq;}&P zUb3P*9d)XGy2({5e$tjh9uC^((Ba|p=?+Ttk=3>1MsMXW7m5gqwKTBV?w;|d7bi4C zi4o%VP3$_YwCus|8*zkqld;HfeWAmYj3#CbN0xv@9lcftC<`Ir%Jmm;>;Zpsa-G>c zCz3C4^|9!1{vvRo@8RmR2)9D=}db@;%y<06`U)}_;wR(~_w*ci&n)+W^V9M+Pbo#U(gmdN8dKWG41TTUhP#K|8b*Ut#*!p} zSt~=@l2t`so6I^F8>L?ys#<&nYbzq)1_)C&XKG4~eKHu8SQTZj2K3353!Ar$7bBZK zS*}cOL()vTCx_d-Gai_F?x$V8Aj?p#faUcbc@vv0H(Rccv3Tn)dRT>bC!id_jH2|> z@IwP>-v`7zK4thYLWGkuDL#-&(bo_MQup*cpjBNU6j`_uy}W1{@8-6fO#CDUIgGZ6tU7@$Wa81y|VP|$Ga{jvtadl03Gla26Svp*))RC z4%r$=jyh%J4et?Bem(0ayf1l`d5fkjofUqkqC$}cK9y-EUpsh3rO z*1Q+40j)C-cH{GP`pA!aXR|c^nh7U-K3q?+>Dhg)bs?UOP7bw3?7j_P-F^-89!I*d zkv+Gpadpn?n<*Ejqwjm(65K6U)#hhy+B4hDr=rIqBLLgV@jp4HQgb|B|z4(X++Is;9A5wmsc_p+-RbiV9&w+BAktf#?$qp<&J$YW$>W&1mU zhWU^2(EqNm|6e-#59!RzL=W}*{6G4d5sLXQ9nH)8ub=s&rTVvG{*MfNMXKum*o@)> zsEGqZiBq%~;1MsD17@?s;cFDv0`^8Em|dJVnGhm8sp#o$fS{9iP+9?}c6W7&u{G^Z zcSg)^KLz-RuI|6?zoMKq9TJZh_f(Ny*@mSVM6si9Iibo<0&~M^?Z=mmq`jyaCvp_; zdfm4qz>D5M4)D22P>8OezbpR!|9fd`ZK>c03%M9`3sC6~cEH01dkHk)OARC6qye-lRX! z(Of2wOD*O35etCUwexz-zF@9cY561_RB34GvGMy$7DL;K(|4h7h8klm)oaZtrqdA? z-@6wq8o#y9A4T8Z)Z3p%8xElLTknnyNMQvA5KPyyj)reZ-e_!%-H?nl{NhMVXXW=6 z7N*i%(yvMlj};EJ&gLf&%_1UwbKzNzWanqsbE#SxW2{Uh0>mI8^?rlLsnT_E;E7FC zB6ZhtD%ITr;6ei?%O;utT~1rkkOp&X;E-VmHo#jgLO%!e{ehhU#{_ivIQkjvDKNbJMcdY1jgj2&`dobQ*%60k z*fTp5%%Fx8fku1sv0lD8X7YvlZocZ{Y{Bv&ZacX9&aJ>UP-4W<+-TbX_!k*sAjk<9~Y;ZJJniToB#u+9* zTM`7Mu`cK7CHglM>LhwG#QN;xJ%c{mmCB7M3p_T!3*?IQCWci6h?(ppziRAaxNLnf zZ>Kp$wCku};Z?&2KT<}tXz=JI7~zKv04^1&npUTldYbS?xr-lA|Ghri!>?h?Bh25u zkt#SwnO-TQMfV))n-`IUa>B)=6@6z?D|t@81K09gjn6`te&u<(D$^``cM%25;WI>n zc>Fq|(ns z9n`vQ<)#hTJ(ZZ47q4$4L#@g7PjPEmVEu$opr(G;#_Hwq-^$8KdKPd+2#R0kx1KmG zkznLdKY-eVq8682CM2|X@Qab3vljQ3n!Bap_4yiMzIj6o46##md!0MHzQcy9VzLiv z{|?2$LgB8ebQqNpZp3;Lbx#xnJQFdl%3wxKce;D3bqxTv`VGaRyP!``(Gf@A(*^Dh z^#zu4x0@RcRLRtDY`M;%mtNP0f%P|w85e{Yk^M*xX|xZ~Ku_mI-&EG1da2DouLis_ z$E%vC-yXCdlNKLgZ#FFBYObQ;;Q99}X^2s~b|7Lvhf4dw+$$>#ZHn!q+OoZQE7%dp>Kl?f%x%ZI;^C(f2YRE1}YJAk{ntAf8-;F&1xyc}w20g8$ISGvd^6@hhF||XyZk{Yf8VVAgF{&UXa@b0 zLsV8^?B{74MFNSmJ4b0#>k-INf0HMaj3Ft>?Aaz1IYk<;!!Go;G z+Z_pFM6uKLJ0r@*`DE(R($evkhvpSwO!8N6?Nngx?;|a&)7E{vUvFY$3b7llI?LHU z#7fJJd+KJOJlQE|B}$c1=)9C~}X$rMHB?N3l>xVyi(eM=PG1^pUDGv6}~s){a2j7;1!du{<;@Q7!IB?%j_#LPD$h7jmR$Eh)#Wpb5%h?nOOe&l8L_eElHPeD~&`n zh!wPr>as|dk-1Neib+!FD7w^kZ^;xa+($uT$X5ev7Z2z-gRS6&bp#?p!Bd+w`M$WB zV}g{J?QRkM#y4JyNa60rklW#2u2>Q(74!FVhdOQAfC*$=v_7QZ z1Ws{0(D)K(g=Q70kUXclgY|psz0&8eW0#96&h=$lqsxinXX<<;)890Voo&7tPlb_$ z2}*a4Th~?L8Xd`)cbjj7_*?vFJ6uRzfA!d(6?Dt|p&0kTijDY)0b!h^nwc*lwFigs+~Mm+9kYk^?h#CFwP!0ev-tzUs-z#f7C>??WQ6jT0Wii zftKx5+lXKaJ2QE!ST#m%ld9U+Ua_6FTpE)HzPUG2G)R5Rh@ufnHPSuavN4^dLOU%J zq%`rhxLh0(9W~{tf$6(D$F;-hi3{+j-^)!dU@_YoA0g2X+<3qDceubf$+*Uy-=%15 zIJ#mDfsQ~IS88z^7Xk@vWfP;Xom6HTqqfd`n z7eK*4!KjTo3>WV&qZ|2u_KU<8w3jL65FSqW)T`LlcK|23CW7=#7%uc&IMC_uab1lY zc;CjUILljjLqJQxw?I!ptE4h0ao zV6M>|ZX-QQ$~jzgrx=c{itN@2VKU29=Vyh00I?T@M`)#NR%U%UZN7(q6+oDNxi{4i z-ECeiqH(iJspt8Qx_!mL@^0E{Jd!oHcqSHkW|DEaWSMo*i(Y>A>b<5+#zS_zm$>7p zOC{gQ9~wO}U%9vWV<%9QHtH@Fu}JT(3J{v=DAB21lcNoyr=-DRiy7?d53AdI{kmeR z=&Hg+z_2w}0*Q5YqJ%mghPy?`+5?o$&+kjcgb&2FcmSS<}2(fukvlQ zp=T-*wBJ&ORB-8gZRFC|OTLB>3g>Q$yUKD>%lV8f?iepZ7Duzp6@&%c#(NFL7Kp-0x0U;x z-|5ya%=rV)OO9kupVJrQ%+zoTn7UUmKbaXta9`ZZH_lf`lnwS{xE~?u9o=4GIxCxP zzzLm>VCKp02sX8-i?_+P$v(gQstJAk?=b%t-u`7xV`BQ(wNaKo`r-cr%>Rw;e**d+ zwa4Fp{vTP>l2y0=VSEOEIPU3(_Z9=rJhYAIW2C-V8{|(c3J>kVfHc#LY0^lb8k3G_ z{(O}|5f`uPs3wPM`hMf~xaqn*hY?R${n>iOi0g&pg@a^yn`6xB#eywmQ-*^S5EN&@ zt_h#<#i*1)!KswJhOfcNPEhU6;X$@b7ytY_=!Z~96rwQED$o7P&6~-?VKXlUC{mi_ z3ZEvd40E})FoB@izLoE`jOoG|bVqu=n8g9w^o349Y5!olO{HvqTv7nXdJcNak*ahY z;$RH375Zi&H?_ zO5^adqw7}VO1Cb&GuBWD1=#O5JX4Kc$s!>{GwgdD+cr~`wOYZ3K>$|QBnE7la|AmYa-|v=#-`@lvDUAkU*&Vx|_kN`-BAvIJX#;64-J?fO-q z(Ey|{Rg0q26$>fu>(c8tN@y*r2`o-2ZaB6zne&d^#jfkburd_C{y^#M)xjQ1Lylti z2lof!w#)-Q|LUJKKeMoCosscN+q4tIrmFEC-dT( zcmQNjIcuFEXrBP-{Cl&6%lZl-Nzelo=Af>IKFHda;w|2Fw|Wbit}ACag`bl|Mz6;} z&AH+^Ys!gq=Ywk%+HaD`f}6WEq0$R|%_xL>GSH48^zf7x5ya2wm1VLQfeM=VTOia3 z;N!0Z*;1!*eo@5KPWX}51nZ4-B&(;2m7bkLf_3WAF69)C3Vx;RDYD8bRMc&!0TcKOPC^o)LLs(wbFD_~)G`imsluOMV{CJ{DgK5c`qu^8J$USouGkePfVi4Yq9Awz_QFwr!)! zwr!uXx@_CFUDaiG+3xb|J8x$0_u|ftnRq|;pA-AnJ`pR|%9WXml?BVelEz9e;1jec zz+y7HciZaS?)B_yD%Pn?I2t|RW?D+UCiUae)YQyEP?o z6GyB{<0h$Ampo1l4X2m&fH#rSa2sm(@o=myR#q1pTY&px#W~u4{S@vHd2x(Fg<)0?C0O6v^%a z3(4}x84KZ|X}kDEj*l_4{> ziA_v=Z84c_{q&tjN3Sy|V$omCG+DWGFOy0w6B5wh$i%v0k`!($g!&rZk9B3xbuk^S z65(>73rD-^?yYS$G#)6y*V=MX_`*7J3CxhSI|t`XS~Ch5bB`%X3sodb!%qC_4QdZS zWcOAeIf;srR=1-8HNL;nsz82+8)j_of~$3Jj|{Xdf2rD*EJuXAGg z9%~5ZnzcmY@;K6y9Ohrfxk;Q|*g#fD(~$lW2689Nm!i!4d~H6E!MkuP^8ms#=-J@f zaRdPx1^yblKJ`0odJq+z`6(bLkj_-FcFXz z%yiRPY@lNon>KGeG{T@kw6iPHa7?83&Pr`^wwpHQ_U3tG)swyc?94WBM@0q!Rz{`p zIjXOB|M+vBXxNe;MkRoR^T`N|@hpda+-}7)Hvo+Mb!opYkIa-pfq+(4|Gg*N+`I_MB8Z(ywU*P>TGGdevPW8yLvl_PHEJqZ3j8J|V)t5Wk zB$M<{wofPB1s499l@@DUNb=|hW(EMsqz|Eo6et@OKKdSAdt3L=tT?C?I1f2GMz+tNIuIotfRpB0?xRq7}Ps^;9PcXgqp`t0~+x$-VW zgS(DYL^YXa1K+5v7Q%OknFyHS7!mZ$MOw_oLRV+4UPB))mFJmviI-5!1QXlx(znuy z$|=eaNEr=YI#|H)J5qRNdvDVEfw=eOef|ySZ_I|0)}jqOmXlL6|S5tmvVd$XMmy4i)*Nc1wZk#m$={ z*tYP7qlggIM}Kac>11E@e>k=`i?~*tQFu2I*0kgFv~V=lqqdh@v^yG30;i{(m{P(D zrKWesi2Z55Qg7J~B~97bdWG+;KOJ4J`O0&3GX)7E>-q1R(4laZfAocuo`XGq_oc>_ zxOwG^QHl~p$>@M4WUp+de+ucZ+x#^E&(FZvrN<>KqJ+@h&^oCRAM5Lh;@tg`)qbYO zFIJoHD?9o%7Vb&k8IYc6N{fPI$zA58hS%fu{eoyAA7%f1@gUm#V? zz(EBLvRveKLxa|)SwuctkW~RW!o=s*;i=c4>BXC>6H2)F2z_1mU1fE;4DnKNunHU# z?qfGHY0MlMRxnkFqTr<~bX7~sOmkS$1Qo6rj28W_y?P|*&$M$^19(L4umwZVbAO@zi7ggx=R9XI zZQ`n<6F5J&Kt=`;S0%M8c<-;KiepXs7##4lIdWG*IBU}AQ>m?i2mn|}coWm?! zb;kTls>}xftf{#130_$f89J7fl<#YdVL4%;W{?fF=|}f?P5q|L;^{;Vyn1lHr-0Z? z!CJp&be#fMkAb6s-@4%vF-ndO83?&et!gh zznrWO{nhBlSY(i3_tRgoU_&`)qXw?%DC5|!g1?>cx`PdRATiNobzw8cm(Vq>c4O`L z!O6jie=~x{@&5$Ezai4!Mk#jY{~o3Orc3&-U;kvr{VzcHuM&9J|1yF76Y~BeMN+fo z9}g)f3dEC%UudTR{n|R5)U6mC65hhniW!HU@=CN16A~r!xAUK=x>EA=Zz6Zz_Cp-w zfQ@tfx>ZES@jVC5d*0a?3=-zPY5yzx4z5?P2Uo$V%&#Onh-)*6QWa{55W<;Iys1=) zCm?Lf7}9T&Bbfq?)ALM5zrR0SkLW*MAP4#bgwT*hjpzAXUvBr^*mKw^xFqmcfS($N z=j(;1arPpRa5|eiPnR#w79mY!m1vV)a4||f@F!J)W_yd-mU`6r;G1xOXK^WMyRf(xvO@LtrKJ!tc0yht^&N0AC)E%rw+4wbLHxK&)y*O)m+?C37FHOoVJj4a{yc*-|)XvGnu z-69P)SOiCW80(RHf>YVMr3*(n!~;6&+97`rZ{IUdHd>kLj#8!$Z17t+)NHug=VEwf zAM)4|;HZ$2F(I0=GZf3aJ{4ge@2%)8tnSAtDW{H4zW=ttvN@tSrqg@{VzS46X_nV^ z?Kz;^Fm<`9&P#_ZF>)#`vB#31aNkGZj#t#6ZSu-{* zepA>aH`QB<2|iN{5XF6brtDoU_Ojby^BKdx-dh21>R+v(R*m{T>FOdAtG%v6ozRSMst0{l#>kH^y*0s?}|E#8K z%v|X@cx!M`1LO&q(zrEGVhaB@4(jGoGdY@;>q~7bwCfgsdQClPmbC@ioaFjMvALOm zJ|!gRgX^)_;7>s7u(?e^W*qdzfM7ehUoXqv;^}Y_F@0Zu>VU+o+y#wo7ocyN?Dk%J z>+*i;^gjGJ)Q!&_g%q2tEGV`|@0*7HLd^0QN7^*G`rPksaYET=aea3cg3^GB%zKEj3ml9&bPQy*95cX`KYq;KqMli z@z>&s3KmG96RppwwA;%{8iaF<@H_FF4^yxM5p+@%)!;XsFn;1w4Jgl0LE3D?%sx%Q zYG8kmqa?F0r|grv{6B00tU~-iY%j5aI66ccV#jLD?zeJNWJ>tLgq=SJbe zK5PK-AK(XHq_N4lp;OETeRzaIT7Z3H$g*hyn$pc6aIpXY zzHKKEl|}kKRj>4&YWyY|@JeObVE0i0%db(Oig&Tfj_sW69Cfd^_jem*psLtnM7(~B z1Q8AcLcqz$8QSj--eyI}DwBR~xY4m@kugs^MNyOoX3BAWa*j^Rys&nN;^#x-pB!DIpcy9)A&C$dNoU{3t6T^k zJhyaX0Z|G9Z&}0!Xure&h5Hs{&|y$Q_d20=pW=b~s5!emyGgwc=`Jtn{tfE3+K6Liqo>wyFvs(e``@A|O$PR%#MoziR2W`-6)jQ~dc^3kX#N#H2=M3HB+rW2!aob39=$!4>@v%# zn&9S?J@RHN-}XUVCOP5o1P&Q@VpGXjZL&+R0Et2b2E5#DwO7LSm*Iif7z2X#uN^A> zzl|dtH?toyBV@&h@(FGIb%gSNs8x+G_Fhs%h=Z38( z-r3d1M=wSg<_|0I#Vd|z_vE&EH5^?joxXVQyR})fsyXon&QAVUA$eFc+W25wwP)Xr z$E)#I`3kZ_@D$O`kE$Zd2n^$PvYn(%VoP$k&u zC85dGne3r;sq`9~80;4>vvvj4ZACclEAV=!@DAz@bPGy2y#^C7mY&*I<@`%}?HhcZ z5+LkTu0G1@YVZh~zabZ1U~<8D3IMDb_$|!@jo?bkL;b!Rh@Sx+yPNBr-1wOf+)9>{ zJ6ix+w6qxVQFq_=``Sw3`3JY3d(Vw#=CA$OZ z8QBY-+*J+x(ikX&%}zWfehZFon;dEe9$7_Rd6!tRM$9KO1&7fqgfTXmYa0{V` zG`K@=^K1C*umrI{f5vas|50XwMHHh@*&xo2!zUM!>|h|9vJW2A;O%=7#>bdi#YsxW z$BaSeEraJ}(8Y)f=4Kk5n@|u+Q6BTV5nmWLTlc(jaOO#rPQM_X3hM-VpX4Hnyc9<8 zqoV{fud#xj{~n;?OtKVCT4OfFI7qh%pJX%;86+yfB8_YqnEFP8S6L*c90%Oy9QVOi z1+rKs8t^T%)b=JVfRRzRir2O4JLw!lB$)qC^Bai%|wwAyFA1&dNpCvNfUl6=fF$}UP1wCT=T(*y_uZew-D7YvN! z)S|Y3$o346oCBF$`M@s8o%JT;SL50|qVoO41hXPB8ja9w1U4fr6a0kUwcZhR_O509 zs2d#9FR;z%7`!g1-v@V(zTY+u+Gv8^0}#{sOK15V@)Hy-PLg5m{a;VXM|AGtaymA) zL`M`cPI*D)sD8YqEyQZAl8~5pF<2tFX8aCz{QjXOi#{!6Ia(v_V1l+4(^bGyn=C;% zPB7hrccyrWw&WWtJN+vvX~$co&e~+L=8aEvv~NupQ@)9N1RSZ z0{(IE6@Jbcb24U)V^*s47*1)o&r!O#{jEi&idky3hMwbau;yt@Q%O-s7K9VnnHZ|7 zvqLyIPc1^6>+v~0*8~uwdfYsFyK8!x1O!{qo!OYeM41?lrc-5#cF$f*hxlIBiNE|=_Kv~`p zD8Q^VIO{gb`CtQ*fY7@a&MV{7dc1s2rJQY^UB=LUpQ=ft3t^?e2cskqF7=H`v6_=I zzmq&7CvoAtyerG>BLQ9INzNhd3Xh|v{I$#dQ)m%|pqbWNDy^QRD~Zmc%E?781<4q&%oNr4QOHP3lOF02O=+Qr{BoUwTFcj(we2) zU;fa8^PXgsiF5dlt+?JJWb#%$<7BDtL?H1jOIf~1GUC=B)W^efIPx=ldn7cX{SAW( z8{}t_;os5L-x>l{xKu@?s`;wRJa#?SW7G0_-Q8mta?=Y2@iBH1GC`n3fik{U8+1x0rT3}rj!djbwl z#@*?}qE0Cocy`K4Y46Bz(mU0y2W=?%LEZ(ZrJ7jUX{cJ$XRUrLw(OIeGH`EAyypmr z7b>*?=@vOu*`dB zMZ5*hVoj?5rneIq6r`&N!3*sd26AvUE{d!xTss27-lJPgWv~tTpyiR71$BYao{u-{ zfftUCN|9CxiUBUF#RcS7nI9=g7Gl7@f@bO+LFs}J2jwR+QCxz}OcFie(QHh?cV7aW zZvc`!GmSX` zk#n$eXnZO){ZnxQ?rs=>E30?83za{r$b{Cde>;o(IZtC-+<(qq!YGS*fmP)BK zk&`Ha@eA;p;H?>ACsNXK+JefI1?|6_dOPuw9eGsah;YV-ib*=j%%36EW~Dh z9fThrX*O&HSS9)q$%w8eU$o{P;gCUpj|J z75ZnE?IUq)+BbBEOLkE5pMZ$-y`U_*K30Y_$Kka)80=*u6~_Y~jheme zZ?7KQ*#+_?c&<+Kh=;)YjZ|mTZC9OETj0}2R5C(4L6^`}EmUnNSp`PDo$7&ICn1?F zP6iVDm=Z$sp}q8`p zgk5Th!je2&Vn;$_RGf29p89oFwn-9&`=CNf(AHSHcNf=H=uu=ys9e^$H+3;(uiu$P z{)?II>wR|ZZhthIfFaTs!*41zjbZywSVr+(B0vYuCmwv?enPmr35KbvOQ$BHy5;>l?l-@^E>nX zY>%(^ef0Mq90FW3H?&r9=oOio;lx3Oi>T z@*#;bi>*bR2rQllo_|ti#Aw4KmLTkBYC?!q<@2FkJ>4~CsFFZpr z|HobHuO^t{&Y%TaDE0zr@0fy!5jGT|qH)^Mdt+cw~E?a31n zD#s%O4$M3wCX^3dRQTi?wjY%ARgp&dF zBDR-=pr}mkQucyBaY>Qe1|%3-_Yv)x+)q3QXnn6$z-O*6tEoY%uae1iQyQyZAXL%W zZk|XRevg1VfjF+^T|Yol)>8_qAH~G|)-ql8!R4A9z~*SJy8Q%&g359j1Qy+fLnkRa z)eejDj&&SGa(oWL=&IK?Hy6V#OUgVQB+&JBc9grqw`pX2YNLvj;9ydE2>Sc_4mUB9 zMJm4;k&um)yhv++fB=Q}H;Z1dKOzT~ToFloVvMMjT$KJ-AsZF3)C42d87kO}ffZ}t zpN}0RII&nCBnZRAn#~IZHI1^@F*9tef(MM}5*vx#SObiJ0EGyYwIWo5T%y> z*pb#?3BILiNMq+)a3)V(b+c#2ka_PfiEKI`ke{H z!L2A6Pm<4Ti4Dvwe`G@U=gUpG?!!qy{HP`m0+%cqyVGE-UybZZ93iz-!NgCH4cVWHv zkgF!feJ8aae?!*^7b=SxpTu~2ecG4bi)%cJht-VkFC!*%K%L#>@)Zt^#10Y=O!VnxjlEF=|u>>8C8#{8+?Z*f{`iVc@W#Q@338jQotH|+U=K^v-XcPc{sy`kU!~I=HAuFa|V)q zoa70RVn!EqG~ywZf>}2zbwzHI^18^!>HpKm&rqNf2AMlm^*=%t1!chzJ!*0onOPPQ zU?JWok|4{(?UNPesk59RItBLRYhiH<^9s-P;vuV!1mU~aAloo-t`I7JYepL5`l*;h zbB8A4NiUV2*He|s7q2Qion;Nln*KKEEMSBgVmw!YPum4OG6(774-YgtBUnY!KUBUo)+r8?Y$+n zaZmKJjgsv<6&6GaeJT_|JY&o!Prx31F6!B4KSjqFkTPgVis6jW6R-2t#vn6=+4Nx% z^-;C2$?dgwvbze4^@c@5{@A&|w}FY=xQjn`iSUg1^a4W`okyE3mVVq(q(?i6Pa_ug zb-~-|5a9FVMdh$Eef>=0j0E?1n!3(W^64FHNNZztuD0#OI}}u7Hh%$=4y`@yIFHLF@YjciDM zWC$1$9LwNb1fO1P&iiXlAWMc8;{~c}P7oF0!$Z6$nkr^Zd}Ib#S3&#z!O%rm9?7e? zyfJ2Z379BalO%l42f~58sT&G>d*4~yAe3q0)G*vqg~5p>ybTAbHT+3}KhDU*mMKhw z^(H7MlvMF*oVO;=2xoTz$c#<5k%N3Ut4Ny-aFhVa0{0aA&XbUzi@iOU#S$&%C8@Le zarroRvAoxKe}H&UYI;QY@Lnn(8iA0_Fugwn0TXRYBTMdOoIabrTwfz)PRwHwj4AXnoK< z*JAu{dqf5sVA3U#@}70UTFqVIArB_lbz_vt)|*zHYZn7t^(E!H$N})cn+8Hew3{2f z_sWg{nt;yYj4})TC&ji!WV8j)z$8*A6qd9-V7`Hy#nsz1I2~u1)G55gshNs0v3zTEvW_jJ`zyCRhhS18zcGh>j(J7ORte+LC z;0`wGQp#3AU(xB5x-m|E0Iguk7&FqsKNnRZ`K{A$zNaGRhkIR(awgkRU5SReLV7Rk z+s}O2eC}cSQw$6QClLEj%ZVU-e{P#3^x0rGDjT}??5zOLsIp+HR8=U-$4Ii_Tc0uC zo^3BaQFF-oxN|uJ{cDYqE)K4^dZH`9Om7r2Uiw;XqbPEh46{LM^en%v^tjQwD$f)M zuS=RY#UXYdq_i4GidIzRt)d4Bup*508I;E`7=NrD6@&$qCBntg}fGiSlXG@n;#2}pBu8}Q!zJ1lOFhUs_ z1cVRC-f!_nlxIIm3)QfwS&{JektepgdPiSF&Zd>3L1w!^zWneF`oIyXQDvva?nLR6agTR1DP)DQjtl;13!?`&33vu%uH zRNy(D@M-hxgi2YJf?VR=3Wpa-qrFuly~Zq)*S@>Krbp>$TQ$DgU^UY&f}I8zLf(o! z!UJE<;WTut*r;&>8?b}6?H%`83BS^F)jI3&JH$nrpkjNPZMKo}SZhuSDy}#*q0jhE z*pQKL9UAE{qZL(6B|8(wvMTH6PTX;4S?A28SJX8Y zyg~ESFX5lhCnVgZ6XJ6x+TE#uesCwZ3w@x6mkITWSs8GGghgt=4uN4DB+4ZZq5y9* z$_hG{vYb0ODS*b_2vi=0t^|mRK;v6`il*$K(|9wQ#np;<1e2}X251Bq;9m35s=ev2 zS@dkG^Smu>77&9HxnGn-LJ8Ols4pWDb(^R{-hUy*)CjfO1~t*sK!WTF0C-9Gh09#3 zQ6%>$$IsC0R6JV^Q`@~#`he8=cftfLwV(C6zyYuHl8C*D!vSYGRDpH(yOGSlJ zu7SEl@@)nCv%oRf+_&Y7Fzpedq@Z~_zw4%NVq9%;D%|2Q9BO{vtN*Y@0#(#*vWo^i zM2+1y9B7lEX6t9Ay=C43iE2V&Ss^a8ZV`=jYSv4ul;hfHgZC(ht`i!x$8d&|GAsJF zr(ep>_sWroa`WEl+Oz2aAVskr#R*Hcgji-&eZi$DYQJjDNv?w*_S$%qzasIvrJO=XR-%csO#5 zr$M{OF1UoStVF*DFBA0V*-HG`Oduc`&(_fieRDWvS_UBn74-_-_5-sKoK(UY5(;I4 zPrsBgmuQMy-%)j!bsPF}3$9N6XUefneb$@kkM!?l+gtNyk0l0rnC(o3o0M>cqZ2y} zo!9V3K@}Z`7H{i4c5*~6Dmb_v79PRiC144ym&Q3Qlqj^H?dJ48y_(5LY(yZOmG=4x z*9nZVfH|81r+Z$zee9aDQUc;SR&?j?$;&wqH+R?GO9RX=$a{jx&HqVj{EbQYFNF;& z6VrcZw{!eOK=bccdH+w+(EnqK{?9{%IR3Ic{KvlU?*z%ev9mR6$;5Anqd+vYzMywp za^kzben0^R*Ka@&>bB*01)Z=A`x7`xhEb@Jl1J~aTVK`Wq?0MQXnnBKtzkCc1JA0S=hnPBgItw>w*I^V-UNCcfa~R&Yz9DFFNXF`6RDKm`eXFz< zk0hdvyi9z(XD5o=kN2Jdjmi=3ewBCggLr0cX zpidy~$=`(+N-x-pE&iTJS&AuR8PU9lFeia@r640mnf7v4E3);l(Qie@CgZXdlkK$-N-%|;zG#7G`%D2wVbh;cYZnTs&1Bdc{m zP#cRY6>Vo~pwjGT_!M%5=}*_4n)ptwmjRi@lY)GlvtohPWL4C`-^S39RE2;J>{mrX zVI&Gozf<2SM0qSc1*di2wpi=^81#dx#t__z2BBqVNlplmI#I=_AfKuIK#S)@4KP99-4S>Mti7S*lt~d587} zy**N?&Y>M&c*&5?Xrt0Ei6-Tooi@axHQQpPG!ZqE&s_usqKBN~_6EMvb}Xq!cai9P zkuw!r1a2E@DHHb4Qt;_zBl!p~3y?BJ#Bt7k>Y_q5%!a%J6BrJb-|)z=_T*=}&_u0Z z>~AeWoCSHJ5v-kciN1;l-fMpvAn8dPvsPL_3Fa^pPksZ6?{gsw~g`md=2ssKM=CVK~O%Xkz zwN)7&6B@uU-&z?2;DO3T-TJg$b+pJpRi;dqwbj1$c**hyD5lUe+f*pF;CTUtzDG`A zp*}VlvVK04Jk`fu0y~6hJ1gTr?1vXSUYt80Chc%Jk{!Mo!FNzh=l9DqEZLr7Z zGqcs}RuW&Hkb~N5HhAyvuKzl?tUf?fTLi5it zSpqtmJN>gJUFCh=1?bH!4J>0ka*5hZfI<2#2Y9bN4bUUGBDg}{u9b3^Dx385Gmr?O z-63>x92qP18g><)Kr_6Iw&Q8RNCKG?4dy-8X&zU0p3`-%-K7IBAdl85d?ibwp{JKG z9^?_wZJxL)i&3RrUi2IMN#-vw+oCug$37 z!d^&kU2`_JSTdDN65@{0OEu%UpMv@&X7W|h%hzTJ{HfYQN+eNuvmy7C+Bnwdrk3X7 zz8Xw$A9G9@B-s3ngzplZO3|E!ae(!rZu{Mq>CoBHMQ0aBt{^89BQdR3;2UJD6luv# zV)FVNic5xgACJERd=;9sKpIdVRl3mBNoDC84$xl7Lwxl8oMdnhj(#fGvlmMn>)%!)GlA-h#$wE--*g^1F^9@2(tLm1&4`;_9=pgslivz48U}@iww@)1 z_LLXFfmq}Vo5#Afv2!X#24yt%^KC!}h=@-{Tz1`_VV`14+? zM})fr6DHhyGYjw;7d3g{RUX+XfbleyzY{BgasMH z&Ix9NQ2bsvj>O^h;(NNf;c`jrU?upfC?L)bAqF~-kON)eEg^(=sGecYy{hHWS>>{| zlGWNF`h_bBcGo@M!`uLseQjy&T3Q8A?AlIpCGdX`lDWwoBo_Un0Bh?7c|Is zZ+nL_>bFWgTx5LZ(6kQtTNoAA7B_L)IDOK+g>fBd*&F^a;rwV|h9KVl7i zNRiE1GISN_9oL7+Gj~I~tT?YY4oOeWzM6X(t6hVf5B-5#|=})VISzcDTY^vb2M64D_ShF{xs-!;P(GP&{dMQ=U5v7msiP ziqpMj<8|!UwL}-vMmqN5wM3&G-D6g&e5S~|?J9TicB~FXKD}*GphI%3%Zo>83VwSz zUu!ols3F9}Hmy`W^LFqjw)iP?9nAKZ+f5pmw zb@{$p^>wykGcFB)+E`+EsB`+v{A?XMWd#qF_o zs>R*3-m{4UOnPWw{7;x@4)OR2(VIGjE=jqv>rFD>UW7G;|_?0O{BG6Ah)mD>QQF-SM4xQr_`x180hA>`|5X_xA(GiqG zE+Okjhh{xB8Z5bdqqN_kfW0W@5H^4E!|aiEy%^?_0B|+-UPl5!yQ#iyoNl{ep@;&0 z%c@N2S?>0Lbf+&so!xD;_u(+roR;ac?u&G!;r!9AHMX^JLZ5Ez0mA&MR+yDiDqmJ-3~AbG_%hHx8#NGI$8LF&8;+v)31l z&F;*gF8|KZVcvO7)MPflzN`?NSkf(i+Ws8G>0Z{L`bs#;B*kK3Ob*&QX|l0qrpSUH zllx;PgD~py^oQcmf$X>P?PoY~Svw}?6TImm!5769BvhBg+!!@Sc{C13qpC&1p|s!p z*mruWdVUAs9qx(=T4D+nZtC?(XP?P2wdgE`(Dm0mXVE_wN#VqERg=_gGhAQR5p~AW z1iB4Im!(gE;ZfLKii|pSwzM@UVtMfFYhe06HaY9a%QL-c>nOLjOpXIZ@|BHA=+6gbNHt>34WGMU*AEHUp!Q8 zr=(JYdq>s_N~^i|bV}i@82fIShWbK2RH)(Qqu<^HmM5rRxF#fxEEO}BCg-U(ep*a^ zxNLc^%(Eblly2tiT@IdZ&D=hX7tY~yu&cjo1tM6g-;hW0a4pCRxtK*g0lq?x5n6U! zGZ6cES?kz7Y{IThDP6(C4!O4o(#3Us)S{&wSnQ}znQ({IMy z&VzXBTyp4Tl*9CYJvu5jg)MT=@U1h@5|+A^uqr|05qy zin`2y<)rnTYcOKKtkO3h^|V`|<;mGLg_p=xf$*ION7H0gi%yW5lG45J@VpgBs@N%> z2wJ%1?D(*BLJuez`+at9%i&YRBeyi%Xk8Z&q$X7=h>Bs6%!J0IWlQfMxxEfNF|s2JbsSl>IWecrY4}EsgB7Hp}aC3cJsDa=eCZnh?!=> zj6jn5xDBppmP;p|LP3uC;asLQPdFJvDW=MVA}UwEVPDNvEICiQ)LC2k#=VgNDvm@( zi`A6!D1(&GNm*ODpb?}(-hDG}76o=ldUD#)>;;5^n!hinx5fzO(hjpwVB>15hZIO! zoWE*g&1XniF!`t|o$FU0ON`tMmPWgHTq>RgH0y3;@gW@ODJi)iH&D2isf?FZHqfnLx(k_B-!5RTDf)Cj zVF@kcX}{eeMid6m*)SctG}$sR#thADMu^SVnl*{vYq9IM4_Zf62}%F8oLlX2Ee@y- z^kvDBtx`d5SGp5+l$XXgZHioI;A-#(g)q1t|E1{;`X{p)d2*;G84Hfo>&iQ5tjqL5 zzyPnWlqJ@qNn+eWT%U-qf}vzW=^1z+^Z+$HI3HJsUp<)-6*6i;?ypWqxgCp9DM(ER zRa+lXqRxoeZ96m1X8sG8H8bFl3^}!jg!5~Nyl9lbg1IdJ%?1|R8+LwVm5=V4QE~7% zSQJcFdPm*Fwj%n96)y2=*Ou5uIv_yv+LrpLCvYS?;OK1gQWpG;VQPpsrNS?-m%Pe*wJ$e{`{@tj0jYaDMSGWXhaiW(9{zjb`axjc({U2U8fTTZ zEDLc%ZRpKhiLWorN&OwK;UkZ$buuENO;fIJcUSlnh2Zpl*HezCHgB^IlN~bgPCfg? zr2~5OLoBaZ^32T9QA0o8`^Sk}*F(+v4hP!n+KMimH@Xv$rSdHKJS2JaQ*VRdHzqK- zYS$ia0h)=%Rq;^lZrX7&XCZT;H>?dSI>wH(Fc=XAEq7l9``49pNx(j>FITt-!ev9l zDnZL=sA!)o^JjBZWO;g9)SyzWG0R{ym@gzwOz5=$Vc6UAtTO%^%<3=VB+f z&R4OH?Jb&vo9Nn(`SdtNvL3q4dx&u%#nOTuhKGIWRxob*HjuNPq9#nDn_j!)x^Sl8 z0VY0$q!fOh=hu2P>?Bx%=%azI{Rl%1$LG9DcMQKgzx*fodKuT!zo@(a^kFdnC4YwV zFI4LPXWjivFZ<8B`yZJvw$kMO_$QIVu0PQyjEo=wmI(!t;}$SBi?m)^tgf3`3{i5U zx?_nl^J|yAJIG?=PL!DRyMBaYLSr7R1hZWtiogT=9gqA`40Nb=YtD{l53} z{i6S;0(DkKXq+sG(wY1eA|B{_SN&rx>ALC{eBL2h^@1i=itzT*O zox+Mrq`VM!Qt81wR36Vx6}$RX4F|*wl{6;aOLu3U@1pe~jGDY#M%1W2{Bw7ok{^xA znQqBBv;DJ!aXx>D(yq(gA2%q3@W+sx$Sg5Us?8-aBg)^;Z!0vfT8URIL5*yrP4%33)OgF6T%Z=9QGeIR8Je@OtJKx5PW*C9lcL{-aj__*7u4BLYZLZmkHdYS{k2mqk)o1lixf% z1{Cn44gF;)m%ax60c(D6vqZ(6yIi?ETUeNANU2s$-TfU$`Hj)fzxYFKy4;bo@E~?> zGS(gfyD+_x{LBu~4V5+w_#WT_t0jEy%bo0%Rxw;=*HRkw`7DSNJ@3#!)l%>y*_gwV z7N4Tig+i4}sk{b#n2ESZEkim;eaQ9)^cdLM4PI-a>i;3_9lQkXmn7k`ZQHi3F59-c zY}>YN+f`k*ZQJa!zP@*M-g)=T-EZ!m{S%(&{7z<5mvD+!Un(*xCen(7zU>b)_s|~Sbu#vzxuulL^lG`eRIa)8QZKStp3zTYHFuBx5e_wt+AukWR>r}`uJkH#T7KrK8o;8rdDd7tkz>@o2V_FOLF#hM#F%ouLhIB zUQ)utwkV4kDDEOo;~_#{i41}HxP71UNB`xD)q(Afp^wUQA-i+Y!gpED~l zQ!WQK>zbwoqOjig0D3siKZ*tmh<6C*8)tPy3J)L67Xd$^StWhq#Av%5HF7=Ux_zQ` zkv3;$DOk`z$ywIVUV_9h`Sa&u2D{7W;Laadpok++*RWV!mxveDrbJ?E>j4H~@24Wp zD-+VeziI-p$Qtq9u7G;M6%sh!YG*;nZ4^@%e796$m$@l*EpgAIAwQ$14~%l?yF)ee zvL_yorVZZ(9T8;`@!hVw@y0&!MlLuLIx{_U!E(XAfe~^fkp4w+`A@+sCoAh;H(nfn zn^FG{wdG%3b8-F+3jSw7;rzEWtkudgj_VBn7;QP)gAfpwTb+03F}W6`)qS7Xu8r3<|oX3&>Lj5TP*TGmHTRQm=E8%RD9J@pd+Sx*pt z`#igYs`i&rj2&DVwHq8{9z~mqlBi1Fs6^D<1{_{Ao@~H?^Sn)w%8>{bvEGCPuo)~> zZRf`tfW{*$lTVexL2=+gTqY2dqrKudHy37cg@Z$R=7a`8Hmluw9_5*5#HnCBUUQH> zVz-kCgMeM_=+McsIx%*gcv`*%lvuEnYs=Jxs&?WT1@;6 z#!w9A^pLzv<4^usB-^}%wu&x;d-U+(T(aVIwK zo7HfxN5sEhWOukpujHN^cvl}<55MpnriXlM?$?^+#Fh&ci3f%X<1=%|D=fWY82{LB zR1*D?x=!d>#PU)7@2~%#uk#-x4cp(=qMU!5NB(bK|KA$&U$6f^#NYn|vGeO6w~V8x zbS<_%XL_>-bO_PMJ{l;X303G9p`u+4kp-tu{wd~vCK*c!s+ccvU)vcNvuSyvL^p*z zNCfV}y~%d36YiaS3Ipi#@8R6c&m~*69$IyEDSoy;M~m;3OBolS|46+-+5L>hp1(zZ^wD*>cslC-{Kk zE;0+L(ptMyM{g&jS_tW9aMT3;w%*Q`xB3q33N?coLdj`V`?`hUkv<(M6;3f^v+_`( zkNF3d(jX*qs_watl2zrKh02nS-lfa!Pp98B3{rM6OoeDtb+Q)Y{R_U&TCn*c4aPQ( zFs|YSpfW!*3*aJS5!DFo(;r)Y7 zp;BA;pFj8Bmnx{?>FMdejI6_&$b$X-3R$ySNspdRU90gjLRGMDdi8`t(v}AE9f^Hk z(|e>K%ZuRpfpaEq`?@_mt^=u)AYPE4S4`TY(HvRY@D2OI<)e!8c+nq~!X=u<-o7|# zn1or>&K7Og={AQj5fjKa2+~c0(&N|mM{c_S*k2B%MeinM8fgoQCrP9#J+!PN_zFb0 z#F^!CfAOSV=`#?o6FaH%C0*HAYAp@@W+qisVR0UeafAq0aw(04)1Z5n$seprJj$IF zwd3-?fP`c$I$Bq4jEVrGj&Y(>#epJ&RmQGJ?d)#X5faNy-JkbrFP>N8AA%PksVYA$ zmH=t3#+Pc=@|qKMWodEHb6<__7GY^u5DlCpXEwNoV}CZ4tUj7(p?hOqBtvC)QNo3` zP_hAXE57oDjb0=4h?|X`Yik2pQu^!r5sAf5IbS#!BYA-^0_`=@f8hdK)5xSIBSN2O zZ5-H$qk>B^(lI-;au9l{{V1VZ$3!-r>!t=M-@qWq4lk@IoM7whq9ZilI4JSJpaJ1f zjLuEzbXaJW(Xl29ga{Rv^}7uDjrFTe#2k8C&;zwerTkSWA^+tS2TUMDy%sIS0v!`W z2rCeVu?~!<$njjZ+(N*E2m6IZG{N1pb8WxTz(`eu7w1v%yS1Q2s!)%6|K66D`Tz$= z9^8gPfo}D5*>FkG`YPp!7AnIt_p9mnk7e6J4+f2|&2J8pK&`mad7>u6Tg(CJ956$F zz5<$(!xh^TLwF>t{oRIV6WmLb*+7_x(#H)a&MNHSi@O2|an=t@r97X{82#rI3r1D8 zGCfy~H9yR_4lH37S0R`F4ZAO2P84Q| zfYwWf)nA1qa)-<(+!IJ~p^2TPmMQIhkb(8y%+x;&_JM0J)3QUEsZAa?^9eXL#2z#A zRkN7OG$wq6zc}^IhuK;Ak~(_6or`tR-9WY7(pj=`20+nKU-b#W6G=iP!oi5Ip2 zWFLvG6CuV;0KZ>kfEMjKPwh8s=DFK(TjGUR(?5WxFoj(5Dj7G%-@GZI)EUVzp8^{d ztmYvNh4^yck?jKwe;ccAHF=8fQ!XPkt?+n;u%jz9QxRcof7)RU>beQ*m;ON*w1Oe* zfO^+*jUXj?ZhN*NBh)hrvux2F0?&h^%uR_e0jKv)aO2yD%U;qqAyLj{K77T;u~-Z( zU-cN7=oLK&)==GOjc_M>->;x!acdIh)4FL@J$Zr#JSUiKjXXdDANlLaS^*Ex+dkjg zCHArXn{cVITuW{&g|8+GDMVsKgLYMl?V)DBIM&^GtPuBgGY`NU8E=SY{CmN9ik-dq zDd<=qU%5wkG9{nS*PNQ1aR5^Ewq0Zb@&?!=RgfIkZ&99U4)xV#*m=<{3a3%hbmXM^ zu;`gg?(2G!54Q=)fRM!QmIg*DI9(L*D>tLNF?7WFUSRd7y6&45X2NQtJr+7%#^0Sz zQE+~2pH}Cdp>8urZ%)c@EDlgOdH1{w`IZ_6oEG}@wm|>z$GGZ$A!_;hnffQBwK6jo z-P@CmnN+qGw$nj0#3{ugY|>>a|OW@ z=aV*=$aQ_j$l&+MtZukJq$fq&SS!#h44~_1oY@Xk(^1P>USW^+CpvdDm(;&NRDZ3_ znEpl*bN-EL_&-3ZznMn-Z{o85*TXu_zs)lL3zo4n{9DF|)#`s7)Wr}$-^yxdwU7nY zuRr%wi6oAGhYTu!{2mezRG`*^6{SK^AwBgy^yJ>erc9L7%6kgTTDqQ|OlLMT4Ma@e ze`5DKejghd8=r&mL^LtCEyPs81gb=fd}ux|pT!1w~CA@}$Cb-5hGC=!qE zHzOg~1eBkvo$Jy$v?)@p;&BGUK|`%J(dNb+k=VXocgLZ6z8()9pI|T({ss(Gbplag z(2bif$Uw3TA|Nj0$60nHQEAidLYmyr)uC6qWQfb^BH$P6oMDJ6_SFtjA_T!Ezi$|+ z*@tSpFdl4cDEbrb&$9eg!o#`iCo`;7us3r6LLp7|D!N)UjAEzJ0WZdEmgy|)f|O8G zx+$w3KnvnX-V)424cNDlWlO;n=+dls4G;?1?(D93UOwg3F8Z%Wcvj-X;-j+htu2J% zqFG32zSrm=Nz(J|$2@`{<|781brxzc2T{Y(*O_W%O^kk`SNVM);I#thT*Cz>9iIv4 zc;1!^6cA6=IB8L4$sK2mgux^e33*n@I$tlJ;0UK74B({o@>(qoi$y3Bns7AUqw@wM zQAjZqe}hU^i`|>Dgc}^HtQmLC`}aX6q?HRYNJHbH^{Ly${>ZhcA#5zK>fpc>j$(|b zvAUcLh6vGsy6gIhw?!o!QBD}ZTi9!l4JD*6w6I)trivWjsB{ZAYXdF*JbP_3!g53& zbm$0E3@JMIUJ<+;NE|mz(vgJDRv9@%r`d*ETF2J%h-PUK2-L$84YAcijl?LZ+=MWm z0VHgsy{v@IoCD`G{sf-Og8(%fKG;`X+G?si+~i#&tH4tfrhDZ&a?qz+DK7{}E=Es> zdx{Gln`5_=tf@y%&=;h{DF$JMMCcdFZe%0SPhp8_GEITR!qNEa*|oI@iE2Og@&^hB zXff`m<_`b&&p*-7R>`T4w%3+AcH8Ajm=Hwe#=x>q>W=wEamL=!vPsN*;;?&^tS1z8 zxa}26^^nDVEa7#ySE#FD77`bR2laiw{%mKl1e<8Tg=bx}RsBAg6Ad@7$7N1QQuU18 zZQx~Eo_;4{VD=Hyt~jUo{*n96*82mkZp?dwehI!Ocd3Q)gT4V28aka!s$hchvT~vN zsCZ*MT4JNT8a|g~z@k4d9V@S{-8I!zDghUtJ;k;Bj9lc*@N%=W?h7-k15ab6mPDxy)DaXDFVw-__qou6mJ2K2Bx5SPTSFm-Dw4>9|0kDr26wyXSOsx|Xi zV_}6!h8CWS(S`vWGc_ENK2Fe|pc-Q-ptl)fT}}>|pUYSMgB2@lQ+{$=M^A0CUGa)x=etbM#J5#x5-^hNkoL<+oV8V!6TcFR*(Q3AkXI1iHa8 zmPzGuh3s*STZ9lV$M7Y;c=XlJNJ}FiGVbNvtd6z%5$hWa03uD{J(tc}p_>E}ds8dz z=Qem<37{NO&A^D}8{{+3t9_Sx?JoCbH~wqdx@iFLV`VT~J=C>52B|{xf|dDnke@O^C6~` z-lnW|qCawe>1}Rdc_DM<1F5>`c|n%l@=@KY1J;Osz+z{g?aCztIifihAx)GS=wTd> zKC=^mPF6coaMsjLH+pJ0T|d-{a#3~1acb4(D|y;NbX6aa@`p<4rzktY&{=b}xmf65 zKZCJnjPMDFdVH#aL#rq(5eI&$vtwi*WHNB~JEs1z!-``rKs>PUc-?UX!<6DQ67e?h z3z@)NkPn$BkA5|L8=A?Kx3y?!a&Gr@o9rs^dlG<;ZT*E)p0*Q!qmU@FURr_*8y{iK z(&H-X;&Dsw?8e@=_>nAr{eg7W7ZuW3Gb)D^982B&F$ zhQIM{|8sZ!|JSFmGyIMH_^V(3TiaNZC`Pz`1{hJ-+QzWC#Fe?1B)t&y46U{~J1CXZUNC!t$4$GP4T~i`c{;egI9t!e0_fI>Xn+v~^(uLhR_5_7tMVkmip{vcx!-=_Zljw>(Ou>- zfFLucI+{&qxyJ$MB%INI>|CPdqUWamF?8&ivUwfwsPD*g8KY3Im~!y`b^8y)s=PHt zL}0L^&Y`u~jV|nougABU;Jw~*RW}N7jj4*;uXCknq1UD=GqyZ8W z9Azj@*E;{XfHQ)(*Oi?{gRWX!I7NNG2+*YxYu&9&&r(FJHWtBpYW9t;@(`V{IB4wJ zUp6|HWnfg&JbLcp_w|<8X^RoNyhIiB-Xcg<@@(t&{(&V_IpgmLMI|iTY&O*RB!Ch@ zeD>J~AnYI<^-_}rVaSN$UfiN}Q`r)hevG*JZB$Zb5s>n1ZyYHD>S(f7ed2iVty9>! zh7qoK#~2I1l6m-9fwvl8$0(S$i0uedpNg#S+~D8^WTGg(Je?Gg)_h#ipoApwSdfR> zK-@nx_ha{CvwwOGXYIy%dwH*O2hQLKPGaom=Ui;PM?U)!jO0SC;(Mo$wH_V6cWiJq zKt=v;CK`(Rz;f_mGrrHguDygaOkVW`+ak&`t*87w3Iw?$ zYtkML8)ps_Q&-HC%DMQ~#%#{4vylo6+S%r-htN3#Qa-NH2qTw@ZW$vuH5X&^=mDB* zP#TGT{X%v|8yGj)hDi+x@1RO&*n9dWN= zzn&^N`}?uf5+?$P2euM3_a4-!pRB!c=7IDVE|2JB+uqz#=f$kG=(+zIvcwQf82ZXf z353Mb@OWYj{tn9$CN%8%D=2v70OynMV_Bxo*IAlku`NMRB#Q$)6sZyn`0L8DXO+5$ zXU%H*jpebY&k~rSRD8(3p3Qta!l|(Bl7Fktj!oRM!LimXQ#-5GhPMt$OE@y1Avpt^ zb3kIZwWclh3R2eix!`diWW_?1utDtBye(4zk-3HKSSFFQ4;Og&_0I2C8whM@;SLh| zkyX%O$viN0W`Eg;^5jy`{IWL(=9bT2%)xCI*x5Q)p*||DnO(ZUG71Kd70SLo1ArFJ z`$HaDZ*}${8q-PzZ((t)<;_5H!Sqe&*jI1Qt<^FjmYRx0KsnEh8a&fQ8!2ZTjB@R!rjTSw}jOWz&xO7caGPn6S z!0gQu3!|lE!VScjI!JZmF>LZdNhQg5cAR7+v?BlrmTEXxY%p5ef=8bVQ<;_#g_m%%`V*IPY{jF{@{;fs+XWeG}w^mbEni{s7Vo17fJHM%q zX(9FP-}rzo181TUAQfmhhYcGcPBA6-JxoU@?PxAy51&ikD#$`{)-tEMX<^inVz0S+ z-YPPR@|gF(hH@hx$7;!YrptO#d}x*%Pgcku*rlf^Xp59RT)Z8Tbn}>{pr%YUA)XIB zyzg0)FEcNEJ5R1oUjzE_orXE7QD{~?FNR!a=xX(T+1pBLh!dgk`2GqyGT)BkNU2SU^)~+iTy_GT2NY)lQA&(scm{7e*)tUb(_HMk~|SILfcFa#|sm3P)C0b z1|sSz5n`7Oa9;(~b#rd7ICPPNz(~`rD3mh71sU zr3s2U@=~N`U5GEnrj6USlLjwr%d$Sc)UWE`9yRAkBAZDWCMR5>0F;1*B9~v0EsIFj z8nxM8N5lMdy$>jX#hujLP0S{-n7(Sxb8acd2U{xKwq(a7%NA?aknAmUlqnB5bw^|s z2Cx#;^qzP@5VPj7Y&I02!||?pv@oeOYt?IF;F9Sm>b_B?>@ZVse9jVhK=PXC=oWL8 zRKsn6%DW9_&yi+3;J@#~f-ZV^eVtJgw=rNoGAY85SBt_l*a^)Ee?*A@(^l40sR^Rh zK%2^6T*NKtd-|m}G5N_gpJJu*>v}-(8RM*UguCT8v>f>?4bdEe;YLabQVzeJ=%yad zt$eT9RFda@v4XFKoW)^i=lt1*`^kGA6=F z^-_XjV+y1xq2au4cyDcG*8n)GDa}?9gwN)gW$LKasLu6KjY#xs=^%u>028!DmKZ`c z7FW9HG{eO8YLAHr*jA)9NvUNey zRUkH!?s$NAh0IwBDuIDS0MV#sL5q0wK`%fuT+-BTsYa8-GkgpXJ@RiA*wv;j(1sgC zSX6R(Wd#xF6a)Bvy{KrD8U2YO^K<68^J??Q!pHg5%+4SbSpV19Cm5If4u!ycfGMRs^Z)2O|%q-R%DA(mbXHnBm5 zU5&Kx%#z4ykeCD*%%323@KOxtH{0)M4>(vn}5aDeb zn8t#R95lGypzNsp{3VOhLywQF0Nz7~q6GU5iU$m9XfqMi0)9DmTY`0o;e<@Q74jFd}sM@jJ(#OzuFi z0oNhK6mm-AmO0zIKTTXbnECc(NZLZy2`E&aZVx;H#rtG+lmPT4d zbQ38Qq+>YNhYnXk64o{?S+i1w7gs{0$-WAF6jTsp5@3(7%&<7VdXpS1W`Eot=m@XU zIE;ExCr@fUoTWo};ypiAT~)baxnzPqnvmVS9=R4KAorWF0@#BK*}EpmuJbb>I{Qs$ zbX6xltnbPlTb}|`_LB+9uX$4J_3Z7v?w2a_C^IPPxHUYN0DOVj?AY7LX;G9wfes?C zjNDa5=JmEGJeM<_jBM#*#UFx7oB(qNj-Zc&j}H)Xmro2Kj|YP!1mYd8BL@bFZ{Vm* zY)m2!WA6cu*$D&**hw_*_G2G_1nf86A7w%mDo^+lI3xisGQnQ&2?7ZKdJhbVAC!hN zG|xALIK#?;HyB9>YhU#<1|JD-re7!3g?cux5vlMQ6&kRs@6}_^wn}x zO!4gT`XFPNjTiJAx}FFNAb}83>RFm%)|C6@lWON|V7U5m(K>Z=&XFh{T6D-kwL}5L=#CYjgt;q zsW-%yP$PFt<*qR=N6n-s^uVs{HX(-ik?mv4wN@L}3;k@_J!j-uXxUeEfH0%dMR~7l zV7YG+q2j|WB$_E&O;xTaOGg?MipHM-KOperUu z5Z&0GrEt-V3@m*tV5D%%NnAKp{^)1%eOP1Gp|&_M>Nu)03PD0b>Vb$?vrB;?hMkd# z%H}PQzrV(I*%efC%rH*HGY1eh-8yMk?Abt&Do3&~R*KZUYJ50+pN=Pm>#?U0lEG^t zJ3WvkS1A{3g^(9wPp|2S4*kl!LNp`-$}lSt>P!OR?gd}Vbr0+??PAAx@M_SGd{Wy$ zX8NL(g0+=h;XCP+=~gtf4yQ027nGsO5{^R)Q(JUSu2H|zp!lG+nbYRI*9ZOXap%dv zY%mwdBw}XCGE3W1Q_&$bErPw(YR_x>QLYcx7E^c!gY&IK^CE>~NlZTO5~nn&_>_$}69liz^LpnN!O7}{gx$~05xHQK(;P%O)1r!; zmA(2;k<;320ZJ=6q?Ja=dtkIF6_PA-4@-JDau+|_@hust3dqbK@M{ky_6CZHb2a#T zBV;Oq5h)51j(f{n`L{2n1%v@C;{5<9Mg%PQy&;Z4I@HK(H^Z|!q(+tHTYWwi>IAi) zRwTiBzjDu(0)G(0Eb1%I>Ws4tO&7`=+V^NOqRmSw=)oJuq$o;lXXHBL(KMsNE1gB$h_c-1sqKm-00Iy#7F_xu0~{v_ zPEkl`t0i}gU1T(gz|PK3E6%3TpT4ITP=e13wM6>mkgf%bhKvNjd;Qn135ze zryUc`n(O!Pz0&WEG(gWr$(o_ZnQ~_9h{>9!ayt%Hag5Tj#_I$g1nRoL&R`)0%}FE* zX+tq4>s-58Wa-p|;+doZ^mC2Z_}l3v=yaRC6|R9Q4Bj62jf^A#*t|8eu4T^{M&Dn2 zvTKkA-Cx>gsT`5v@ygIz`!i#)jMZqAK3FBbDiQRbQN&PX2I;b8))q`e^*;pDIl+Pv zF&oU;3DMsJ&^!}UIo`Esd)e(6zrd0v@h7wo)b4R4X{deMjXYPDGS2mZQ0CoM0zyTP z0A?10E_~L~w!}k823i`w!8@Ts5MC(dnI!Um)q$mJTG4vNRyfYEE*-N}OWg|8SADO7 zVuW#jBK}YyY*b=Eo0fYD&mQNgFJ~tt{bYwplbXd8wEOX+A^?-e=7STrA7%y4n>UQ0 zZtqLEW<$k+WD0*ydOQRNdpWLfxGl8D&vi~HB}_ZP@VL<{iw#K3X0481>PNnEEPVL~ z1!QdY4UpkWdHiYqPjdy3IoY(F8Ng|x2%+DU5k>)ve4z#rK`>*#?Af3VkYR(#R^?gP zb&|lxb-q%JSE~5L77&7&AH#_Uw>9+W(F-Ty5A=VHgan>$QI=uYzTabe=`Omp7wc4qQr zFC>4s+4P;E*XxaKOl|DR>f(aFkoJ)+pMrskC=pok$R!e*f#x&@$Q~F;5)>8A!_o8& zyTV4?6`6hVXus*G`E=p4eZEn9EO?O*ox_KaxTjdnp7is1$gSzg{lUhz`l0Md(Q^Aj z$wK~BRk{M=?Q`?~{ytgaMsx?xrGBTB)sWY!BPVsE${5s%mWS8H`Kq7xl2zu|Uss(+g zmrs>P@AD#HO^DG@|HjhsZffJ%Cb~k1p?_eVf0$HP+`vR#vz=50V>$^|>PwJA1sN-) z+t>H?`aIW02ZKX?q_pRKAGprACZhd{bKY!zHP0SQRM4EZI2-S!*7le#V@2Kju+zcL;}8Uq}PbLplo-j=ndplwb$8!xsxIIYAM zIGuoqjELJld2G;vi^Q)p&*^BWN(y3+@-dII0rAL1a0TBbVy*hZP?4>SA>K7}X)@mi zuU6iQ@>na92-Pa(+DHJ`7KsjzGo+6bNWPm{EL1Tn9ZTSXN%PFhKDYV}ty=0}K7pZs zq7j}*NeM^!K{QT&!neH+&6Bi;i@LrZQ>hCS3Eds1IOWsk&pq_$fiJ2D()@ZmyZ^k% zwHcNLGGGe9=b6s0et!y4$9g+jiy?%eAmt!WUfSbu-}rs zJWp@LBY-D?HdE=vLxU=vpB`#+C6$6c=n($;5X@t32WAK_iG#g4B@;yPQrjbaMgg=?*%$_kF#j;&Hw0v{Wk67DE0M2 zbIw7Tp!`>aQ@*{VR_i($N*reVK#P#<`E0*w3EGsUlJ19ggIkVaHVS3-mNDdhYtj{*S&r68unCS4OxjIVn7KH5n`Ht>%3YZ#r~E{eXV2SJQ&hSNRWCd- zFy_z)ZM6IbdIa|M8F(AOsKK)3x5^~Y@gB~utM0RqEdYB|IAdH`EC8HEXP$1>#=gUd zyN@;a<0a|9wCYo&Y?w3-jO0kh`#nZI$$~wxlnglvZX@N3iumMETwz%fNeU0i1_}E3 zj!huqogvJ}a1kq?yJk|~AT(s>Gv@J(TtC``3@2lP{A5-*`yS98#{fzQ!pBxJ*SbNK zp#etx-n9cIGIkRw57|&Zt=H7@Tl^M}veL!!(o3tw?W{!Ouk)11<5|46)eLB6fdD=6 z^}T33fTCpBL~1iDHoY&Hh4ev`G#Gj9M_U)Ry`G#kODZ7!=nzm>?-5m{b3>OpD#!a8 zlkry_)U%gQuM{{8@DAbz%AQ;@{qRrwkcvgd^9>yv04FnpGsaoX$c~ea7C;(AIE33^ zG@wSBcp`n(rkO*hk4zN0Kuny}cEI_#f~$eDixdjLne3ISIopjf?vAfxEL;d1K@&fh z5FG2m;cVbP5$>m|hVJIUV@|vQxa3h?pdz>*X3bKO2ZXo4@29RALTf4_+|LB_I2HLM z;U@~7c9pK~^07kP>JLq+Ng@aM4%aD?Hi5U_E&CcBqLmBfe=5g2vkoZ&)U(hDDJ+}{ z*5t?*hq|EecqHL%cHUM1G0KCY8M9pwckTj*Vxg5GCphH6LAKmolXBw!5m6 z&qve%iQlfM7Ie9;un_2(xvJ88W2hcYe>`2rmGQHq(stm8%86dAG<;&yAwElN*C=Fn zGNt>g72n<8d^6N9%6z_vL}|kz`bf05Yw`F{)h&x)h|&xXclPjrTV4xF0J}B|g8wS( z2l)$*mlt1%mS3}2t_U^=yfD1dxStEHTn1-k>pMu$9h?>LT%mS0bCEWD=)4{b0|jGN zunv$HJ+W*+o#XPW7DT9XRWMpIg8!=VpHwvrEIll|Clhon{K>=exq?fOyHH`%vNJ@+ zuq*SxW|9R_n??9VB7fcT9GIT9J`Oi3HWPOYy|!%Woc2HS-=KDlKXzvWpj%9i#HeFN zq^y7l#2?8P{{%k%GTyp1s$}9%m>En7)L}XbNQ@wV(ndkICQt;b+nmD{hfdpy*qK1u z{ygYd_E-m2PZd$9b$CHqp@m=?sEgX5QaA6SqH48p%}C#XXG5 zGD>no$nN-Iyy&{!i;L6&I7m33X)S#*gxHz{UX$#>V3e^qi3?SUYcb54?`M6}y?^N=YB#exF8Z|%c?goZz$!7|U{smP0 zOEbp8@HeRVw^i%^3>E(({r_dq5c@xE+W*%&;Xgqk)4!(z)7Y@t97P2EC``E~J)YbYK{eVDIw;M$Pe~`XMGxn!iA5tg4%huB`@#2gtTsGr_w2m6; z$Yygb(LrRR4(!}IHuJt8U8Z6>o866Aa(i}jaQludMkx{%&o>TjrTh9%TM4pcS`dcd zM_#S9Do5O)`QqoalFuMRedjSxV=Cy=d0xD$p|3Ee_H=vj;Xq5aHSuKic=xomd)S{vG4vN88F#c5{`=T#Ajao8Tie_~dl zG;*SfFqyr!Tuyke)qXo{SFgvC^6RlpJn+B!*6mqT5Lgli5?`+j-0|eVw*@+>X$%r#wg<)v;pD_Kvs}iW{x7WQ(vnVJ>TeAl^Ky*76DYzfkGi{I(ig3XO?>y`o~* zkH+LINoZZJqt~NX3Q1jxLjG8W( zP8F2%eis{3pIYk@)a`Bp^cLI{R_=FGjpj2Leb`Yj9~(2eGO~nd$e;8WFY}4&#z6_f zI3mkbi7)|syqWbt$9PSmG`u4)nunxF2P&Nuc`9`lF~e@Mg`x1dv>Nivag!(o!?NgG zn8!d#N;1PDIhP~T1Ec{?#Qr)3qWo1z&Qy}#rAgu)Cyhn6R z2KtK8M?=w`KybK{^ShzbN)qQ>WtPFrTt!ozb3x86!-$AnADcpx?zvLvDMEmq69m? zPe7@gu1~G;nCa-vJa=R8Z;NMmHcVBffQZ6U!X&kV${#`$>O5bh6ft`02CfEcKo~vD zG*x+OzF~zMlTSOiuG2Kyid&w56P#v($p!~!IYIlW;0eqy6+EaJ)E_7$5xk>jy|uYq z$?@q2yFj2}UE!d%#WzcXc8X2FiLZ?J?%i>8w80)ZO9NF`X1#y6bZn>97nYs%#=z2y z*9t=_WH50!hQ{!UoEINajtl?k9~0+}1jK4kzUn$v^NbLrE`rpDjxQM-NI0krEUtj@ zKoCshGm{FYFTSt{$$<0bR3u>#5{So0brGxJH6-B$Lw3s1O>BX^+~9AKpbY5_e`SN| z0>`!uNhg31Z*b~`Naxe$=7=jk$aI+my~C4*hLV3zWd}jeVDSBQz<=;QfMkU7zWM&` z!A9}g@hO*QIxZ&yfTEmH6YGNuYf;Q`~>H{+3^}i&X@=QbWD?9ZqiddOr0`XUut-Rk+BTfO0`0 z)0|gdA5u-8bg{M-oY?oAVb#_JqJpv1CXX50gMFv z3b?T^biUB*w3UAIlH7uS>vcb;iR~D`xLl; zT_qJjfhXGX63|U&ir~zeVbKZDd)qIpz>oY73_G=5GKIb(cPt`lolWK(Tw~$Y~`?lqp(VcVV6!g;)Ld&qtTd1PR>V%}*HQJfyJ0Y?i?G6RtQV4ezt=fI5(jQyuJ=za0Ci#yGmIkaKCFiRZ8N5pO3b0-u+C{YbZP3@aJq?n%@>$Nx#oJ$37Tg z=a?Tvf$u8sT@R2Uu#u0lP9VL$k1g#FssJjnF$3K?Jh+lo^XPQ+H-7yN0+F@sItZtk zo?C=EZQT~isy4#Ln41N0lY+{iEP8_I{_Kci?@GrB1k>`gcKCvmhIyZ;GvTNPRD#5^ zr;GAL@DXwqMKK=wX#EJM+C z1?$&jjT}n_@f(e?L`h{rQJsq7YNGKgY9gl&>igKH%!nkQN{ET~<4}AitZb>xRp76$13+ z8i;jE%nS--oKO$sW(l#uz3)^!D%vm$NSV0mWj&m(G>9+JuByO%jO_2G4VI&;GaPze zTJ*JGRW;k^OgHc{zfgXDCcdT5w?+Ezo#_$wKKcvz(B%VMlqTuobnU@6`MQar%aKO> znJ;J@JPX19jwk;K?EV4vm{{2UOXkP)Hwno9j3@uKqU2wLOQye(nty@Ie@iksr1{Uw zPq3#s`cLQ(JvKlZ)0(VwG|{=sbq#ul4H0a8KwwZ>1vcz(W%02X-ye}*+d1vH3G<^r zTSX(hM@?Cnc~)+`PNc=fV#7b_KRC5;y*b|;q_;Fbj9R#SIC(wp{L_sjnJFEed310T zd||$XVqwQnxK)K#`AaGb&0O@JyxyLPO&hWhVLeM93eEVtJm1eQ19i~dOHdIFyglxo zl68(q4kib;Zgjs-YepNh`ddGVvcBE!uCIQ)N3vj^P+jx2N-6g}n{R&HU4C9frn=x3 z%{&)@kCDb>vKp-w|0XBN+Qm#B%ua)#VgmFe6Ee~4e7_2oz2+g#7%ekV;%>*ZT2M&W z>P#{tS|OrKzACAx9dMVq^=i!Od>~msl1bv(QIXl=bYz-^F@{E`$)Xe)zR#yjSyCBC zL9Td+s{C;42QAxk$!(n)AIoDJxC`WGFYZ(~i`pCUp-GjJFSN?W;W3Ih*(+5#DWW-% z6r;Dsas>vxQNmg_-PUE9DMPa?tL3G}yt+Di@*fe$d!+i%$f2}$fjKoKJn;nEWg-q5 z(OR)~+(MJp5@b${r1(5)taO-bGOm#jfBB zajZR>1V|x==~tN#xM@vpr&H$#W_CV;2>?^u#_abM@}`%X={%Pc#9<0k_~;i==j-Aq z4oS5~pT#>D*?Q6A-Ac1E4ZT%D8@Y7!z`tgM;3#5l2mnTgCJJxa+D<8aj6`O1?2_4U z#s^Wz68?%QAHyk+=MRV(@aH^WURAonm;Q*IeTZy0Ebnevqh6aU$pk@BJ)3M|M zh;u!i>X#IbgLXsNc>!&Y)r3c*(-WYpV+4oZQeQ&`Ige3ORDLrJ7yK9*bI`~^BtcGs z+Z&y>IAyrhv&o!`1_De|v>^W@z99m7RDJwdR+)T}L%8G%6D#7Nz~~8GM^Wqwev0Ut zt{@3lq94nynTSj5?j9ErB3Xn7UcYu!|K@pU@frP?G(q|)bG~_DvwF;OgS~RdJ193; zcyJS{p@Dm>LExz7j%vB>sd>Sy!Y`Gu~2By74lGjO34FZO)Xl+JCsiv&Gwo_!uL~{) z>%UO=F&d0;E8zKnc>Z_>u^pD;3*biKWCy%^HvULt0jFgGp2h8sxf*Z*c)vPw%ob^E4!~PrMe$K_ zJ7}Ti0a;UEzBz(Du$|g;4bnkRFy$4e#ZE|06JXe@n{0yX2Js_dwOVkZHwHx5MR_Sl zkMwZdQ{Yin(~4&#xh3c>JGVFZTFs=A9iLL!st1n?f}hv!wk69t4B83fH82uhBs;*eiXmBOv0hMCZ%{WOZ%oZ!F@x~IiP1!WI{eDninIAjh7<3r z%eO7+g)T1g(IkQaCS8LAW>F!J7b(==-nH*DAv0$zMF*1$YJTMv56>8W(z=~uV;L9( z{Arf?Mqtig?n(LjoDW6PXm|k9qA|cgvq{AsRU}Xf6H)v`*hUydYO2ndD~m<9!@3e;Y! zpH!=D(xXy*a?EBjx|3|u{L9F!^0GBYstVsRv1@1iJYS!QsASj9dj9la`kbeGD40)? zXm3>5KsEW?2$6QkKJ!`bCYtD-|0<1Xz|=mwl_re>l(8ooQ`eiv)yyAZ};zA z@actnRn%FWl#6gbqd5KR#zIDC-gR)S=Ff4qI7gLksRjlo(8H%?7q4|Uos8|$czaWT z%O`31d;1uvL*LEA%Fkv(&F%Fp{O%LETl9DOPk@dW#ki65+rQ!FFf%?RJugZpaeiKt zFU}~;iJmoViIpfzDvz8cE8i_0%=ajG?Q~`Q$KNXsPzV0Fe2$p}n$Al7nQ!&_58}l8 zJe0HT?C+Cnhp|knds1^H+h^ZwUT*qi@vy`M6fh`sK+JuXbF|r^ZbB{!;b&*tD@1Fr&J)Ytd0?6-OQblKlZ>oO&>`u~hD zgD%```AX!mT+?;wK~-)r9|_9XFx&f2?$=r=LED)}YjUreb1sl;gYOO$<|cHjFFXz5 zn6r6DjN-Sv-}mAn7Y7?B+sX%7o_gp*GV$ zzS)g?|BYmM=0X9*z-0llv$>F}Ns%iBS>Jvp7ndTJ4-~DXhri}DsP6135BhzsiN!7n zus{~9C_YdRjh@R>USo(r z7(lryMOxNeZX?xmMN1tYQ|YhC|A`=?JFIco>)S0#_S;EE>YA_TM${V1JoF+;x3)OM zwU1agUPNF`q{q=oMJ|82hlj_0zWC3#;4j7u`)wqQtCzVRATv0W3=O{4bX8vsg1GveYK_dgtMSlJH>NOzw%B-%j`rvAxg{1&Yn5Enp4?>6lVU|4h|mK|DA`X;x|c<>pt6i9l%W0so#3^mis!Itp{q9DLZD(rrwsH z*DJ6FYYdgo<>r4LLj{X{f-y$)#f=7*d~ec;5w4%EQAy*#)N z#cOcK`YY3b((EB^nww$0cj!G#_JyM&s;H<{ofPVcx2*M-v;;x z_+M!#VBvJLB?&Jb2U3}lK(S0I8vo;~=a+q|1NG;d2{4!*tMZ**246SSP-enl#Wcfv1O-{>vn!R){4t5E<&)=`04@i!JO3cjs610*%9J_Gxk-k+BXl%`@&ka2I{gc^R=CWQ%bPTVsWRN*1lCG~eTi!XeK&Z$--KpqCliG8qk{XqrS zJ^Pp>t}cxQD0Z6-rU-Iny6QguR6&1|+MW5J_`$)~(pg0Ir-dKP$fQ5_f5~&@oA(D= z_o>5e`$Hc{1ttuo_K|6M8=E~T-t$E|xXMI1pqiQOozrN|M_H=#*V%vr;M(Q zqdr$&YWcY3-Jl!eLF-K4f`f^9VsgSd_dlEny%V5+agtl~KGAjNG?e&*un1vcgqJtwTZpGdqz6N#SbTIv5yqol&F4b z6`4mYc{k^}1P6zSwvOT1uIlrxO{x;F3cfM?jG4YJro!f@ca*Ovg>t1&*o-)-_etGs zy?X0?P@%bR8|mAwX|HY~AMYm*vd%PUT-LE0u&v~K`0CUXk@ZsI500+C8*ZHEr)6re zKCaz=@>t_<$+@!eG|y$_{?lb9xesM{kKHE@3}K3}bH=OewFN+&7mNctTLOcy3utV95z#FEZ#Qf zb7Gk*=}PsUxxl@~JRkXhDYAagSNb$EbsD#(K!HOZr#=&}ag=wozHlTdV(@t^rW#Le zYm{6UUGYdu@o=X1eQm|d;=c~wiE^bot!A92k#_%`_yLdUgRR#jz(0CkR;C z$)@-6Vvb>q;s#n?w(oyp7IJsLE8FpQq3d%;*E;D(xNH-+$Qf$7-ik4Xt!b7= zD^JJvKPxPPkoF42X-owdB2Vi)o;mi3t&^lebl4!$Y(jwX&cG76qC)Xh{Vj`OKhCca z?y-jy7BlSzPWyd$J)_@xJM?DCYoSN$3j>DvZy9fjor^g;#-KyYko5D8wTCJU zd-wf3-OD}8Kr3aqf4D|rxWYKfjGe*f!MoY2MUZTGN`8aYwa_1zz6?<;n*~E*qh&0YgXAB?;o3fF}f?=b!1<53W#xWp!`K$n?Y{$j9i zydb3`Bysh~KtsH@Zi>N5s=9-CSqV(Wj^fZAo|7tXNZX7r7?4qxEmB3Oi62r|xgr{N z=>7q_-t1!b#eDrc;#Xp%@&s1*Qy(O1%r5fneZhsMuY zoURR*c=bi@8W~C$>@P_T*_WNRxA9@{kJYKC0e4)8U*qRgrzEHPR*d^OAYh3bOw&E|c1Cr)yZFrBNJCFKKY zkZA|2-iz;e7^cbdja^u&GctQVD*<}@$<-KjN5g#woP%nC!^JG?11sjL!vg2*z2CGP zNjPm^&0xb{uA3ZHI^LKenK)>Wiy(E#G(7xb`GuI1$mo|dV?6vbjF0pYT;dKF+Kox5 zH4ji^ew)`1<{rG@`|MhaGv5_MNwt0I=NkCoIqAyG2s#*?q6$bK!bw|+Gp{&FPbCoD(uU5>lT zi4>z7YJQXQ>U%3huhP4^QK_q}+L}Rl4VK@XKLfrPNl!U>zhC-HmG)!m@TpZ!F5j3$ z*wGMGR6d(QDru9ZV=VIb*zbI+(|o0;u1Bei^jR$0izCN#T|8Fw--)~_kiL;q|B&+) zl3rx_huQgX!$RsL?RX(iFq1&l6U9Xi3%$>kK5b_^+1sBQ|4!}>WV_9yi+Z4VqtE0; z{_WKFor0|&l1}`-dm%J<==s@^4BGy3MVk+D3ct#rw$~o)omOYILD-+`iqFU@i{J#6|)yr0S1F0TH&C@b3IGc1zdLJ>`c&Ihp&N|4opt>M;F6EEqSz=Z;<@R-wv&z}G zoC^2m_!YPcv({J(Fo`f zrQmfHraO5Ly|Y%2-LVXC%N+g@cYL;r9Wt$6ZE(p8e2gQIJmfZ?rVY@z|!|0tRD@?m|SAq2y$>FfZKj$&jxF$4-c0rCF486OXojcb<;ed zd7{0wi7`jj$j3>viN{BvI#6OChQ^C2@6A4B9H)&J}QQ$^VSJfVD* zQbYVwZg7UoDqr3e=Tf4orX=YxDyRHtX3|{vep^iex3R#-tgi+w*2kX@lIn<@1by#9 z95Y^VlD~fR3B!6X;!^oxgw>j+kcnm7cXv0R53y?D^ZnOm)H!V1U7oGIxO;7qLQvY} z*C)H5mV3)pW!mE-YdJs9&}jHS^s6{^aj<2S^zI1baf>sgq%H@w!_CKwZa)U6kaq+U zT_c^?<6QOgX~kWA6T=@2-EPh=6-Z6PWrYmHw0@OPJ*+r)J53-WDALz-aHdaC_yPxy zPkvYvTW@UtX+FNC8E8~t(=XI;WwhSHmXf_J@cBYia;z)pambmvvmMaZ6I>sqTgG~h zI(^KX*ZBdpiDE3)7y7{L!eBA=*^QSdjMUh8G$mV5mp{EkUV3_6 zQjIM|^VakE>k(@&gV%L3)-AL5M+!VoQKt)N`TW}9ZR@^Ehn+2TNGG0D^w+xBpBQab z`Ai~QeLa|6@#e_k7SLxUTJNB=^6R7--31PLf`*b})@sy)4N0GPy5)W z=AeGQgR5>$`Db!bx$n9s?yO}EWJx+dW^il=e=nm=r!7u9eR#2A?Xy+Hw9w!rJxi^z z0HZ&rv}di{XZsgfyuTGAY4w->7Z$No<=gs?-&cOl;-~XIU`Nc;+RsYMF$0Sgb~@Qc5f&PvyEztYIDcs~%Db@lF9rw?D9toDEKTR#)=qtKo; z`)O^QK!|i^-Jt57mJ(pUW$NRZs>fU*7r5KWR5{vtP&^lX>yMEMD*2?Ux*D$jaR030 z8}+!s`E@J(t$Oz}a@T6y>p#pYkx~DwjcYO<8km0I?maelELZLwVsYNrQ`Qn(GC)Pw z_wbLa{2#?t#Z@}bq3Gr9eh}k>(Ce-ch%9u=55n+PNB;{yNO-XoFMS_|H?y+k@%~3S z9gc~O=%O@{ONvoimU`K(?yxy#4PjC@jvP>H=YQS|1Y(39BAcoZ32i!klh&-8RVU&o!`r6|VnOTaT2E-g?vV?>J!d@B zQm4nw7?1w+|JjrN8d)!U1q}c6l_JCa)31nw zcE8sm4$ANyuk;_4gM3w|EphuyvzN)Y%v45!P30f~;cjk{grK$xbt7ST^FsfHY_~Q> z;)@e+XxbDf{C~C^(n8;GSexP9{4Z)=W^wrM-(IBA!Z*VYguXdm8>p1SE(-hEiilla zvU>MzAE#$w)G>aD$xuZ_@Zz*NtFTnTADKUU*V>lamg1xCESP@1(_7#6V^2Cex;k-n z{i5A+sAB?C3(S!FMoDq$}q8(Rm12Sx0)VQ@yVAFeiHg3y|?!qjiWi` zGrT0O{$b=2JSvtWMgIe$R_Z@>uOY$t*{1>42YW2Nb)?iImfpk8tSgfeA+ovLp4DDn z6I3ruQfv%p6n@$aj0;{6$k)%=A1Ubthxrt&reL2n`o2$sMOonwOF#l5cCd zGo*a`t$scA(jl#zRfrJ(Ga+H@?d2*e3*2X`%cd`#FBLa7v0ZIpWQ@DYq7foCWOI zS~DIRW2*X#D%mOfNEidki0+adClZ|P+q!y+SHU)94e;WK=~YHhHRn^^}@{o z-Z}kaWGB-^I$J&rH7LjZveiH##toA#jq!O`iW122%X1;>c*P5Bn@6-3}gjt>f-uSY}4t|gMcNN2J?PAjY_lYUj zLC@GpQzJNTI5c=9(RFrI+^joiZWGa#qHtH=I6QGNnwC+L>e#5x<#<{-4N8a470>Kz zK~COZwDg$8ibD~wbkz~sYleAY4SX4?v8p5kF5#r44VUz}HOv$o8Z5&p+m^_5`>M0O zyy&Ti82^dq7T>!jS=ncI ze&)$fE%V6xWS`614MuvEeElvM=n8e(msvOrpQ^pcq|{9Uv1w}$&APz5sYf)gAxDgXMb5aIykomm69jn8YOGlNuq#TAn2AL^>Co{C^-gNOB z6)wE*(e`MUT@pR^mW7q}jLgNkI=4R6?`m01jQLg3->UNW_)tINK5P@>T*gj$MO%Q6 z#{H;p>I&IoXmo5z>_nPTLTvP>BYwtgTzX=td)6J(L{+Np6){3tRoQB%*7i*gIqc2K zQfzz4G$d>orl^w;Zp1L07+ZGqsdH>t4opPEfa0-EPQuUeKeK9Lc`DF^mX{!*lj86* zC;0>qzKR#gk3aG38l4j?^2;xwY@L(QCx3oYtUVu+elBc=WWVT3+j>;^`(z#R7Vd^J z+9k>VDp8Q z{Z@Ud=VB_TPSdCHf+OB(IWb8v{vtE&K$45ycirn_A(`=l^4!pyN2;VJ%YVeaU}7Cl-EO*#&e8wTxuUVOG>-6y>;Dbyw|@8E_gy& z9+I<93cm9?<865m^AJOo2WV|uiBXR%5?R$k*i&x^cQ!W z-Zp(2Y&}BpSlvymM*q&mTWY2S)z16dJbfSON}GEM(82~_K}PmA7At~%HpG+-j4c^m zHj1r0EJe+M+=mR#xs8;WyAnl7H z#`mm2&gjteOKKjq9zT{@lILC8#&eP9B4dpT&oorx-o)AAx7nFq{xxs3cvbhReO>WQ z7RODR6YoDN!)Cp*E0N;c5e9<}j z3Cdx*S9&uy!e#%Qxu?P|Qa;5I_+!%SYh#&mGJ>sePw@SfS-Zp<)Xh(~na@zF$Gr4s zI758Q{Ba6((6}{FGqG{)IpF&mq z+%-!z^V@~_-?S7es6v7AwO2n4D;=)y5*7F{`Nr`6hwQIfq<{F??OAkWktjc}--}Li^**9e zs>D82YZgm334Hg_=SIfd8~-|Sd*!vXPk4r`)XnwZZuhcJbT=@@m5$w1VL1Egb_XAe z)-~A02Ju@8O{hRu?Mm-nt~h-j+D2`1XKhLQ#}C{0)+`uAFl%0@{FS>z17N_rCuiSr zd`#NIeBaG=lugdWvK>@>@<`rnZpD{Vi4V{F&lYKr`|!L^zpSF3%qYb1sCsd9BIv~4 zl|EiRPnwJ5&Tr}zeV#g-sV_u3JCBer%}Siksy@0#Dpq(eK1>O|*xf;9e1YZL!Nyxz zzaIWvOiGevQa`dctL|qyEKJP8t1*P~{VC0sSJ!WTeLq`xLH2sW=yj>Kd!4zB%v_MY zjB4@5JfgIM`M%yZ_9TI%B0tJ<<%az}v{kS$fh5`L^VCaKr|u??6>*ZXrw&^VcJzG< z@qI&F3%T{CiPM9$y4mZQ>2bd|2yNX8F1974^rLIhIJWH6@)}|imQFl}q zpek-ydgsdx>;!o#)GMAk{_yE_qMN6nszzQXIjrtkoe(?e{rP2o&!gcKO*31j+c&e$ z13}4`@HT~^x}ox5y~OP9tTVIZ!Y^bM-51=-lK8XRvpf)=t1s%QyNN4Q%#39Exn65j z;bTdO>q<4V2~MLXp5k}0|4x)Cxl(!Pf_#Aq$2)N?Y$iSz;9)PdnF@5x5~ z13!|b^9q&*psLKnCB*${s)Ak&M4oA!0w0NryJuOJ1CAKBSL}@>J|FUZ`bWH{8|C9! z*kastV?LPWI_aZp4uP*gx_jYOjv@Wg?T8GKsV9P|LN(y2MdReKK2aN$11w@oN%y%W zDFY9VC4*I`2VCx)&LiVcpv^p{(f4{ea)O&gDAR-FYcs#}C-VW6WAf#{&FH(p>gFOeSrv_@lt|L0G2R z1MuFL&x-a$K5=>V($BtLjQxV}6&dFJ6&2hEwaJT_tqk1Oo(@VZJkS6?LA=Pw@P9#3 zthGQCc}_!@+^XIrRP9yAe$7j3%-8PKcertf=9#@3a8~eMN}Tk(NNzVHeD2HzuJ%2& zjw0?SL?N%Bv5bXNKS7Qf`SBdo49AZR8J$rjUq+i;{(>O z9%dVm%=R56dfb27EibU--u_PkA1A71M`T?Vh76_{OAfqI(~mc}Dl=UsT^_M#RpQ+* z7^%@LjqJq`ZcyIM{F{~{`YUcn_SlOR-N+15>|%~uD5JJv=qS@omc3m=OL^^eRY!%o zw!5n>gucGv4$0?qrAI{4{SD%Z6rR-Zo>i}^8P(6PrZiLBA8`7z`=8+U1;LvfZFIE_ zzuqbwE4G-c`r+d7^mm1nLCKhR`fU=RBo0-6>>B-AC2gaY+3G3wLl0HHmazRM*X{Yr ztgU+F%q*#%Y;>`}ke%seLr{LjeBqadljUC&DLKiF|7i9Hb#k6{_-OlnRXo~WNdD54 zAqg#W1W|iL&f~}zXO!1CGTJ_~jJ%N=xwLR_r=!*O|Wa%iB2 z9(mAX1`;k03@d0jhZ$o~zy)So0N%JEhc{dJUtq+ok_)(Qc!1k1$kS2A$ky3WM&HrF z#rA+lAfFYQ2Lw>!0VxkXMlECF;cM&b$R`U>c{{rM@}WmT6X0V<9}hoodq*FDQzLH= zds9bWD;XmVO+Fbj$3S18-@!m%EmKTaOwk6Qi>3$A9fCpj)BrOw>cBN{M<2eej{q@k z47)ff{6A;#*x%o6g}KIl@z&;Y;GzDXfAN-NFmixmM)$vY!R%r;L4Stj2Zm=3JIoJe zCI|D~IK5!zqW|ItFQnONehA11GgI^zKbw>DJFhQH^!KlPFz+UwzVJi79hMKAfPCQS z7aLzb7=M9vC;vS^|KSUcF=LDa`bR7qE(=dAa_Bhuf6T`J*5PdMLqIHY8!ij?TFLF6 z*&w#Q8~0kt{cAReoqerz+yMW6;BWVXARs5izvhG3JvkvU=;?2Fi1=4d$epz#LUO{K zU;U4LBe!&lb)`Pw>>Z)e;! zLB6(Z8u$KT&H((2FFf@9-@D2GlYhdTSo4pZFbC-1^8>-0VY71%laQbwn6m-?;S7Q~ zec*4_cF)#cS4tbjrtt;2B?K^`+W;mMv;MO?9urCkSVFe}OXw~FODG{= z3Ec)Pp}Pnyp)f+`y$x7GVY_JFgn%V<8?c1_XTb9Rgq?t@Tia)wpxY28^glzG|0}0W z2v|b50ZZsE0!yeIf!TTJHed1TRYoi4Y~WXg-{$+!D9`Fvo={n;q4Il@1v*x*f$VVC=RmVv4+E2 zTdeJVgbu|ljbXw|eAc#n+7@d&>*NVa4F_THSi|A3P1Z20S3CC_{1sl|pbI`rTli~> zrJXf@e3oE1$b!$(*3gY*35I`c_AZ${3z9 zZYppWw+_Mx?Hz<|+dK%{;oXCO*%W4N?H`x{+qQ2IhJlwmr@+5iLJxA=SlXJf*i;+_ zR_+o@gf>^gFn|?*0RXm(+bdy&_E*BTZLoyx@D9tr6h~-lC2ZT?O4tr>uKb%N0y8$S zZQCkg82GqLwnS)SC2ZTyO85@%ti+cRoY0O+__iIDa13nR9Vx*vYia*D0r<8ZmB2|| zJ37_&my|GzYTH=aa#mQs1joR{os$xwu?~(+T>2|l3624x`2Gowfr~rG+TYUJ5)5wm zg=2u|Uo7o#A`?MrVF2F0irkjc1jnq8?VPj-vW81!!jl><18dX9wrbq$%>MMh6p71a z!ea@Sgtf&II%?l-X%Vt94BGq4#3>YkLOPf0lyv zAJ4!4Wm5!`v9@Jn!FMqo3y#@C`L9#hmXHOJZ`bJvv7l;LUDm9K5JWkc#}2E zI>ydP4Sy7nBNRZ(VYaT}$6a#&SpfaN*;*rqSrGZx+PB5aa=TcbKn@og| zEnl_C5`Hn39bVv)!-d3nEaBq$EtYoHiT~w}a3L{1OIzC9Vrgfc_g^d#+QcTeZ4;Z^ z4sT-no24y*;7MuQ<~6xpL=$qjr4M|Twwd=1qlv$ygj@Q+V`&?TkVEdGd1LnM{X53t z)@?S;8-piy$uHrSKJcZq<*YVY!tA8mEtUwGH*Vc#i=~~Nruxg42w^L^ZP-d~hq2XP zEa8?u@D#TVQ_0EiqIu(%KJZ!E(&nb(FlcahYzcu|`oL%DU-L#_P~dK{v?UN6O9bpe14(v_$M8v_uesmWXZ860yV3 zlF%##f)K<+;FgXy&3qRjCV~*eL|~Gl{xb7jgqR52stcYo*ak5Xy9hB6xK$T?mbQ8E zU4)njLJ$+N4PqiN#W8ltWfFpz2;7pRAOtxP+aM=mhao4yH;)kXL}1Es{1qYW zBJ@NOf}RN6mO-qUBmXn#`M+6OLE<*s;Q|BXHpGeCMZ}3Dw6=-F?G)S;&JH6^LZ*Zy zgglYkkSB5%ktdQ6@kvj}DH+=x+xB6DaYD+`AQ;zn&d`K*&+c-%8 zNhkvgxebXTG3apT0L_2LGd8&i%QFsd;kkcYO%1HCMHiUf;24kra6$tg=7`C@2P@0oPa@ z0L2F1P;A5t#fF(sY-|U`22vZz>?YJOZ0xX+rVU(UN5_psWZ)V*4#2R^7l!qCFsz$_ zVPA3>b_xfEoi~ADCo5ps83GsA*mq41`?ASlvp?mq@3S2C)tAH88+0dW>1_Y4^8fGR-PQp&G6uG8jxr{288Z_Z9S7h<8yDXo8ABs|K8TE|KA-G9 zSt#!43D~x?9uB(OdpNkbJIiReI5{~2N9+J+>R8EA%h<}w*g|A%p)$5G8C$rFt(=T4 zLdF&;V~dipl?VQW{xk4*2tWVHgb08T0T3bqLL@+l1PGD94UqsH5}-o@bVz^>3D6MP#z$Z2MFZ>LSX1a zHvlPc`Z2lzh=E}c-2k_R$O7aLS%4lQ3v>WZJO-K#1)&8B!RQF1B#f3I=q?yFVf2Ji z6k1b2Wps3d{t~pZfMFEfpuYsIFQ9Tcx6M zxxmPdZqPl@`h}ns42<&V8=`d#K`R-8)-o{U0}Wcu5VW2lXhj3VKe|D8LF*cVRyGg{ zpc`}#w7wx|g#%#$`i5woL(ocxptTOf2K;#pfwLvc0)JlE@;g|(VB;%H4lU{=my;bt$8R~^H4cC>SKKP zZVhh(2=)L=bXWyY`1pD|+PYDr>&T-217am$IB|dgqdVprGq%X`*}G96(4m&m(dYB^ z_H(3`u>c6EWwZfWYMBE@>U@C8fTP9K)itSQG>rIwjH5$*(!gix9B2tT<`fAgu);zOQ$IUjOz4gQ2pCp9yiGlA?SW`s!_nWx-qA$s0PvtL4!$S(fMEf6 zT1OY>lfHaFxB@)0i?5H7qqn+;o2Q36`q(uTAOIIvUq^4Cx4M~zBQR(HV#10Vs3wAx zS60Syv);e{4Me8~9Hr(6asZ)!)`vjqAWCv_3UV?^3JMA;DoScvmOZpIG_>qY%=9eW z9K1Z-99&#{Lib-1Wb`D_?Q894|AhJWEa5QqwM9Nzb^NdA*>p zsJNu`Mp^ZpyZ37D*FLCw+|t_C-qG3hAO> z=YRJ0@pF>uA!?Jkx~cZDpw2x_a{QN6`(xrAQok6(nB|4$f{I*;pOgqTqN+buLZMnm z)5rO1JG;0tg~;VCodv70bNlky=Za>G-Gkh7D=9wErZv*B9fcCCISVS3$tLdrqz z;-JCSn4b5aikLk3VF^U}7hHt&*Fh4=ojh-NXb>~Cp0)5jPugn4jVJ|`^!e>nM-}IS zru5}U1qGFYrgWcGq_`*7hlTZB`uq~4PHYDGC9X3!pTkBIe@>h$oR>s8h3IFYa8^Y8 z0$;-2PdeS&-Lh)4IzpkcjuhXniD>2)ue#IzG(k%@>F#sRXnB9pxgz#K zgHKeXj5S$zlRAW$DBIslz!l!8fkAXir|j3-*l8Y|KN@QqC8Fv{!LtzLpt3K-B-kXM z-_t_=OXqcjBUnOPk>fNx#ve2k&p2iBdy+(nfk#51Ksb_7`K@kUvXs=}x%6`VT z6H3qbwRiIU{-p3aIbZUwcPpLN7sKR>t`hx}+VG}X2B!|m=8jW(T2i7+4BB0t9q^gL zeJ`Kd7ke2D9$=-APPp18S@G6fRFIwbs6)QyxX|SuQd1kd&YL=RvX3sw4-i3Wf|^EO zQ#+dtvk}!f6_A4OT&k~gil?swkA~BUha8KdT8ZVF$n<3A^rx-_FXmNWw(F#koI5A} zxj-nJ{&tasn3PZApL;ZOHE)uthJBLzy$osd)7>zT3O_*`8B#_so8HRo=q3wBeIvZ5Als6D=78l`wn|KNP;qwpj12C)v5ELDS+ zWA?@3rDKqhv9U2)V@`&Sh}6_1hza>htoJ~>SqLjrB;z;QLr`Buvkc0TXQ?UPN@Yq_ z70;sIw>l@ho*3@`49RT>n#dl%zy%7L4w@)x4KWEd_(pPu%eTm$ae(g+e~Qmw!R1Or zZe{zhzALE58l_|LHHMY&THz;2wIsJ2No4qsm51&hZPX?v?l;l0Ii(n~rttk7nfPIg zq)8%9kG|_tRotER5!~(Bt$getkW05YsGEhvG+lCk6<O!W6;bF(is z@Wi}IedM+}u>XZuSC5I;Vxje3_uxscfc(*}!xWbuh!l`D+o)2PB!*muIkf&L z_vgI?m&v$!v)LfzL@;%D<*qUZu!}6iPn6bBS_n{gVn=s^8|HH8!9h+M_xgJ(f?XxIWnk8U)82;q*z@R8qq0V zoG5Gat%>^}lMd%lI|+mK;OiF$+5?pomP(tcOZXN>m8K%0wdQ)+_HfDSaUymS(#+tf z`7jr4ZZgd$7gDlQ+bOtyn1Dc?qp8EbH&lrN=;W0;bUkam0B7aa^t15DfDx!Ir>%Aax)^mM^oWGpY29{%X2H#j9=Fx%iwH1%A*|7ylpg<23}hpuHn2Za!s zJcz{5Nw~{6ITT{lphpj4{lj6p)F0X!zpx}HV(`<3N>EAZx!~;#9VR!ZViEUCf{ zwqdW5pzfq2NWI`!RU!y#R<$n)Z#emktoT-6yVsIc)0eJ;lq5VZ|FN)BHF}zCl*%JZ zMVkG>K}d|9U$tm1^elAzkVEg~`2?bwRNa{Ks&uHXqQhEV@uB-oBb&!0LVk3T_7d+Y z$j#spQ>?2|{?V=^rf}aOIo#z)HqSe6FP%9_0b*JC=liY2J+hL2nYFMFGo}%RHodAn zJPh`^?=h)H$`2;V5id}%w4n>^VQHr|UK*tZaV@loOi&hGpnZfmC?RIO_gyF?;*bcV z<{KgUz6>h~9aPg|VYgZKD9Ky+xRZc-J^zQWWv3iH4Vx-<>jd$z+7I{H`DXt3P9EH6 znN7wkzQ8hP@F6W?vE-XggU#=A;upb(4_E?&vD%j&^1^FrddjBl&~xXeg+?S1XYAS4h-l0Sf zcLq6U2P}Z|h!Q9S7r>>>tuKq4hQh{v<{!B{kmlLsuxk3aTsCP^!js|_O3llSyz4AB%a;gAKp_rN}6~oUNEEB`d2*t6Qxs*M7iTAl<}%r z9R1U~_NY#!)!x_4_er>+^ghp}sv$C!XG2&0+u)u3Hsl7wliX3n2N4aDCT5(*O~O&SC{;Z#9Epk%`*na zN}mzWtf*2AM*n_K{|w3H{3^R}W+kh{I>c;Tl)}gNOX8DD&1pB347^W4{Szp@_tFwM z^J#a~=^CaO@Dh^j-jDza;2&IEy@iu5cERyB{zZzH%2ud@?}JNZ zx}&&8Unjhw4HUB%x_lyy%kKsi=L2?Hm7~cI1QWn!7X?=oJCzT+GA~?*)yS$pd@IVS zr5opb#GXk^;fPOfF`0J2xH&n!iFmPE{kYHwErX$aarvGO3KR(`&pme43;Ee&0c{2r z6j%31v=b+Fh=Pj`#qx&8Qi4gQ;*6+ozgrlEmr+N|t=jk)$27nD5~sr=MuMWHKuzh- zGoBFTR3k3j*Knydo<5yh{N|8_liEb4_MlmEa{+Z~kn`y(;{_I0$tJ}lHF&GU9Zzsh ze-TtFnSmsHBu7g<)4MLzKvf>aUQ%#_B8kp`+$D@%(6we#l>LUyrKp-I@ZQ;(17l1S zLbpZVUpR1ALxC1DnW_G#N_XtL)^YKAl|aNg$Tz`|CH`5_fgIwQp4*K)hi9+OM=AQW z@k?}t%GNFvIy=T+dS(v>FO|5PK!d5&QeBz%d3( zGbiWwpsvxR^SW1ADd(E_=naoLSxnHpNX=e?7udVg3};U^3f)RGDijBE1=FpAF3G>U z8ZO&xr$T+HNs(wSRQy$HV-`(n{K!%fEp?SVx5_O(oBBk((be9M)2*Xma3TE_OCWr+ zn`KhrA_npF7as9n@k*Z0Q7h`ChI+z2JdzU_J=xWvv^H-bLeD3Nl%*dV;?%0eSsM@B=ZmYNnj4p%aHq)oO3&3BJ=5#)4b|gg-qQN2W;oCEF8!Co zIR{gWQedDbvQ5Eeoz1C4F?-tSDHP2w=w4Ql9U1Xy?qNCiru*YmoJLm$_arFzjG3t{ zQLKF}bMn-zHixE@jVz^g@WL0}Zlu`cxO@{_;Zl>$cb`y~wMQ>gWGQ>>`%UwO1={6V zS>gqgS*u$|QQYEP3J^h;=5{fpsoV#_m^ipki|BiyvGR6BZ^1DTP8pUjH=j6!M>)QJ3)PqDfHYy^Ii@w-@x{ zrX)2*Ui)J)G&p2Nv>R?_{MtPkz`89+^648UC-UhNb|wcMTwDRS8r=F)JH_MHXeJnxm7Xw=kOZy zhjt}gKW22bX+nJl(`IOzyQXxPRUt#aBup&Dx}SLyQRG}cYB5|UYd}t}@WZ4`-27c= z!$@M0C|Q=r{b0MfnfoOy^SNRrpvqzJxl@fTb=qvCzY3B~wAQLWAS}3?YYWA|DO7@a zg0Eu8MnO!RB}XluYJ!BVN{%KNN*@;)R{atxK1yzXMZr)>JRKBtgqvuTd!^)R`yUdL zyZ(ieG5i-u_~HYKlVkXjWj=@7{Vi#v7ubckFITRYA|YeV~om4k`(`#J~_?36L5T@8vO9wS%o zFOjI231zjOQ=KS~V((G>ru5_Os|+wKnws{3VQR_MWR1Lur%s#Gsmx~_b}+qo zE3OLQ(l;|Y--GU`RURh^i0;>6!ReoK0<#L;!94O6IwdY(w&d&^)35tdd0Wq&j(L6d zwDjx94(jW{%-O$BUwW;0LT)G}sZ2CqzNfEF{+=Z#u>$I4(^FX`eT#%2ZgbyliQ2VM z%8TK>kTK>s+a%`-NdZH~XLIgN!}}RP9b>>1gMq`aYUgKFn#4{E^V6ShND1i(k$-~b zakosg`&iu?l~x*+^bpJ#;|jVMo~t{bbRwQH%%I!iGS4sbrz#xNSE@2z9duC2c1X-G zugQ^pBW*91BFX>tONw%IBad`&8~4?sBN0ok4(6qPPnlln&Qs2Xl5vv-IgK5UgP02C ziF0T8Sd1=*1%ZJngs@I_rBe&X73z&h)EPVY92Rd|giq64A#x78Kk|c5(U|d?;u}Fx z)YM?ZHFJi&;aX8^(A2im1It+!RfEcdy;1GzOFWkg9DmS}R31Ot#d{)0lve&HN-pGS zhf%#)!@U&6^IUphpRb;$Uyfc4=UVy{CI&^QuADhcm-}hRYRLac(t&YLuNPc>xkI-m zT!d=8_?*as#<5#d{V{7|778Wlqz?IB{`m_Z-2>P8T-_I!S|ftP z2iSXxNNlpm4#~mhNe?>W0I@gUzB3cBGX-W7vy8mGXSfyq7@C*-5a(_E;gQ z6`t&r{icZ7l_iA#s$c2VcL~Z+Q<(#`=F==O@UHtKZO+QKB zwJLKR9r-~Dm0OxsiPEFeOLX36;;yLOQ`WBq@dg_|9=q*vT&)B|JjvY{M3L#v5=kQA z^&F+s*y750B*by*?rZOIg`n7}C%xBWizxgR8*IgckUuA`{i@k(MA|>JUN>i2`w) z)<#ydISyY1mlhtDS4aqEAd@$DcyfpJv0s~Pmmn8W*Hq3z59BEWIjmRo7LQ#+SeSe_ z#PAZ*!MSuIgVcJT@;8S z8b~@76NqjI9edsYks=SAC}2;!;+j;z7iZc9qW%9!IPXBVzW@J+*sFG_*-GuIP3+ZJ zwIjCLdnUG0q_onAJ*p{Md)6LBOO4pns@f!IC~B8#-#?%4@1J|lxqqEM?mhSQdOV-c z8|8_eF6<)x745bo$Nw_RIS23uI<3=?-h5qNd0M8^KWN&aY{$y^6z3;T@iXR;Vtjo3 z@Svzxax)`XaX=0Q`YmoUIxgD*r!YthkMW}5uUUaBj_ZwleJ;egv^M<)i|iSM2OBy5 zmBL~zgI3*Y#%$F50F<^ljw-FoK@dfrNfDDMG|i#5VgY+f$P5e5e(% zFF{6txOZm1)+;qT|0WB4ADI83v&SMcea|dVT3?=;1ITCU!&#Rm-w!MoSWWW6YmI48 zV!9*C4j;k9H7Mf{-}3W>hU4^kQcOS1JqVc%FW6EUFa|hh{)WkSZ$^gvrqBL3c%p~E z{wluqeO_SFJS5neU78g#>4U#E#0xhQ)h68%>=HRVTobkb8o@u^Jql5ZeiMD4d0F`K zHHPihnOs9v1S-bXD&l+pWBK)?-}7#b%tbjMhS}AD)Mp0hI($yxm#*_a79YFQO9~(v zx`d2~I?_Yaj?V0o0t-;;FzCqWq-T8_>-IQEq|~a2FGYZ4z)a1VJN?qqdE1GQI+E{c z8mU;~Nrt9F`I4!AR+2cAkk4XdJlTV;*A-A!M)|lZ`epkX7~5>6v|_zbVY_# z_zWm4h`XYTAL}ox{2;pYNK`3nQU04P#7utn{pI!^b=xR4U5&v~0t3C^!SgfTtd$Z^ z9#MHREG7#bJj9pe9nQAHS8MIIsuTYa11pKIdr$&P+S=qtrY}|rG<(iMzc>)nmuijJ zdd)d$1uzkyJ5LcCZ6a>LlVnJT*!0a%3_+q!(>bBBa^mRFfpIQmyG^`}`EbyRu$kgN<)-I-?rvGlRC|vw$Gv?6=(3HpNhU;$L6m(E*DAQGKq)qp@dS zeBU)6ZJ}!fu#DOaR;g3-XN4(0-P3e~sQQ4}_*1zbW*LU0Meg;*Qx;+5qBySVf|+Yq z)`|302y14_kMLW#={Dvk%@CouWR`Zvxv$@M=dF$?THm@0RQ%B0aGz!k+ zR43W@tMY4HA|}#9h;quJk>lP?BjWMyzO|^>P5GEPWt4>u+c@s;R^HMbNd#phH!k7YI*z^BOx5;=fgtAFS_Sx*vgUwBF*# z7^IBRN#?X~hl1J<=(T?8=Gnzz)5w(sm%kRiIi$1TOxog(QGGUf`p#|#czX69Kz+J! z+evSX;b+)c33V5+qq{TMoUu3En5 zX6#v~MEk@`f1%IqCRZ~Pht}Jl5e+zaN=xqlCGJ+lCk1Es zP!y+CvBXgUJo5T{fVj_cEc8{kc&}#`TtdP0J;Qtk9(vZLVT)23pPG{%z0Bbt008^e zy!_wZO}}TnD`RwT3t9lpFRj>>^lqKDH{M{2BwXP6Y-?j;C<^`W_a89bE--m|bXH3{ z`o~bOz_2rudbcW$`@eSM-(&Y%qIMd0gI2YNYp;sq)o!V-hF1)Zo`RrSNL`Zx=9lP3ugvUpar}fOT_s zM^m0rpfY3xPSYwjAF}Vb22IqXAhy-ioBbvDmLJEcpx4y?N#F3oM5GL z=X8a#pV8<1VBoF$&~o>n*o?|UJja>Yx!wDQm9Pm(JZ1W!W9r5Sc3f3uYlj%myrfJj z*6CPvFS5~rWPP3eYUb_t+%bFL+xCjl>WT0C8x;Bn(WWJt*aT^KjAC6soPj}8wYpln zw|70?TN<0h$w{KyV&KYU&3%BQh=XVl6js#@Xsi1-;QEwgf4y%9^0(rVvs3Tj-~Dlv zm1SZHd;%HD3|&xk%}dE!94awBG9Tp!rxl!lyWW2Y4>%uw?I=+}^L!`v5XS|7k}`yc ztcPruaCjh=Sm)E7&o}dRlH=m_RG46rRF&zZ3X^b-jqenm1By?jGGk5N~AZQ`(e)R}ugf zgg$twi!OvBTX(#(fqOeC0xv!Q3?7#KrY5qy(qWw#UyneAO3~IubYy?RtBF z?*g{F`UavtpC?s0C7I9v3IhDF>nJBz2CEc!*8l(>Z$O1oWw_yG-@GucdP-Fp`|r-5 z0nr|%LSDnFQ8e)j-Aa(lS}hEf0PI`RbysehWSL@a zmohbe&@@+@UQ3j$?gjxl#FN5F%0#c#&m6 zhJ8CCEQuLR6{(k;{d>7@LZ`HD@eeX6vH(%bw!wSs`iM)aSe}FbF`4Rf3aOHV(&Hxu z-++9;WSN$2>H*DXk&N`Xig&qz&!+RtQo$A0*@S?}`S*m7iP#q5tN=W!fv3lEG1gr* z)u(u?)w|c)v}veZvBbu~j^FZY+b=m$#?KPZ?i6vpU{iQKV2}%N!c&yk#Q)>I(|o|e zsC)0-)3_Ls_+frb@mZxYnZuBJsloWR1mgEh(`O;Y&FUATw^T)){-klASCnX?k+TRh z++8gS#R@xNjY*39Vqd2M(TT}ToSe(Zwy(&%mwidx2?jr%=immw(wXa(#6_hOVJ=|_ zk1`aLvj}X8{8w|&J#JP)%2`_mzYvbKWj+l)Q-piTDC8vIYO_U0{PSG^Dcoek(RYLE zJk^YSBEsou*SQ=~bj_rFB>qBEC z4TWSLjx6BSckX3djj78p0=V=_8EU!H)8ji2qb=D_#LO1@yLI|vImALLt$3|{4+wE2XoA?@0l3%&*Ebv$;h|-5eC#HzFTz7D_^uc6gIv#=j+}_nidYmWLAyb9 zeg%K)sL&jYiSg#D^DZHU8;Qs+1I<__f6o{qaI!OP+%)h?#d1-!shcG+A6`I+KP?yI zt?em~dcN*vcBuZC97RtZW4>S~x)Zt5P41P#$NSh2CPRwceT~%a0*ee75-5p4Fr@YpMO|&W-mB&k+WTjQl~AY=QrnlBp&{C$9yX zLP@(WYpi**X*FP-9jE>;I5wLOnr{pvijg#j5z!r8W6G#>Z|!F(5NPa z+gAd~I1D)IJ{j9mNa&((!SSeNKXUc5e?gqC9_CehVo;~6s48W(jn0)&vQ%&=7pm13 zUg&4~53pONl!zD*XUhR|uM(6BmOPp*+~ zO-s9Lt2>D9RNy~AtwUgZAn%fO^wYFV5&o!~4b0b7KK5CQ*g?Cw){2f)i^sXY2oOoq z$?+s(cLxwKv+w$f+;25R@MF$)?S4TxBZSJg95X*tZn>{xU5`sonB2)D{JVBO%QiIf zYOCWWd>AEoJ6i>XidwbG^%$=zN&B zr6!bI3z-r9wdvUy)N?ToZA=YHbrku*5Zs=j8d1jiEW&L98a$m$%fg zI6QKQXzWfa2>oNeaelofy^~&$Rl!C1OpI8N&5eS(ao4Y#LlAce7rm1W_@$0fq^2{xP@>(%BK}jwiX>W8X%I(zgk%&8U>n+~qj2zl* zfr2v@1#?aQD2wnN&@pAHS=aHjwTC-^9T2}jb5h8rro z?f3yo3C$AovG3r@bvuZ4K*jyds4ODFC~nk&;my0q9lDlb&5iXw@$6#% zjV%a0Mpeoo!CEvy+AhMDYNWwzAOyC0C+Qw%TJUPe@8&bD>NZNERdFML z`wYic)_TdmUrA?Y6>nQz`W~*)L$sA5Ry@bjg>5!|8b1Lp=1;9-L-uV`sFr@u$~@Y_ zx62xORlM#QxaGylYz3Te^k`*R4r7D(y1NN+&wn+=L?1!Rza!_H0yZ4Vw|I`lq<7f} z>z?g($`%cr4={71j&T|3shy}(+8?v;oWHeyP@A)JKYev*ul{o5n9512qoYpd$#acx zl9a(36;~(cDKu)N{Yf6u>Onvg6~>%_q_;u>^-H(Z&4D~aHrvE(=(L8|I(%oS%MC8t zQoQeyGF{v3lu@2Q?pf_(im-bAW|O`!FUUtZl0++ILMcY%!PoMS7M+JeIr<;qL&-QDh=WSD_3nb0l^nv5z`Ks4aRxt8Anm?;lC_ zwM`h$x8d02XL`siMd^}_6X4Aj@uM&1=hfS{kso}Nt^c@^VXvxQPGNT{(HKq#BBe0) z@gsdLv`t7iPb8N%86Uof)sw(z^xR0R$?}-zo>-FU41KM3U64~Ko2-$5APEOI!aQkt zfwJH?&#tBagocpnFB!}H@Go_@_+wc!!PZ~3dF^BqvB>tL43aZev}xiO43)Zp>yGo~ zrK*fsyRzL50VAWyPty5rJ3Eg;II3YHMq~o{qGy>R*ld*7%>(2f)G=vNN@p*^aigU@ zZ(o+0xwPPe2apBnvWYBhRf4XISj-y4T3!zWTuK<;IA}9rr8bNB-7p1lvukbm-yF*7|!s8R}7#&_YoezI-?tB>;!0m33er1)pB9yCAlHM6PeC-?e8`YUVo~qf- z3*MjoMtekJ-CfL!3{pWXRaRUwVIp`QQA%{EkmwbQ8D~E4siP&Chyo~Cv6e@IPD!iI zd~&&?H}li4m(MEubwhRQ3+6Z}xufQSIbF?b$kL>&*6Y2g*5_MVQT+_`)=1+57t(if zE~_KnQFrBD=Dc}nIT1aVS$fK$f+E(Q(n;8Al@npP5V33BIB>0Xmpb@yvqQ}8b(Czs z`@6xIJ@mg(r(jg{!lnEN0fy{lLCmY(8{wnuL)pRf4%Gg}cc{OyowRC0b(u{~dx%Ou z)kUq^NS%l>-(F)ICAR)aU*o3vUjIVjfa*^bC4RNqo6cFEKX_t)`J&dJMkqSD#QAOQ zxPnof!opWXM_vvG5k2i)|AO78=)mKCl9H?3w2hsp>#|4N1B0rn9V`s0lSI4J;%E21 zu@bMi=a^VFu!X0c?(CKelV@cR{h?@!zW#YjCA1umX=V+;aq{?j=dl3;H|!n{WRZ4R zwCy{JShgMO`qYj5c{U%cC5uccI_I9@eVR?K$HrHn9p4;pKGNr*8a-!YY%O{+h|p@mjfMsX;rUX;b+>znCQr_gOQqhL5+ID`Ebp9-P_PBX z0!37?)m>MniRkSbtwF(?p<6(=Q=xUt4X$CIp;XD%5O`PqNFi?kb-iqLx2TgpM-sQA z5$g!256$`N!meQg4DkJ?0*-tz{v4EG=S_!LQ{OrHU^x{)=xBJJX7eQtr+V`5nNkbu zcep*njjnuSxFDQ-E3ehO;4wy|8%|JA7`o=KE$<>#5%aA`rJ_kwpGYev36cQiuK)I=B z=$VF#IMWg=(qP?*t=9<>vnx&IsPDR#kESEFd+>WMa<;}pD++tZ`gNFpm~#AOy>MD4 zr)C26W`30(jR}}6KN$lWI#8Z<&(hE47&IQG@X9ikq+DHcm0W`7z7s1Cb9F+w(OpSGvxwzSSD5{Q%QI zZ~g0zEKjC+=4b!1m&W=ZTmMtd7xH1pIe#!#fr#|~)pHMV_1n{{=4-(t`)5P{0rp_F z3LNFiK-9|+;^QzU--*I4vq{_arWVmL>xZb>rnZ%P2Sn>u!fW!7R$=Rh8&)Ah{TKzh z_0wwGr!H1pFSPAo^A%ML6k?7XaSq*5s8Y%md(=!Kyy%MNr+;w@V39mDY^XR95NvGO z=TY-M^`TI=m1wVSLp9YvlCsMO0axUJ4SM6HtP`?ep+bVyU#Jy4Y0%t2IIFslrw_Bd z1F`NUJUlWt;3>XjL4#)6M;RRUZ5yy`ieh$q8;2CoWy z9qH8+P4C6Gk;P`;Z^_r%iXQ^9!6x;iqo1e6>4UH#WM>1~?xk{F#Jhv~E(<@X_fQ!t zGQ*tvwo~_>SEbjfPTJ0(DPDR4NXA22QKk$Chx=H&$O&WNFKEP4zQVdweeZrgEX5k5 z$i`w<3`e9zS>nQJvuO)!?IU?ez94_kR>jpR;f40}ib(Vt__<|VXU&bM!3*O9+MtOl zhMwRbK9t!F>3o_CbKWn^O$;gypfNt)0x<(!U-W-aRbjY!jeV7(6TS}#9My~_PneA8 z;vakL;pCWZTvO!Y1s*}cXsG+ACsC8>msPhU^eYPaGw7u-rl~$@PNx-Xv}rzqVEb9J zUq*=hX26aBxXyfc`JE!cD)4FN1&KYTM4p|q&dT;B=@Xv4H*=dbTVMWJqQa0F;L=4B z*jY&rD8uXNCCA>li?FiHOt<^pFU-1rvp*tT3q%Nq_R*G-Pq=BCc(u`2&?UCq#O7#Er87DpAjj`u9Pvoc|{qRrSo3pVQCdu$C0w90lu zf@cb5%S95oQn_c_?X#U|Qf)Ki3>p)Pd30?dUq*~$kAOsTN%xdl{XWJUXuy0KMp*D=?6Nhg9`T(@9&c@}2JIx)6|hV~{CoGFLgyP}&}$ zE9l)G9_orGa7e!s;Y{_BXv#Y-p}V@9-n9ueo%;716~ap4u_qk>lEruTt+v%)sEVrR zR$haN#>}1QRsfiv#`&I6VjS5AAEOaVYft`LgGJ$VtmxBw@AEaFfbVKMwYp+)#oLpy zCbl`d=1|wa);+u(A08f&?$4J42+UL;3}o)@`@bfm+wQ_y2g+D=z!gu_%zlWa9PP2! zw~Yooc(^qHcLc|rv)}krHmCpD!-B77?*Ca!R906LPD7o%rZ}AF`Ww&x*T+!v1#ioo zH%hCb&ZAdhM696+>1Gh)>#FmzDd(q{g|1eAo3m{L%Q5O}VtY@`k59k0n>VQ{+p$Lu zmY?m<>re|@6H(E#RSLoRZy6s7)LPn1rS-;9)FfMZjiUehZ2BvLDQe255!gSo)xDJS zweOMRW+wo@T3d`WCK!u=Z7e7*lRLK3VwuV9t*rzU31(aTAo7Yw6UI^#qGoVON;W?g z?e^+-?|5it6V%^qagf%&XDrH9VaTfz35mn<`YhQ~n4QpM^Kin;(_weL7MMBQqGwTd zU{w+7%U7I>e9!Aj>W$1HoGnw!Bz|Rzy+Q@&brD^bVnkVx)^{A?fyx*2Z`>QL= zv`E{{0dABYPLQSj>&Wv8keg=bI48~r<(m5d?FnSFIcjNCwm|P%2l!zyr zHAZB9Esq8{(5X>#rnctVu7wlbPx@ezi`Iij{bjmlT^Fi1=pgFF3-O|+#+2#%(n={i z9sdEqm6kx#4#f!>3qNJaTU>e-u8MhXN9osPitBszFzv0C@FYbt`7mM(rm1kRYwZgXSF?s2!Iqom~d+bwFk5$mL= zc(|`G@wXHXSQ!-Ab~qyBEE_ACH$Y;gTHutG7vra{!N_;*E_Q|bkdV;mhUMNEaPR^<(U>DEAq`IwN6+RQaqbQi&=PFc(NbphY zPo?6%E|^92lTs1RN|UUp^pp)6ddk@0MQ%GE49bq-9V(kuohikcSf~YGmh0&UwIjM% z$2Lg|9OY@3VI$2jezRqr7A?5)C*hcqQE}?H{ zTz~;wUcZClNO=?e?Jdg*ll{YsM7!w;PurgxLr6uUJuGJ_02=+xrO_F1UWe4`X@i?Q zg|%XO{g-z>iT2soXp?tTW%{tZPpdO12sSn08Wu!cG@wF$y(~7pq>mr4Y46B-(JNX# zg|rwA7MjpssGiz>KAU&zO`EDWq?tGzKn}^N&!x}`i?{SdkqG!dqKR^w(~d?klX5cz zfwznP=o}R}tw$lo9iA~iE@|Y(uclw?BJNeLB@IHvRNY%r47$9&A6jVomM-5t@rZEy z$5V_-{iAgbv$Sg&-mUqgyX{>V*p;48JAE=|xDPy%>n@LY{no%RVJp@G_Wm0j;Bi@9 z$jjdD_3vxB15W9zS7i>YQ$NNYDk2D`_|RHex!A|I=o+M+c#`dW#^&GR09lp2E!CL1 z0f*P9z3==XC(Os!W!mq`Sxfbycw%b(8&>;n>H#LkS8Mgang9&v7`JOXqALy{@I>}j zpD$jcZo?U((tJM`9J-L!AZ#v_icBL%f!3}TnKTU6mSV*3g=6S--uJbuzJ6bG(1pQ7 zSfE_F*Qkz3d#%0-#IQNyGEtws?UTAx9tK=z>`lwlv;NCRV;rOjB zA3)Q_u-f5;%k=G2wi(<9yBylif|9w@+0Cq^6H3k1t^+r^{y-eZQ04rJv)JyWoej~^>Ft&mVrdS?k4Yo1eNx7cD?o7FQs<>5gL4n)C&?(h2k;C}!j>VyznNekKBbO7&b>)hs2ZXz)z15!dg29pmQ$&Tv}i3JSUG&bPy9O z|5D4RABO|#9)LwfT&dOS7wb3mIN)d24mT2&!S%38=teA&Kj_9$`yasIwKe(Rv<5!4 z@A@B`%%DtjkX^P~R)%P@S-b$>M4?Ep5G4nXHyUy*|0|NBRPh0tp*TO2#u}r9O0jtz zC$z2Bj4{bk;FY?X)sV(ePnvrFg-TE>ZWnp(Qi0~eR1q0IU=N1=21Wjmie&nS+y&WU zB6_dgFN19TEaB{s^a{f zs&&&J=~0HaXo{@EWirRL@2anI4v*{JLn4PkR&pP_%ML7GTPG{>DAW8{+7{S$9q?SU z7r!lvE_vH6R&d0ZwTPhpjjq3@cl!NeL@D}z^PQ=0e8I)bLSqyV(Gpmoz)uy0?r;%V zmPc6E**gPs8#`kuVf#Fff~?q0=}cI1j7wvDQ908q2o>`{$5O<6BSmhwb3}^xGa)|7 zo!StyQ5IHMIwCG=-u}*b|NOqEXs(MI>?)+1$;Z{C$-2-m$@?iG&t45)M3QyIZP^*Q z{~+GWJs3zozI|8O?S zNDd9S_tCC&W`F_pc<^}@qvnHAwWv5f{D&5&t^%h^i&P(%F%BmnuElU`n3La~Bec@b zZ+u|&pH{_Xqm(5Xy~@|Y>KxYuDa+!-^4G33hEly8WlQ$jIQL(-X%P*Y2kdO(knHl%p+jF8!89ymX2%)Ofbp znqVr+J8sOtNx8Qb%ca$966LDkardDnza9QRzkH}3tZr`TbO?80r^l-!f7JH^Y#0E_ zpWmwCp)BwF$Vl820SEs=LpQyH243A=0tKLBYw8;gmaEh9DkB#EqiuZT`>qBN~uQuXOb(oOROrKd?P z7FoNwCNSs?;al{%hbV$mCtCbVMNy-7!TZ)zg|b;dtVcmc);c%SVvV-QbFp|_#b!z3 zqPQY)0VC#V*5=(1Oj9=p3jqtJEHP;(t{Us7`FY*Bypwd&5|9%pHpXthc znAXtG|G4xuSzHbWAWoNP-~249VCMr{hitxF<>lSg^$@e(npaEN?O+Uf@(tOlseT1* zK_f%yQvWU-`=DEi{=93={RiqvDuwgabq)iet87j8h-HdG9DsAV$sgxQ2WO1HwxH!0 z3bC%Q`{rWzI$yeqF$OQi{}l`WqU3AuI1qy0f`B|b`2Kxd`BjGvc*wl~vEZGp^87=X;5+wJUZvr0r=v{k0yQ;V}3sRq{vjt@FoGQ;@z@$jH}U?vWj->5-V zbS9X8I{-hWFlsQ(ufu=RE5JJI?y|ISy+T=PCxj3_{oymOdBe#Tlhp6kMUjj@oM4d3 zPxTHl=f>hW+1z;qhWs+I+a>0DTdlY3XB)0p?3~U7%a^6Y8x|>dEEf(hk<3zP=zy9B zSF(Lj@D-HnRe-&#K&?q8nlCEt=JISXOA@LKiIFie8kB@+_H4cvWnw)Xb~X6PbdxFZ zVqu$-+6jx$Ji`h85l zTe|?!G(h=O}qu8aYypPppp>XJHL73X~Ou3k31|C_d(xdr2 zFaK$E@8vX2_uIy&#Y`zyTb&OYQom?@WaO-lJ-%*Vh`9FIeLvb^vO+XYnBer|yvHa0 z=Ch+n&iSu#mtl@C!<}cFjj|QXUZz;UQ=E{h5Bybg0N11|?C0&VrUG_=iZom`MbH1A zc1sXoT%0|kF^)k4{ZOqKiQ6zvSon(pyx@o2PG1g+xE51=TEFqu=cfs~m0zcckKcU5 zFvs0rD^iwg`e|`6i?ia<_V~s$YD#+~DhRbrF`@(Ffzw+@TWdGCU`#BG-u(P3G-8#G zhI*Ik>D^L>?v?a&)8+Dqm-ZiC_`_5RN;}FwEP{sYEK^m#SIa#&Ck?yq>(+sGh*mul zT{XIEhfw4XW4&l$DqEN-G)OrmQm+UBiNh63kF%JM(@1z;2zH#eFdLHT94`#1UVhM+ zZeEJmhf=X50`u|HED}vjzysIRq7OPV#q>U75ksUkUSaPJ%KcG6OVIQMnx>5<(~H~( z4aN*}pfJ*U70pt+Nta`gXhwXtz+!v1s>*_pYVSalU`<%@;H_V$a(%WMP9HzE0eL-a ze9CG)s%v|8--T1?_6!;;R(%|=s%xXIB46fw0_0S!mb}{wOu8uNfEPKjpN)IVmA}sT z9L@I@;(vi=v>dREmTu=l5D%e=l@PV$OVi;ztI(Qm;?&yF;dQdFi z^m%WjcuMjf)3>Xg4LOOd)0lDiMVYQQg;XE6n+;n>2oA{$t=RM-?lx zo(a+dQp{?Lq(z~ziS28KDNWEx?*Q{h?Afq-wkUEdL!a_qXO;kL&g&m{&Lo)4GlS|fZUW-t!Wqve$vHG`1!rb7S)F(!E5#MT!6$W5-e3ye!5BTd z*N`3-GY@2=EBKVhQ9+oHA;!m>zgQYM6)bYijK7Ej6-Gs)r9?GZFO2Sm!!KGb4{W8m>~Q8ecD&_&r}60-E(?Y!fF z%fA5nLkqq44$495ibHaf4t6g=p=N{9s(b9)BrHQkLAM1|cTr!`wYiG^d*!7+%csX47OdP;J+}^_X6M^Xb6ECED$xDtNJ~!=d{ocs#OrT}+9Z@|V_$Gw~Y^4T$}j_I5cs ze)@fKwmxWo(zK7GvZTo?tR}ghS93qrb=h*QL4`yoxmkh#9M^Cl+W0+ZBHE(gMGZ+t z0?UWe#K!h1mNh?6BQxkv&j`bsQ(5XQDk$t32vGm42?z{mG53~?+-~|10GlQ~X6c?_ z4X;)1V=rVZ3w#9GUi?_N&BGAkikOeW!%478-PyeE+l+E);!|xnLFUBIO5Icdd2yK2OvG#qwrP z58Tf6?Bx+Nfi(Y-_M`;BeV=GH{gGxtrgX>nzMi{?{M4~$pH%PBnos-V^VS&St&xN@0XD?R-BahG3bsu*yF4mM z0|k-OGrmN7_GC#il6F+jSAk5!j~Rn|51pj8~>Be??ufcZ3vJr4TAR)-a7{{~>LoT^)tI&k7 zXBaQJz*O+Te8N}xFKu#SlGAWSjxD6N4O#E2-A-xe8*`}L+}!P-MexqzbPG+@EYisY zy!ciFwoB#$-U|L3o?h0EzT1C66Knl~Ta1C;rmca!HC+c|Js5Auw|P-Dct67y0w*QKv^6WMeuyb_S(}UZDjafK?moLN6>-+oj8CbdrL?KnduGAJV9B#2omB> zBezYu%gP}{LaA;Ky9to5IJi;wfUjV6Z@p72-Kl$a)UsjWKz=~vp0Pf|S3XN2Il9q5 z1EL6|j%z~XncRW^uaf7L6%@1dA7Ij;{->7HStU*i{ohT(%gURAHvKmgrJY(aZfgVX z30M)G{tTknpT<&ySk~G~i7@5;P!TXI*QH|vd|^Mvsu`#}KbWH4+H>co9zK}xuhZ1PhYEx%w$dIlcb z2xtKKkwfPdD?OgUUod^$j|8cD70=4#Y1Xm9<2q0s()hPH(DYD|XJF}FAs`R2NQQZ= zgQIG^{%O&zK%bg0bOldTw1t|(TOalw7+5VE3^-ISp`*dzVG|UV2+<8S7161kIAO#UP)l9Z_lBc6qNNV|9ku$cwDA)0W-^P?8sS_ znaoMa`Va8Qjz89t_V*jp_3{@XTZlNj$j#)Izc8;AdffM7=Tr%%o{F-xy96j*=WIRE zvTXKDAD-c8p!+`2s`t}ojO5FBHeH%x08L;{gJ8d!9K%wSp>S1R06;OwdBaDsS4vs@t5c+T2Kiu~t7 zawTZZb0Kggmg3I{WCPct!uAM27d_)Jx_*vhZD1~H*jcPO`kbJ?I$-NiIzjaxAe!~Z zuZGhhVt$s4lfNIyfV5;-;v zJ!5c^f=?fZ40Kikj^;6ucqGpDIaVT?AuDl>@1YjBEdBVpJU8VgnHQZqK(&{Gbd)Czxz%AQp);c&VfEc5UF$=&|T= z^-PO_G!)ZOF%qP)M>JIga&X6+Dh^75N#A7_#5_`3;8^BGeiE^v6(*ap0B}p;QN>_T z0eBy}O_mXan1!`FjTnpFd6u)4T5Fd?3<_5;ZZY206v%bd^_eIz?X`M05p2^YQ3IG@ z@SYl?&`_~#Cr~1ZHo+N)g@QSifbjJrv&bd+_^CN(`7x5|7M+{l^W>Eo!K=!ux;9+* z7OTtL{P%};$)%%Tcrca2{)#l(E6exqJ~L=zRYL>{#NW6j?tjNRSw?Ju+~_QGvRExa z$1>)+%%F%}6U1scO86_)|0WgVvHq5szcmIthU*e`m(l;SqmJ0!oloncqMb0otBs-5 z4_%$N)DH$co^TBnG3V@ zHTEy)?@$0P6sy)2a~(alOnaiRRpbFqv2_9O+-bLPESr#mfX;gX{rQ6A+dyx-f9 zS*p6F`rF-2hm>&M;^~i)Bk-Obw7Ieqat}Qp)3Vq|SK#B>PIgx9vgJU+<}Z<+2_E#G zRvhN6f`2AQ%;(r>?8xbtk>#iC4EI*tZ|8a`RC|APolzNup(4Ox64VuMk=*|{YJG*D z*49KZ(nC<5ShqAK?l3lPVbAu1+Z{ZKdcV4Bi=dY!|2#63JrdZYd8QSFRI4>}pE_aQ zS37hp)bw9jZnvaP!ggo?W((2t@vW&7^b>3v|C>ME-v;Bii3ZRFEJN0y{e%h8n7_fH zwr8`M(OFMGNUoUi3->X?Kvg-@xYueCpw|4Q{cZ|aA2#_x#WL$+^2Vu9?%1_+BY|4D z-Cjbk2ODci+ffP>m8E?#CgI%MHvy70@m{0e2!&70B?_r)o0zXUYW}G;4zdd9OM{rq z=d*RSF5>Hg^)q4*4PHZTW6`O$*|#y81j{5k{T+<7s3cQbn&irV0Hr6gp1^cWvr}do z1%S8*8%6&@%yQ2TB;hep$b6&cA_TXPol-gIx(o^0VnihD$)?z)`Dpudl2|hw8|^Oy zCMyo0uUgfXqvt0j7N-X+l?51{2@$8u;d?#Gy1{#9!ZcCX=($Msc{<>sC4sMt1OH8q zh3tOs@H&b9JwP=k4vHZO2c${gB2AWRfik?^l^~sT-Fzdcr!vcokwGOnLZi)Ps_?*6+axnI!1z{_71`gJH1AHV8Wo$lQU7&OXw|gT zB)~Gvh2wyevZ(CwZ+Cz{xh`p~Tl@qAWmIiYXNg5Y@RcQPvjwM1aafF)(!qVHCRgm0 z84GZD&z$nI_o6}`P2iO>Z>;a*#*rRN7gqr;hI-lY#ou2L}_9zqjK2Ab^ zv(#dU?8wA z8Z}#WX-+|XuSB>m(YnB!&ktplUTBao{2w67MTmn4+sYi7oUV@4orK+-(K7)A#m84r zgCwr7m4)l_#dlQBZQ$Kol#A&*;=%dO0dtH5?kn?hQ6o7`ap_3e0rHo_gxLmv83-=^R$*K={D$O!Ezz47j*hVgf2qO@#p^|@4up&`rhzgG!S|f1tbt^ zkgn7~=pa(1lh8#v5)tWDlp-K}L+DZsAcPQ_AiYXW0HsLpB2}u=MFDqy|FOr|H~Z$C zi*s|<#TqM_Sy^+em618;`#$gIS>J++pfZ$07QRgvyNi)lKFqc$vdV{Jf%vaFCc+bJ zN|b}U+ffD&;|5iAJU2{+Oazn1Q?oK%rgR~4mAg&DJAf{pxKfU-1q{+r$JpeP+=~{) z6|#wGtWGj-K)An|%TL!NB1UYeulaA{@~INl9`&kN-<>EJ@Q`%^Erk=tv0`Z-^}V=? z6}=bK2q2n-c?PM}T*R|E^3_Aty5&iT@U*UQM8}|}?n_T5 z8HB;UGJ>e1JJS|GRIDWdh|OwTg3{3tug7tQ$c=c0C;4_&NKk-*8BuXp5fAe8IB@ zb*=tIhlwa(EqfBDbRtkih$Ipp8(^WiMn^*}7Sna#G!nQSKsmbSPv4tmCn%O(VwXnQ z42~a0uTVXi$}1C&7Nb4+EyUMuKrD0VW{btR$pX zB5_y?PATIJYHxpi_EgT}Ats_?_0!?m+4+^Ng143ZVYS5QJu2lHgWCBoeKI0oe?;j- z6-SDTWfzWHW=ArYD|^(5Am%>qkrdqR585B-_fNAIe65hZZo&CoW1c=mAF$ernAmp) z-H2PmVXayc_05Xomf*LDP;hJDc=cA!!-DVHg1H}ra#VZ|(gN>AP zM?99l*1z8iB8^(Gs^)!rJp_RcmD|MNrlSk|U=YnEdcg5KSC0_dRj%(MIHK@SfZ@2_ z($(^2<(+B{>QRj_#H=$M1>;pPoIC=|5#@9SbVgoVZgjN!W+L`rg6rwFDGU8vl*YZ$ z#`@4(m*v9)qtGn5<)_iI^GJXy`F@gBSs4LK&?EbP7qJ7c3GciqNJUOG!rg8-Wt`t^GUfPPXDLx9ZspfeV2X+xr zFB*-Rbi}?G4|Ti|7Mwg>xe*E^O$+ViL%G8(I{(BeM*&lfX*wNrmqyi2CUuUbxT0}~ zIGGquCaH+OlZS;z$B`ysH5Er5fLw$IZgREs9&DaT+R%$1!U2i-X=25t``KbeWS)jM z)&O8ue?y(lFSUB?t+arSCB=T4YDaJTSe<)B|KZc z32%Z~bW^$q7nQcuCdg7crg>ZX*A@BR4Ug)m;1`@3l2G>>OZ=nb{DNh=3$wjWOsrq>S1R?lNhjrQ` zjYB8`%0~+_g3H&P;y;8r`L?t`D0nhZIxte%6lI)}MFK@`^#x!HgA^WN@|~`zD|o5P zN>FYBqO&VFBqA}!>IQKSfZL{eqzE1{496$PYZ6wLw2@YFvTdQuPrYl@ifZ~9xz50{ zYeo$qf657$8b;5p{7EF{Nf}x-x$KA?4fs!2b*n8hPk&TkUw5xwsG%!7-nSG;-vod; zYrXn9HHj@%?&%w&242bSN3LAm!59U&Hy_p|JC2%i#Af7l?YMcM2vh*MQ^6s)TSw&7Of)&&dQ(4 z;unh{9lHL?Jh#hs5toF8nB|lqppRbHN@CI`*>6FYX543?bH&s5_ivCbumN5KfQn*n zMleGkVOK~JArq;0M7-S55~Yf6hkw2cRtr^wA8_K4KEdCe9JnB8;GeO!SLzAUz0e@d zj`_~UeR&1|2jY1$t0rUc>D9JV%ztYqDMB+7--0}v2$$A4I#Gj(RX zQW&X&Cu;3IoaS4hlobFv*;4P?Fsg8fo zS&51_=pr7(dJ2xg_$KCr@UcN#`8{x>dkuq>BaAZxp}>3J$JVOu>pvT^;sC>k zA^Za>Op`Mg5#9aT(quZ!synnkVLZCFRJS2bpi)`xcu&=4+zmCaThS3>LS)R#dz4y2 z2FWH!*T@xLVuK*|-GU%fMiJHC`Wi<+gHU2s(oR*baWSWbbi@`DOT|-;Ey&ZK?ep%Q}L_WCQD* zxIhNK2d~Y=Wcu*8WtH_=fTw3fd3f$RvQgZwT(r4g^wXBLdFQJlFk z;PR>MBC~|7s|PyMjSuZUqI6nuV_sM8^*$kNT5#S@YQXEJs6d^MHM`(hRZmXWb;OSR zYYzxo$<&K~saaHb*Wiz<*g{YK`DR%}EP>w9ydFH&1$73Tlb zlo+|VC4}P;k2Z!+SW0n_4N_sP2PvCaej`p9q@;5@^IDy=6&Yt&vBHt?G#|23IajsN z%?#iu>>NKOqq-AdF?Nc-slog*8&|rIQ#m#=Ws+USBG$N#Ln>%fNMO#ga|VV9nu{x0 zb3B<3&8WF&EPW?4RS6%Je-!3a@I_j20V?&H@5A#2mAE-WKpdqvyW397M&K#3 zX28Ea$_lJ2L5@I-w2n_-=IC&)C80|?W+pLdk|~%WvAUNcrHjQ-hBpt>1=rO1BBd@Z zr?e7<_M<(+L4J~WMwlt!#v9NUR`*!CS3$L0QleHlj7-lgBNao-lUk(?D;~oqLyQL%vhn(VqO{0eOl+gnz#Y z+k{WyFQw^F8w=hlwm9K1b+@oyJjx*i6(aN``oA#=Enf$nB=9~CCbd#(~#SKuAF+#PmSRcE@{=fP!^?yj4 zMidc@O&|?6O1TGjbTljOR#fYAbXVbVj|zr99^|9)zjq*OTLo0!ZqH7M9&k_IFc!o1 z|4B{HU&Wi06}w`ZPw~rs!=r))BjqNNpdYHDarbeMnld+^;Zrt)@M_t%bohZJz&sdL z5ca6+>WN8ai(>hXo_9NZ_t+T^YLXA1wp;XmagLATYCfrWdzd1ljYwi*^z11jL91%% z*p-v48~zJ_E`S9B(X?#9VwazRP+9H@GwC7xD0sT66@86qsPfhjbUb-4IPaUE=AWCP zKxrIOzOw;$P0xK7w1!vl5nIJ%uOMbGcqLicU5>6qzXt=9E%cWLMyIhT?ijv zdSV&ny{Jdwk{F`7=@#Z(Vv49s(S%BbXCGjLE~r>1D<29?QTWKHGHTsBSR~c4tRKmQ zu0$Y*)E+YYq09e2d&84~wdT{J{OYNBDOR!zi(bac!WXlpcLyFIMAHC+{ji#q+l27d zd_92M*;c3M7y5z7o3M4BlQ?-1P__pL3|B|6W~GQ3%he^Yovk+sBI4%B2B{A#bO8#A zq zqh{E0Nb|SA$`(h#G#HfTd)=Rj;cjC}EfJAf(7FY%MrD$s^;Vofc>$CovJa8mBz4+v z&~&#+xg7H=L~g$;N&}<$by#dz<{tnAl}KkNaRg1>28f#5h`Cq=VYzQg_f3X#pBIR_ z9Q#`+Z_z1PC}BJ+a??Ep!R8z5JD!?p#wEGh$wJlIHvsNMX89gi+a!HHM6;txa7EBB z*JDc;ln2M|c-4E7bpRrj=5I?y4SIb#!^|;Yvq2#F2|*-P!#<3zsyWnAiZq=b$}vks z&WFDH4fU3w=FgVo9yUxTGQ@v@Q8@a;8>8DT7JQrwT?9V#JD1;odpR2RqSfn%!pCT4 zUn?g%iw))E2pp`UamG{+_t^>a8(P40%wqyvXs`ifQV0J!G%a+*!Y>;H(xW^7v(RZV z8{A&5?g8>Cs;YW+bG$&$tyQsHukSnSQNmDN{&sky;>oCuDbfSgy}R!UPAkFQeTyPGSmm27riFYMO1nq*|KNd-An+2Ug#w z_`$Xf9f2+rW8?YY6dzp!cYO{5bCu}AF}a_Q)DswqQSk!_%>RQ3q9`!2MO7=X!!}Vj zSxL&TiTTt#nH$EojRD~TYa@;{ydvi-uaam%IX#lpGvm3#4IJnt6H?H_o5|x@p>LG& zLsx2=J`^G;6vZXwna=U=#B|geRgs) zPmZp(ylfMDe8z+n%20o4!e+IftT@l=Kf}hLkd-9^_;4yvC_>G~kh<=SQgNV4^AJpOtn%xtK5ClqvpF@xAjImjS>;SXj%{Z zGu25uY{2HjY@6h)FPmy6Au6g!UdIXkWSp@YpN#dC5eG+^wF7yF^6uuQ9<5dJ*TEM_ z*$oxk7cv};&*D@Lgr>OK--P7^O4HEYy=$6h)`o-HSWx5GM3Plb@R0xufJ?pyRjJMH&C_xWJH)AcQ1LZY(8|T0WhD(Yd0GA^>17$X$kplSGZYp!rD~vX)T=ug#JwwP z*$^tQSP&Z8_0zEB-BBeI&3V;6`QZn$B(&bj*0z0qy34xv`=(3IB*7UbCDH55hgz)} zPg4bM9p_8^p&R(R44=xp<#TtE*U9!zXh+TU7st#q#^8f>L$UA$Usvq zfBm)UKsX`l!ah@N4pzN-u<%)IH?mTZC$7yd)IfgX+}h>GQ+1Co96W$-*4nZMTP?#Z zNqy0Mz7wo_k=cAHG|-!|bTq`UaSeI&J6SE_aSAOEZ0n$Og|i4Boavammsvnzilhj0b9 ziLyC0@JK48r87}XZy#kYhq2oS^3i#(zK&hz@i*c1_Z0r1Vi840BZvuI#ice5z088dX6JRAe;T;~pD<3GmZoVnQ!~!z_sdI~RLOo8(g@*8wte$< zfM>0!?5Mj&kpdl$g)VG#J52}`Tdx6H{F4pg>!PTn7}&~r*-?oXu+xW9-q6RG8Eo1` zPCFm6wrdDmG;x+8V@-~vXD$`9p;wlI4XphTlfM&ZZ+-uB?5=o2~N<9Q=F=haYAn~DNPAhg= zsPF@MZ3xBp5X@}V{nw{!Xfayno;7Y{$5iLZh!|-9ya zbKeHdDSdQSNw7q%2jQbATrFnFso9LIqu%a_If-`hypMuG7#I~jD4b%&->1*WwfSWK zydTqwn`QMMp+<&q#cANm4?dG6Rznu0LU>0?Spc_zF(!%f0gJ^OBo33y6B+>CQlgMA zXm{6~=2{~{_pxmf1h5iVVb(pCizH_zRh7z1AvfAphwU2PxTb3)qg4d=UmYC&P*iIed;BABsU$K*_ZKEU zu{RCEFbw`Lj@nxtY-!Og_*fjp6xGH#(e$n{aveCKxH29Z*=#vL=C9$dY*MtE^SM(x z*)|p4Jpay9O8*i$yEM4At%O`$s1@{bT$6^&1u!TXBPT~LVI)>2@r?$3hE}mv$ zF6O{}h?YOaF5cRhrzz6uP6>X|tZwURP82g1L)=|>dxoFn>9GD|zVEE&MJ2aM66^nZ zpO+uEvJy5fh8s?MX=YxB0w|8!=Z4E`01F&E(_Evv6~Su_>S@^jSjNZDxW$n%G21-%KrpI~WHlh4)q`yQ6 z%Cks{sfl5IVU`khj@v|wYqoed?A`XKZ8^#*Ft%dX7dSd&X{+3ux1-QX2ph=JtQ0rW z^VR@jz8SG^qhMvk$H9U4A#Ss3v+87T*-@Amo+DW`xlgiw11=WqK6+MvvEGDZLq4!c zK@-bP%RWdHPVvpJF)3Pd!~aa_3p^|uBq58PrcA0rU!-|Eh`}FKJQBiw|CBw9%!Z`B zOJ;k0_)%?;KKYOG9wzRxcc>Ryh7u@qFPJYdC(k0E}FkT^n@`AkU4s8?5k zbbX!QlFTlGy%)wS9jO^~WcN+xM!n3@K1RkBQE1ux6MQ-tg*q(-dw82PD6$?5f}lc6 zBQ&52mOkHnpD>F)xBLjtWrr=2_ks2g-^7}dSkSJ?(J#fqGJ*+!uJJ}W8aY(@wR;nF ziL2sUVQ^31O3h?t7hItPRf)*`7iV#&+nV2@GHfE#K}XG&ooF!|VS?1>QY5@|z?G`u z8a!kHiX@msuU?*cdU$jSQwxW1;!eOfChITJt6U{*1Q-L8VpU+23xK7GgQMTm=Erlj zL2nxd-ITKKn3n>@QVFJVm2J#?;^bV1Y?SXRO&>s#$i;pED%yeyyZUv=M!Chzg9>`F z&!1V3i2%sD00Cv2LEg=4QOO2Tq!5JxY};~#W^KI4P4F+=ivuH?z_rGAgiMJSj4^%W zX*uI4D{?a`sSB|x-}DlxZI+JOj4WRfjDe^!+9W#v*HEKdRIO&hFfiOn`_QAj!Mx>T z^T#)`khl?A`qW1y0@_<3#a)9HDgHk^v%?nh(jPZ$iq}y7CQYB*DB{FZcT>bi8*9DN zLcn9QUE;IXfwPO-@*nGDstJ(tX}6ImUk(=#$k3KtM3mie*I+8F&J#&v!B+|FUM{kvRSRI#O@p~l%PZ!XnL~f z>shY8jT8gFfU6_$9C|Jb_1CQDd}$HQ`14qXts<~_oj1ikK{;#!-geUdBT7EJbgN>Os`MfsOLo|wYR zr<|(nO!RH)5FmGj0X>HRVvfTBAj}<(h@rK2$u$khx}{qf2Mr1rQi)0|Ig3^1 z9LQCyavch&98@6uwvVz}%hV&K_a*Kg#JOsFoeSV0tX+!uG!IL_34X2ZrqG<}jj(93 z5bwE{_Uk-_C*?9Beq&cX@RJn;R{>p5YSz;x4Q5`+$GED1!y50kZ}T-DBs;%VmXS2O z#Wszq@1po}Ki~&(^R{^TuQ`H_WreAyDm=Zpft!VmjXN*O=Cbz@gS^R9AM<*$LdbQUzlYIEpep|Kmb#~tAe-u?(`V2 z0`Cc?OE^Av~QvLmsZ$@2(0i{Dj-r$kO<3jI zt@S9q-|>{+W!s@`l$x@hN6fDyZ^pPp%TzKO+6I967Sg zTlRX{7$U)CVDwas0CcApDyMrCSXjjJPa*Gd58p&Ges?6nVD$7Bl1 zk3SmV*D!_&pW>@3H$P>%L>XJ78kHDUTWOLSW69rtc&7;TRXIi>1|<3-hm|jaKA-2G zpYfEYc@`xKrCHI^e9y;pc7;tPsp~h4J6UB^e@|~|R%?HmX?|?_dcc%LLR&ubN_wA%Y`pT&}B^au-gYd+(W$@Is* zXQfN@@6=rA@gO*i5$&TL9A=DXYI2_7Cl7$VRXI`Cg)BgOm+Zs_F}O*%eDG~0ox-f? zxfN%-&1#7)**QMRvyjX*_;uo>Gl2&J2&S)5tC z7D7J7v&3<#)GX5TwWt8rKFlI+V;eq4AN)h~*U46u;b8tGKUkUw#By*&k!M=}94vc3 zsH0ZtYZORTLgsWKdx8T8m1*!jQ`NOiQgfi)>acXBD&~&~RLk^=Br(tDxjtZFqNB!0 zH%CRrn0-X9NI?QziXeq-&yC1yablO9MH~b8z!QA{vY2_y09x(k%VMa^vO!Dl*455d zRl6jZ?`_Vy;yUN#e+Kmk>Os(HmDcF5W4&AXoa}Qf0KGAnL-i`iou5px|(ZVZ|vpHQT(`14ug}ztpBCA>U>cWN^jw zc9@4Fbha-h837cB_SbD80sHLFP!Eoi#rRJ-gikBEq4QG+`jt3Qy62LO zuxslCu)>Ee3p);@(Lah7f{7X=g|V4E#Bg)`yP#kh#m6IB(Au`G?w+pxj4P)PG#rHqg7=7;g)!ugC^JFM}i*+zXAoX!|G~tl1CT;m(+NgQp z2;kV;3@KB8=e!VlSZaCyum0n_PFNLJgyrf?EeISnHetroO=rJwBjiq2{#KQB(n$w$!~9*5Lp@1+xCB}5(%L{PY$7EIjj#Mc zZIo2~Y!25b%omkL8Q|QrteGBzK2@!BpUoJ}p2(@ouiHAxq46tf#wf-wZ6)` z)c?Qtug~65kzSr|E#74IGX2h@axgmH6u3{beH?n$5^f{qd)33r{25=#Pd$nv6%Q4a z|9mc^H`Y#KvGDOQ7x7HBJcZb^qu$3mZ~$k1z}14 zH5KN^Ra)<@8J*78*bhlFW#PzIyj?Tep&?bzxhv^6Z2O8d9Bb<&ADJ=UVEIQbW?wHZMyF5?PjlZ z)G;Qff|e|&4kbdM^z3yM*&o0{mz4L+m>{1Io0@-wNvu+ zl-t<|MwExTIAd9zkn>&Ek(Aa_lpIhQ&$Xd>0Qu_}mP`(M`@OdmzNmc5hZ zkLS!y`f&H4K|aR_p|~F=uNd# zftc-7Gl)0kK)16UPY#q*e#IKaey4Uj-3Uf~f-94YWSH#58TVw|`i50ylFdblZd*h) zZ${>Cv0m$P;Pxd%HPRMTkZbjS7Z3A77rr{o$Q9}_b$ zx?v)XI>B-LQnIKUTg!)+yl6SaQ4V6egv$3$*4TtqB1DH|jKfXW(mV}T*3CbF1n~Cw zMcmkRz#B#2G&b9n8LL6X?9jjvQ6? zFr#%QNn%Lg)gJLaO%Qcixvg;_i&}TcT&n+u;(@BTz4w3v4z${mq_gzMKaEL-W=DNQ z{NCf6NY2||(83e}={5fV0v~z%q63LN-B_Au0^GwSe^r`gH4HaQ=^5og>S;KJ&#F<{h$cAQR8l7Bv{a>;8$Fhg`k) z`ThaC($gb9d3bFd;hEnAEVcaA`UhwgP^>imEVA%TFmP0AKBwf?DdT5#$UXc|mqv!AEXBYMpbU(*}14``|zx_tvv9rD& zbp8hjor_9CoOJyyybh#q*!)0ybZemQdHa{Hx@1G9%-mMi`*U=WG<#wp0UOIqQoSAa z`XEYy;WB|@({oEoW$*XC@-7Y6dXt+V`HKmmU;P<{mJ)_jhxR4=bp0% zul+{rUpKH?#sz_26#AME-jEe=T}iQ9%$=)i(x^y$>#A`6cqZ* z|Ix5dd}}-nh~|L`p(zcLF6G+#WVPtYk@UqxUx?WWu5e(pR64SqwD^U9$V;prii#82 z>|VX40d%8oP%Bn8|kXs2*%K0`xei^3A|4-j7^`6?u~u=(++pRlQC z3i3Qm!|su_+}I5^Z@BmKzMv{y7fgMurFE_%T#2V#8y+F*oKr1fw>Lxm^M;!4ncL6P zT~jW{w4A$K19>gLjaTk$NZPx?F(c96xs_AGoNEsx)s{lv3`!C7M$gMDF}!i}YhUUy zdMq`z(7&ZsM7kb2NzHymxAsb#c@VN_cbPF*Zd;uR+&wq-u;5?Vpqkp6V}a> zO)PK&sLGx~X0S#lZAF*Tf={{icHfXbjk&>yN4j9BkRjN;l0db1{vL{lfbcAy{WAUr z#T(R}$UsxwHA}XTepoet?cW@oo42cffS;Swv;Q4EcSh1F$jR_Y@%`^eMMcsg&^aK~ z$Bj=?|Cy7A8=a)qbFb%q7Cufcq_-Zp1$nx->H0Z^(n(r*x&}PqlZHvrN$R zlYz?8N#6Gi@Hchy(|Z2Q=ef6=cK{!ZPEyCyE5OZ z%BrdT-@W-a`|kk2q)Fut&;pPN``2_C?^9e{mz+e#tQ3)w&IXO9AVMSG#jLJP(IhlW50D2n06`-DsOaSn& z55Nl`nP8LspY8u#gtQ|g2U1W{QPa@U(UU&Va05V21_Y8*04XUcC`hdlq;>!W3*}9I zX-%qIW=_-szN|7)sYNu9`?cL{=3jpa$~yZ+)6%iu<^XZt5fT;=6_bO?E5H<$v>s^d z=<4YkSiljMR@OGQF0O9w9#1@x{sDnO!6BhxF|T9e;@>1Brln_OzRk+c$$ej3f-S|B z;mbeP)i*RYHMg|(^!D`=hy#N|;}erp(=)Sk^WRt3);Bh{er)d?9vz>Yo}K@``15Zb zKto0b0H_02+NUicfQjqr9o?Z%nR>0La_NRwVwRJed#o>6zwIk0KOcH`h4oMF_yhMa zZ@vBp*wzcAFTV6RD!JVx=5BDSb$+#xm}nt?`{3To zj9%qezUpG0Ifs!6MxIN$BE`STh9_dqt&U3mT9Evh&Caq;cr%6PxyD|?3=8h}@?wvCUT zNq-?8VeP_oyl6SDSxd(yE??*RywUmOm)Go(`Y?4w6gz_veU1MSTDqnBWR67z59N{* z)0^!Y4^07{GxE49{*8pt`Z!VB zXp2U)5(EPZ6-)0?7NncWMu!;qM9q3|lr}VKYY9@^qqLH$!AhklI+?Zd#1$RQ=93Nc zJSbR_>og?oCT?vV*f8ph`hQqqtJB{j}uuL zn}6|Q9ie}6n4FdSId^cXHW3G{tS*!3gj(z*LjWC56wE$kx|3tQi_!&HWFe11snip_VEg?oKFfO18rN$C z+wiPCTH`0e$qHjweyU=n{nX>5bZXpBtGA0T9L0NGJQ-iTI=0hnO6Ny0OG?fks|)uN z2^b-Ln(hj6p|nv?z@6QMo~v?M=~3 zkCzD4-_7?12Jm00V5Mx`Ws8o7M()BfHZzd)dAt%e7~ODxa|!Ojtvs#W-+S-=wCjEf z?GK~`@#lqE#(ANPO9xl_GPYGm;pPoy+vGu)~t|<=pwwyN<;Y8F1l=b%KJ_~5E4;pghS=S9lYB8kQ;UEAeVwF z8|tUzl-`~nS|WDc?`2nvRoSE9Em*e;PXLh|#iXqzaMpi+#RUg7)=crWnYgS}YskUN z_wP>EWN*~{MBK}$i&QLoQ8z)A>*9rB5~1k|kaOzT33Xk7xKTegc%C=0{&)x%ZHSKK zMHYlY1R77?5iwI8WYoEh-sU7v9P)~HzHBv#CN21tX$5(Zl(>#^^XB8sa&P7^*N+kp zTiPsLTXSFZ1(iRqy60O{!`)B+ieYWTJA%=w*(a1bad3+4Nz_TDu5x%#xy(TS5tC@t zx5+V^w#{^5?kArS2`V3?BO(!`5%sqkcY8MLF2>$NO56eCc8Z z>GJz3na+k4_EG~0+LSCI^Di4ziz}bU3iD((fQCGBi^}XN?sH5-WEzc`<-XmqtKofv zqv5CKfAie-PGo9}eF47woVN9A)DES;Y%QqV*`7&5uJg(DkK*Bf0N0mrj0bOk+2*T{ zVxcZekelBU6iY*GAe**73zcb4EElC@-eHE(9qd(?X;hb+oRkg-U(gmb(WI?dz zx040)Ol6x2i=KNt+g(Q$uHOb-me1;&nSJAboD%E`Z%@bo4hN*NtTSMI?UyU}W;AsT zyeyXk{sVhiujMn{-i0@?rA>PZ9A_GwP~5QFj=J2rA#CR>9~{%|5LY#Cw26A9luL4{ z4_ZOLZ)vW_|GeW=rt9!!N#sTclf$5_d^aeS!UF;bV()GBZyh{fCDwcs%`7GjV(!&1 zk6c-loiqsKiD@u4soR1~oAqBm1xRmO9}_nRhL?<>rhF1nnaSoj*1=~d`% z81rL&`c{~zL=wqv`L$1GQFslI>eOsWBt?qLVe6N7Uh6boru7A%R0rJQQoIx)Rg)lx z*HJSvQVcR-EHS2)=t`zn1}8>$Iww3R;uXb*Z97mG4-R15?ksP>~os7#XD`&wtoOCi)}CbldccuM!ubpp`A+2Yqo1d@>{vs0y*+N zi#Vj`iz0Cs3Xk9Z$scfdLs2PKh46}r zUAkg4@a!hG{z|EdSZIl#{Ppz|a6!_Ib*c^}zp4~eAr@4s3_l#8!Rd8Xd5j91ir@Pg zHCkocI_WY|8N<#&Ki&>InOtiaV41_wR1ReS6(=@#*XG6HGi;-1OqPD@ zfOjZa$mBrb>e!e?zo7Zs`CxUtZpsB0O*eH%fc!_6{--*#_LF`F{{6C}z_*Sfw`&=W z7@;5Dt3|(8LWQ^b?unKjv0qC>c>WsTxU9;bsw|L9PltQF;Ov?4R%!D?)P!?xl)NQb z;N0=xi7mfd%zG6kpD6#eG3!Z%g3lmjFHz7O0z7w3b|RrE!V%7Pa^N$$9H&ue#ruJt zAc|kwfp7QZV{B9OKt4!Omr%CoMn<=bo44Y#U}~8%c6hLYx&h}v*7r{ai4RTNvsB;@ zy+3rjZ#GEmkJAto)lS_#dVHtrNXik+)F|?oNq8!G7Ryl=Q*_ICtRD?YeBwRvuzt)k z9qgRcd5T=Gw~*m3L9e(M9Tx;^llr4AnZNj};CujAlx9Vfh)vdDwIadoBXXrBj`%WL z`Pi^PuV+=ZW(qzbc(VcLaJXM2QJ|vUP)3WzEL{XPc=_Y#5!z0uR4*ExKY0OTP0LRl zZAt%3!DKycl)3))T&D5m;bxVCXJc!nyPjS&DW}biTt9fWRiDu>!{)Rj#-IO{q^MEs z7ltBN^_JaX!fN^OJL&3ypGLo%FZ9eXvCFwUqHJiF7m=@aQ?))OX|rr*?TxE^;QJ1h zNPVX+1}d5g_PRKG9%if^g%rWFhjA8!yUKXBCHVEsZE!W?wRSfUN`vCjHPHPYQeH=T z{;Cyn>Ec<>yAZB=9!*|OceIFq@8>Y=-*VxN6PsF>-f6_xkfJG{d`Hdpo~FK)kF(&y zGvFvVoxFJ7;T3$xQB!eRkTfR!bD>H*Pm-@FO49EsiCaByN$>hO-10I^fRwyY|I&A| zCvLvFx;)=SOihzwwG=V^jG403n-@O5S)$*|!}uuih2!L=W9X>EWVCnazFB)z0x;by zN50BDckON@5-&vZW^;u{%dlRF-j&$jihW!exw5zWdwj`SBzxVq-fxPeh{pU@9HxBceRx6^FzczU3pt> z<9|N7o0Qau$$JAhcd^MGDRsTL`y2Fkin6mn?iVOOr7(Es2?_2HpZuZ2!-z|#51sMb z4FZByB>s)3W<8qat~1S=Hx{d(I7Cg-B*}({P0bbofvk1ax1)699KV%)(OY}wy{qJX zrJ@(J^=6$HS$sDm44dc}#pl3Tb0^Ubbf$;ZQ~%%8q`vnipPP5*RC2`kS!|1IRCLRR z|JMrsOZ69Mc#of|_}9t+?fZ9{FAB;Wda4(fwcVQm?0b~1ZA&{cF4WHpRp`c&^%9Yp@3I3b*!LN}CM&>BsWU4IoO7<993Zl41*(^y0zJ{QuKxfb zlk#C+=YF(8!kz~tGb?)Q=rW=sV0}ip{M(`g=Kl2_%K-ON>KMK*m8LDbuZ-nlLr0<5 zC%w#JQH7^$ymL(!j99*gZd_HP65Tszx(*RBX|wGAYD{Im_=wj{R8qdn6_U~*WgTz3 z$cPZbwn*lbt#8e7PvcbnOe2l_aSvSJj!SOM5AH2MHS73B`u#Be7W0JTz3OW!UbW`TYo3 zS$&A*u9;r8Z;V}&rQ}l~0;v!$R#)yigDC_@!J%UA^%!X{LQP%_NpuqCD4jl!m#gzt zn0I}g`toN>b*>v|p4yD}Q~Tdr&;lp)bK=#2*|>&$DhNeKuIynLLu3?NJDwezYIXq)g}iMkAJF zYhz^ks&Cu`YxF&U+6uG9g`l(RTBy)oJePVxx%UJKuTAgWy{CpMZ8h&7Cw~RMNqA zU1*L_ntu(XZ{Ct79tY2w*lzQ8p!aED3@}$!ZTCku?YBTxzk&HolV9m2Qjo z(s#t`MPAhfDNmTHg3?RL+^9^shQ%lbnXgX$bUZ}cUh&aN9?%rUZ3F)?oI2vG9xEd>fB*~4HC1YS*{kVKyg?Pq z%^;$aLudt-P(ey&+sxgTh@h?Le1!SWB~mjTj9H(NVt-_1I$!v1`0WXKV}rg*UdX=7 z_dFD{K@){1&ia5jj3O!Lk|(S0-RTHQomD7QrN$~QUJOxJ1)aTlRi~(GS@ERzJT07a z_)y@W^S?#78n@AWE3=D3&Xc?lXd%_t6wy_!*~$N4U@08CC73fIYdkNdJ>5w5rd0di zi79DcieqOn2?eORKV)MoALcDOR{yjGo_>IQp?z>!w#K^jfP@ei{Sbs3Px_oZS z^*-Y3=+9D~Q(Xt%?L+_hqF;xE#u%Q4?XMA2&=-F7B!)*e+bzEReg&uN!@@oicUzCu z!<$lKPVYC=Mwidr@F~wl4Wkd|(&xoTADhUGDFeb(Ut7NApSUx$p1xeyAZokw4=~{J znj)a$_Rp(#rRj92DEoKmZOcls9--^kP<${swi|F5wJ`tb|2@J9`~Nz^sUY+JL^!2M z$NwKjIOP?g|G$ZFP68_b|0BYA5|un2EoH({iiuIN(Cg>l-Zk3MWqs|Q{VJ1x;iOcm zGzGA2L@@c@UAnfAsFl;1qWVuBAZHLJ96p zffNr`8r;3OQz#N>iv`yL!QG`$em6bm{Lek-uJh%7xgRbwYwta?GBeDq{cd^RXFm^g zr~rtS)XygrKe>W0o%+JPyD~87+t7K%LRl44^4sRXI$_H%-w^Jvr8N3Vu)C^31d{#z8o2M_n(D*&C|vJXhOu zTFd*Se-Y>W)c^qd{eklN@AE%SX;b%H&-+u3 z9nv0G3`QDwTRzz8!Vk`Joez$?7-oOhA1GjUnw<4L7{~lD=EQ0q{m!K7Ys!+utS@8q zfkn8p_j`Yr<|lQPUz(RZ!T3enV!Hm&eu0>tQB@iI#j~X4C~7miOv`mwF^23EXPj6R z8h#Iqu%5hJ(M@s1=x;dxaUf*qm;s|pPVX24N43NM0WeUmxY4y%*RIs3)2^6hyQ6ZQ z*~dS~yg7G_H>aU{W19%w%bXj7D^7SdE~j4ZD4qNeK(4ePx6D1do*n<$C~fQ*CyMmZ zq0*_}RwS$zHy`()%~*EkJN5ZRO=gDtjn6o9Rt-L1$Y|Aj_uI3^@mMum- zM^%xuh;MnWfO0TEIsL~mBK-EW{2zeOAD&*iJ7nyP#wPyW-A=$a40(gy3Wd9tTIi(Z z?E`2lz+*G-Y_dsUnC}9-i6E4iJmIaJO@MNs8s0ctNVj@JsSaY4?;G=;YCjVx?)l|EFvXQ?jfGnc@` zg<2uO?cw*7ZZ8<@-2!jeV}A?V{kE;{U0Zta4y$xP`WIesMn$cYm`xw<^*(&qR*FM;d~hRM?0E27y;%u9BR* zS)^M!T_`MkM4<;qqe(-fe;GE1=GGV{IO>F9r_-~!;wUTYS>%#g%h;w@&Au4f6?6Y) zqIa8`_EwS**kwzA01?I| zr<7SxTjo5u__KDP5EF+tkBiKlTZlmWZp0bi4j-sZG*Yw2RV~ukB*i>+A`at8o%Gmo zX5+=*KAWLTL%GN5k*wQUWyImR4(Gd|p?JG}yYCYC66M)%Y+k z*!9_o`yW70Ti^)vY1*%4%|~v(k-gKYG~&KNiu->mzF+(za%>Zf*=&6OtWJ)^Rq_u{ zsyFW}Q>ctSZuU~W{vrFa*ZFIm<%$C~x};EzgIz9s3@w0L@oHALKg~{1$_K<(AN@|_ zSGyFPR0E=SJQCAgQN@4q-;3%0wD-RPZMQK-@m&;)OM3(MSV>5~R9|TwyJXol$v)Y6 zdOf?vG2KRGDK7)qF~E*x;8vi6%2LvDaugY6@-Hd*jZO+**EqjzN|KG&=l-R7l0$XJ z=VaiNMgQ0EgEh7N+2W34DDJM4`;FdJKSXFXd6 zeEI3=@vnuPfh3RO<(G>KIfbcCIw+Uo_GJCp?|uQ@45=EzrlTPJ0xXri7Mh~~>D;b7 z39m$A#oVWFW`pDWB~uXwO-Vg8c=Fl+>`J>Yn3c7%=VgE+%^?C{L+^9}G&8boWlB6c zwFlRRfv|@1I%~z$-{!ONmp(^<&2LX*;gg05b*r6^gwZ?7(45aTRU)N5cRQE~cHtH< zO4=k1Tcb}-x=%XGbox`eK@I_xG^(*f#3kTEtD8y?kWuwA0pH=5%|t|eM)K=VUyD5F zzTE@ynEWTcSrr1%MdCnm^|xCvYgiEZxi~i z*~&Kn_b=oYb0rwK9qG4*Nt;`}c3067R|4S=3c5qUQAy>M37SJ;QCpl{d(#%QXg zbMPOBj;k_DaogDJpQL+wHcJ&gDKE57PXjBaJoHA&>~me|pyxGjYon34mKWW_uW>m? zsmev>`#V$K{hYHDYH)K(nCgHAJ_#Cr2U7%)xFk(kKzhS+P;OK$LS}nEF1hmFL zn_RY9tDk{Sjp(UnqovEn(cIH^n*I-m;$ypSc~=$Je9^!5v{mfkqM5eeo_xay-7HS* zckC2k`N#mMw#8@OQoPg2(d6bj=&P+uN_`V<2D;C9cSvn!#qUw zxc3^0l=_r!N-C=mFOrB#kemMs?+9ofrHq@FF9}&c{`JT2JeXh5h9SSB0F58g?8k8# zM!MWRC$;N`dFah=SqvW;d=%W#t(jNizEqrYv2{y zhQ8)r*6Lg^DLyhrO_0hd5vH1$?KoIrY#n@n|^C`O?rJDJWvZ7R`efA)ZDm? zC3V~mAnuzVDTH=db@r~F@i<(mEvn`Gd@yodRt_rugqJVC5M+ED9N~4R;cFOm4li4# zO(*U#-H_p#YtSM#?jd$J8wfM+K;JppI%To{#7n!Ahh7CNLeI;XIzE1Yc_$gUYB5cx z2*wynr9S!@sz|_gPF?B$=hY=rEA4c78T^XQ5@DcU^3hW~>hnl#bPuib8MBr9Q5aUg zeLH*2JH1k-*p->oJ4Mt_uW`+ou&+GC`qCdvdW|g9faMw;8N~iv`%V)QhUL9ZtDkrJ za!H?s(Os}vT6I}xT`6nGW7!UXg>!yPX9hL47N0nhmQ^T$Vto3mwQ{TXdcN?QXnSsC z#ejA!@TZ}!+H01*FgtD#QQ(plNKOQyMD)d+p z4SS2FHZFAwEJ&wi7gTeX`=}CC8>}40G#xlc+^t;TUX9?n(Aq80;6%iEt-qk^S8@P9 zr5Gq-Rsa|Ng4T{;t<&h&351^FCyco(UqUSpVu>%%!0s5_U~W7#s+EyKmVTe2mkC!8 zaj!q(!_r-x?)~l!alHrub+t8eJ~pX4^HoLA>X6sPc@3BwLr@;cx(IRZMxPdwXNNWK z&%7J|1~4t$AA9>7co0AWuc> z4>fxaYgl^yZJDj1vzbM?YLG|J4T~eOw@Jav`!~^K!_)SFA>qp8E$|>q$#|}hGcz8w z(Mu9VF+=lr65WDMs-j_~5@=L@yVtCN0Mc)u(YcudqYpN$B7~`uS`3YifIstRNqZ0p z=JX<4^FDokU&;Z;&vA!6BO9W36^5Fqg8Fe5g@K1*gjD@LU*n2C?DeJBJUr64#qmQY z?3jJ%X2i){ZbVrn_Z~baT@qzon6BkxmKDd-29(CNZKYH>vnsbv^Hm)@PtEp?$ByS& zka%(YZ9&~8N5|*Th4dKfwB&jwm?6QLz9nHW0jJ~#s#?K5@mo^)9gLr#QP5dx{w<5C z&nyFp9^I62)j`#o(KrOO!i^OY7-{K9ej`>`Tl!7v*=rYmCu=ROrLEQ~*@kCtcjNc- zg`Gnaekz@o)0pQ+F>l<|xp9vaIALj*_cb^2W!F4TH4ukh+cp|l@mIx8ITfTz@}wot zcD26m?pXx?)@!>gV+dXST(%DF;vCdQR%8Qe5OHJ426p1@+5VFP1IFRdq3ZE$Dv6g* zT?L;IFywkwD{d39d+W^;t@!D^p$o>6y7;=@!Ij_ZHwTCc^RarRO9(b+}lT0 zDbPM5ZK*T5v@5phro~tY)_kmuM`fqU;t$8}!1J52+xXOQHndKCQ|Exl`a4POD}qIG zlP38Pe9;OwuqZvCyzc%O9X_AYL@uysRN;w-S=K$5AE{!?tK|j48O629S_u+XDmB&o z21+%KLE~3R7$;<}wK}`~o={Gs{V}AjU2uoOW2^QVApoI+$?x2{p0%qvNqpoa{f-Q0 zzCU67-tlKhH};+d{?oExQ~2ShXhv}NRnb!+67S|MwLf{TqGvP>`xnX+#!VS~vnc&% zN_4he?Wk(h+6dQEM!_(Fi6TcH8^~t-R91yD)0a%Icf87G@NFJUSc2rb`ucipZHkY^ zTxxAi#fw2^L{q8AzbSiG@P}FDs?f0?(OpwCuk`4 zoFUNhja(CJmH|jx@S$UT@w+N#Y7>F9_bFIE7#+*<9YWciKFL5db)?&PysRjtADkXV z`@zbQ?}%->PMYLGf^?U=g5b1Z2%{v4)66|h zfMWL4L4(>C8w1zG*7xo3vEQ((1^?V#qBjP8YO)I>>3id4D1E%Kls*yFe^xOk$4a6^X2i zsH}#&35j$D@%Q;F4Y^%es%J z`SNh_i0>){k{<+S4dF?n1XP8hY-h0dK|V!pM(bBc8eoFZr1N2RXwTiQGP}QTn!FXY zrYr$fjpBIF3nxDh@*aWsO<{no?3wkR`852bLMwUl;UF8#Vk5}XF|FbxU;HCA^Ta_G zyLHHje-Pz*Hp>b9VSDhFx%$stY|`8sr)ydqt<{fT&y`vGT0{UrC!=|njMJ^8R8HQ@ zG}oz6vF^nE2eD-cRgC(`uwPE(-D|rF6QqRTT~#laMA7|gcF-=H8+f$2n)AM{cvOH6l@LY#H9ubF}CFrOitBl$k`D@=Y zavkW^`3LFc{&scfnRCVJsYp}q|Co)ZoBk=|YN*EV+WO>SZxG{gU{{VmZ<1L>ZDPbA zSc2{k&%?DEm#p;?vGLr~?wThUC#828rEB(5`rcwa%n2B42ve_}u#Y7MwIP6MFe$4>VQ?M^(8EDmX%^U|1^`+WB$d6FkVw4HC} zO?TE?KGO}cK6w|Y@wTyRmd1cKRZ{>n4Ti90i}`7bohY$Ed(I2dEmb$x#!nv^pE~4j z5df2R9;@Kim1otWIVOZ>D@j~0Jgv!<8oVfBvVs^s8C@mZ1vgQK4>j{90x8%FF_g1A z2FnVIPil)Fe6f?d*x`Tm!Ba(BP;jM!INTgRXLZ|}w&Aw@qrl9MSJcu+@QLGoC%$w) z8H!z0>OTN0knYXoxI@};(@N2=_SQw@3CLBx9DtqI8Wmu}5MfPumfoje)M4yNgI=E} zoxyJP_gFNF&*;~1FIoaM4_%o)g7sxmvjm78ywUOAg889YrL$PEsX}879X+U_IgO@_ zw+_l4L}&j17@zb7&!~1f7ppKNdE%%LI?$1MuS1WFOO!0}U6{6{k*IQtlSZ|gqGA=1b_(@gki;G>x;El3F!`=+QCa2GvnL0mg!UC~s%TMwF1FZS?p;(#N^SCN%qmhV;#zkKp7rkWst##-y|{My5jE5Qqycw90|+c29?t8zo%Vt0qxS9+uTig z7?0O@kno<|Y4dI4P8ZceoJ2YI+7mkO9rF$!LLbWa8Y?ILF32%=1Nh;@s4C`T!S>PL z-eDxBK0S4Pz4jZkEOU6$cPpup^YtG23j6*ly4m?{PN-!=VkK1T!RTf0 z?abbuQCm0mKE}P3c<^E8_5bYG2LIpqwINEc{sr6>783qXw>C)V<^Qc)TSySI{Xg() zlM`Z7Vb$S4SO7}ofLG-IKjU|aaUcLCz^lI)-lLsgy$UZoafgFLiFbD^5K z6AqJ}1y$5Vg+)ccd>9wrbI#2acLku10+6u;*pMNdOQVB07cKyA+YdYfwiM>W zyC|M01wP=E^eLzUHZ))*DMDp-)TTqntgCQxk(hq~jycJSPDV2j&Tc(CGGat);{8n2Uf}JL2Qh zFwP@2HQ5CvN714KB@;2sYv`yfhtG%4$G=34!vxgAcQE_Ezo?RlByVF zTtyA@Sv(!NG&oE&8z4IURG3ez&E*f#iBGXEdj1SJPn4VK?I`s3+Ls7>U{p01sTtwNBLdEj>b|?0(lmpgk(r<`KP*@oR21-{D`Pq^ zL000%HG%aMZ6nwPoQdk!fWvAJonfld2{8_N;#s!;iOI{??pe= z3h`}YL{_eJiQle}f_C7mc~PBZ8wNYsY{$j-DYz$@D7ENyXAH$30Kt%2m`*;ppg)<2 zB`V3SstyS&k>o7%0lmPFg+RtLMGIhDk1%yXS?Yr8wjrhD5JmDK(L*>z=K@nTiiA^a zW5+Z9t(L&A9sI{Jbr#bM=*Upz68|+u1v!jOM-xxV*kUXU1`$$Kw8xlG>)%QRzbK);zU z0wgtgSho6}2xx75o|TAx&*-s5 zF9Tz9E__&8dqtIpWTd%6hBnDZv0LpkxaLOLex2adR3Q9R5op zbEvJ&_nGaoQL?61z^UW(vGuCY)sYT0se~>gYY9tOeDuQ=yGBKnz&^(Fqvy=Z&}ZqU zAPPp((a^1FPHvC2psCN9hU zIy2vn#mL@nuzm4B;5od_0T3f1#Cg$CRqlS zOI_Jwoo}+9K3tDu6?7w!J5{d!C3nJ`gxoY+V$HW^QCiPYJtJK@ z7WpKfskfZTS8kQ?K@XBlO$=jR2>(bBRvqzk+hUlbJf}=6=jb7P%o;HY`ohRbbo5%% z*e6_PVvB^&EvgL-OrC$rc2vL1E8prY0iC}mgoWL9{a@j{Hw7Ft2x{ayTUz2vp|IbyHX>i~2Sv`*?q0?Dql z(>bD&o5yO8LE@u1fix%PrUva(?=5yuUmYS7WPbsIKx=JHRo>;xom1cNAi$j? zM)Qb7n*?#IZ6*8Tlv{`k0D$hvAP&IP<)&-fvK*7A+-cWsWGWXDu+%|9aUA{nFzBF! z_R&|s1@LE*&Jg=1I=6Hk?hYN(yJg@f!jVcP5B>~ulcoyZ((-|a#UWdB+w6*Uyq*GTVl4M7Q9|^bhtq=uYhkMVGICPt=`= z_9j$`{E*<^wohC=c2(Zz3fkSmQ)VR){_5!-R!AP6=@XooO(gv7esR(lJn|$(N@cM4 z=2Q0wSC_4;5X{SW{i3i((x>pAJDU`7PF1A8yx^`{(b=?_Nw$76F`c#XG5CiVA?%!q&ow@rfe(?ZU#Mz3Etp zcTv%v+H@kO^T&Y^02$lWOD+owS%o8PKP!mA)FD=Rxqs#@9Jsk*FxUK0Rs2VsRKo6R z%YPekg}*&OQBgtX3lmin9aYXFn6A1XH}5)o1AXb$fxs!gKwsUH+o1@9769^o!Pv!OG;e{z*2 z0AEy=rQ?#h=a|U#i+T);P?y++g!-1wlu4&5cBL5uV(5BG0@rVsoGli#{O}fymVt>=G0{c z85U`gC*cdFoR`|D6KATtN~EVukCzorj${(!c|jLuKL_c%H>L{$k%7SBKD4C5N#R+8 zVBo){7#^!YWlP_4xcw#QZCkX{5i*iZ~b_r5>pAowpu z;gkBPUCA=Fn4#DeOYia#2HyBjxt1-1y?^|5w#ZLYkyoKdN(iOzhK$Puooegv^iWPl(w);in4y0f*pU9H0I^pF*d{@UnhFV?$F)A4lt z@Y`M8fS4FV%hh)9gUK<^s4c!PaUK%GB zDpOQMccu#7#QZcZE%d6)fnd3)h@R{3nEfBXBN1SOjv9HSIA%3<+~zdJ59Rg>fLPiMz<^ajC4K-2NU(g zf#W~u^PLp-z5r!^mrRpP>}%d+PMqF{`C!hIqtF=hbo)d*Yc$7uHp|ul)bm;f9qdA zW9#a}^)rwcw_&rxy|t}lUSMVwhk%4-ON5P{wE%qYNF6Jwmwrjpw-_+E8h=M0Nd{^eF?a&u%gJji%HX)ibdR$B>{3Gn3*n8(cY1<_Z&f&);%5tC zucBf-j#Mo~%#^W4i{w9HI6r1dxGh5lH22+O877%+&4|fk&rlJ(KSIL^T0{BRKwtp?z`NpvV2)!w@O@u9n-km zNy`n^;E}hiWgM>r36un8Dv`z)h06wkr~`pcrw~0!x-lGc)42Tw(cgR3#07J zQkq2^f#%2-f^f%-4QdMdqCtd%vFWT#=Orpn&2n)swx|kWtK_FXQXkTc17^P4_^lx% z>Ypwz`dR%eud(;*9F4kAuHN6`6jT4S+V8&?Y~xS8n)eOzh?St_$h@XEhg{`Nc^nHwqj88``g24gN$;i|K8TTHfpQAm z*-a&3bCnI}%hkQ-ZtGw{l@j&x=W@-dy>f3rV8x8yA>bA>kb?f5oJ9Oax$o(WYZNppWPTL(E_uLtPa_bn$nRh;90dk;IxOdB?Q-^u18Jl`q~i#; zP#2?6)<6gZg33;rS7Ef$)&#<3MIjop{v7FVc|%r;eBQ@gd}=gTdLbwQJ?Zz%mONqW znb2&`uq%udo5?hD_2OWa*z8DO6NypSKwf%Qh@=wr6^alqXI$1iyN+Aa@rC}$ava`x z1?76wD^e_3zUW4X9>9NOklKqn);<}7YJI3h45^fr z^q+WH_CP;d1*@YooX8jVg9v!Y;OMhqm%w4`!-s@p3rmefkP@sri@_?uWMuF3}xB_KsonAIpp zp!6vDq9|*CB*(7fXN z-wrCb&#<_y&j5P|22E_IxN#3igHK8%luwS9!3T?amlGe~^V7%2XY?j)s1Rcrv3?-n~9V zH;gJ5yjehzB9*ekIzSi@pR%a`@2V=?0HJoDM$?ZNEsFMJ$yK5qi*^Qnv9->#Z#0XUo1u6=yNNzn!74M)VtfORt2h@#wnFiAx z=Guhkf-Fuqp06%r)Kw{Y>u?DqdEh4`HN?<13fWO=kevP`>zDduMNeE3Aw7`!EAfY5 zHal$@G-!)~H;Zj%1Hn#2jqG$cc4r<$g4}hIwpx;3xv6D0YHtC$q*Bi=D_mVJcw)ZD z_&&V%{BK7d$*fxh303^}9-b0sTI2|tg1Ekwe@~1q86KH66B1zFqJxl>YO{ugkSrOq z61mdu1GB4GW~&qRYP1U zqWqkdmW<=pXS22jed~Pwq+5j*aW-a9u??M*ZBe#ZjRtVg!EdJj&ts9K4IDN*Ur96X zO4Gp+$)UYH^FN1(%gd60Hxgd}vS!mI1*4P&OYdn#Rv*(V=u8Xyu0@x|#rN}e6FXl> zOwn5_Wpl!!XZImL0Rz8uhut}T&%h6PeU4?>(Q-ow0EQY4XTgG1~pGOj>}A8AZ*V&a!!}m50Y`fpF_T z0py0IbOAsL&9Z9ijAr4)Gyj^)Ev z7AJAM{p>_4K(R@e2;H##QljLhHM0JDI&RF=Ng*0Av9`7T z-JyTnwUuv2M^vOu{J=yrOn#H^ALqXv;L57taOX*u#f1$meqT?NWhp#!ouzj`sU(Wo z<_;(*N2?4hH^2_(82&xM$#FEhtboi@{h}Jd*A&-xi)1WPK9R5^CN-l;TJss9VrT)8 zYp#}wxoZ*72dnzA{{v{j@cxjQBRBSTbnq5~EV@$dv?lFPN0yz@D+9h)l;=|EZZ7A0 z##aS}wNZFHo9DE>QH-)j7OThK_m{3&IJ~+pug1MZs5zaNUC#^?z)d7&Sh-J~!FWZER%6q3eLl>@#Du8- z#fhF!7g;8C6PK{iJBVX^iO=)ZASKF83)V@zzIcA28OrhNwBvzzznN^+4K$x$cH?F? zXnNV$WL(sY!f9B-sj8!{G2gX?ZQA3gXGD;@xHsf=Sp@}ifd2#=(-I{;o^NHZ``b<# z%FX&m!)X@)T?&3h<%*^g-zYoxZs71|^fE@pz~C^_(mQ5wL`;8Js=t~q`584qGIU|O z+Trp!)FX*=Py!ym+z5Fj_Qq8=0_i?%uTpGc+RLJ9vAL3vcrJSns%5ibPRvjI6IdSF z#3CSwt;7M(+?K9qX*AFwOGF@AM#j%~%n2@S49dT=P&|gGQ_o9f@i5G@Va5muth2Q? z(Q4dvr8l_A*41L91Et%3iLm*aesF@SB&hO#qmAdo%h)Snc_O);0O5v zL#lu8Z;hW{(%;F_Cc8KDD!ud5m)?(ISYlYorL&UQ%9L;T@JRW_@nJDoVjAIfyROBb zB73A?Rdv;Y5+xcDfls#?)Ww-RPrO^GZ;jW&Io~tqF;=X4G8p7Mw}|8j{q0%)JM!zN zE)lwsfYEM!TKW6&#@TIEHazfQpp)~&!Bcy;_HR_WCxyr7T6mp{kCp0-3PpeG()4MS zu^^%gi3`z8D>&iThsB`i9Ebv#T$x&BK(?EJ;AF`{t8A8y@PWqw4~L!O(ZvEAd5b^< zDRU3yfSHW*;*k~{v}v-Lekncx0CXOU8Gdrgd_8+a1;D=Q-qCCx7$IdTmVY+5lf9W2 z&$N;f5CqC|a5<&3yV%Tcj47P|?7kC!L0PH6KDm&i?p;n{>OLZLQGzU?)_rFQk6&`i zZ$3UpVX?@aGNQ}YP>tduP{uUTo*;xlY!G9{7hmV1(}lKb4SVG3%}0W?`Pa|e%h#uc zX~blyvR4LJ4?k_f^`@S)MaVi~DO*#mU*reUT&#N$YHGSke=Aih8pa)A5YZG{%WV;P zIVQ|+Ol2KJKj)@};c0&u?(U2uhnMt0WOXT>?Ot@Pf(R|@k?`h_N0qeBOp(GVE5Z%1 zr-zqzBY>(>C^l9SRYsxyWeJ1L14YTkZ{SjFu)z^u&z9q8EE3IDd|3%aJh zEHV6A^MF7)&j0suuKV>ExcIU}*It-LTt`6^LgGLmJP$rEz)U-Um^h^lCf)(m8K#@m z({)#n%Zw7<lWFukf2EiYO>HU07Iu!>KAW863hy@$ysF?By`eHDOd0Yb{B#_CScAG@?(?d z6hJG}@A#F8U3A#EIhswJyTg}jkkXAAws$Zo{5g78z&x<+0~|`P$bHZvuMt*_{kW7; zQ7AM~=)gqhe8kCR?5!(5za-Cp<);PQ%4^k9IyDFG{aK)hj7mKm3(g=wx_jWy@%5ODAy zM{7Be{uEAiHH-QZj<;(?tS`l zyzjc0VWV$V)sQi`>_;|xj_GOt$Ftl6k$}|x%4n;(8Q*S}wua-S)b_Y-wll?Je|B!d z4pA2yY||}V;v@NWgR@z-C&w(BuYVkBnViQxl@~Di(ps-{dQzvvlcR3wZ&+yG#tfT^ z9L|(Zk4pxd{kF!Luj4!aNIlm3?2Cl!$%zrN_cAeHlOWNL!Rd=M2SdZ~I^#)2y2*3I zA^lpc=n5k*^d984r%<2O+o2OhhqDncJ_t$yTedm+q|q&7hbV-{RQ>Bib0g!;hp^SF9t6|JW>X zj=Y|sy<}@{bGO?h6-w%%o7g}N56*cCkK9L5QBDp9j0s|Om%Ay3Uejg%fGb2&evnf{ z9s=}zFDqMxjdYA`gx>|N;2GvPZsy3vuM%5^=z#I-{{gHrgc&kA%wIEhgDI!X6P9Ag z?zUx0x3J~lp-09uG@#GT!w+iBJh#8qR|`9dyw9YxYS|l)d~3R$8Q8-9{PtvQTC;?V zEMtW`XObXMgUd zM5E)?6Q&z3aAyxCHS9v-2_>CE+7q0|2XJtfTOPJtF40-?OYX`j!8w2tHHp^2b%CD>T6lim0v#c8`z(qxyVANEVj-pDc%+P-=*Su>GqV;%e?L)Oz z(ysu(<`c4QP!c1@T7l z#=qpj&CJTLDZ93?TMz8mpZ58pTaS$Ae~?=<5nuw*S(UX<1OdK1I~L}p(w_oZKa5%% zU4>&}M75=l(zQ-kwn~bum(DjklypaK>Sv&!HL+~(;q3O9${R4a^n>?`?$G)K8Qqq% zr3jzcMJ4_Q(xNf%ohzP4n|~6O^$=*(7@3Y!Q-z^TVN3EDkQK|!;`-@tCyk$lXonG%C%3jXVv(p*ScgyQ zhd|VA5((buW~?fkg#cI@h=bm})eljpJG=LXjS1Y;rW#=JyN})+a+gjpwbs6DCM&FM z8BksieDo&x8~d>q+Y=!TVA*%Of+EkPHDNhwHmkxjx$h!q$xa83@yhp4ScNT>Gqm@5 zkh#L}?P-yZYSb{=rNj_5*rgF@mNY0KGCR2!?rA#S`u75g0q4y@l#6N-vR{! z706T^-vKouuB`9oekaZw>@qYI0Yc^;CYI z!~yS^^tm}n?LWnhpGpd7&y#RBe)^*gBlSJ#NEAcjX8;ywlg@J9EhRgWY>_yx_?8nzYcFs4li%oCeFn}@f&TAt^%&F`~#MpepM}|tXoe0*$Jop zf@A4XGBYj^Muv^S{hg~@MgS1#PGE>1YFw*d8fc9PyP+U-5IUXVmstwzTml*x<9ZLw zDC`I7H0UTvO}ZcG@A$7J$6r`fOl%ilmFV`Ag#VjmLQq(0GP!#0g8&fnI_x|`^wD0w z7e(ksCOSYyn{~zV_cTY0iLB+dYlp$V3WkV9Rhz73jm5KJ?G8M^-~kdn|>j+Hc?f}Q`WC6O)F;ccd!5lSX0bkDVcSZ zi7aL~DI;zWOGw~YON~@*Ll9?kr&v`X&te~&H1#FaI8HUO1^VkpFFrQ-(k=$oXTqYx zF&yX7oPDZ`ux&U9^#l(%Sg$|I;`Rs^z+u%JqXdlorY- z!?r);Nt@3q=aPCZ?>&u&4)iv*8toJD^b_3=^juh<`GOSJ1P$TF@d(5{rGfI2m;oYY z#OqAI@V9~9F^MmD--+9YKmu_I%G~K0fgWgsN42>(x^X5b)#H6DTW6ds4b1i$zi=~} zWkdD&e5e^yUvn`1o^r6(rLNpdeNK%tQDtXVW^2E>Hxs;J=E z*7+4*h6vz(V3x8aNP#cf?<)2i*d`vbwNTUfUy6#+GArwTwrwx)O`rY6i(0Z$W4Ob% zbfc<&tp>KF54`ZiKvpm)78<+AgZ`Nqk3s$io!?yu#^`d!bR}N6@O7va%ZBJ5>bgpW ztlx)qW=gE!Tw#} zdBZ+S-`B-*f*nuVQwKez?x$kWbPwD}vr}?O+zp-=P{a!uo%C6l7u3A@S8lLh;7d

ll05+|47GTvjq$bhA1=A38QF{lzF%?C9}t-2FYBaOTVY53SpWe zL5*I*!=|xNeHJ(!P3z-?qIagwqFb4>P4m!EkfXqp?_+>A&@`A0X`4PaQ9yVx=_DQVj{!)kHT-H9}ON z15Se8`qr60v!;wTKXbf>>K6`x*JAk4uL6)nn1L6$DE-$gZTOL%h*$>5kdO@Hr{7zNMDQR`vT_-v<@gev^HZc8N-w zj?CQRh@ezXq+?l!%2=3GqplA;4>SIJc`1T57_=lX-SYAJcpZIOqm(5mFf-r!C}@#@ zPhe>M!RDQYl?e`~#0$s&UD|4Lhg%dJXMYFQbxl5Clo;L!U!baa@glT)CY2dZRbQJL8!{Wmd)(Wo68un2*%8y?Db)}WJ zZUGO^f4Xaxf2(-FC7TcPR`pi(1Xv}kVVvUme=jeVR^0%dGngWv=4M%s+_ITQ6VY&^ zduHTiz$fZ%P{JBru-#A+0>|R57Zl1wk5!5_Y%iHI^LQwN3qE;OLeH?y%qbM#VVKZZ z)R!z?sAbaG$!d(fltH6?nfZ&AtFxCzU7MrM>v29Ld z3mHuI#67QCV5IGEVeV-DUu?Z~T$69#|37ko2vQ0-LYSnYq@z}&I{9SObzn!@;&5+I4g%EWsa74NE;K@VMa^V&T(BW0{4)=|}Aj5#u!M-x3nG0Dx+`|25DX2K@?ERX>~V5cao|}ZS!cb} zM??s!+RyZVL%RkV{uo)aaropTs)K-SDL?9QySydJ_5&>3dW;N-C>l0N-}@$i!FuSk zKALEPd|5cq(%5l{Qisdl&*a-(CfKy&Rc&~{SQnY15KC7NHBr=kcJo6!iUq+6b3c`6^`SO5goej@T zAS-6YC#3;om@E0wH57e$Uo(^oHO`54Ruh))O@8iw=0O_EmBHNMlvdo{1*`;!p)q$pVVbu-z(D?p~ zVZfDslB=8s9_WOLXYd13^_4QiQrWCg7uZtt5#e$OgsqA9jg(S(a(IW*?{Fac$T+zo z6RiKO%M|R`MKI)3_SC71YExu&2b=t89dYs%mOtzOchDgEN*)J4HupL1_Fj7i=FAH_ zt&r|X89x0}X%=`A8Ubv#U6;@*oEC1M$*nhU)WYyC%!iyd1!chX1I6Xe(M z5E(CZ!?*9~MV+~K+FKprm&kh(m2_VHo zRn==$RbnPlZR>e%W=$jN4!`B`#*OVn!_OVd!*R7U0e7X>A72#0wv3Rk)Yi|YT$K?; z8ZP=z=a{4xV0NCTV-WM-3wZsKrETN89(MyZM5;HdVT_M;(wBl`8~~_-J*t>Id~oz zD`MUg^x?v*`UYMu%3wi7@+y!RbNdY(rEFjreP`w;pWZ4F_3|K}KpS*icT}Z$T+?K( z)3uU|E0x*CC3#aSr_4K0v%W3V-1Yq*|MSSsiVE@CJ7@cL5v|n-<+~?wySupz;>6No ze_EwWak)@4*X_rRnKYay<*{V9N~`y2gx>q-b#G-<7abovX&EunUB`cW!eQNgr5rUS zZlSgDXD+8XEnmt++A!eEM-U;cQt8MvCc%0vT!QQ+%Y0|UFc6^S(Cr*6jUvokjvM)R~Vkh)kPt3OZP{iUzu ztO4SQ{gvVqPT8%^DZK8~In>~c4vSfFu0JlDc0(sdf1LR8qkj_?g+*~XGk8&a69d6f zDbsV3nQb4~HJtGd&o3vxq?Xv+du?p^kcn;?JN#s04RXnHG@4t#pOq=sI&q>Oze1Jh zKPlbOPz&Jm8jgP+)WK zwNXLzB=$^3seer%bhqi-X@O0u0sPx6 z(y=d{O0aIy@j}*#jo2aY5`BZzdYVr*9P@z1JBK_sw;2@K!1OwWHfQl09wE%qBBPO) ze_w#FjZ2*Wmt;nmi*xMLmM<&PlC_Q4FY_v#qY}kvu!`| zg(t(knl4z8mzM^zVt3pHjPWBg{g!Hv8_V;8cO7t)1hD)By$9hWCY7!hDLL5wt*JW_ zo=cI1$_;b@-LDiXBndqdj?J~6pAl?5Ym$5W{iiSaK6isx`*fZmNnaG0V&&|#yj%c? z@QJbLM*{G+#q~T6>(sSH%#X^=mYvQ%p>JOi90mwl19lxK?*E z?k6PLu}AuaqA8NiG-|?)To2_CFh5;a#gs{+2jYJLu{U zOi_1;v|%d$GKtd9R4RQ4S|y*8^xC0tP?RU^UQl+r&iG8vqTW{Ky9#l&l;dH;4_-^kSDA}+ASLi!?6~$S;W{>VIOt^<900LxVK;~vu zIHZ%9gcHNVF(yit6+d~0$8Ak&4}#FyoVy0E%_a7Im~1nnpGNKv{&=KF(pe(bmfiZp zDivuKm3B`Y53R>!GBRgfGtkH1{hfp$}%i;XdEHn_m${v!cY5EQR3W4n2#-=1<#o1`)gxnRl@xg8*o2{`(h&&&r*7>8sTYJS6b!!E8C& z0w?nwC;Kxs1VGu^i7pZQ%TJ{L{R3+whg zMJOyTUcH9MMKrYOHP%C8sa1ci51V)rp3)Ae^ZYnu>gZqQ6vZ72i0XbU|JW(lOY-Yg z&L>QjNLest>1}@KeSZoX2d&3tBOEbsBvBh58U+UhGFF}{B(OuA`Pk^4Ble~Qi}Qyv z0ywMCGi{wDEAXj6zIZ0I=~r1otLT+hYj#=Nt(d$F;QH$?kH%0lYCdR^f(SeO*iiH` zE8@It{@%u*LxIE)p^kiAup-XEg@pR)e+UmQH-Wqm+v^jm=H% zx=r`}+|}iA4rGCGi!GBXGvCAHLDkqILi}@$P`)cu1t>oL=UQ{+ou3=~Sf-z^QQA!u zQxr;l+iu47xr>sXqsn~lJ07!5b7rZNO&NiD2bS@GE7chvx4URpw=I*@CtsZGEn8=L z4nM}~z=GD_8*{w0@UH%PR~nY$FSU94YsIvr)V0SICIPxceLJuSV+_cAa_K*@Q`6U} zr@tD#g7L;xGC9foSQuT1`OWQma1l4mcYNg_=WCPKqRO<#NhrO}kW zWJz4A5A#|Aq;ogP^ZpMo^#v*LH&41KR_F58y~~2>L#;C57dhE8l>!Zy@!R$c7%*C^ z6LF-9mRSg)ZZw*w?0kHX(AUrOvHcm?iYj{Z%RKqUXQb#lD*ZZro0()+&FoUoK@P9H zBmVa=6E@+FVh?_OU`sp#S0@gbTu|CwM=bXf<-QL#lK$O?rNh3=Rk!fVv=8;O_6m}Y z@hC678fepA$cO@Y8~ksgPZyHID6Z1HSl#=t zH~-hl7MZ#vfA~d@Q8a!q88Z-4>KG3F1@b-8iEOP35kyRYL`bRy*%sVqiJ*5wp2YMu zGQGevzAY}?#!T)J;&Et*GiJVNyHZ4%`M+H43XQyA$*`aAU{OhAazpj)_kJ)7TpaUt zTl0x?T_A+?6r9?QY%ZEZAc*chc-Oq$LoF18S@v|kiaomQ{K&XjILYjaXZ!PtW!u?&Kv7Q5j zCjXTYg&!8=YoJIwV@J&s1VhSPrU3r?On*1s;na@P?RzTF_e!tXZC?pXJ2&wIOWj4S zka5rK+AbIII2;@$#)>`vF^ww`*1&l?34h?+Kmj|n8MuTfqDNcm{RN4k>YT)RgLKT+ zx&99~0X~KAQ9#kcwbG(xR7EbrhFd0gE+*O;3&%A>j~9tAAt0UL9y-Ibe{v4SAK0X+ zzl3lA2}X0!Gz7sLCT2_6zF$8vb}2oc0lf7`?2=6jQ?wLrvj(x}$qd59FT6ni-$-Xv z{$Ui&9>Q+o*x{wHKNXAfT%`O|VvJ?8G^s6%)fZpm#m8%9=c>9QjD-m+J}=nKCJ6U3+^rWtf{RX>Mdj925eC9#@M^-B^JbHTt!y8CG z-|d<10=6yu0;T)aFQI?S&>p!Xu%t8r^F#0^*CJ`<#FtSs)#xbTfbj`By+KZlg4gy3 zmTthtjpaA;cW{M~YTE5~`1W1%0fy0510F*Bxjz?n(#+46I=k0A) zHq%)+3?A=_cP0D6`uV|JvY!1ja5yYw&PzZBo5fk;3p&o%GrH6NC~>tR<2#c759uZb zE6HQya2vpV(EYVCQldj+>?HTwPl1rKk55FdoqbB#2JW_lm~ETMIf0zQ_QvgJV(<~R zj$UA!3JqIX7fm5qk9XawQ`!vCJ$IWouEyf2%V78-Z@up z)caNM5qaz%A3EDP5$a+Rb0_(}f-T0f2#w~Js-U=jl7_d4hmTxan% zoyFi}eFx+Z7{l{d%2vNS-(KT|L7#Ro7ZMa^mHX518{whXnjwW?7vr@QE040O&(|_1_nRcW9YsR?56xg`|13+Vj9}j9$?3O`-4vg z9Gn=sdsqK}_HNO}s8MLRBxPaSf1errxYiK9nCsu67R?R)uFUSYK3T!=_QvRte~M0C zt|e6dKnUf(a!-bj{cy378IxXtID+vjL1ky=a>j@z=2FZtE9xG!<+L3fqm6$^F1?Cs zJ3YMe(>a@H-n`^}`JA-2LJVIjW9z;u*Ggvx=X8?w>KJR|we2)()TtHZv^2hXr=$4& z=Z56Cv>@gM_;}STqi@*nGL+7ecC0p|K1eR;im|k3BLUNJW^59)+$OWfR!DEF#KtE={ zUjUg7b&fm17fL|j2eb3=gD173N`V~;C zLHWKN%|mgW;^#oNl(X zu7RjRhwNte97bO$vu~N$EWHu5yr2@*NM4_V{GcG3l~3-6FqICsy5xZFG)C|yIEx$b z?sET7dY=x~C?0%K&)w=(LBg+32%;MD-wGku3kDLpWx|hNJ!ZsY(8m7-RK$2}+l&&n z5HaDo)Av=F$xN(NBjq%-C|Ojtc1Rin>)4!EaP*elbRXto2ZrH2r8@#tf5fJI3rwK6 ze=4`DQT*>=aEiLGuPlZ5ED(qn1% z=#H`BlwLm9u)-A=BTZ^WxbHX|5oK2v(|`3bOG^2J*nHt!DgQlVtI_7i(GNcbax4ia zyx1(i^{$9|AHFu<-xzBids!NY;RWu9VZxY%AHL>e!#=p@N{Q3(anK&qjCtra2Ln^& zG=q@~oLck34^D;S(ku~FgoV-)1hmC@zk9#cPrWyCnG~H`dzbPuSWLNdH zaSOC{^z28=t#pQ!;*uI3t5lr>6=3y;G-HEX;b!XoON*NZuzvi0`~@j?d1|WM;A1Bx zd;E(?tIlm?@a066SpfKs(>rh%z{x9?*kxv&lVzRG{?&XG{>)G1=N%7!FUz7mFZ!_; zJ>bNR)2{DLO)@}8S(BfNhsrdK0TPy0j7_8k9{jm0woUTXLj2a%Re9IWai3W=v)e$rNQq_T42Su*Apj~n65N=?Wv&w(Ju|l|Bj5`O= z?xETX?$vK3z&%PY-`#Oc=PWb~UnKSl-d5KS!uOP#^&KnpquDqq8BqxsQ50iD*cj~G z!RmzYh~~eoea56gQY8H5kuZsRZEp5=0gBw{N~@)Z^OR}sd(?7jfcFm@hoH-Ebcw(K zP=KEG#=c4KX~R9JgwwPvD)1CsDcU+#(fTomKcOW-_GXF+o4v{X7w|Kob?r!_`H(NN zS7lcjcxLRy98pvf`P9iwxvau0gJjz#&iWuRK2-Pdxp&Im`kzbmrTbsN?0g#$815Cb zGbHgz{P-^b6Y^g0Vm!ZcS=`C}^~7I5yUo?ObkIe_5|8%OK}JLK6C87YzV>F5rNgi5 zfX+N5!i7HXvEaDrTH zPq(dM9IE=jla3qf|G8ktcY8Vo>u=7WFM7e4Sti1}evea3Eu zppWPJdP;!LrF*F>LCwsF9_ew*r(T?&-vTiM{$xF*is+oVq#P=O<Xfsj{Ua6yU8*fKh=BOu*usus~^x$W*>7SHm3ff+K zF_i1C>+y_?@NWM^Yup^*G|qZepr83Jj2GTFU#YrSSrC1`C0yTn#mIzgYQ%|2U$|T& ziK}Vx;_=+!P;wt3%w)?8&vdShSU)*ZyRqXt}eS z@=FeDT=}aYt{x{zOH~=gwWF-8Xe0O%NE;zli))tAj@Eg@Z5;laf{Fot+U6+Z%afuS zEz68+Asy2E{vN(X)kfWnV(zT9B%K;Gu4(^(Zb5N~8^|})DdCFOq-KHgZ=Pzmhx%C- z<7jjqmVXqzOAPZ%e!p&}!tnO&EnG>C6%2-=^|TPYg$I&}dEv5ghHH|L9&a2Q*uIYR zJv#stgP2$r%g?SJe;gSDa1{{O>5A{$6f@Au-V87&rEuY}OJd6;tTy@%j@rMy;To$W zeZm(O`WQwI%xCn>e*9qsXh;jjA!)<^z48m%u~Z4|GD7l)W!Q=Lzl`bTBHm z05IFx{#NAz9BJoKiX+n4^JzNC_5T7yFHuRe7X&Lz&66)zXA%NKo0a+(fup^E=4f_->!8eOMPR zw{T+nN?B+3+Nkey=+5ggL{1UVJ;2}2Qq}8l=(efM?k8A|2>@meFMX?c@Ls(f3n`iU z(fTUU&Si*K<<93&;nKp*5E(Eogr5`BOu4G>UIq4Yj5_1jFLQEa$J`UFLqM1|Ct`QH z-M$igR$&R+yq=pVLWhGfdE<#W)Qp^9Gqiy;D4zzG#jALyCdR;kIP0-`0$!%E+Z$uX zpkxsxVtdga_s~G;Boou z4*C+oLea98BAF+?H+FoR_wF#`6t4!6ZiBk1(QUYt>MdRHMLz>b|LN2>B@n8o`9hf> z@pXg0Pw6zs;Dx6gp$v`B-1^vb^$D>1+4fzJTbf$#T*Fk8+(2PfXu}KC#>XeLimGOf zeM`mGr)x)V_$@*r`|Z7OA9&K%Y$Sv1l~SNH6Pg=0$YP5e=K;`?1H}KIp_ZceKUFd+ z#-oq%Tkmmxd zqM#{)We2+SfC*}9gG9tqBg;eUvVqegWI`+2i>^P~W<%zx^+2P7pa|FUKR)Ulw4aft zi@><@8uoXBJW5e+OK+O~ZOdoej>yJ7zEc^fm*myp!z54rWJz)t{wFx3}zn=!s`_rP=aRsEq#Kq`Va_(Lp8IF9XqAa2-C-1y>8LX|$aa&Mo zjE6q!;1I68AKXVM#0Ineep?L2#tMEeSRiGDksaVyAsLr_h|B z>i>b#Y_fXSJRLY}8%UAUxK(r=@i^3ieqpDNT^RcYx+41IAr}_tD9cb$&=(PghpYN| z${N06+8hGZNbdM^nM3$fxlh`yv3#YK&=p4l$^CI+#l+KaVd#Qjk0GC|} zY20X?xPQf08GN=wOGuDfN9lJ5Tn*iSyeDLdCTss#XrH>;P2TqSL%Lf=0X$#(B*R-jyi9haKi zjjWyiFh;R)PdZ(CG@4sb(XPC&qJb?{D7|3UP;K=7S>Dq<*dXngOs>RI%u%!#L%~|8 z`X8S>PTH`gloVv93O6^GP-d6v;V5%b#3b?(=au<~di9u&!WJ~TPTLyoz$HW=BXlb= z=6!ABrlcfVNG)019cSyc*h4Uhf)tYBt!PrRC81<|a#B(g+*JET3oWZpnE3fd_VI-C zG1d^abQeM|ej!)DH(y4JZmQYtAAJNk^mc#U@ZH&&!8HZl!mJ8k;ul>pkR6knGVGxg zkxxo7^S~Kr$V(rCX!lp{Gr5nyEHE_bj2I+)7ru;8Zx%4x#ru>jNu<2|e0Py;x#&L*KR?jfQ$-V8BrDCDiQk2;A9R)y?1FF-c)Tb(V~RUg z8&mm~MjKXFno*g9ROF32D9o!-Wy(Hcaf%5)+BiMG7<12E+qRw>>?4=2RxGjVr$XUC zssbo#rX|z%)3yyc1-n|DaD$iBgc>z?VV$YO|NN(`C@4BITP=Pv?o$Zt?Yb5>cYNs9 zaZyrIU+2lCULLYgSjgbvkH3I&DJ1Fm49YdMxtZWa8 zKq>ofcxYK+LDG!A-xRV!dtEXO|L&T-A8|(EOt+&(p&2KtGCf%KQEpvK0D?NzOnl< z#K^|tYAB>6|EKSm_KKoKU{@tMG>@3OX(U#vPH7F4MIQ8iht!KjwX(#3MJ{N za|`8-bq-49(za~qHLfKaA#9FE+~yL6C~UmUqu=~u%bboGgKN{M7}4fey>8C>#?1Tu zS}_exEefohY*W=#>wPfYy53zy@G$Xbs4*;d@u~HS=lbOo&9b+up(s<+ZQbBlu0Mib zYX#-JHQIV&L{3sEso#aqYs*H`3)gSUJ6C`#L&_d115-nBzYYfuQlhpVcQL*?H z$%e!`mroK#r#3$bitwYLTt^LJE`Z zG?9vSkDh@8QYw_UTF2Y%oBG&(^-6MA&A)7vqCdLnx~2WOmov*k?sL0{^G5wy0uF;I z6RU(P>GG(t$n*Gfx}Jh;oGcQECBSwT-a6dzVMvnKaQIcNT14z8$#mF;;Uv5#$6Uhx z*Y>wSl}(GWFT-NW&k3yLV1~t#gEf6RLj(lqN$^=}gPF}yh*`eAx|EOBFd%edP*tjo zA^P>NDmhm#58)@5pDnqqEPF`%e~(Xg4UjH~NspE)U5Wei3aCrDLwu^R`-~M&S&&wV z(uPB*TffC}mCUoM*JE#o(Za<#x2L>vzF~yoND3a72AtdF$t*s6Ir_0b3qJ<2gwpSKJ>nk{Z<=8O`fViE3j$^YtV z_h!n?=D-Q@_K2b*=@bgMWyP!%-gZkWKp!jPN$K`6R9j=3NrWlZ8%wAO6B;4@7bb}VR`*ZyImjIv_ZL!d<)H2|U}>#DIz>4C+3104 zkF-$NAQ#c?s@AwitRQshazo;~3!|$|%^>Jrx>Yh;q=%O&a9tf^y%07aQA{ge+JbY^ zR=K{wc7UfSmsFwm8d)E)2V-p2<*^Nd*>URi_i^v=02Ad)gJ+L>z8^8HrmrF|QA@4L zOH5*?f<%?+qU^*nB1M;0iN*#|67q#6y{2_XoM6*F;t3YDL)+T>vNUIiyi2l5xL*Xb zA%N$S;PZpN0@!`CjrijV0aa&*`rZ~2hGF?inLCw}DB5~@H zzim>Dk_h^S%e@ROCRYK6f?N8PIPzNM&$W_|&jb?@lD6HcJ{SCR@!p4E1IG>4+&PsX3 zo*13{H1F;qPEz)}8ACBakWT^Biuy00=6sC3CMxjPwN3r$=z|OPKBg^wNs3K1Jdhb; zPuFC9Kz=n8twX)C9LWAh-CD+e@xoj`;QBesXf3OV^K~_^bO1f&hJjUef&_aECTLu6 zrtcB=NT#iIi>vHBl3VT8Y7jjhGr9ZF^c@DkS*JAUxL8ljuz>HY2d!}%Khpg894xwV zTsr)S1KE4CnLDE}n5^yWI{~ea`oxpBa8{6GMgW3Ome&%4sZC9zO9^ez(h|CduvKW6 z>HFHJT91gK+YqenNS#6$1Iy=SrsBkJ>8$UON`5t;4{gH|3e(Xic}K9jBk!~AhUfUN zAw`BqXEA{kJUWm1aqc+5Aps2mv84o`ae_e$Ek7b5#yq4r~|aqk&`vrM)GVGsWTLMO`z z;v*z9qYh~yof|5BOx3OC0gA~;aSQLh>sT3dY!}jo3}42bkODJd+NOEvTG?N_{5w3w0}FI+#Mbm=a}WfoQrR)2sxq&HEv>R<0kplv1vPz zQe0$Hb~k@KzGyT3Tc$%{be%DnD(A+49`@PG5Wo{%r!wGtaBQa#PwAFq7IM{-L7}Ov2Us4qA7xC>m*s~out|RDnS`Pz4 zi?4aJl~$0>#FB2W4dbGO{GYMC?yiZuFh`>nPhd2-_?-n9Z6u4kV@vcmb`(OpK&e9X z)YD?`1@6P+f%nQRTNS`Vt$)(&TAgVx;1*TjxRWV@3$EL`QQH8aiD&X%4j)y$=r5!$ zuIb^WXvV4^WX7nT$qk+jdJExr$$yr5*ad>C5gRF}3T+PKP0CYU8oA7b- zdrW<}kf&Uu41ecVoC>ny9=S7od9+&C$i84-0Ge<0diJ3W9{ZW2&uK-1>>Ann$sKu` zgitO!8tn#a%PU>U<^_F@e8-W&(;{Dwj*5io^_U2H;U)*S7`K_?O6k!(CAWwEonykI zou1BV5>&%=_STn;3C|ah{=8<;iSGCa!qAO3EYrldqC48Tn5Ht_RA6)q-GI_3NxQ6& zV{tz$ro%v%=#S?`oMceBcP38fB?y0gv}o_As05yYL*CqrtiF?SB``%NrAb{eVerpK zTa%x_rh4Kr1^kA+PZ#`oNKNqtF-cn=EiE9+h}!@3b?NH~{3&z<{j9x|blfta1vmBi zBU86?eX|q^K_uMeHR9F&knBc}81U=zWLdWoq~rjIJTABM#rbNQghHHS>e-P1S@;~tFk(dfRk0f z=Qe^b!X5<;pEZ?vc{Q5`ydyCcyxFy>?q+LlB*^N-&)qpGZODC4{b)Dza8PUL<&!_` z$>T2Jj?y%$VkD~`pm(3*xF8%TliOe$&=2k08B7+!ryb z>H6B?2b;~WNMO?ow<{6x=ack9w+7Lkl#WSTMgyO?Ten2>LNrz>-xlqikCi*|*%us@ zttF6(CrJk6wlA9`7kFo?P4p7ZTcSM>I&qVA(X_@GsM*h{xK@${b62tVb+vmmo0t0c z)K5PKUaWFLuHD|~XDrJ-N96%;TfR!8{sJOa|M!YX9LmcOJ9@2?zj-Z@X^D1O?H{dI zp~Y*#i9viaD)s%TFje(KMoPmE#98hJ{Lu43*Or-~w#um{|FhzuU@e}LpukVv>;cobr|x@a=t z@$6*JyVvK^SA(NHd-C0So>SQT1T5fbbN~TlY2@T)b-L?T5}=7p<1;#=06hAog!fV= zvy94-7rxFmnLTr92jJEhaAb_Ducp|Qo@>^A$30)h3SDM;d`h!d+CLwPZ-lr}nrY7% zry;sxDBN9d%z|pE8mf&0*`$2ZVuK=1blo9SB?)rA%wKENKlQk<)@|k?G1$+g zBN||W_`Y%y7J97hO8GAHD2&f|h1r!iySlM&3w>NJDR8ZZQ;KuxWa_cmNL{ido99K4 z?DD!Rw|O#0l-s;+e%bMd=$*oCA!;OALjXqHY{we|2@nuRZIo3!Up(*IwKG>f^xu~( ze*7zlB{RF^vy@wCygu>-yh8R6_3k*`(#BfQ#2f_gOjc{poBaip_PioQ=v4YmG?sUAvL?XHlzpAR zjwV{O-KLf30g41F0nz=z?6vh3*v^51^S8nk` zMf$#24Kw`_wEwu~cQBXLn1~a;movEFd2PPToSf+<#m-UX#0QvF-g(uK3UCCUmZT;w zv!e!Lm^9W+zbQcC{~-H|jOpKVvh@0wT5?g(@q@TKxAu(p^~X6aMX$s#fitIc!$b~p zo@SXf#p^fi@06$^x%`Es^w{wU`FLMqsH^R48Vd(c6z5LyHji(}15*Hio}6NK{EU#V z0|0nV&(u`vb?*BMv8!OCtJG0k0eV=Bz9NeqljM0Ae#8+U#4sC}UgY@jJ4z8?<#KD8 z8rP;clsSofkA{Z}{Rk245i*TAfU(C=O@`7Fj4>7Sf06I(5L!Mu8j|FZ!5e1&ng;+K zZ1V^zDgUu`4$5pEw;v=H@IA@ug$2~TrC-F-j)h@|0K=liD>2){I`KUU!~!JOn=j-F z=`U%tn&}|e5tO5u7rq9uShR~83o=BqI4eoLv2ReCL}o5xUuZ-?+;I#29z_gw`0W;> zLvfqdSx|^mUru`zhYU2aDGW_W&ql^jD_xHCDUyQyZ6CyfTzL)D4k$`SAG#dQlAl9qnk+k$sM zJOkR$UT^=-Rq>4Xc91UrFM!ms;V(cs3U|iRx#m^9rT*=78%T3|U3hMgw+Y|P$j!b| z`1(5Hx;o~_IG}L(uJ$!O?uj(|3#b~Hl3Y!7J)c`Se2YpQ7}n9+l;Rq%W9p}Q_=@r& z8wBjz@b+8oxSv+Bt#|?l&TA~9;H-4!*q;1y6@u*N-E+HkbXAvtru1!TM~-mt4_Wgs z;6N{CBrY?O!xC#%VUQinI>t@OOj1JwK4SJr5vZc|XakeXD!Ou{O{BPi9uL-Pwh|_O zyP=`1Os{4&mxq-YfBf9Lmpf0umGrCt+26-GhXMP!!6;;kWQUnH?N=x$Z2G$Y0;mev zX|5G9;1ibE7o3&0YF1n7z3{OCVTl@@D;!$J(?xx_j)BOVK7UAz(RevKi`u)SV+D;l zF+*Es$Kef6<|Kl%hS#-}6Ev-G8qZ-X9z}|7U0%gsF0BrVT0+$m6DV!%(MVri!%A>4 zhJ@~E_V!(*?N<)cA`&7s#f|WJb}(?k3-kcZScqn}b`S9VpC8%ge5NYk+bu?x56j z3a{hQQKs#rd>BE2PX*)XuB!aX7nga-(tx`%u+UbxtL;#FY41ked1AJ9pjb_T?Lo6c z0Qiq?=1?;|=i#l1?X@-nSk&_l>e4az8nJy3QV}wJ&PTkseb@c|RHyR`N>e*HH??%U z7$=?eH?q6Q!yl1%l}|GhMSE;s7V{LF@b665=8PxnR??sD7^R$Xh<@Ce*EXJuK#CtB z6xH87o+Ea(6@4Zm2kE~YZ=arF5fOpflgvy!hQ*zs*?8E`(4^e$^De`$>Ve6m#5&n1fG9M^xky|&~PLbpusRg~9) zy1o!G`W}dVrcwi<>ZF&U@J*bbtKw|7+b;8ac@6v37IBVqf~or_$3?bBUA_4H7r^Mz zsto8hll)Sb&uAZG?zdhpYeOaK3Mp04n^E#qATcI)<{zz?mak@&TQCboBJ$CyPUr zj%1j*4JQ0AE41yVL7GY;RqH{kDDBgT@+NSmA5xdVYb3YgDEK3GBxkO2|CW6L~WD3}C9g zPfR4duS|?mCP2J|phqDD%u8vrE1~CO57Ed##<!+YGTiOjC=1Ea_sqcM2F0rPfwL}kK zP4KTVQ%xmiUTaOfF*=Lda=lb)TO<+i{9fjIboI1;$v~8_ z5`O443GArHRcqGvMb;f7PSM?KJOdg9lzh8Z`rFJC7hE`h4&&;*Kq=d!=k<6Wui!7h z;%mg&(SYk*?AKfQ%dx=fMft0X)g~v!#lS~5wvr)`>ol`p^nXI@*Z?abkUb4oDE<0e z*-W=v0>8etz)&|N1Ji=EerK(#rN6(dZa-IDDSo8OWYUbEb~CJxD#M}T7VZi z2tl}Vu|x7{7sTJAf%e+?c%aet%bI980l4-yCtEO@Dw^0?kt=SUppZ5faaSSKJniZE zcwwcXuBZu=Jya!vw{OMShC)!0QtNudm6&S*uDt*sU4V}%9T(q&k2!O9n``D0q628T zIyqTBh_i62gv+T|l_Em&sM(ZY!rQ|OjIC`Um6I)JzGG`scB@74(ND^~~ z8GiU;u`vw)w?zOI($uo!kc*m2#E|$zkXj`FIDFiipjZ(U8Xp}C@Zjn~y7Fr@ z_%V*h9`dr9(_|WsG$g{wC$_jnGQ$323z*#(z6}VC&*<m4?TV!d(2W= z=;|OpZ~*nH7sf7ZiYUkl&4OI|ju$#_y6L|MKr;<%?%_*Zj+@7f(qQYj@zccP3~e|i zn+g)#W>7vGTZ$AAAu>C>wl(A*(6$En4ExwjMzD~#CdY4uFOKASTjG`-oLN+&R z4Wp%Cj{C8oY_usPeF~CUm#0uMO}DF%1w=?{@mi|%VHL2gMM&Y%tX7Z<3@fiv zVxy=2g5auFD-+J`oxhaZBNQWL(-kj!T+~Nsb@(rX3#2|Xsa-s?9+p^2!V6XbbQB=D z9(po*N+tc60@9iR3k~^0$I1bg7|2N{Z5T!EEd0lruhyBbwo)dCKlj0xW5O}?L3G58 z@!a@}z6C@?sJtJ790Zjw{*1e_BV^T2OwG&*^RAe z&Yivm<~q<1q7`RK!w(%U!?w|)t7|JJ$p zT+ZDagseC8p49c6v(DaYPiwFB?X`y!a`@syXBy5txGlQu5&dUZa(1*>G5n3W-?n{o zW6XlidP7B4Y)(JT@wAv7p$l60O)8)9nKA0+x<41L82NVEr6sEeZfiAk=Co=1pZ~1D z{?+z|JD=!S&k@q$i7tUX#(r$i*H7LtbadlZ4J?nH`l`eHUO^QjLq`tGTXUh$hv}0x zr?jqU^8Nhq7CSeV-(wGs=ssh`YTLogwh5V^B?gabSJvrb)8ewhc^6`@9QgXepxkaP z*6j*hef5d8tM2*o@|KB3EAGqa z*y+hS>rLjP`#L(e^f_uuZ}4i{=#!fqhhhe50+P$;d>6C&fj75ay1aGStH)PkAJx=F z?bqXct)$}_;*V=zijW?je*R)u&-C|-CqH;7f34-=7h4v+NFBf9}^caBtuC8vS&? zHnA<{<{0L599tZ6Zg*^M#z%8=I;T%A3q7HUkm8O+LnihR^KqY74}#yZua`o zdqVtQy435S_J^sb>UDVX%U(<3a<80vEil>9VQReYN?}5He2m|u@8fcp;i#cj0g3nm zSi7Hdr?*ZxH8=nL1&!fBCTfBd@ zp>VPzq-@`zm@#25me$R<*i(1z{S9B`th)EwyFF~9rGcLme;+>~V{Wh9!VE{9Les@A zJ}u_>^=RGf(GdkN{#tgZ#nRluZl^YzpWNJUj3%geVV9VWzxeF-*{vCsxAwsk8NC;O zcJkb=i@o#S*kO;D_SO30+50ZVYj?%BJQ7ltvHI}A+wRRh*i)aJzidiT+mzd0t=RhG zv?qhxe7WGk_{6k={DQuVU+vekZ*-?4CFxmRTfKSV(>KQmC zcY2$4C(ng`_U^LDz?FS_tsPO?TGwKu-&1RU+5Cd;tD+C@D%_fv8MhC(u5isc|GMK# zLz-QBD0k$X?O2HPOzzT$@}hPO$iCwrt@HXWdA_J^R=8v9$yR}5pWD`RqBc*tT#g!@ z^&AE-pQYZmwB7sl<6jwFHfHGKZN8snf4#%lUsjwRKC54Y&1H{2`?uVN^(Qttot!*}%=UzTUPQ&?Yj{LwZ=?*)Bbq@SAi%Lw~PeaO<% zYo$5QgeHg7kB+X&KLa>^K)Fz-G2{Cot8Mkezon2uS%Qrezw&a=fUqXoC8-iz596k@TX(8)SLM0 zr33Awj=#St`eO4}j-1U3djFY^-&rRbIwT*STlC85dBZb4T@}*gsb+^SUwF9AxDXtf zzAI?VzECN?aVPVa6+WByK9a3#^I@BuaR1#g&&-Rz_QUzp+d_JD`t*ms26UVl|4uOz z>@AizSXGC9YnH@SoD3hEap8wH4=(MHtouGXYV63g(}`!BT-s7HGJ1OQp_BPtK0b2c zP)ra1w0kx;Z?o~*$hkuL z`L8c+R%*Xo=C?GlEaFg1pBIn)qrs*&i&kCSSAJW)xu@gy+~*g2uIHIu%{nbM<+Odg zL+i4?|IlW_)SS8N*4^gw!^z8cH5vZPfgVeC;D5ix`-_ikDhj;Ko||>8&6|nE7rK<> z`T0hMhE5$&P}FA9SF7@p=jDB|Jo{*5Na%o~wE>;mogbh*+ahmje7~&22OPHajM#l& zt!i1TcrB?ZIAeDK$CWhj@CQ;RcVipuuAXt2R`U9x%|`*OD>7)FZlb< z?){73_69HK?CSVK8-p``Lc??A2ij+S-=)Kz0pmiBwt6@B-GYy1O)u}j_Z%V z7PIuuLrqREELhfS)5h*=m*ImV(bu2O-2@<+`eJ- z{ATxD-g3e$tQ|hFJpS!2bD}Scn;R7D_PKPvcz;>WlZteLm*7kfb_te5eafKPBPoM7J;Y!@q?my>r_(m+r@7pryhjyo)o4aSUUtz|D z=ozIyZR`|R5#RZpCExdJACPLe^HA)N4991Q=J!4efArL#S<|!nI_{bsmAd?upHCJ( zcyi*Uqxa0Xda{4TxBhk3^-WLD>~Ux4?OpBWcLMw$4eI>W(tl)*?YO$bR{Bk!mD5$< zX3N!6$3H2bl(4kz;~^sho}4N9|J-EYi{WRQ#9M9RYq8gNn-XVE#nzCE1Ec+S*e{2i zAMly>cuYV0p`S}bLcYiyo|t1;vg6Lo2Xjw$vfDQ&-gVZz_NS&f{U-nAfd2FSR>RpQ zFIHTLuKVMGd(5l9E`A5dW~QNEXoG@gC07c^H2LAv4Qn5ae=L>F$wC>QMjaDoU+%fPK?e+#+UD**a-`ew8Lz#yIw+_8_EUR4n>`n+^78#1%`=Wh)XU2_ zApfI}x)l5O{K8m+<9ys}ow5op#8?}2yIgjM|N1L&UtWoSrl`}72ae>7?0GHYXp5mQ zf89QQ&f3r8Ui$Tbz0I-UJBm~K2ff{SLgLx?i$i|aem48!$&Jyw)*TVc>zxbzF}~#^ zueYzCUB2wT;YEHA#*bJWJ)YCuL)^Vr@;>Y!U5WDYfl;S zqQ2~M_}rYOXOr7xmP#7ThwOB>8#jG`^@t)`lRIJ|9&wOGBf(Gzw*`Q+{S)=9f99z`*nL+6W?)2 z>#MCxf4aKm>T7K$K7J-XVDyQ&9&I2F(RH(;S}b3SV?jD6Kj;%RM1xJ;K3hu0H>qF$ z>%u41eE5+3$%i{WA7+?+Amo_i3O=fF z$o_rryo`?uhxx6F$Z5UhjplDokpC%d|8tj%`_46q>vu69|Mx1Iexb`TeCxT#J?5N# z$)BAoDLWRA6%pmy4js03j*T7LZ`-j3d)qc?cG&-0d|d0Zxrfg6Oz(2;$Bh|xY@J|3?R!aDZ`-CQojm|Lb2q&>mmz z^1-o({@A(T(`-Xdg8?13bcp_S^X1SP*{6;VX}vkD==8Z$A1%$BbfNPG9JP`*Y zG^S-}e3ytXN<)4QwEOIh4(zGhkkh?W`NnQn3MamO?JQW9cZz&#BO0x$Z`&J8m7lgB zI5|BjvS(UqcK4*L#LVRM?6gezv0uWtq{tqjT@yJRIMrDhW`AhKIRdUR6q=rQg`;!p1=YCvSK?1Yr$ z#4f3$Q<5U|0g>_9N#h=lFj%Ysk$sc1vXWCr4@w@HJto3rGJ(;Ugv|J)?ADQq$(e~M zNr`FclQXm11jrfcnVgbjiZB>apaC5_1|+49OdByaKz^p1_U$A4B&Ci9C!0kM6B$2# zL^c(f%5CW8ert#@+HD;>W@Tq4C5#KuYUT2;B>K<|3D1&mrTPL=OFgP5>`|*!8qW}02Dal!5BGNJ= z`X^=5T|(-}h{3G}-xtv>5Oc&K_%BDy!P5{aM-n8^rJS&ekNzs9N!_JxQYx<9 z#BO4mn2LY9%h&FBlNuH{smPgBw05a@Z;_vrw84LGz}~-v1=KZ9>Quj8ae4jv<;C@H z(`cxY-8JQ|Zdct>eH-m|r45WWs&IEB+)&B}KGbK(klyzW=sU1)uNek|zEaX4sP`N7 zwg{Wa0+}*aC1^%(LBpd*&=9jaK{G(+ZXjq0Dd}SpB1a@;CqyQtXCu=0<>CdyKd2a;sy>HmZTEOZZ4s`k3`cHF>p*$#K5FS(o@nh z6VUmyBD$qzrqg|LTB_V6ib%?pLUkh71S$gcpwy15Iv}XJ34f{I`1Y^{290KrHb*OH zbG3`LdDzHX(T zkSi<}@^tH#KDT?#im91l!rYuWi{^}#T7=9`TbLn?*FCsB;e)WCSH2M5{IKM?H!iRI zM0itJn^TyxYSD&iTT}CNlO|73OWQPe`OxsiGjeALGlb~$m}#kFdq0$%yhs=5JU;8S zA-kN7%4a>*SU4w+f9u0jO@kg6&z=ol(R)qWeqpCjQd+iq>GJ&5!g66rPTs=YS;E|D zGbhcMFlELRVU{pIf8omcB@2$`6zH}-f9BFI(bi>JNV-&aXwP}GbU`~s?c8DCw7TOi zsjk#eGPQoI=kc%JJ6XCue5#loyfi7_EKC^j$U{AP3A(1Y#UHndOV>9RefNrMKJNcP)1a%O;0y@P+%|t(*mmLh;)1+AzHIX0Yfh_7%s9i^T>*zU^p~ zf>8Q#eZpr9oByaVOeg7fw>ldp&T>8%EIcwZW?Ga^n(en)YgwS5$*;Wg`l@#dkA#b}{Ic7|NJCl)NN~3lS0d`SI9u+}ioq|6i{JHejuiI<=SWR$ z(p~opx`ed7r?xEFx?)H8F0tvG`}PaE=U+@Rg-bi7;lU+6pB?wAp!-O)iuFZ<*s$}F zXldX8X|X;dytA|>XQA+EjhoH`s7 z-dQpP=OC=GP&Z}eoYi5ggf+{T7C$4l4H3s~JSTP*z7@9369c7QMK6dQLvokqE)kaK z*3McnGi-)1eb)T!;ZoNSX?98-H}W z{&3dzD50NV=`FRDT4f?Ty=LwdyS^m$+=;CCh*!kH!OLFqmFD=ZJ@lg(AO;F6gq6aI zMftlzrugXv%eVm}EpemU3Eg#VzK;|eh3yeG73MEq_I$|nnMt!U1xcGb>a=i1$j@CS zx}yOkfR-9H?4DW3}5k zLvx$D_Np^7ep!vhiH*cZ8;E@yYU;a;Oy9VN2S1vSoc8<8j9e2{*&4b2ID>QBg!Uaf z+$kHK+hnVwX|4&^H1xJT+I;OYO`zNUXpU+wYa41e)M;1e3!iwO{dME&e(M|MoBpS; zL=`2%OXB~%q!pZ>_=w5k zTe?KNBjsf=`)t#o_r;kn1?O&D`Kj=!?jKWsjEYW;8w|zUFC^cO0$igID(AEhV5BHuqYQgkHGlW^Xtd-MB!%Bo_))l@{xUXRU;*I4y#17(v z?_Vz2vbJ;yFzAxi!YW@oQ6g49&%{HKQpWYx&h8LW1P z0uKy&eCe=OgUtbt^y&U^ZN@PN2X4=G*q*2+C=_!cqB92JNjKpu`h?L08 zgptXK2`OH~Qv*iQUZ}xEU{M1Bt!js-4wHcc4Goz(t;SVyrEz01vynKof!MF1Mkl*U z`VStSlBt3WH|;J_RgI@++*P2iNmu1ynEDs(*zOIwX_`f(`#ho1WNIGMglV!h^)Wd0 zj9E4HU3lScO?$kattr>Ms%@{Gq}@_yc%6B`3gT8VM$~ErQR{P7oE1E-G^@OPV`+JL z=Eia3vNFeo1&Yr~y-F%xfpOjIBet*52M@mX$cudSPHt1+k8BPO^(Z!bif#AFX*=_n!YX z{ng0eT)*mG=j6H=He)yjUO7uy5|5Voh})3sJ>}=$e)b1lx?e^dMlS(UXp(NOzZjY% z;-M@~x5;nh55~8LmFp^&Qr&%Vyl0-fuYm3;WF81(M@#f`;|?>@GnX^>OgAg+id8=pTW5_PdT{v%nbbE`C4PtxW;yJ|`>2oJe3@ep7NTHYKEuEV;S73rmvW_dcJ6i36adbXUv~7Q<&aNn4dd;$^2#0S1woqZ^iPwWlO~{Q5%ve zb@QFLd}7(Ag5u(^EU~i~dgrnQ1q%y=W-Eo2OP8%)vTSj_kT0y6y>bS|Sk46=(Gde7 zJ^dBw5j$6W>6W9L_SGo^DTm3Zs86#^QL1p5-q2U~NY8FPyT!ZJr(tBmpF@AjI?+oP znr*TduF_@fBCxv9dLvzE(et{n5nDmkC`0GS#$xA2qOE~wXsGdZ`HcttA(~KSI6UgE zu2$pHbFzNZ_$r$1LCsIvzt%>VRjEgA^{y&B;UqC6MHYQ!@3JZ$jhcE_@4?;s4Csa4 z)#H)Mj%75!32uVg$3#Me*~&Y?&6qW*oNS?|N*6fdRp$dY+i&OtACZ}m_(W1RVT=*U zqa)pq^1KE;rzd14rP9l;%7grhp1fmvo|ULBLXw-Y>M1*2j_P`oU3ot)d8F$hX;Ng? zcsNnWHJzO_$rZ$%M^(a}jJOd1vg_UVt;}?hSthW3Uj|FndQVIS2M2`etJ;tHeG89= zK0EYsW~lG3ie$ZMgP6Z98qWN;TBpeg8m2baHAoCetF6i724ELLicIyKX zT~bma2GHD9R>S~&$t!b0(nw59^>{>?1faH+8z?*7bBp%z+>gkXZ<8j`rLt+ORMV&iReh@|v%|Aej?vcMtz@_--3+;fCFQ zJ*1@Kk~=-;^}yi!Hw+dv!cRIt$(Be)N)lUk5?cZ*ZkP6zh^v&GN$&)UA0j&+!u^vR zTG8rIsNd2+beV@Vnao`ZH3L_>XM6*lVWHBD z7q0y9f}Cm{JOqn*FG&7={e_p;gkQ<@Un9JHFiiA+LCQl0b|Y6Mp?+s6{~8}>Noa+g zAYV=&@o7Q)1^>S#J}u&T`nnJ)6H}dfX`gVl75*1-CxQYvRmnr#1tvS?f@Wf#R4?um zoUQP`ggXh8>61gm3@PU=>1jdw1^@Svo|f<|^Z51H2cf#dAIQ0WAoSN`!D7V+(hiWs z9Un*)a#ocfp!kT#L&e*Jr5&BbiqLw)rHW4C4urXmh$W$Q^NU04E<@|UyffHDMTT!o(dMbA|Jb`hC}P_lJbU&e*TAqq0_^!XZlai8QMQg@*D0K zc%}UMv=6WN?$%zpbCZv=@ahx6(m`hzU*{aZZ-vX*d!<&o?S7ra(Z1Kd_j78muDPnc zI?=b{d%uswWZx(JMz-q{FSQYLSGW6N`nV!zh2Pa5SNI&fP4+T6Ha6;^IM~a+@s;)xvF|t7BWQ(!)mnwQ1W|1-ipd&v+kp$5?`IXbIhw3UKI=97yWiM7G89IxQC`q zf7}!NX7V{qo1PcW{Jpp+qda8FwCH{vgdsxrZNs*FCl1dN&x(*u2dd0ngksWgqR_ zDn5Bu412C=&|~|YtDUoG(vC)VGjgX3lY~Ke{gypC_Q~G!(iX1X`GIKN_^eLsbu~FS zRmc)GGeqC5Lix0kaZhEhctS|i4W0UUMws-DI4F4cl7sm#!@J9Xi7VOBHY z@oi7M^`tIn(>_CDtQ64gj&Wl*Y%MEXxpKwI1;UE(;>}NOD;>W+b@-4GF~hg_|4{Tj zCC0qI5k)+Viht+hSH*^3iXB%y{RXQ3%M(3+5TnE<2QLo#vT4vm5#r_D!7rukO+5ie zeyi`k`~17R-ORgcK3hnn{{HR^*^tAJ%2;_)4BqG$#3q|&ZDG0vj=C}XCzH5e0b9! zLFZ}Bw~L>9ERQt<`33RKozGqRbwBKbj~IVOZ1tLt^SIb5IAK%=+g*ZAsy7f* z6?H`WIdQPq_3wWl+~MITdPQYUcxui1tp!4P__}G^MkY)hkrn&;;17O!>8s;ned)FX zW+_(cCk>RcrKX=s&Be}P;@!fRm!EwWc6a*ZvaiqovQyj+7tS-^op8on@^Nl;?hBUc z&dKOHMv9yEV50Ph)BuwjiKW{%R^3=z{YIq`csQoaH&o z1>GgF<6*JcnGP5E29T>i++F>LM?DZGNWM~ol$Zs&z$>j_gTLQ7@o$ZVQ)2V8V*VG0 z-hb`cra^n0SDo(!Ps?5~4C^JNkQb%D3U*=Sg5eY6b8|v4#XSs*fbs+}NcTxpaeCVD zX$hGdr>_fpR+#%rsi0fCYT}rV@p>s#>K>lsx1?n8dZ9@8YVc2jSXaQqk`i6eheL$N zhNku(-F5E$QIb)Y0|awNe>jTX6}IJX->@wwHzav{=KOKOFk$H0G(p$yiTE+8>nE&R zSG2BZ*@87fLHMR!t2bhi!p^Dd=FLvYNf$B&#}VlvAwuYq_2|4=$mEMpx2_wQW{=W-jXy_?>42TOar?T$=f?T&1msvG2(4OKWe*s7?`!4c3{ zG&K?*Xdt%zLl?%W3k+*i2Pe&w*OshX-DdBS)v3zm`Db-i+_aOA+LhYcY^ZcY*lX*C z=+>)O@2CMXteRm+GX49ZRTZ$x&W_<_0wdlskgOI~IjsCjyM|2Jy`|fOtge_Ei+48? zLmP;H{lkD&-9B9uSVfS^?W7|}^;aLwEjaaWgj2Un{-4q0dq$BCt7jRRMVx*5UF4*oVdCq_?h#UyDHbRtqSMc0LO$#c z&pSJ&ciis+T;YszT)MX+t`g5-cJZTUsyn6L=xVk)sH}2bA|Gs_r%*wb%1BOTFeHy{Q@f6Pf3!3%2XvTy>JmAGW1|a zLY498PQ^xkAtwhuCNwXxk%<)5fwU=~bWi!KWP>Lc7kZ^6tz0SFbT3CkH5+XZUZSDN zsCjIl;az}Pp;1_OcnW96q9H}pWV*q{&xZUdKjb-pvQ*WNN^C_(p=MP7C_k!Sweg83 z<+Uo_@;mB`s79sU*ej*Y(&$+c4foX}4szX4U8sLZ-|JcZ&UOD-K&3r0S(Wt%YUi#? z$#n5jOs2>lsflSLY5K~9G{`?n8mE6|T4EOBCP2!qZev$zoyl{IU1=6Qrb(gF;J3_7 zo-~xyA*6-=1>K{@^p$E%uPCtqy*jtXS}%-n=}wpHxU#fH^hcK_R+pB%&FogYs^fbU z`OQU#hVZ0*Gdka@s;nF7d~_4iQvV4$A5-Ld=p^WG5=y%X9T9p>*0rQ>@srkTy78Z?@{PAtKCi|r)qHJKex>%dvFj~d1obFP(e#nslShrh0@&2Vq^zL<#>i30 zk)u)q3}#zo#`v`CB&=+e*SsnZ@(?J%V9`fnB@S(uNg79&$5aZ~rZP7-RDmwl&EsC1 zrIt$2U15q6Bp~eSqApwR!75f{Nq(RZ04;wQ@HHCDmB80nX{9THZzZZA4N2b4d$$NK;ZtHhB}1>P&q zayYzKh8PMkrK_2ckQ?~Q@sL*;**Glnm0Cif8{r70XS3O*L`k{1-$4mlj;}j1H>@zH$)}TuGja?`nU<{uh^xR}YDk5KtE>ZM8ijR-mw6a#hP?T3~>g#WTy>7vf zg+LJ?Ss;*C^|NwMRYhr0`f^^8Z}v(&m4;Mbsj*eRYU2|>suz|oJrh6o)eA_fW}0rO zhPtMujO3M&xt2Oeh9fEG9m=Rq4epV!g)s3 zD1av%DF#%jnh(Jb7f;vdoN804Vv8M~3O*d9cNdV`K(2ETJmNqd#`7Qt@%+Q8AthY} zipc>zab=Z>+Mu53VL?wf7=OF16!EZ`;V^RNlp2x>Ez^|oH_<5L?##;*8`5LiJZLaYn zy`y_O0Z|G^;1gFe2NahwO7UbGYLYVIsTip3e&mZTpy_u~>Q_lTHsC==v=@N~1_ z(+x;(fzLk}e999!l`7SSp_jL2s~UWo;0N@=lPYamolawqmGkI(WlG!TTH01Q9fQu` zIwepAHC0&CV6ZFGMCkL>Ey%0mnoTyFTwPD@X4Ey%ZL0fOnD@jBVdbuCh2p9%UJZ0P zzFl8^x@>$KdH8AcB9BE~>9b*e!?T?JZwSwp^Pd*qY`3X>F=l8=kIYpkJn~YADh(o{ z*K#Q09*q6TEux}$Yq}~e@3DriaVc*R4dj_|O?ulfze?7Qa6Iv^w20)n!FXD>h;GY? zc+}%4t_}AdRWApu!6M3;m#rGyBnBlV$dyl>coS$ePYdx2?P zXSmeHiUBl|mlA-Hx`Wwd^=M(-vl`m#*SlvI(>AKFrs(Hms8 z$^ul8r>eqLN2_)Iv9n(`bWC~ycAO@mTAF20LGfx}k@`ezPM8dsrSg^~`JnOIh!QH# zV}Y@BlF4Y5&k!XS(!C{0|3allqNErLRV#6#q_5fM#GD$&i<2InCq|y+W8P{bP_PBA z88*^QwX-E2-9%mxRoSYPK6>vqI90t5z%l0TX(!=QM zqkFITH%O;C9<`2dbX1}bRXPwTgIYJ4)qa9%l#}Z86;7BCpA{yvJny9zCS&D#P?e#R zyE~Jvi@`N` zQCVC&Ajl6+qkS5!yB3DgV4Ch}XePItyz2qsPzQFqXHAbh=%z3fm*UWSWjN(Y^Ojljsu?_@pey2ms0 ztV`#TSC#H>PS3h*1UW#dJhCHH*0ZioEXTh%($1u?37=c22XkQpmAJ$TPE_g6XDCo55TbE`@jRXS!dE&e-VtEZT5 zn0B|c@tMg z9jV5YyPJtK<94IUT&pIT)f=jLCQg-Hz~9A$O{nH)st-9+?z+5j#&5vye?7jJjZ>fM za6_%_RzvrDuV^&adR1c8@!_}ksNQPypUPbDI zRRyVzRteV_Ci08wVzKl}E_idZpwA;a|LdUb_m*D``rzaIJ)p~GuUQ9?H;!P%e+uZr z%Css$R~7SERr*&6ps0Vm)$#Z!$?~{=-t$;$&;@^It^KR6m8vfP>dnq$Rr*zH^shoX zT>e$Lj2?%Yw|~`D{#*W4d9pyR(px8a{Z{`fz8q7d9%4?7%;_p-qbTRaIs+ow@&A<)>D=g{p6%a<|N>)ew&UtVs*q$dzfU?OBO`4pa@l zGMx`0`(|WUrfW58<*Ef`WtjSU3sqBn{jZ^FqvO`OwvQD?}gdqLvCw6 zEYX0iJmV4)Gt*Ml9!s3j`FpgQ*Q;c9sbtLx}F#WDFuAOA)9mVek# zpj_2QO4B{H3@sL=d)2{)l}Az2;fLy@sKJYtE>j$NktyE&mmdFxX?fK=F*UB&;fG|D zZk@tfyHi-z^ThH;z18!?DtsibpQ(PH*b7#v7A#h$&e%@|dY0$7kDmd^V11uv>@xFS z$6xKt`lv{hRYgOyD+%O9xR6Cqr<&iXW z1VpV4$7G!kSoB||b)-WyWO*U$K+|9(6BJS=-sC@S9-cGGt3IQR_FEw_`pG5_Ig$6K zf$rLyW`cQCdmXC3$0zMweCQ+^t&OxTyzrDh&81N| z2R3uc`_^n0*CFMg(=)*bH6PRs0HnOCiV~m|VO5{eCKm#c<;`jCD`i-r(}pv-67Y`h zDPKP-s4>9~~U|8#t6h(G((6}7)xay@d%N^&iq|JUQIr><1$2VX}U zIX*EdGop1=zlS2C#-wFsyS_CRVST`2Y=hH&@TDA5Rg*H4Mg;)gSRDZnEcagoPM+pnB18&;@ zhB~mJ1YY4Vf|vKy5V5jsRtxP>RMSunGq$98(e!#N*SGX~^iZaKL9?;#0e%)Z#~6M# zNH0foVEY9dj*}Pgv(g?``l~F5&4B}<8Jfev%ec{wNffVeW(Q=FX-hqP2&{}FT|4at zrN7E_9S&?`@unG2eGCmp!O)k5yuy*V(5ij<^YBAleEP|YhIAeDtwtuCf%aE1G%GwG zEX~I1No*!Du=&&DJ7yTjF>!5ne7T0BVNmBq13x3}X`sK#a@f#F3=Q9cVdb9sDnPJT zT&Nctt4m0p*}edkO#@FRuEE0UIveLe6 zmImjz7Y+RET>F|#SSsfo4!MI7;AyOVGeP69?SZ%kRzIU;yq*LNXMZyJGoUfOX?nQc zIUQz3rkV1ZE$GsW?3yh$2a5&JJM3^=c%`d1^Kylp?bunl-J)|_2vf}YmdN>!%c{5;cx_6 zh|`In@w(llXR)Im;=-0gZzoO8NXXP-pL(jO8nnmNpmaGZU^8J={mu~&JC#*KBcn}F5#2xn!-wK!AK%=Q_gv2tZ1oz3V( zgoD;$^MYN}OnU(B+PU$$1znnt%Z>9eu%d|sro1q~j0_=vc2?gbE`4{Kjca9fBEoT) z&}4yknk%o_%E|#iosky9(VrrJL}PUw_(6$r;gD^X=CIP<18;s1T_z3iGqPi61BS4y zz5?Lq#yz0HS?rw#_?cOKPvO|Hn!$)6J6kWHv2_oA7Pbx`R-B&!BE(?*!q$gVAPY^)AuaevbTcz5;~furdY)5G*zghrG{7-9|9xdOlqYVcEW50={B(4rpwj z0Y3mNCS4OW7F%8ubyhAMCzIf3V)Z=`tBLCiCfHE6eL>^v4tBW)GJ+s2`5Bwb%nW3rk=r1{{Eyo&xi{n z#qz_Lj%yE`V8Nsdew?q$V8RKzOgKa|vHFz!2OJGw8e#F88T#44*m%(Bm=CWyz)AXO zb%ut~AlsJMFJ)wLC*_aTVL&f>HZKTAQ+rSf>gD1B{qQul&5=KA6?x%&!v<&} z7B_)rV=)N$*;)BRI1b0+`}9T*AArV=x4_TAj-4qkiRwkh|FlzU%Q=+irL4>oiK0IhJE-#?b1gn>vlD1;|425IUg|~?t9}$h!_uxmT zDR`xUa1bJfW;K}Dag>2n2_yI5XJfGdg=2k@1}nVWY#+3e$Id%l@Z&H#;?jrvyz`7% z7(QLtZbtuMl-j>9UT;e(J~ zbq{`UTzJzE*U0*4;cenDhzanI^)bT!qQ`mj!$2I$&YMR3SQ_$T=Inx_iu_^i7l-RW z<7@@s5GT7plU!YqON+}N#ELBkD4gs<{5X4#85V9#0vf9iP+ne-W7dkrokmP5u|5x? zv3Ag81>R-yjBuQtG3t#LRt|{9`mVvxz>c>N&dTCCBW7aQ@i}NF7Egj7CQiNOfWook z1sGaLAR7*fmyuKOGvn(7Uh<5%4z`~g_3(jm{A?ItddCGn4v!-)H%|h`Ce(>{T+mQ8 z-Zb#T;L4ju;aHy~9MaH4OgPY383I3UZj9oxb`Y~OaJaMlj4<-vG!VG{i@4nUFJ^2w zEC3ph1>h-Q?JB}K*zpIHq@Ha{&@ef{TDwn94jwy)nf$W9T)JAzS8L} zFNn+L1@(eSW-c5$FiUfA{SE2T>DXRrVD%f{f1v<5tPB*!$unw{#Ru@L+qgbRg39C> z<-kG!@4O%`02@m)+SzfQ5r~2H9fBVQ@?2axV$Z9*Mu-rnuRvq#)MUk&gw63PqP9;g>9OG7xm zufj~T_yvP_`l5`Nynr8lyxNO~a8PzE&A|CU;dq5-)H@t#oIepx3urs`LH+WC2EVcy=4typqzA4VxEt*PY^pFW7E6&cC zFyLqS!2)0w(mM^JvGa}K$BhvY4g$@_<>dt*WWvDPI~-^nW`IEk{9(cYd9(S$f*o#6 zhY{P!cv}Hq6(>V>AR_NH;8L}6Is!BnC!!8G{D-(4UV~b*vUUNp8rn42lU9MQ3XE53O?TUV4T9V5q6Jpb5EG2 zvvar;LtWO7M5ddytBA|D5l&p@bOdNDE&)Go-8Cu{R-P@dozunS;bvtVXcA5>F0O$a zCu5|>))huLoQ#7XT*fRvh#K1-lod7{XuQ0@pUCuS4Dt|=Ndu;lwefH;V!@AhIOLDV zDo}qMh6BuDv6+#e4^vl!##x^^!eLnKoi2^?xHbZftt;^3eCCMD&9h^KXyVg=pfYs| zes*^3M{#)?Ts*AKMpRzEIIwJyEgLxs85&R+X9q!J+uTIcjZ7QilcpFAvHai`<yTPxDx`IE9DKCb8Hr8)TG~REEwX00~A{-V5d6ySXemIS$>!V=gL-vZyhL%oi_zP zILTOk@KG?bi{%lVe*-j5PQj1!aU&duflXMk!|8U=xVnNAaD5PHoYNbaA>e#Gps|<` z`NP6ero31U!rBiEivbfFwB|lyy~DQOWsuh{nkpFby}Rg9DJ&r$8^9{U92r{|FMY@`ru@ z9F73sWT3^XsAm{- zHh=Ipu{OX&J}6cWF#X20IRurpDKIje{UsXLkI(~I-w48CVKY-#P~;r8m6baa&W6zy zE6=1P*fz&(JSRh-vEu;LABQ*K=7O7tNf%Q}tPd2$<<{MRABQ)nS~xufml0>n$c@Cx z5G)jnH)v@T>w5*w&f*uMaWVwh#M)Ja!^99+(b(}8 z_I>jB1>x9nJXS}TS^EY7!b&&qJOg!dzH5rh^-HQM#$J*Oik;UW?ZWB<+IPavk&@4s z)x}VV+_({o@VNa}(*$jp}a6k{VI=8gjHzPm?k&w&32WZi_8 literal 0 HcmV?d00001 diff --git a/EXAMPLES/Industrial_Format_SEP/interpolate.f90 b/EXAMPLES/Industrial_Format_SEP/interpolate.f90 index 88908cf45..e985edee1 100644 --- a/EXAMPLES/Industrial_Format_SEP/interpolate.f90 +++ b/EXAMPLES/Industrial_Format_SEP/interpolate.f90 @@ -164,7 +164,8 @@ program main_interpolate !write(*,*) trim(tmpstring) write(system_command,*) 'sed -i "s/^xmin .*/',trim(tmpstring),'/" ./DATA/Par_file' write (*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop write(numstring,*) OX+(NX-1)*DX write(tmpstring,*) 'xmax =',trim(numstring) @@ -172,7 +173,8 @@ program main_interpolate !write(*,*) trim(tmpstring) write(system_command,*) 'sed -i "s/^xmax .*/',trim(tmpstring),'/" ./DATA/Par_file' write (*,*) trim(system_command) - call system(system_command) + call execute_command_line(system_command,exitstat=ier) + if (ier /= 0) stop write(numstring,*) (NX-1)/INTERPOLATION_POINTS write(tmpstring,*) 'nx =',trim(numstring) @@ -180,7 +182,8 @@ program main_interpolate !write(*,*) trim(tmpstring) write(system_command,*) 'sed -i "s/^nx .*/',trim(tmpstring),'/" ./DATA/Par_file' write (*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop ! nbregions !call system('sed -i "$ d" ./DATA/Par_file') @@ -192,7 +195,8 @@ program main_interpolate ! original Par_file line for regions to replace is: 1 20 1 20 1 write(system_command,*) 'sed -i "s/^1 20 .*/',trim(tmpstring),'/" ./DATA/Par_file' write (*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop ! number of processes if (USER_INPUT) then @@ -201,12 +205,14 @@ program main_interpolate !write(*,*) trim(tmpstring) write(system_command,*) 'sed -i "s/^NPROC .*/',trim(tmpstring),'/" ./DATA/Par_file' write (*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop endif print * ! backup Par_file - call system('cp ./DATA/Par_file ./DATA/Par_file.org') + call execute_command_line('cp ./DATA/Par_file ./DATA/Par_file.org',exitstat=ier) + if (ier /= 0) stop call sleep(1) @@ -219,20 +225,32 @@ program main_interpolate print * ! Par_file flags to create new mesh files - call system('cp ./DATA/Par_file.org ./DATA/Par_file') - call system('sed -i "s/^MODEL .*/MODEL = default/" ./DATA/Par_file') - call system('sed -i "s/^SAVE_MODEL .*/SAVE_MODEL = legacy/" ./DATA/Par_file') - call system('sed -i "s/^NSTEP .*/NSTEP = 5 /" ./DATA/Par_file') - call system('cp ./DATA/Par_file ./OUTPUT_FILES/Par_file.step_1') + call execute_command_line('cp ./DATA/Par_file.org ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('sed -i "s/^MODEL .*/MODEL = default/" ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('sed -i "s/^SAVE_MODEL .*/SAVE_MODEL = legacy/" ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('sed -i "s/^NSTEP .*/NSTEP = 5 /" ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('cp ./DATA/Par_file ./OUTPUT_FILES/Par_file.step_1',exitstat=ier) + if (ier /= 0) stop + + write(num,'(i2.2)') nproc ! runs mesher print *,'call xmeshfem2d' - call system('./bin/xmeshfem2D > OUTPUT_FILES/output_mesher.step_1.txt') + call execute_command_line('mpirun -np ' //num//' ./bin/xmeshfem2D > OUTPUT_FILES/output_mesher.step_1.txt',exitstat=ier) + if (ier /= 0) stop ! runs first forward simulation to generate new specfem files print *,'call xspecfem2d' - write(num,'(i2.2)') nproc - call system('mpirun -np ' //num//' ./bin/xspecfem2D > OUTPUT_FILES/output_solver.step_1.txt') + call execute_command_line('mpirun -np ' //num//' ./bin/xspecfem2D > OUTPUT_FILES/output_solver.step_1.txt',exitstat=ier) + if (ier /= 0) stop print * print *, '************ Setting up new simulation ************ ' @@ -240,14 +258,22 @@ program main_interpolate ! now uses default specfem file format ! backup Par_file - call system('cp ./DATA/Par_file.org ./DATA/Par_file') - call system('sed -i "s/^MODEL .*/MODEL = legacy/" ./DATA/Par_file') - call system('sed -i "s/^SAVE_MODEL .*/SAVE_MODEL = default/" ./DATA/Par_file') - call system('cp ./DATA/Par_file ./OUTPUT_FILES/Par_file.step_2') + call execute_command_line('cp ./DATA/Par_file.org ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('sed -i "s/^MODEL .*/MODEL = legacy/" ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('sed -i "s/^SAVE_MODEL .*/SAVE_MODEL = default/" ./DATA/Par_file',exitstat=ier) + if (ier /= 0) stop + + call execute_command_line('cp ./DATA/Par_file ./OUTPUT_FILES/Par_file.step_2',exitstat=ier) + if (ier /= 0) stop ! runs mesher print *,'call xmeshfem2d' - call system('./bin/xmeshfem2D') + call execute_command_line('mpirun -np ' //num//' ./bin/xmeshfem2D',exitstat=ier) + if (ier /= 0) stop ! scaling model values if (SCALE_FROM_VP) then @@ -286,7 +312,8 @@ program main_interpolate ! runs forward simulation print *,'call xspecfem2d' - call system('mpirun -np ' //num//' ./bin/xspecfem2D ') + call execute_command_line('mpirun -np ' //num//' ./bin/xspecfem2D ',exitstat=ier) + if (ier /= 0) stop end program main_interpolate @@ -621,10 +648,13 @@ subroutine interpolate_slowness_gll(vp,vs,rho,NX,NY,NZ,DX,DY,DZ,OX,OY,OZ,closest print *, 'replacing model file' write(system_command,*) 'mv -f ',trim(adjustl(input_file)),' ',trim(adjustl(input_file))//'.org' write(*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop + write(system_command,*) 'mv -f ',trim(adjustl(output_file)),' ',trim(adjustl(input_file)) write(*,*) trim(system_command) - call system(trim(system_command)) + call execute_command_line(trim(system_command),exitstat=ier) + if (ier /= 0) stop enddo ! iproc diff --git a/EXAMPLES/Industrial_Format_SEP/run_this_example.sh b/EXAMPLES/Industrial_Format_SEP/run_this_example.sh index cd0342a98..26455b4e5 100755 --- a/EXAMPLES/Industrial_Format_SEP/run_this_example.sh +++ b/EXAMPLES/Industrial_Format_SEP/run_this_example.sh @@ -28,7 +28,7 @@ rm -rf OUTPUT_FILES/* # links executables mkdir -p bin cd bin/ -rm -f xmeshfem2D xspecfem2D +rm -f xmeshfem2D xspecfem2D xinterpolate ln -s ../../../bin/xmeshfem2D ln -s ../../../bin/xspecfem2D cd ../ From 8d8a304b0c736f61ca761481cc0ef6ea7849cd60 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Tue, 6 Feb 2024 12:52:16 +0100 Subject: [PATCH 07/13] updates timing info and external model routines --- src/specfem2D/check_stability.F90 | 19 +- src/specfem2D/define_external_model.f90 | 55 +- src/specfem2D/iterate_time.F90 | 126 +++-- src/specfem2D/iterate_time_undoatt.F90 | 25 +- src/specfem2D/read_external_model.f90 | 679 +++++++++++++++--------- src/specfem2D/specfem2D_par.f90 | 6 +- 6 files changed, 577 insertions(+), 333 deletions(-) diff --git a/src/specfem2D/check_stability.F90 b/src/specfem2D/check_stability.F90 index 685b1fd84..4cfd3d0e7 100644 --- a/src/specfem2D/check_stability.F90 +++ b/src/specfem2D/check_stability.F90 @@ -37,7 +37,8 @@ subroutine check_stability() use constants, only: IMAIN,STABILITY_THRESHOLD,CUSTOM_REAL,myrank - use specfem_par, only: current_timeval,it,NSTEP,GPU_MODE, & + use specfem_par, only: it,NSTEP,DT,t0, & + GPU_MODE, & SIMULATION_TYPE, & ELASTIC_SIMULATION,any_elastic,displ_elastic,b_displ_elastic, & POROELASTIC_SIMULATION,any_poroelastic, & @@ -54,6 +55,9 @@ subroutine check_stability() real(kind=CUSTOM_REAL) :: displnorm_all,displnorm_all_glob real(kind=CUSTOM_REAL) :: b_displnorm_all,b_displnorm_all_glob + ! current time + double precision :: current_timeval + ! timer to count elapsed time double precision :: tCPU,t_remain,t_total,timestamp_seconds_current integer :: ihours,iminutes,iseconds,int_tCPU, & @@ -72,17 +76,22 @@ subroutine check_stability() integer :: year,mon,day,hr,minutes,timestamp,julian_day_number,day_of_week integer, external :: idaywk - ! checks if anything to do + ! compute current time + current_timeval = (it-1) * DT - t0 + ! user output if (myrank == 0) then write(IMAIN,*) write(IMAIN,*) '******************************************************************' + write(IMAIN,"(' Time step # ',i7,' out of ',i7)") it,NSTEP + write(IMAIN,*) '******************************************************************' + ! simulation time if (current_timeval >= 1.d-3 .and. current_timeval < 1000.d0) then - write(IMAIN,"('Time step number ',i7,' t = ',f9.4,' s out of ',i7)") it,current_timeval,NSTEP + write(IMAIN,"(' Time: ',f9.4,' s')") current_timeval else - write(IMAIN,"('Time step number ',i7,' t = ',1pe13.6,' s out of ',i7)") it,current_timeval,NSTEP + write(IMAIN,"(' Time: ',1pe13.6,' s')") current_timeval endif - write(IMAIN,*) '******************************************************************' + ! progress write(IMAIN,*) 'We have done ',sngl(100.d0*dble(it-1)/dble(NSTEP-1)),'% of the total' endif diff --git a/src/specfem2D/define_external_model.f90 b/src/specfem2D/define_external_model.f90 index 94c3ea6ae..3debff538 100644 --- a/src/specfem2D/define_external_model.f90 +++ b/src/specfem2D/define_external_model.f90 @@ -31,6 +31,47 @@ ! !======================================================================== + + subroutine define_external_model(coord,material_element,ibool, & + rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & + c11,c12,c13,c15,c23,c25,c33,c35,c55) + + use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,NDIM,IMAIN,ATTENUATION_COMP_MAXIMUM + + use specfem_par, only: nspec,nglob + + implicit none + + double precision, dimension(NDIM,nglob), intent(in) :: coord + + integer, dimension(nspec), intent(in) :: material_element + + integer, dimension(NGLLX,NGLLZ,nspec), intent(in) :: ibool + + real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLZ,nspec), intent(out) :: rho,vp,vs + real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLZ,nspec), intent(out) :: QKappa_attenuation,Qmu_attenuation + real(kind=CUSTOM_REAL), dimension(NGLLX,NGLLZ,nspec), intent(out) :: c11,c15,c13,c33,c35,c55,c12,c23,c25 + + ! to implement your own external model: + ! modify the *_dummy() routine below and uncomment this following line + ! + !call define_external_model_dummy(coord,material_element,ibool, & + ! rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & + ! c11,c12,c13,c15,c23,c25,c33,c35,c55) + + ! by default, uses the AK135f external model defined below + call define_external_model_ak135f(coord,material_element,ibool, & + rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & + c11,c12,c13,c15,c23,c25,c33,c35,c55) + + end subroutine define_external_model + +!======================================================================== +! +! dummy example below, to define your own external model +! +!======================================================================== + subroutine define_external_model_dummy(coord,material_element,ibool, & rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & c11,c12,c13,c15,c23,c25,c33,c35,c55) @@ -43,8 +84,9 @@ subroutine define_external_model_dummy(coord,material_element,ibool, & ! ------------------------------------------------------------------------------------- ! Dummy example of this routine, to be used as a template that users can modify. -! To use it you will need to rename it as define_external_model() (i.e., get rid of "_dummy") -! and suppress the existing define_external_model() routine provided below for the AK135F global Earth model. +! +! To use it you will need to uncomment the routine above and/or rename it as define_external_model() (i.e., get rid of "_dummy") +! and suppress the existing default define_external_model_ak135f() routine provided below for the AK135F global Earth model. ! ------------------------------------------------------------------------------------- ! users can modify this routine to assign any different external model (rho, vp, vs) @@ -138,9 +180,10 @@ end subroutine define_external_model_dummy ! another example below, to define the AK135F global Earth model ! !======================================================================== - subroutine define_external_model(coord,material_element,ibool, & - rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & - c11,c12,c13,c15,c23,c25,c33,c35,c55) + + subroutine define_external_model_ak135f(coord,material_element,ibool, & + rho,vp,vs,QKappa_attenuation,Qmu_attenuation, & + c11,c12,c13,c15,c23,c25,c33,c35,c55) use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,NDIM,IMAIN,ATTENUATION_COMP_MAXIMUM @@ -1130,5 +1173,5 @@ subroutine define_external_model(coord,material_element,ibool, & vp(:,:,:) = vp(:,:,:)*1000.0d0 vs(:,:,:) = vs(:,:,:)*1000.0d0 - end subroutine define_external_model + end subroutine define_external_model_ak135f diff --git a/src/specfem2D/iterate_time.F90 b/src/specfem2D/iterate_time.F90 index 4386f6de9..6fd27d276 100644 --- a/src/specfem2D/iterate_time.F90 +++ b/src/specfem2D/iterate_time.F90 @@ -56,7 +56,6 @@ subroutine iterate_time() ! timing double precision,external :: wtime - double precision :: start_time_of_time_loop,duration_of_time_loop_in_seconds if (myrank == 0) write(IMAIN,400) ! Write = T i m e e v o l u t i o n l o o p = ! @@ -144,8 +143,6 @@ subroutine iterate_time() ! ********************************************************* do it = it_begin,it_end - ! compute current time - current_timeval = (it-1) * DT ! display time step and max of norm of displacement if (mod(it,NTSTEP_BETWEEN_OUTPUT_INFO) == 0 .or. it == 5 .or. it == NSTEP) then @@ -413,35 +410,8 @@ subroutine iterate_time() enddo ! end of the main time loop - if (myrank == 0) then - duration_of_time_loop_in_seconds = wtime() - start_time_of_time_loop - write(IMAIN,*) - write(IMAIN,*) 'Total duration of the time loop in seconds = ',sngl(duration_of_time_loop_in_seconds),' s' - write(IMAIN,*) 'Total number of time steps = ',NSTEP - write(IMAIN,*) 'Average duration of a time step of the time loop = ',sngl(duration_of_time_loop_in_seconds / NSTEP),' s' - write(IMAIN,*) 'Total number of spectral elements in the mesh = ',NSPEC - write(IMAIN,*) ' of which ',NSPEC - count(ispec_is_PML),' are regular elements' - write(IMAIN,*) ' and ',count(ispec_is_PML),' are PML elements.' - write(IMAIN,*) 'Average duration of the calculation per spectral element = ', & - sngl(duration_of_time_loop_in_seconds / (NSTEP * NSPEC)),' s' - write(IMAIN,*) - call flush_IMAIN() - endif - - call date_and_time(datein,timein,zone,time_values) - year = time_values(1) - mon = time_values(2) - day = time_values(3) - hr = time_values(5) - minutes = time_values(6) - call convtime(timestamp,year,mon,day,hr,minutes) - - if (myrank == 0) then - write(IMAIN,*) - write(IMAIN,*) 'Total duration of the timeloop in seconds, measured using ' - write(IMAIN,*) 'date and time of the system : ',sngl(timestamp*60.d0 + time_values(7) + & - time_values(8)/1000.d0 - timestamp_seconds_start),' s' - endif + ! output elapsed time + call print_elapsed_time() ! ********************************************************* ! ************* END MAIN LOOP OVER THE TIME STEPS ********* @@ -557,3 +527,95 @@ subroutine manage_no_backward_reconstruction_io() endif ! SIMULATION == 3 end subroutine manage_no_backward_reconstruction_io + +! +!------------------------------------------------------------------------------------------------- +! + + + subroutine print_elapsed_time() + + use constants, only: IMAIN,myrank + use specfem_par, only: NSTEP,NSPEC,ispec_is_PML, & + timestamp_seconds_start,start_time_of_time_loop + + implicit none + + ! local parameters + integer :: ihours,iminutes,iseconds,int_tCPU + integer :: nspec_total,nspec_pml,nspec_total_pml + + ! time + character(len=8) :: datein + character(len=10) :: timein + character(len=5) :: zone + integer, dimension(8) :: time_values + integer :: year,mon,day,hr,minutes,timestamp + double precision :: timestamp_seconds_end + + ! timing + double precision :: tCPU + double precision, external :: wtime + + nspec_pml = count(ispec_is_PML) + + ! gather info + call sum_all_i(NSPEC,nspec_total) + call sum_all_i(nspec_pml,nspec_total_pml) + + ! output info + if (myrank == 0) then + ! elapsed time since beginning of the simulation + tCPU = wtime() - start_time_of_time_loop + + int_tCPU = int(tCPU) + ihours = int_tCPU / 3600 + iminutes = (int_tCPU - 3600*ihours) / 60 + iseconds = int_tCPU - 3600*ihours - 60*iminutes + + write(IMAIN,*) + write(IMAIN,*) 'Time loop finished. Timing info:' + write(IMAIN,*) 'Total duration of the time loop in seconds = ',sngl(tCPU),' s' + write(IMAIN,"(' Total duration of the time loop in hh:mm:ss = ',i6,' h ',i2.2,' m ',i2.2,' s')") ihours,iminutes,iseconds + write(IMAIN,*) + write(IMAIN,*) 'Total number of time steps = ',NSTEP + write(IMAIN,*) 'Average duration of a time step of the time loop = ',sngl(tCPU / NSTEP),' s' + write(IMAIN,*) + write(IMAIN,*) 'Total number of spectral elements in the mesh = ',nspec_total + write(IMAIN,*) ' of which ',nspec_total - nspec_total_pml,' are regular elements' + write(IMAIN,*) ' and ',nspec_total_pml,' are PML elements.' + write(IMAIN,*) 'Average duration of the calculation per spectral element = ', & + sngl(tCPU / (NSTEP * nspec_total)),' s' + write(IMAIN,*) + call flush_IMAIN() + endif + + call date_and_time(datein,timein,zone,time_values) + year = time_values(1) + mon = time_values(2) + day = time_values(3) + hr = time_values(5) + minutes = time_values(6) + call convtime(timestamp,year,mon,day,hr,minutes) + + ! convert to seconds instead of minutes, to be more precise for 2D runs, which can be fast + timestamp_seconds_end = timestamp*60.d0 + time_values(7) + time_values(8)/1000.d0 + + ! elapsed time since beginning of the simulation + tCPU = timestamp_seconds_end - timestamp_seconds_start + + int_tCPU = int(tCPU) + ihours = int_tCPU / 3600 + iminutes = (int_tCPU - 3600*ihours) / 60 + iseconds = int_tCPU - 3600*ihours - 60*iminutes + + if (myrank == 0) then + write(IMAIN,*) + write(IMAIN,*) 'Total duration of the timeloop measured using date and time of the system' + write(IMAIN,*) ' in seconds = ',sngl(tCPU),' s' + write(IMAIN,"(' in in hh:mm:ss = ',i6,' h ',i2.2,' m ',i2.2,' s')") ihours,iminutes,iseconds + write(IMAIN,*) + call flush_IMAIN() + endif + + end subroutine print_elapsed_time diff --git a/src/specfem2D/iterate_time_undoatt.F90 b/src/specfem2D/iterate_time_undoatt.F90 index d34db75e9..4d754eeaf 100644 --- a/src/specfem2D/iterate_time_undoatt.F90 +++ b/src/specfem2D/iterate_time_undoatt.F90 @@ -58,7 +58,7 @@ subroutine iterate_time_undoatt() ! timing double precision, external :: wtime - double precision :: start_time_of_time_loop,duration_of_time_loop_in_seconds + logical :: compute_b_wavefield ! checks if anything to do @@ -226,8 +226,6 @@ subroutine iterate_time_undoatt() do it_of_this_subset = 1, it_subset_end it = it + 1 - ! compute current time - current_timeval = (it-1) * DT ! display time step and max of norm of displacement if (mod(it,NTSTEP_BETWEEN_OUTPUT_INFO) == 0 .or. it == 5 .or. it == NSTEP) call check_stability() @@ -484,9 +482,6 @@ subroutine iterate_time_undoatt() endif ! mod(it,NTSTEP_BETWEEN_COMPUTE_KERNELS) == 0 - ! compute current time - current_timeval = (it-1) * DT - ! display time step and max of norm of displacement if ((.not. GPU_MODE) .and. mod(it,NTSTEP_BETWEEN_OUTPUT_INFO) == 0 .or. it == 5 .or. it == NSTEP) then call check_stability() @@ -614,26 +609,12 @@ subroutine iterate_time_undoatt() !---- end of time iteration loop ! - if (myrank == 0) then - duration_of_time_loop_in_seconds = wtime() - start_time_of_time_loop - - write(IMAIN,*) - write(IMAIN,*) 'Total duration of the time loop in seconds = ',sngl(duration_of_time_loop_in_seconds),' s' - write(IMAIN,*) 'Total number of time steps = ',NSTEP - write(IMAIN,*) 'Average duration of a time step of the time loop = ',sngl(duration_of_time_loop_in_seconds / NSTEP),' s' - write(IMAIN,*) 'Total number of spectral elements in the mesh = ',NSPEC - write(IMAIN,*) ' of which ',NSPEC - count(ispec_is_PML),' are regular elements' - write(IMAIN,*) ' and ',count(ispec_is_PML),' are PML elements.' - write(IMAIN,*) 'Average duration of the calculation per spectral element = ', & - sngl(duration_of_time_loop_in_seconds / (NSTEP * NSPEC)),' s' - write(IMAIN,*) - call flush_IMAIN() - endif + ! output elapsed time + call print_elapsed_time() ! Transfer fields from GPU card to host for further analysis if (GPU_MODE) call it_transfer_from_GPU() - ! frees undo_attenuation buffers if (SIMULATION_TYPE == 3) then if (any_acoustic) then diff --git a/src/specfem2D/read_external_model.f90 b/src/specfem2D/read_external_model.f90 index 383227b44..8bbb65ba9 100644 --- a/src/specfem2D/read_external_model.f90 +++ b/src/specfem2D/read_external_model.f90 @@ -31,7 +31,7 @@ ! !======================================================================== - subroutine read_external_model(rhoext,vpext,vsext,QKappa_attenuationext,Qmu_attenuationext, & + subroutine read_external_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext, & nspec_ext,c11ext,c12ext,c13ext,c15ext,c22ext,c23ext,c25ext,c33ext,c35ext,c55ext) ! reads in external model files @@ -42,25 +42,17 @@ subroutine read_external_model(rhoext,vpext,vsext,QKappa_attenuationext,Qmu_atte use specfem_par, only: nspec,ibool,ispec_is_elastic,ispec_is_anisotropic, & coord,kmato,MODEL,myrank,setup_with_binary_database - ! external model parameters - use specfem_par, only: & - ATTENUATION_VISCOELASTIC,ATTENUATION_VISCOACOUSTIC - implicit none - real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec) :: rhoext,vpext,vsext,QKappa_attenuationext,Qmu_attenuationext + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec), intent(inout) :: rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext - integer :: nspec_ext - real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec_ext) :: c11ext,c12ext,c13ext,c15ext,c22ext,c23ext,c25ext, & - c33ext,c35ext,c55ext + integer, intent(in) :: nspec_ext + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec_ext), intent(inout) :: c11ext,c12ext,c13ext,c15ext, & + c22ext,c23ext,c25ext, & + c33ext,c35ext,c55ext ! Local variables - integer :: i,j,ispec,itmp - integer :: ier - real(kind=CUSTOM_REAL) :: tmp1,tmp2 - double precision :: vs_val,vp_val,rho_val - character(len=MAX_STRING_LEN) :: inputname, line - logical :: read_next_line + integer :: i,j,ispec ! note: we read in external models once the basic mesh with its geometry and GLL points has been setup. ! External models define new velocity/material parameters which need to be defined on all GLL points. @@ -74,277 +66,36 @@ subroutine read_external_model(rhoext,vpext,vsext,QKappa_attenuationext,Qmu_atte select case (trim(MODEL)) case ('legacy') ! old model format - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_model_velocity.dat_input' - - ! user output - if (myrank == 0) then - write(IMAIN,*) ' reading external files: rank ',myrank,' reads ',trim(inputname) - call flush_IMAIN() - endif - - ! opens file - open(unit=IIN,file=trim(inputname),status='old',action='read',iostat=ier) - if (ier /= 0) then - print *,'Error rank ',myrank,' opening file: ',trim(inputname) - print *,'Please check if the file exists...' - call stop_the_code('Error opening DATA/proc*****_model_velocity.dat_input file.') - endif - - do ispec = 1,nspec - do j = 1,NGLLZ - do i = 1,NGLLX - ! reads next data line - read_next_line = .true. - do while (read_next_line) - ! format: #unused #unused #unused #rho #vp #vs - read(IIN,'(a256)',iostat=ier) line - - ! debug - !print *,'debug: i,j,ispec',i,j,ispec,' error ',ier,' line ****',trim(line),'****' - - ! checks - if (ier /= 0) then - print *,'Error rank ',myrank,' reading line for i,j,ispec: ',i,j,ispec,'out of',nspec - print *,'Error previous line ****',trim(line),'****' - print * - call stop_the_code('Error reading file model_velocity.dat_input') - endif - - ! left adjust - line = adjustl(line) - - ! trim white space - line = trim(line) - - ! skip comment lines - if (line(1:1) == '#') then - read_next_line = .true. - else - read_next_line = .false. - endif - enddo - - ! reads in values - read(line,*) itmp,tmp1,tmp2,rho_val,vp_val,vs_val - - rhoext(i,j,ispec) = rho_val - vpext(i,j,ispec) = vp_val - vsext(i,j,ispec) = vs_val - enddo - enddo - enddo - close(IIN) - - ! default no attenuation - QKappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + call read_legacy_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) case ('ascii') ! ascii model format - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho_vp_vs.dat' - if (myrank == 0) write(IMAIN,*) ' reading external files: ','DATA/proc*****_rho_vp_vs.dat' - - open(unit=IIN,file=inputname,status='old',action='read',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_rho_vp_vs.dat file.') - do ispec = 1,nspec - do j = 1,NGLLZ - do i = 1,NGLLX - ! format: #unused #unused #rho #vp #vs - read(IIN,*) tmp1,tmp2,rho_val,vp_val,vs_val - - rhoext(i,j,ispec) = rho_val - vpext(i,j,ispec) = vp_val - vsext(i,j,ispec) = vs_val - enddo - enddo - enddo - close(IIN) - ! default no attenuation - QKappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + call read_ascii_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) case ('binary','gll') ! binary formats - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho.bin' - if (myrank == 0) write(IMAIN,*) ' reading external files: ','DATA/proc*****_rho.bin, .._vp.bin, .._vs.bin' - - open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_rho.bin file.') - - read(IIN) rhoext - close(IIN) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_vp.bin' - open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_vp.bin file.') - - read(IIN) vpext - close(IIN) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_vs.bin' - open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_vs.bin file.') - - read(IIN) vsext - close(IIN) - - ! user output - if (myrank == 0) then - write(IMAIN,*) ' rho min/max = ', minval(rhoext), maxval(rhoext) - write(IMAIN,*) ' vp min/max = ', minval(vpext), maxval(vpext) - write(IMAIN,*) ' vs min/max = ', minval(vsext), maxval(vsext) - write(IMAIN,*) - call flush_IMAIN() - endif - - ! for the moment we don't do external model with both viscoacoustics and viscoelastics - if (ATTENUATION_VISCOACOUSTIC) then - ! visco-acoustic - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qkappa.bin' - open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qkappa.bin file.') - - read(IIN) QKappa_attenuationext - close(IIN) - Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - - ! user output - if (myrank == 0) then - write(IMAIN,*) ' Qkappa min/max = ', minval(Qkappa_attenuationext), maxval(Qkappa_attenuationext) - write(IMAIN,*) - call flush_IMAIN() - endif - - else if (ATTENUATION_VISCOELASTIC) then - ! visco-elastic - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qkappa.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qkappa.bin file.') - - read(IIN) QKappa_attenuationext - close(IIN) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qmu.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qmu.bin file.') - - read(IIN) Qmu_attenuationext - close(IIN) - - ! user output - if (myrank == 0) then - write(IMAIN,*) ' Qkappa min/max = ', minval(Qkappa_attenuationext), maxval(Qkappa_attenuationext) - write(IMAIN,*) ' Qmu min/max = ', minval(Qmu_attenuationext), maxval(Qmu_attenuationext) - write(IMAIN,*) - call flush_IMAIN() - endif - - else - ! default no attenuation - QKappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - endif - + call read_binary_gll_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) case ('binary_voigt') ! Voigt model - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho.bin' - if (myrank == 0) write(IMAIN,*) ' reading external files: ','DATA/proc*****_rho.bin, .._c11.bin, .._c55.bin' - - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_rho.bin file.') - - read(IIN) rhoext - close(IIN) - print *, 'rho', minval(rhoext), maxval(rhoext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c11.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c11.bin file.') - - read(IIN) c11ext - close(IIN) - print *, 'c11ext', minval(c11ext), maxval(c11ext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c13.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c13.bin file.') - - read(IIN) c13ext - close(IIN) - print *, 'c13ext', minval(c13ext), maxval(c13ext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c15.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c15.bin file.') - - read(IIN) c15ext - close(IIN) - print *, 'c15ext', minval(c15ext), maxval(c15ext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c33.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c33.bin file.') - - read(IIN) c33ext - close(IIN) - print *, 'c33ext', minval(c33ext), maxval(c33ext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c35.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c35.bin file.') - - read(IIN) c35ext - close(IIN) - print *, 'c35ext', minval(c35ext), maxval(c35ext) - - write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c55.bin' - open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) - if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c55.bin file.') - - read(IIN) c55ext - close(IIN) - print *, 'c55ext', minval(c55ext), maxval(c55ext) - - do ispec = 1,nspec - do j = 1,NGLLZ - do i = 1,NGLLX - if (c55ext(i,j,ispec) < TINYVAL) then - c33ext(i,j,ispec) = 0.0_CUSTOM_REAL - c12ext(i,j,ispec) = 0.0_CUSTOM_REAL - c23ext(i,j,ispec) = 0.0_CUSTOM_REAL - vpext(i,j,ispec) = 1500.0 - vsext(i,j,ispec) = 0.0_CUSTOM_REAL - else - c12ext(i,j,ispec) = 1.d-6 - c23ext(i,j,ispec) = 1.d-6 - vpext(i,j,ispec) = sqrt(c33ext(i,j,ispec)/rhoext(i,j,ispec)) - vsext(i,j,ispec) = sqrt(c55ext(i,j,ispec)/rhoext(i,j,ispec)) - endif - c25ext(i,j,ispec) = 0.0_CUSTOM_REAL - enddo - enddo - enddo - - ! default no attenuation - QKappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM - Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + call read_binary_voigt_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext, & + nspec_ext,c11ext,c12ext,c13ext,c15ext,c23ext,c25ext,c33ext,c35ext,c55ext) case ('external') ! generic model defined in external files call define_external_model(coord,kmato,ibool,rhoext,vpext,vsext, & - QKappa_attenuationext,Qmu_attenuationext, & + Qkappa_attenuationext,Qmu_attenuationext, & c11ext,c12ext,c13ext,c15ext,c23ext,c25ext,c33ext,c35ext,c55ext) case ('marmousi') ! marmousi type model call define_external_model_from_marmousi(coord,ibool,rhoext,vpext,vsext, & - QKappa_attenuationext,Qmu_attenuationext, & + Qkappa_attenuationext,Qmu_attenuationext, & c11ext,c12ext,c13ext,c15ext,c23ext,c25ext,c33ext,c35ext,c55ext) case ('tomo') ! tomographic file call define_external_model_from_tomo_file(rhoext,vpext,vsext, & - QKappa_attenuationext,Qmu_attenuationext, & + Qkappa_attenuationext,Qmu_attenuationext, & c11ext,c12ext,c13ext,c15ext,c22ext,c23ext,c25ext,c33ext,c35ext,c55ext) case default @@ -403,3 +154,403 @@ subroutine read_external_model(rhoext,vpext,vsext,QKappa_attenuationext,Qmu_atte end subroutine read_external_model +! +!------------------------------------------------------------------------------------------------- +! + + subroutine read_legacy_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) + +! reads in legacy format model + + use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,IMAIN,IN_DATA_FILES,IIN,MAX_STRING_LEN, & + ATTENUATION_COMP_MAXIMUM + + use specfem_par, only: nspec,myrank + + implicit none + + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec), intent(inout) :: rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext + + ! Local variables + integer :: i,j,ispec,itmp,ier + real(kind=CUSTOM_REAL) :: tmp1,tmp2 + double precision :: vs_val,vp_val,rho_val + character(len=MAX_STRING_LEN) :: inputname, line + logical :: read_next_line + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_model_velocity.dat_input' + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' reading external files: rank ',myrank,' reads ',trim(inputname) + call flush_IMAIN() + endif + + ! opens file + open(unit=IIN,file=trim(inputname),status='old',action='read',iostat=ier) + if (ier /= 0) then + print *,'Error rank ',myrank,' opening file: ',trim(inputname) + print *,'Please check if the file exists...' + call stop_the_code('Error opening DATA/proc******_model_velocity.dat_input file.') + endif + + do ispec = 1,nspec + do j = 1,NGLLZ + do i = 1,NGLLX + ! reads next data line + read_next_line = .true. + do while (read_next_line) + ! format: #unused #unused #unused #rho #vp #vs + read(IIN,'(a256)',iostat=ier) line + + ! debug + !print *,'debug: i,j,ispec',i,j,ispec,' error ',ier,' line ****',trim(line),'****' + + ! checks + if (ier /= 0) then + print *,'Error rank ',myrank,' reading line for i,j,ispec: ',i,j,ispec,'out of',nspec + print *,'Error previous line ****',trim(line),'****' + print * + call stop_the_code('Error reading file proc******_model_velocity.dat_input') + endif + + ! left adjust + line = adjustl(line) + + ! trim white space + line = trim(line) + + ! skip comment lines + if (line(1:1) == '#') then + read_next_line = .true. + else + read_next_line = .false. + endif + enddo + + ! reads in values + read(line,*) itmp,tmp1,tmp2,rho_val,vp_val,vs_val + + rhoext(i,j,ispec) = rho_val + vpext(i,j,ispec) = vp_val + vsext(i,j,ispec) = vs_val + enddo + enddo + enddo + close(IIN) + + ! default no attenuation + QKappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + + end subroutine read_legacy_model + +! +!------------------------------------------------------------------------------------------------- +! + + subroutine read_ascii_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) + +! reads in ascii format model + + use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,IMAIN,IN_DATA_FILES,IIN,MAX_STRING_LEN, & + ATTENUATION_COMP_MAXIMUM + + use specfem_par, only: nspec,myrank + + implicit none + + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec), intent(inout) :: rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext + + ! Local variables + integer :: i,j,ispec,ier + real(kind=CUSTOM_REAL) :: tmp1,tmp2 + double precision :: vs_val,vp_val,rho_val + character(len=MAX_STRING_LEN) :: inputname, line + logical :: read_next_line + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho_vp_vs.dat' + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' reading external files: ','DATA/proc******_rho_vp_vs.dat' + call flush_IMAIN() + endif + + ! opens file + open(unit=IIN,file=trim(inputname),status='old',action='read',iostat=ier) + if (ier /= 0) then + print *,'Error rank ',myrank,' opening file: ',trim(inputname) + print *,'Please check if the file exists...' + call stop_the_code('Error opening DATA/proc******_rho_vp_vs.dat file.') + endif + + do ispec = 1,nspec + do j = 1,NGLLZ + do i = 1,NGLLX + ! reads next data line + read_next_line = .true. + do while (read_next_line) + ! format: #unused #unused #unused #rho #vp #vs + read(IIN,'(a256)',iostat=ier) line + + ! debug + !print *,'debug: i,j,ispec',i,j,ispec,' error ',ier,' line ****',trim(line),'****' + + ! checks + if (ier /= 0) then + print *,'Error rank ',myrank,' reading line for i,j,ispec: ',i,j,ispec,'out of',nspec + print *,'Error previous line ****',trim(line),'****' + print * + call stop_the_code('Error reading file proc******_rho_vp_vs.dat ') + endif + + ! left adjust + line = adjustl(line) + + ! trim white space + line = trim(line) + + ! skip comment lines + if (line(1:1) == '#') then + read_next_line = .true. + else + read_next_line = .false. + endif + enddo + + ! reads in values + ! format: #unused #unused #rho #vp #vs + read(line,*) tmp1,tmp2,rho_val,vp_val,vs_val + + rhoext(i,j,ispec) = rho_val + vpext(i,j,ispec) = vp_val + vsext(i,j,ispec) = vs_val + enddo + enddo + enddo + close(IIN) + + ! default no attenuation + Qkappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + + end subroutine read_ascii_model + +! +!------------------------------------------------------------------------------------------------- +! + + subroutine read_binary_gll_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) + +! reads in binary and gll format model + + use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,IMAIN,IN_DATA_FILES,IIN,MAX_STRING_LEN, & + ATTENUATION_COMP_MAXIMUM + + use specfem_par, only: nspec,myrank + + ! external model parameters + use specfem_par, only: & + ATTENUATION_VISCOELASTIC,ATTENUATION_VISCOACOUSTIC + + implicit none + + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec), intent(inout) :: rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext + + ! Local variables + integer :: ier + character(len=MAX_STRING_LEN) :: inputname + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho.bin' + if (myrank == 0) write(IMAIN,*) ' reading external files: ','DATA/proc*****_rho.bin, .._vp.bin, .._vs.bin' + + open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_rho.bin file.') + + read(IIN) rhoext + close(IIN) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_vp.bin' + open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_vp.bin file.') + + read(IIN) vpext + close(IIN) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_vs.bin' + open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_vs.bin file.') + + read(IIN) vsext + close(IIN) + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' rho min/max = ', minval(rhoext), maxval(rhoext) + write(IMAIN,*) ' vp min/max = ', minval(vpext), maxval(vpext) + write(IMAIN,*) ' vs min/max = ', minval(vsext), maxval(vsext) + write(IMAIN,*) + call flush_IMAIN() + endif + + ! for the moment we don't do external model with both viscoacoustics and viscoelastics + if (ATTENUATION_VISCOACOUSTIC) then + ! visco-acoustic + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qkappa.bin' + open(unit = IIN, file = inputname, status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qkappa.bin file.') + + read(IIN) Qkappa_attenuationext + close(IIN) + Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' Qkappa min/max = ', minval(Qkappa_attenuationext), maxval(Qkappa_attenuationext) + write(IMAIN,*) + call flush_IMAIN() + endif + + else if (ATTENUATION_VISCOELASTIC) then + ! visco-elastic + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qkappa.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qkappa.bin file.') + + read(IIN) Qkappa_attenuationext + close(IIN) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_Qmu.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_Qmu.bin file.') + + read(IIN) Qmu_attenuationext + close(IIN) + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' Qkappa min/max = ', minval(Qkappa_attenuationext), maxval(Qkappa_attenuationext) + write(IMAIN,*) ' Qmu min/max = ', minval(Qmu_attenuationext), maxval(Qmu_attenuationext) + write(IMAIN,*) + call flush_IMAIN() + endif + + else + ! default no attenuation + Qkappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + endif + + end subroutine read_binary_gll_model + +! +!------------------------------------------------------------------------------------------------- +! + + subroutine read_binary_voigt_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext, & + nspec_ext,c11ext,c12ext,c13ext,c15ext,c23ext,c25ext,c33ext,c35ext,c55ext) + +! reads in binary voigt format model + + use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,IMAIN,IN_DATA_FILES,IIN,MAX_STRING_LEN, & + ATTENUATION_COMP_MAXIMUM,TINYVAL + + use specfem_par, only: nspec,myrank + + implicit none + + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec), intent(inout) :: rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext + + integer, intent(in) :: nspec_ext + real(kind=CUSTOM_REAL),dimension(NGLLX,NGLLZ,nspec_ext), intent(inout) :: c11ext,c12ext,c13ext,c15ext, & + c23ext,c25ext, & + c33ext,c35ext,c55ext + + ! Local variables + integer :: i,j,ispec,ier + character(len=MAX_STRING_LEN) :: inputname + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_rho.bin' + if (myrank == 0) write(IMAIN,*) ' reading external files: ','DATA/proc*****_rho.bin, .._c11.bin, .._c55.bin' + + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted',iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_rho.bin file.') + + read(IIN) rhoext + close(IIN) + print *, 'rho', minval(rhoext), maxval(rhoext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c11.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c11.bin file.') + + read(IIN) c11ext + close(IIN) + print *, 'c11ext', minval(c11ext), maxval(c11ext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c13.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c13.bin file.') + + read(IIN) c13ext + close(IIN) + print *, 'c13ext', minval(c13ext), maxval(c13ext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c15.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c15.bin file.') + + read(IIN) c15ext + close(IIN) + print *, 'c15ext', minval(c15ext), maxval(c15ext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c33.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c33.bin file.') + + read(IIN) c33ext + close(IIN) + print *, 'c33ext', minval(c33ext), maxval(c33ext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c35.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c35.bin file.') + + read(IIN) c35ext + close(IIN) + print *, 'c35ext', minval(c35ext), maxval(c35ext) + + write(inputname,'(a,i6.6,a)') trim(IN_DATA_FILES)//'proc',myrank,'_c55.bin' + open(unit = IIN, file = inputname,status='old',action='read',form='unformatted', iostat=ier) + if (ier /= 0) call stop_the_code('Error opening DATA/proc*****_c55.bin file.') + + read(IIN) c55ext + close(IIN) + print *, 'c55ext', minval(c55ext), maxval(c55ext) + + do ispec = 1,nspec + do j = 1,NGLLZ + do i = 1,NGLLX + if (c55ext(i,j,ispec) < TINYVAL) then + c33ext(i,j,ispec) = 0.0_CUSTOM_REAL + c12ext(i,j,ispec) = 0.0_CUSTOM_REAL + c23ext(i,j,ispec) = 0.0_CUSTOM_REAL + vpext(i,j,ispec) = 1500.0 + vsext(i,j,ispec) = 0.0_CUSTOM_REAL + else + c12ext(i,j,ispec) = 1.d-6 + c23ext(i,j,ispec) = 1.d-6 + vpext(i,j,ispec) = sqrt(c33ext(i,j,ispec)/rhoext(i,j,ispec)) + vsext(i,j,ispec) = sqrt(c55ext(i,j,ispec)/rhoext(i,j,ispec)) + endif + c25ext(i,j,ispec) = 0.0_CUSTOM_REAL + enddo + enddo + enddo + + ! default no attenuation + Qkappa_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + Qmu_attenuationext(:,:,:) = ATTENUATION_COMP_MAXIMUM + + end subroutine read_binary_voigt_model diff --git a/src/specfem2D/specfem2D_par.f90 b/src/specfem2D/specfem2D_par.f90 index f1957d1d7..721b98e47 100644 --- a/src/specfem2D/specfem2D_par.f90 +++ b/src/specfem2D/specfem2D_par.f90 @@ -313,16 +313,14 @@ module specfem_par ! for backward simulation in adjoint inversion real(kind=CUSTOM_REAL) :: b_deltatover2,b_deltatsquareover2,b_deltat ! coefficients of the explicit Newmark time scheme - ! current time - double precision :: current_timeval - ! UNDO_ATTENUATION_AND_OR_PML integer :: NSUBSET_ITERATIONS integer :: iteration_on_subset,it_of_this_subset integer :: it_subset_end ! to determine date and time at which the run will finish - double precision :: timestamp_seconds_start + double precision :: timestamp_seconds_start ! based on date_and_time() + double precision :: start_time_of_time_loop ! based on wtime() !--------------------------------------------------------------------- ! global variable shared by acoustic/elastic/poroelastic simulation From 2f9b4a86b47b225e2db33480e776e3e1386afff2 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Tue, 6 Feb 2024 19:56:34 +0100 Subject: [PATCH 08/13] updates cubit2specfem2d python scripts --- utils/cubit2specfem2d/README | 7 +- utils/cubit2specfem2d/boundary_definition.py | 46 +-- utils/cubit2specfem2d/cubit2specfem2d.py | 298 ++++++++++++++---- .../cubit2specfem2d/cubit2specfem2d_QUAD9.py | 12 + utils/cubit2specfem2d/run_cubit_to_specfem.py | 39 ++- 5 files changed, 315 insertions(+), 87 deletions(-) diff --git a/utils/cubit2specfem2d/README b/utils/cubit2specfem2d/README index 12dd34af8..df63a7f89 100644 --- a/utils/cubit2specfem2d/README +++ b/utils/cubit2specfem2d/README @@ -1,5 +1,8 @@ -SPECFEM2D/UTILS/cubit2specfem2d/README +---------------------------------------------------------- +README +---------------------------------------------------------- -The preferred version for using cubit to output files specific for SPECFEM2D would be to use the python script cubit2specfem2d.py, similar to the procedure used for SPECFEM3D. Read comments in the file cubit2specfem2d.py itself. +The preferred version for using cubit to output files specific for SPECFEM2D would be to use the python script cubit2specfem2d.py, +similar to the procedure used for SPECFEM3D. Read comments in the file cubit2specfem2d.py itself. An alternative is to use the matlab scripts in the folder matlab. diff --git a/utils/cubit2specfem2d/boundary_definition.py b/utils/cubit2specfem2d/boundary_definition.py index 07a7ed652..4dc9cf09d 100755 --- a/utils/cubit2specfem2d/boundary_definition.py +++ b/utils/cubit2specfem2d/boundary_definition.py @@ -34,8 +34,8 @@ def define_bc_edges(): """ #from utilities import get_v_h_list # - list_vol = cubit.parse_cubit_list("volume","all",1) - print("#define_edge: volume list length = ",len(list_vol)) + list_vol = cubit.parse_cubit_list("volume","all") + print("# define_bc_edge: volume list length = ",len(list_vol)) xmin_box = cubit.get_total_bounding_box("volume",list_vol)[0] xmax_box = cubit.get_total_bounding_box("volume",list_vol)[1] @@ -46,17 +46,15 @@ def define_bc_edges(): zmin_box = cubit.get_total_bounding_box("volume",list_vol)[6] #it is the z_min of the box ... box= xmin,xmax,d,ymin,ymax,d,zmin... zmax_box = cubit.get_total_bounding_box("volume",list_vol)[7] - print("#define_edge: bounding box xmin/xmax = ",xmin_box,xmax_box) - print("#define_edge: bounding box ymin/ymax = ",ymin_box,ymax_box) - print("#define_edge: bounding box zmin/zmax = ",zmin_box,zmax_box) + print("# define_bc_edge: bounding box xmin/xmax = ",xmin_box,xmax_box) + print("# define_bc_edge: bounding box ymin/ymax = ",ymin_box,ymax_box) + print("# define_bc_edge: bounding box zmin/zmax = ",zmin_box,zmax_box) # cubit2specfem2d.py needs one block per border (abs_bottom, abs_right, abs_left, abs_top, topo, axis) # # 2D model should be defined in with top at maximum, bottom at minimum (e.g. z pointing up in positive direction, not depth) if abs(xmax_box-xmin_box) < 0.001: - print("") - print("# model in YZ plane") - print("") + print("# define_bc_edge: mesh in YZ plane") border_t = zmax_box - 0.1 # top minus margin border_b = zmin_box + 0.1 # bottom border_l = ymin_box + 0.1 # left @@ -64,20 +62,22 @@ def define_bc_edges(): cubit.cmd('block 1001 edge in surf all with z_coord > ' + str(border_t)) cubit.cmd('block 1001 name "topo"') + cubit.cmd('block 1001 element type BAR2') # convert to BAR2 types (not BEAM2) since export requires BAR2 cubit.cmd('block 1002 edge in surf all with z_coord < ' + str(border_b)) cubit.cmd('block 1002 name "abs_bottom"') + cubit.cmd('block 1002 element type BAR2') cubit.cmd('block 1003 edge in surf all with y_coord < ' + str(border_l)) cubit.cmd('block 1003 name "abs_left"') + cubit.cmd('block 1003 element type BAR2') cubit.cmd('block 1004 edge in surf all with y_coord > ' + str(border_r)) cubit.cmd('block 1004 name "abs_right"') + cubit.cmd('block 1004 element type BAR2') if abs(ymax_box-ymin_box) < 0.001: - print("") - print("# model in XZ plane") - print("") + print("# define_bc_edge: mesh in XZ plane") border_t = zmax_box - 0.1 # top minus margin border_b = zmin_box + 0.1 # bottom border_l = xmin_box + 0.1 # left @@ -85,20 +85,22 @@ def define_bc_edges(): cubit.cmd('block 1001 edge in surf all with z_coord > ' + str(border_t)) cubit.cmd('block 1001 name "topo"') + cubit.cmd('block 1001 element type BAR2') cubit.cmd('block 1002 edge in surf all with z_coord < ' + str(border_b)) cubit.cmd('block 1002 name "abs_bottom"') + cubit.cmd('block 1002 element type BAR2') cubit.cmd('block 1003 edge in surf all with x_coord < ' + str(border_l)) cubit.cmd('block 1003 name "abs_left"') + cubit.cmd('block 1003 element type BAR2') cubit.cmd('block 1004 edge in surf all with x_coord > ' + str(border_r)) cubit.cmd('block 1004 name "abs_right"') + cubit.cmd('block 1004 element type BAR2') if abs(zmax_box-zmin_box) < 0.001: - print("") - print("# model in XY plane") - print("") + print("# define_bc_edge: mesh in XY plane") border_t = ymax_box - 0.1 # top minus margin border_b = ymin_box + 0.1 # bottom border_l = xmin_box + 0.1 # left @@ -106,28 +108,32 @@ def define_bc_edges(): cubit.cmd('block 1001 edge in surf all with y_coord > ' + str(border_t)) cubit.cmd('block 1001 name "topo"') + cubit.cmd('block 1001 element type BAR2') cubit.cmd('block 1002 edge in surf all with y_coord < ' + str(border_b)) cubit.cmd('block 1002 name "abs_bottom"') + cubit.cmd('block 1002 element type BAR2') cubit.cmd('block 1003 edge in surf all with x_coord < ' + str(border_l)) cubit.cmd('block 1003 name "abs_left"') + cubit.cmd('block 1003 element type BAR2') cubit.cmd('block 1004 edge in surf all with x_coord > ' + str(border_r)) cubit.cmd('block 1004 name "abs_right"') + cubit.cmd('block 1004 element type BAR2') # outputs block infos list_ids = cubit.get_block_id_list() - print("#blocks: ",list_ids) + print("# define_bc_edge: blocks: ",list_ids) for id in list_ids: - print("#block id: ",id) + print("# define_bc_edge: block id: ",id) name = cubit.get_exodus_entity_name("block", id) - print("#block name: ",name) + print("# define_bc_edge: block name: ",name) num_a = cubit.get_block_attribute_count(id) - print("#block number of attributes: ",num_a) + print("# define_bc_edge: block number of attributes: ",num_a) #attr = cubit.get_block_attribute_value(id,1) edges = cubit.get_block_edges(id) - print("# number of edges = ",len(edges)) - print("") + print("# define_bc_edge: number of edges = ",len(edges)) + print("#") return diff --git a/utils/cubit2specfem2d/cubit2specfem2d.py b/utils/cubit2specfem2d/cubit2specfem2d.py index 54a0f8c08..05e8485e7 100644 --- a/utils/cubit2specfem2d/cubit2specfem2d.py +++ b/utils/cubit2specfem2d/cubit2specfem2d.py @@ -1,41 +1,47 @@ #!/usr/bin/env python # # Script to export a Cubit13+/Trelis 2D mesh in specfem2d format -# Author unknown, comments and modifications by Alexis Bottero (alexis dot bottero At gmail dot com) +# Initial Author unknown, comments and modifications by Alexis Bottero (alexis dot bottero At gmail dot com) +# +# this script supports both, QUAD4 for linear or QUAD9 for quadratic element types for surface elements, +# as well as BAR2 or BAR3 edge types for edges. + +# Create your mesh in Cubit +# (or build the simpleAxisym2dMesh.py for a QUAD4 element example, MeshSansCPMLquad9.py for a QUAD9 element type example) +# and play this script within Cubit as a Python journal file. # -# Create your mesh in Cubit (or build the simpleAxisym2dMesh.py example) and play this script within Cubit as a Python journal file. # Instructions for mesh creation : -# _The mesh must be in XZ plane! -# _One block per material : +# The mesh by default is assumed to be in the XZ plane, but it will recognize also XY or YZ plane meshes! +# +# Define a block per material, for example like : # cubit.cmd('block 1 name "Acoustic channel" ') # acoustic material region # cubit.cmd('block 1 attribute count 6') # number of attributes -# cubit.cmd('block 1 attribute index 1 1') # material index +# cubit.cmd('block 1 attribute index 1 1') # material index # cubit.cmd('block 1 attribute index 2 1500 ') # vp # cubit.cmd('block 1 attribute index 3 0 ') # vs # cubit.cmd('block 1 attribute index 4 1000 ') # rho # cubit.cmd('block 1 attribute index 5 0 ') # Q_flag # cubit.cmd('block 1 attribute index 6 0 ') # anisotropy_flag -# cubit.cmd('block 1 element type QUAD4') +# cubit.cmd('block 1 element type QUAD4') # or 'QUAD9' for quadratic elements # -# _One block per border (abs_bottom, abs_right, abs_left, abs_top, topo, axis). If axisymmetric simulation don't create a block -# abs_left but a block axis. -# Ex: +# Define a block per absorbing border (abs_bottom, abs_right, abs_left, abs_top, topo, axis). +# For axisymmetric simulations, you don't need to create a block abs_left, but a block axis. +# Example: # cubit.cmd('block 3 edge in surf all with z_coord > -0.1') # topo # cubit.cmd('block 3 name "topo"') # -#_ One block per pml layer of a given type (acoustic or elastic) : pml_x_acoust,pml_z_acoust,pml_xz_acoust,pml_x_elast,pml_z_elast,pml_xz_elast +# Define one block per pml layer of a given type (acoustic or elastic) +# pml_x_acoust,pml_z_acoust,pml_xz_acoust,pml_x_elast,pml_z_elast,pml_xz_elast # !! Warning !! pml blocks don't have faces in common # !! Warning !! you must create the corresponding absorbing surface blocks (abs_bottom, abs_right, abs_left, abs_top)! # -# Ideas to improve that script (ctrl+f for TODO also): _Allow 2D models built in XY and ZY planes -# # The names of the block and the entities types must match the ones given during the definition of the class mesh on this file : # Below : # class mesh(mesh_tools): # """ A class to store the mesh """ # def __init__(self): # -#!! Warning : a block in cubit != quad !! A block is a group of something (quads, edges, volumes, surfaces...) +# !! Warning : a block in cubit != quad !! A block is a group of something (quads, edges, volumes, surfaces...) # On this case the blocks are used to gather faces corresponding to different materials and edges corresponding to free surfaces, # absorbing surfaces, topography or axis from __future__ import print_function @@ -203,21 +209,45 @@ def edge_min_length(self,surface): edge_store = edge self.edgemin = edge_store return self.edgemin,self.dmin - def jac_check(self,nodes): + def jac_check(self,nodes,plane_id,type=""): x0 = cubit.get_nodal_coordinates(nodes[0]) x1 = cubit.get_nodal_coordinates(nodes[1]) x2 = cubit.get_nodal_coordinates(nodes[2]) - xv1 = x1[0]-x0[0] - xv2 = x2[0]-x1[0] - zv1 = x1[2]-x0[2] - zv2 = x2[2]-x1[2] - jac = -xv2*zv1+xv1*zv2 + # plane identifier: 1 == XZ-plane, 2 == XY-plane, 3 == YZ-plane + if plane_id == 1: + # XZ-plane + xv1 = x1[0]-x0[0] + xv2 = x2[0]-x1[0] + zv1 = x1[2]-x0[2] + zv2 = x2[2]-x1[2] + jac = -xv2*zv1 + xv1*zv2 + elif plane_id == 2: + # XY-plane + xv1 = x1[0]-x0[0] + xv2 = x2[0]-x1[0] + yv1 = x1[1]-x0[1] + yv2 = x2[1]-x1[1] + jac = -xv2*yv1 + xv1*yv2 + else: + # YZ-plane + yv1 = x1[1]-x0[1] + yv2 = x2[1]-x1[1] + zv1 = x1[2]-x0[2] + zv2 = x2[2]-x1[2] + jac = -yv2*zv1 + yv1*zv2 + # checks jacobian if jac > 0: return nodes elif jac < 0: - return nodes[0],nodes[3],nodes[2],nodes[1] + # change the ordre for the local coordinate system + if type == 'QUAD9': + # for 9 node finite elements Page.11 in Specfem2d-manual.pdf + return nodes[0],nodes[3],nodes[2],nodes[1],nodes[7],nodes[6],nodes[5],nodes[4],nodes[8] + else: + # QUAD4 type + return nodes[0],nodes[3],nodes[2],nodes[1] else: - print('error, jacobian = 0', jac,nodes) + print('error, jacobian = 0', jac,nodes,'x0/x1/x2:',x0,x1,x2) def mesh_analysis(self,frequency): cubit.cmd('set info off') # Turn off return messages from Cubit commands cubit.cmd('set echo off') # Turn off echo of Cubit commands @@ -287,8 +317,9 @@ def __init__(self): self.pmlname = 'elements_cpml_list' # Name of cpml file to create self.axisname = 'elements_axis' # Name of axial elements file to create and name of the block containing axial edges self.recname = 'STATIONS' - self.face = 'QUAD4' # Faces' type - self.edge = 'BAR2' # Edges' type + self.face = ['QUAD4','QUAD9'] # Faces' type + self.edge = ['BAR2','BAR3'] # Edges' type + self.plane_id = 1 # plane identifier: 1 == XZ-plane, 2 == XY-plane, 3 == YZ-plane self.topo = 'topo' # Name of the block containing topography edges self.pml_boun_name = ['pml_x_acoust','pml_z_acoust','pml_xz_acoust','pml_x_elast','pml_z_elast','pml_xz_elast'] # Name of the block containing pml layers elements self.abs_boun_name = ['abs_bottom','abs_right','abs_top','abs_left'] # Name of the block containing absorbing layer edges @@ -303,6 +334,35 @@ def __init__(self): self.percent_gll = 0.172 self.point_wavelength = 5 cubit.cmd('compress') # Fill the gaps in the numbering of the entities + # get 2d plane of coordinates + # determined based on bounding box dimensions + list_vol = cubit.parse_cubit_list("volume","all") + #print("# volume list length = ",len(list_vol)) + xmin_box = cubit.get_total_bounding_box("volume",list_vol)[0] + xmax_box = cubit.get_total_bounding_box("volume",list_vol)[1] + ymin_box = cubit.get_total_bounding_box("volume",list_vol)[3] + ymax_box = cubit.get_total_bounding_box("volume",list_vol)[4] + zmin_box = cubit.get_total_bounding_box("volume",list_vol)[6] #it is the z_min of the box ... box= xmin,xmax,d,ymin,ymax,d,zmin... + zmax_box = cubit.get_total_bounding_box("volume",list_vol)[7] + #print("# bounding box xmin/xmax = ",xmin_box,xmax_box) + #print("# bounding box ymin/ymax = ",ymin_box,ymax_box) + #print("# bounding box zmin/zmax = ",zmin_box,zmax_box) + #print("") + # plane identifier: 1 == XZ-plane, 2 == XY-plane, 3 == YZ-plane + if abs(ymax_box-ymin_box) < 0.001: + print("# cubit2specfem2d: mesh in XZ plane") + self.plane_id = 1 + elif abs(zmax_box-zmin_box) < 0.001: + print("# cubit2specfem2d: mesh in XY plane") + self.plane_id = 2 + elif abs(xmax_box-xmin_box) < 0.001: + print("# cubit2specfem2d: mesh in YZ plane") + self.plane_id = 3 + else: + print("# WARNING: cubit2specfem2d: mesh is not 2D, will ignored Y-dimension") + self.plane_id = 1 + #print("# plane identifier: ",plane_id) + #print("#") def __repr__(self): pass def block_definition(self): @@ -320,14 +380,14 @@ def block_definition(self): blocks = cubit.get_block_id_list() # Load the blocks list for block in blocks: # Loop on the blocks name = cubit.get_exodus_entity_name('block',block) # Contains the name of the blocks - ty = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) - if ty == self.face: # If we are dealing with a block containing faces - print("block: ",name," contains faces") + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) + if type in self.face: # If we are dealing with a block containing faces + print("block: ",name," contains faces ",type) nAttributes = cubit.get_block_attribute_count(block) if (nAttributes != 1 and nAttributes != 6): print('Blocks not properly defined, 2d blocks must have one attribute (material id) or 6 attributes') return None,None,None,None,None,None,None,None - flag=int(cubit.get_block_attribute_value(block,0)) # Fetch the first attribute value (containing material id) + flag = int(cubit.get_block_attribute_value(block,0)) # Fetch the first attribute value (containing material id) print(" nAttributes : ",nAttributes) if nAttributes == 6: self.write_nummaterial_velocity_file = True @@ -336,12 +396,14 @@ def block_definition(self): rho = cubit.get_block_attribute_value(block,3) # Fetch the third attribute value (containing material density) qFlag = cubit.get_block_attribute_value(block,4) # Fetch the first attribute value (containing Qflag) anisotropy_flag = cubit.get_block_attribute_value(block,5) # Fetch the first attribute value (containing anisotropy_flag) + anisotropy_flag = int(anisotropy_flag) # Store (material_id,rho,velP,velS,Qflag,anisotropy_flag) in par : par = tuple([flag,rho,velP,velS,qFlag,anisotropy_flag]) material[name] = par # associate the name of the block to its id and properties block_flag.append(int(flag)) # Append material id to block_flag block_mat.append(block) # Append block id to block_mat for pml_idx,pml_name in enumerate(self.pml_boun_name): + # block considered refered to one of the pml layers if pml_name in name: pml_boun[pml_idx].append(block) self.abs_mesh = True @@ -356,8 +418,8 @@ def block_definition(self): # # -> Put it at the correct position in pml_boun # # (index 0 : pml_x_acoust, index 1 : pml_z_acoust, index 2 : pml_xz_acoust, # # index 3 : pml_x_elast, index 4 : pml_z_elast, index 5 : pml_xz_elast) - elif ty == self.edge: # If we are dealing with a block containing edges - print("block: ",name," contains edges") + elif type in self.edge: # If we are dealing with a block containing edges + print("block: ",name," contains edges ",type) block_bc_flag.append(2) # Append "2" to block_bc_flag block_bc.append(block) # Append block id to block_bc bc[name] = 2 # Associate the name of the block with its connectivity : an edge has connectivity = 2 @@ -380,7 +442,7 @@ def block_definition(self): abs_boun[self.abs_boun_name.index(name)] = block # -> Put it at the correct position in abs_boun (index 0 : bottom, index 1 : right, index 2 : top, index 3 : left) else: - print('Blocks not properly defined', ty) + print('Blocks not properly defined', type) return None,None,None,None,None,None,None,None nsets = cubit.get_nodeset_id_list() # Get the list of all nodeset if len(nsets) == 0: self.receivers = None # If this list is empty : put None in self.receivers @@ -417,17 +479,81 @@ def block_definition(self): # rho = (1.6612*vp-0.472*vp**2+0.0671*vp**3-0.0043*vp**4+0.000106*vp**4)*1000 # txt = '%3i %1i %20f %20f %20f %1i %1i\n' % (flag,1,rho,vel,vel/(3**.5),0,0) # return txt - def nummaterial_write(self,nummaterial_name): + def mat_parameter(self, properties): + # print properties + # format nummaterials file: + # #material_domain_id #material_id #rho #vp #vs #Q_kappa #Q_mu #anisotropy_flag + # get material properties + mat_id = properties[0] + #print('number of material:', mat_id) + # material id flag must be strictly positive or negative, but not equal to 0 + if mat_id > 0: + # material defined + rho = properties[1] + vp = properties[2] + vs = properties[3] + Q_kappa = 9999.0 # not defined yet + Q_mu = properties[4] + aniso_flag = properties[5] + # determine acoustic==1 or elastic==2 domain + domain_id = 1 if vs == 0.0 else 2 + # format: + #(1)material_domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_kappa #(7)Q_mu #(8)anisotropy_flag + # with material_domain_id ==1 for acoustic or ==2 for elastic materials + txt = f"{domain_id} {mat_id} {rho} {vp} {vs} {Q_kappa} {Q_mu} {aniso_flag}\n" + elif mat_id < 0: + # material undefined, for tomography file + if properties[2] == 'tomography': + # format: + #(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive + txt = '%1i %3i %s %s 1\n' % (2, mat_id, "tomography elastic", properties[3]) + else: + raise RuntimeError('Error: material id must be strictly positive or negative, but not equal to 0') + # info output + #print("material: ",txt) + return txt + def nummaterial_write(self,nummaterial_name,placeholder=True): """ Write material features on file : nummaterial_name """ print('Writing '+nummaterial_name+'.....') nummaterial = open(nummaterial_name,'w') # Create the file "nummaterial_name" and open it + if placeholder: + txt = '''# nummaterial_velocity_file - created by script cubit2specfem2d.py +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +''' + nummaterial.write(txt) + # writes block materials for block in self.block_mat: # For each 2D block name = cubit.get_exodus_entity_name('block',block) # Extract the name of the block - lineToWrite = str(self.material[name][0])+" 1 "+str(self.material[name][1])+" " \ - +str(self.material[name][2])+" "+str(self.material[name][3])+" "+str(self.material[name][4])+" " \ - +str(self.material[name][5])+"\n" # flag rho vp vs rho Qflag anisotropy_flag - nummaterial.write(lineToWrite) - #nummaterial.write(self.tomo(self.material[name][0],self.material[name][2])) + nummaterial.write(str(self.mat_parameter(self.material[name]))) nummaterial.close() print('Ok') def mesh_write(self,mesh_name): @@ -443,14 +569,27 @@ def mesh_write(self,mesh_name): num_write = 0 for block,flag in zip(self.block_mat,self.block_flag): # for each 2D block quads = cubit.get_block_faces(block) # Import quads ids + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for inum,quad in enumerate(quads): # For each of these quads - nodes = cubit.get_connectivity('face',quad) # Get the nodes - nodes = self.jac_check(nodes) # Check the jacobian - txt = ('%10i %10i %10i %10i\n')% nodes + if type == 'QUAD9': + # QUAD9 + nodes = cubit.get_expanded_connectivity('face',quad) # Get all the nodes in quad including interior points + else: + # QUAD4 + nodes = cubit.get_connectivity('face',quad) # Get the nodes + nodes = self.jac_check(nodes,self.plane_id,type) # Check the jacobian + if type == 'QUAD9': + # QUAD9: quadratic element: 4 corners + 4 edge mid-points + 1 center nodal point + # format: #elem1 #elem2 #elem3 #elem4 #elem5 #elem6 #elem7 #elem8 #elem9 + txt = ('%10i %10i %10i %10i %10i %10i %10i %10i %10i\n')% nodes + else: + # QUAD4: linear element: 4 corners + # format: #elem1 #elem2 #elem3 #elem4 + txt = ('%10i %10i %10i %10i\n')% nodes toWritetoFile[quad] = txt #meshfile.write(txt) # Write a line to mesh file num_write = num_write+inum+1 - print('block', block, 'number of ',self.face,' : ', inum+1) + print('block', block, 'number of type ',type,' : ', inum+1) meshfile.writelines(toWritetoFile) meshfile.close() print('Ok num elements/write =',str(num_elems), str(num_write)) @@ -464,8 +603,8 @@ def material_write(self,mat_name): cubit.cmd('set echo off') # Turn off echo of Cubit commands num_elems = cubit.get_quad_count() # Store the number of elements toWritetoFile = [""]*num_elems - print('block_mat:',self.block_mat) - print('block_flag:',self.block_flag) + #print('block_mat:',self.block_mat) + #print('block_flag:',self.block_flag) for block,flag in zip(self.block_mat,self.block_flag): # for each 2D block print('mat: ',block,' flag: ',flag) quads = cubit.get_block_faces(block) # Import quads id @@ -498,13 +637,14 @@ def pmls_write(self,pml_name): print('Number of elements in all PMLs :',npml_elements) for block,flag in zip(self.block_mat,self.block_flag): # For each 2D block quads = cubit.get_block_faces(block) # Import quads id + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for quad in quads: # For each quad #id_element = id_element+1 # global id of this quad for ipml in range(0, 6): # iabs = 0,1,2,3,4,5 : for each pml layer (x_acoust, z_acoust, xz_acoust,x_elast, z_elast, xz_elast) if faces_all[ipml] != []: #type(faces_all[ipml]) is not int: # ~ if there are elements in that pml if quad in faces_all[ipml]: # If this quad is belong to that pml # nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad - # nodes = self.jac_check(list(nodes)) # Check the jacobian of the quad + # nodes = self.jac_check(list(nodes),self.plane_id) # Check the jacobian of the quad toWritetoFile[indexFile] = ('%10i %10i\n') % (quad,ipml%3+1) indexFile = indexFile + 1 #pml_file.write(('%10i %10i\n') % (id_element,ipml%3+1)) # Write its id in the file next to its type @@ -527,8 +667,14 @@ def nodescoord_write(self,nodecoord_name): nodecoord.write('%10i\n' % num_nodes) # Write the number of nodes on the first line for node in node_list: # For all nodes x,y,z = cubit.get_nodal_coordinates(node) # Import its coordinates (3 coordinates even for a 2D model in cubit) - txt = ('%20f %20f\n') % (x,z) - nodecoord.write(txt) # Write x and z coordinates on the file -> Model must be in x,z coordinates. TODO + # plane identifier: 1 == XZ-plane, 2 == XY-plane, 3 == YZ-plane + if self.plane_id == 1: + txt = ('%20f %20f\n') % (x,z) + elif self.plane_id == 2: + txt = ('%20f %20f\n') % (x,y) + else: + txt = ('%20f %20f\n') % (y,z) + nodecoord.write(txt) # Write 2d coordinates on the file nodecoord.close() print('Ok') cubit.cmd('set info on') # Turn on return messages from Cubit commands @@ -548,18 +694,24 @@ def free_write(self,freename): #freename = None): toWritetoFile = [] #[""]*(len(edges_all)+1) toWritetoFile.append('%10i\n' % len(edges_all)) # Print the number of edges on the free surface for block,flag in zip(self.block_mat,self.block_flag): # For each 2D block - print(block,flag) + #print('free surface: ',block,flag) quads = cubit.get_block_faces(block) # Import quads id + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for quad in quads: # For each quad edges = set(cubit.get_sub_elements("face", quad, 1)) # Get the lower dimension entities associated with a higher dimension entities. # Here it gets the 1D edges associates with the face of id "quad". Store it as a Set intersection = edges & edges_all # Contains the edges of the considered quad that is on the free surface if len(intersection) != 0: # If this quad touch the free surface #print(" ",quad," -> this quad touch the free surface!") - nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad + if type == 'QUAD9': + # QUAD9 + nodes = cubit.get_expanded_connectivity('face',quad) # Get all the nodes in quad including interior points + else: + # QUAD4 + nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad #print(" it is described by nodes:",nodes," and edges :",edges) #print(" edges:",intersection," is/are on the free surface") - nodes = self.jac_check(list(nodes)) # Check the jacobian of the quad + nodes = self.jac_check(list(nodes),self.plane_id,type) # Check the jacobian of the quad for e in intersection: # For each edge on the free surface node_edge = cubit.get_connectivity('edge',e) # Import the nodes describing the edge #print(" edge",e,"is composed of nodes",node_edge) @@ -568,6 +720,9 @@ def free_write(self,freename): #freename = None): if i in node_edge: # If this node is belonging to the free surface nodes_ok.append(i) # Put it in nodes_ok #print(" nodes:",nodes_ok,"belong to free surface") + # free surface contains 1/ element number, 2/ number of nodes that form the free surface, + # 3/ first node on the free surface, 4/ second node on the free surface, if relevant (if 2/ is equal to 2) + # format: #elemid #num_nodes==2 #node1 #node2 txt = '%10i %10i %10i %10i\n' % (quad,2,nodes_ok[0],nodes_ok[1]) toWritetoFile.append(txt) # Write the id of the quad, 2 (number of nodes describing a free surface elements), and the nodes @@ -601,6 +756,7 @@ def forcing_write(self,forcname): indexFile = 1 for block,flag in zip(self.block_mat,self.block_flag): # For each 2D block quads = cubit.get_block_faces(block) # Import quads id + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for quad in quads: # For each quad #id_element = id_element+1 # id of this quad edges = set(cubit.get_sub_elements("face", quad, 1)) # Get the lower dimension entities associated with a higher dimension entities. @@ -608,8 +764,13 @@ def forcing_write(self,forcname): for iforc in range(0,self.nforc): # iforc = 0,1,2,3 : for each forcing boundaries intersection = edges & edges_forc[iforc] # Contains the edges of the considered quad that is on the forcing boundary considered if len(intersection) != 0: # If this quad touch the forcing boundary considered - nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad - nodes = self.jac_check(list(nodes)) # Check the jacobian of the quad + if type == 'QUAD9': + # QUAD9 + nodes = cubit.get_expanded_connectivity('face',quad) # Get all the nodes in quad including interior points + else: + # QUAD4 + nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad + nodes = self.jac_check(list(nodes),self.plane_id,type) # Check the jacobian of the quad for e in intersection: # For each edge on the forcing boundary considered node_edge = cubit.get_connectivity('edge',e) # Import the nodes describing the edge nodes_ok = [] @@ -656,6 +817,7 @@ def abs_write(self,absname): indexFile = 1 for block,flag in zip(self.block_mat,self.block_flag): # For each 2D block quads = cubit.get_block_faces(block) # Import quads id + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for quad in quads: # For each quad #id_element = id_element+1 # id of this quad edges = set(cubit.get_sub_elements("face", quad, 1)) # Get the lower dimension entities associated with a higher dimension entities. @@ -663,14 +825,23 @@ def abs_write(self,absname): for iabs in range(0,self.nabs): # iabs = 0,1,2,3 : for each absorbing boundaries intersection = edges & edges_abs[iabs] # Contains the edges of the considered quad that is on the absorbing boundary considered if len(intersection) != 0: # If this quad touch the absorbing boundary considered - nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad - nodes = self.jac_check(list(nodes)) # Check the jacobian of the quad + if type == 'QUAD9': + # QUAD9 + nodes = cubit.get_expanded_connectivity('face',quad) # Get all the nodes in quad including interior points + else: + # QUAD4 + nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad + nodes = self.jac_check(list(nodes),self.plane_id,type) # Check the jacobian of the quad for e in intersection: # For each edge on the absorbing boundary considered node_edge = cubit.get_connectivity('edge',e) # Import the nodes describing the edge nodes_ok = [] for i in nodes: # Loop on the nodes of the quad if i in node_edge: # If this node is belonging to absorbing surface nodes_ok.append(i) # Add it to nodes_ok + # 'abs_surface' contains 1/ element number, 2/ number of nodes that form the absorbing edge + # (which currently must always be equal to 2), + # 3/ first node on the abs surface, 4/ second node on the abs surface + # 5/ 1=IBOTTOM, 2=IRIGHT, 3=ITOP, 4=ILEFT #txt = '%10i %10i %10i %10i %10i\n' % (id_element,2,nodes_ok[0],nodes_ok[1],iabs+1) txt = '%10i %10i %10i %10i %10i\n' % (quad,2,nodes_ok[0],nodes_ok[1],iabs+1) # Write the id of the quad, 2 (number of nodes describing a free surface elements), the nodes and the type of boundary @@ -700,22 +871,30 @@ def axis_write(self,axis_name): indexFile = 1 for block,flag in zip(self.block_mat,self.block_flag): # For each 2D block quads = cubit.get_block_faces(block) # Import quads id + type = cubit.get_block_element_type(block) # Contains the block element type (QUAD4...) for quad in quads: # For each quad #id_element = id_element+1 # id of this quad edges = set(cubit.get_sub_elements("face", quad, 1)) # Get the lower dimension entities associated with a higher dimension entities. # Here it gets the 1D edges associates with the face of id "quad". Store it as a Set intersection = edges & edges_all # Contains the edges of the considered quad that are on the axis if len(intersection) != 0: # If this quad touch the axis - nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad - nodes = self.jac_check(list(nodes)) # Check the jacobian of the quad + if type == 'QUAD9': + # QUAD9 + nodes = cubit.get_expanded_connectivity('face',quad) # Get all the nodes in quad including interior points + else: + # QUAD4 + nodes = cubit.get_connectivity('face',quad) # Import the nodes describing the quad + nodes = self.jac_check(list(nodes),self.plane_id,type) # Check the jacobian of the quad for e in intersection: # For each edge on the axis node_edge = cubit.get_connectivity('edge',e) # Import the nodes describing the edge nodes_ok = [] for i in nodes: # Loop on the nodes of the quad if i in node_edge: # If this node is belonging to the axis nodes_ok.append(i) # Add it to nodes_ok + # format: #ispec_id #dump==2 #inode1 #inode2 txt = '%10i %10i %10i %10i\n' % (quad,2,nodes_ok[0],nodes_ok[1]) #txt = '%10i %10i %10i %10i\n' % (id_element,2,nodes_ok[0],nodes_ok[1]) + #txt = '%10i %10i %10i %10i %10i\n' % (id_element,2,nodes_ok[0],nodes_ok[1],4) # Write the id of the quad, 2 (number of nodes describing a free surface elements), the nodes toWritetoFile[indexFile] = txt indexFile = indexFile + 1 @@ -732,7 +911,14 @@ def rec_write(self,recname): nodes = cubit.get_nodeset_nodes(self.receivers) # Import nodes in nodeset containing receiver positions for i,n in enumerate(nodes): # For each receiver x,y,z = cubit.get_nodal_coordinates(n) # Import its coordinates (3 coordinates even for a 2D model in cubit) - recfile.write('ST%i XX %20f %20f 0.0 0.0 \n' % (i,x,z)) # Write x and z coordinates on the file -> Model must be in x,z coordinates. TODO + # plane identifier: 1 == XZ-plane, 2 == XY-plane, 3 == YZ-plane + if self.plane_id == 1: + txt = ('ST%i XX %20f %20f 0.0 0.0 \n') % (i,x,z) + elif self.plane_id == 2: + txt = ('ST%i XX %20f %20f 0.0 0.0 \n') % (i,x,y) + else: + txt = ('ST%i XX %20f %20f 0.0 0.0 \n') % (i,y,z) + recfile.write(txt) # Write 2d coordinates on the file recfile.close() print('Ok') def write(self,path = ''): @@ -771,7 +957,7 @@ def export2SPECFEM2D(path_exporting_mesh_SPECFEM2D='.'): profile = mesh() # writes out profile.write(path=path_exporting_mesh_SPECFEM2D) - print("END SPECFEM2D exporting process......") + print("# END SPECFEM2D exporting process......") # gets executed when run as script within cubit #export2SPECFEM2D() diff --git a/utils/cubit2specfem2d/cubit2specfem2d_QUAD9.py b/utils/cubit2specfem2d/cubit2specfem2d_QUAD9.py index 401a7e3f5..444754f4b 100644 --- a/utils/cubit2specfem2d/cubit2specfem2d_QUAD9.py +++ b/utils/cubit2specfem2d/cubit2specfem2d_QUAD9.py @@ -1,6 +1,18 @@ #!python #!/usr/bin/env python # +# +########################################################################################## +# +# INFO: this script has become obsolete as the cubit2specfem2d.py file supports now +# both QUAD4 and QUAD9 elements. +# +# Please use cubit2specfem2d.py to convert Cubit/Trelis meshes to SPECFEM2D format. +# +# the script here is left for historic purposes, but might be removed in future... +# +########################################################################################### +# # Script to export a Cubit13+/Trelis 2D mesh in specfem2d format for the elements QUAD9 # pour creer des fichiers correspondant a Specfem2d a partir du maillage de Cubit # Initial author unknown, comments and modifications by Alexis Bottero (alexis dot bottero At gmail dot com) et Ting YU, CNRS and EDF, France, December 2015 diff --git a/utils/cubit2specfem2d/run_cubit_to_specfem.py b/utils/cubit2specfem2d/run_cubit_to_specfem.py index 6e65bc9ac..42909f6e9 100755 --- a/utils/cubit2specfem2d/run_cubit_to_specfem.py +++ b/utils/cubit2specfem2d/run_cubit_to_specfem.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +# +from __future__ import print_function import os import sys @@ -13,16 +15,31 @@ version = cubit.get_version() version_major = int(version.split(".")[0]) version_minor = int(version.split(".")[1]) -print "cubit version: ",version +print("#") +print("# cubit version: ",version) +print("#") + +# current work directory +cubit.cmd('pwd') os.system('mkdir -p MESH') cubit.cmd('set echo on') +# avoids assigning empty blocks +cubit.cmd('set duplicate block elements on') + + +# adds path to scripts (if not setup yet) +sys.path.append('../../utils/cubit2specfem2d/') + ## This is boundary_definition.py # extracts the bounding edges and defines them into blocks import boundary_definition -reload(boundary_definition) + +# reload script in case it has been modified during the cubit session +import importlib +importlib.reload(boundary_definition) boundary_definition.define_bc_edges() @@ -33,20 +50,24 @@ cubit.cmd('block 1 element type QUAD4') cubit.cmd('#### DEFINE MATERIAL PROPERTIES #######################') -cubit.cmd('block 1 name "elastic 1" ') # elastic material region +cubit.cmd('block 1 name "elastic 1" ') # elastic material region cubit.cmd('block 1 attribute count 6') cubit.cmd('block 1 attribute index 1 1 ') # volume 1 -cubit.cmd('block 1 attribute index 2 2800 ') # vp -cubit.cmd('block 1 attribute index 3 1500 ') # vs -cubit.cmd('block 1 attribute index 4 2300 ') # rho -cubit.cmd('block 1 attribute index 5 9000.0 ') # Q_mu -cubit.cmd('block 1 attribute index 6 0 ') # anisotropy_flag +cubit.cmd('block 1 attribute index 2 2800 ') # vp +cubit.cmd('block 1 attribute index 3 1500 ') # vs +cubit.cmd('block 1 attribute index 4 2300 ') # rho +cubit.cmd('block 1 attribute index 5 9000.0 ') # Q_mu +cubit.cmd('block 1 attribute index 6 0 ') # anisotropy_flag cubit.cmd('save as "top.cub" overwrite') ## export mesh import cubit2specfem2d -reload(cubit2specfem2d) + +# reloads script +import importlib +importlib.reload(cubit2specfem2d) + cubit2specfem2d.export2SPECFEM2D('MESH/') cubit.cmd('set echo off') From 43b5f49a4ff03131961628d9a19c95d3a2cb7cea Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 8 Feb 2024 18:05:19 +0100 Subject: [PATCH 09/13] adding support for nummaterial_velocity_file for external meshes (similar as in SPECFEM3D_Cartesian version) --- src/gpu/prepare_constants_cuda.h | 3 +- src/meshfem2D/meshfem2D.F90 | 40 +- src/meshfem2D/read_external_mesh_files.F90 | 346 ++++++++++++++++++ src/meshfem2D/save_databases.f90 | 12 +- src/shared/read_material_table.f90 | 263 ++++++++----- src/shared/read_parameter_file.F90 | 120 +++--- src/shared/read_value_parameters.f90 | 20 +- src/shared/shared_par.F90 | 14 +- .../define_external_model_from_marmousi.f90 | 6 +- src/specfem2D/initialize_simulation.F90 | 6 +- src/specfem2D/read_external_model.f90 | 2 +- src/specfem2D/read_materials.f90 | 5 +- src/specfem2D/setup_mesh.F90 | 14 +- src/specfem2D/specfem2D_par.f90 | 4 +- 14 files changed, 654 insertions(+), 201 deletions(-) diff --git a/src/gpu/prepare_constants_cuda.h b/src/gpu/prepare_constants_cuda.h index 54e2ba5cb..95ebf4e24 100644 --- a/src/gpu/prepare_constants_cuda.h +++ b/src/gpu/prepare_constants_cuda.h @@ -124,7 +124,7 @@ void setConst_hprime_xx(realw* array,Mesh* mp) if (err != cudaSuccess) { fprintf(stderr, "Error in setConst_hprime_xx: %s\n", cudaGetErrorString(err)); - fprintf(stderr, "The problem is maybe -arch sm_13 instead of -arch sm_11 in the Makefile, please doublecheck\n"); + fprintf(stderr, "The problem is maybe that the architecture specified in the Makefile (-gencode=arch=compute_**,code=\"sm_**,compute_**\") doesn't fit your card, please doublecheck\n"); exit(1); } @@ -147,7 +147,6 @@ void setConst_hprime_xx(realw* array,Mesh* mp) // if (err != cudaSuccess) // { // fprintf(stderr, "Error in setConst_hprime_zz: %s\n", cudaGetErrorString(err)); -// fprintf(stderr, "The problem is maybe -arch sm_13 instead of -arch sm_11 in the Makefile, please doublecheck\n"); // exit(1); // } diff --git a/src/meshfem2D/meshfem2D.F90 b/src/meshfem2D/meshfem2D.F90 index 647205ed0..e4be1ef72 100644 --- a/src/meshfem2D/meshfem2D.F90 +++ b/src/meshfem2D/meshfem2D.F90 @@ -101,7 +101,7 @@ program meshfem2D ! *** ! reads in parameters in DATA/Par_file BROADCAST_AFTER_READ = .false. - call read_parameter_file(.true.,BROADCAST_AFTER_READ) + call read_parameter_file(BROADCAST_AFTER_READ) ! reads in additional files for mesh elements if (read_external_mesh) then @@ -111,6 +111,9 @@ program meshfem2D write(IMAIN,*) 'Mesh from external meshing:' call flush_IMAIN() + ! reads material definitions in external file + call read_external_material_properties(nummaterial_velocity_file) + ! reads in mesh call read_external_mesh_file(mesh_file, remove_min_to_start_at_zero, NGNOD) @@ -124,6 +127,41 @@ program meshfem2D write(IMAIN,*) 'Mesh from internal meshing:' call flush_IMAIN() + ! re-opens file Par_file + call open_parameter_file() + + ! reads material definitions + call read_material_table() + + ! mesher reads in internal region table for setting up mesh elements + ! reads interface definitions from interface file (we need to have nxread & nzread value for checking regions) + call read_interfaces_file() + + ! internal meshing + nx_elem_internal = nxread + nz_elem_internal = nzread + + ! setup mesh array + ! multiply by 2 if elements have 9 nodes + if (NGNOD == 9) then + nx_elem_internal = nx_elem_internal * 2 + nz_elem_internal = nz_elem_internal * 2 + nz_layer(:) = nz_layer(:) * 2 + endif + + ! total number of elements + nelmnts = nxread * nzread + + ! reads material regions defined in Par_file + call read_regions() + + ! closes file Par_file + call close_parameter_file() + + ! user output + write(IMAIN,*) 'creating mesh from internal meshing:' + call flush_IMAIN() + allocate(elmnts(0:NGNOD*nelmnts-1),stat=ier) if (ier /= 0) call stop_the_code('Error allocating array elmnts') elmnts(:) = 0 diff --git a/src/meshfem2D/read_external_mesh_files.F90 b/src/meshfem2D/read_external_mesh_files.F90 index 8984f2a7f..8136197c9 100644 --- a/src/meshfem2D/read_external_mesh_files.F90 +++ b/src/meshfem2D/read_external_mesh_files.F90 @@ -34,6 +34,352 @@ ! in the case of very large meshes, this option can be useful to switch from ASCII to binary for the mesh files ! #define USE_BINARY_FOR_EXTERNAL_MESH_DATABASE + !----------------------------------------------- + ! Read the material properties from nummaterial_velocity_file + !----------------------------------------------- + + subroutine read_external_material_properties(filename) + +! reads in material definitions, e.g., in MESH/nummaterial_velocity_file + + use constants, only: myrank,IMAIN,IIN,MAX_STRING_LEN,TINYVAL,ATTENUATION_COMP_MAXIMUM, & + ISOTROPIC_MATERIAL,POROELASTIC_MATERIAL + + ! material properties + use shared_parameters, only: nbmodels,icodemat, & + cp,cs, & + QKappa,Qmu, & + rho_s_read,rho_f_read, & + phi_read,tortuosity_read, & + permxx_read,permxz_read,permzz_read,kappa_s_read,kappa_f_read,kappa_fr_read, & + eta_f_read,mu_fr_read, & + compaction_grad + + implicit none + + character(len=MAX_STRING_LEN), intent(in) :: filename + + ! local parameters + ! elastic parameters + double precision :: vp_val,vs_val,rho_val,qkappa_val,qmu_val,comp_grad + ! poroelastic parameters + double precision :: rhos_val,rhof_val,phi_val,tort_val, & + kxx_val,kxz_val,kzz_val,kappas_val,kappaf_val,kappafr_val,eta_val,mufr_val + ! line read + double precision :: val0read,val1read,val2read,val3read,val4read, & + val5read,val6read,val7read,val8read,val9read,val10read,val11read,val12read + + integer :: number_of_materials_defined_by_tomo_file + integer :: i,ier,idummy + integer :: count_def_mat,count_undef_mat + integer :: imat,idomain_id,aniso_flag + + character(len=MAX_STRING_LEN) :: line + character(len=128) :: undef_mat_prop(4) + + ! user output + if (myrank == 0) then + write(IMAIN,*) ' Reading materials from external material properties file: ',trim(filename) + write(IMAIN,*) + call flush_IMAIN() + endif + + ! file input + open(unit=IIN, file=trim(filename), form='formatted' , status='old', action='read',iostat=ier) + if (ier /= 0) then + print *,'Error opening file: ',trim(filename) + call stop_the_code('Error opening external material properties file (nummaterial_velocity_file)') + endif + +! reads material definitions +! +! note: format of nummaterial_velocity_file must be +! +! #(1)material_domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_kappa #(7)Q_mu #(8)anisotropy_flag +! +! where +! material_domain_id : 1=acoustic / 2=elastic / 3=poroelastic +! material_id : number of material/volume +! rho : density +! vp : P-velocity +! vs : S-velocity +! Q_kappa : 9999 = no Q_kappa attenuation +! Q_mu : 9999 = no Q_mu attenuation +! anisotropy_flag : 0=no anisotropy/ 1,2,.. check with implementation in aniso_model.f90 +! +! Note that when poroelastic material, this file is a dummy except for material_domain_id & material_id, +! and that poroelastic materials are actually read from nummaterial_poroelastic_file, because CUBIT +! cannot support more than 10 attributes + count_def_mat = 0 + count_undef_mat = 0 + + ! counts materials (defined/undefined) + ier = 0 + do while (ier == 0) + ! note: format #material_domain_id #material_id #... + read(IIN,'(A)',iostat=ier) line + if (ier /= 0) exit + + ! skip empty/comment lines + line = adjustl(line) ! suppress leading white spaces, if any + if (len_trim(line) == 0) cycle + if (line(1:1) == '#' .or. line(1:1) == '!') cycle + + read(line,*,iostat=ier) idummy,imat + if (ier /= 0) exit + + !debug + !print *, ' num_mat = ',imat + + ! checks non-zero material id + if (imat == 0) stop 'Error in nummaterial_velocity_file: material id 0 found. Material ids must be non-zero.' + if (imat > 0) then + ! positive materials_id: velocity values will be defined + count_def_mat = count_def_mat + 1 + else + ! negative materials_id: undefined material properties yet + count_undef_mat = count_undef_mat + 1 + endif + enddo + ! user output + if (myrank == 0) then + write(IMAIN,*) ' defined = ',count_def_mat, 'undefined = ',count_undef_mat + write(IMAIN,*) + call flush_IMAIN() + endif + + ! sets number of materials + ! total number of materials in file + nbmodels = count_def_mat + count_undef_mat + + ! allocate and initialize material properties arrays + call initialize_material_properties() + + ! reads in material properties + rewind(IIN,iostat=ier) + if (ier /= 0) stop 'Error rewinding nummaterial_velocity_file' + + ! note: entries in nummaterial_velocity_file can be an unsorted list of all + ! defined materials (material_id > 0) and undefined materials (material_id < 0) + number_of_materials_defined_by_tomo_file = 0 + + do i = 1,nbmodels + ! reads lines until it reaches a material + call read_next_line(IIN,.false.,line) + + ! gets material id + read(line,*,iostat=ier) idomain_id,imat + if (ier /= 0) stop 'Error reading in materials in nummaterial_velocity_file' + + ! checks domain id + if (idomain_id < 1 .or. idomain_id > 3) then + print *,'Error: nummaterial_velocity_file found invalid domain id ',idomain_id + print *,' line: ',trim(line) + print *,' idomain_id must be 1 == acoustic, 2 == elastic or 3 == poroelastic domains' + print *,'Please also check formatting of the material property lines to align with:' + print *,' acoustic/elastic' + print *,' #domain_id #material_id #rho #vp #vs #Qkappa #Qmu #aniso_flag' + print *,' poroelastic' + print *,' #domain_id #material_id #rhos #rhof #phi #c #kxx #kxz #kzz #Ks #Kf #Kfr #etaf #mufr #Qmu' + print *,' tomo' + print *,' #domain_id #material_id(negative) tomography elastic tomography_filename positive_identifier' + call stop_the_code('Invalid domain id for material in nummaterial_velocity_file') + endif + + ! reads in material properties + if (imat > 0) then + ! defined material + if (idomain_id == 1 .or. idomain_id == 2) then + ! acoustic/elastic material + ! format: + !#domain_id #material_id #rho #vp #vs #Qkappa #Qmu #aniso_flag_or_compaction_gradient + read(line,*,iostat=ier) idomain_id,imat,val0read,val1read,val2read,val3read,val4read,val5read + if (ier /= 0) stop 'Error reading nummaterial_velocity_file, please check if it has the required format...' + + rho_val = val0read + vp_val = val1read + vs_val = val2read + qkappa_val = val3read + qmu_val = val4read + + aniso_flag = int(val5read) + comp_grad = val5read + + else if (idomain_id == 3) then + ! poroelastic material + ! format: + !#domain_id #material_id rhos rhof phi c kxx kxz kzz Ks Kf Kfr etaf mufr Qmu + read(line,*,iostat=ier) idomain_id,imat,val0read,val1read,val2read,val3read,val4read,val5read, & + val6read,val7read,val8read,val9read,val10read,val11read,val12read + if (ier /= 0) stop 'Error reading nummaterial_velocity_file, please check if it has the required format...' + + rhos_val = val0read + rhof_val = val1read + + phi_val = val2read + tort_val = val3read + + kxx_val = val4read + kxz_val = val5read + kzz_val = val6read + + kappas_val = val7read + kappaf_val = val8read + kappafr_val = val9read + + eta_val = val10read + mufr_val = val11read + qmu_val = val12read + endif + + ! sanity check: Q factor cannot be equal to zero, thus convert to 9999 to indicate no attenuation + ! if users have used 0 to indicate that instead + if (qkappa_val <= 0.000001) qkappa_val = 9999.d0 + if (qmu_val <= 0.000001) qmu_val = 9999.d0 + + ! checks material_id bounds + if (imat < 1 .or. imat > count_def_mat) & + stop "Error in nummaterial_velocity_file: material id invalid for defined materials." + + ! check that the S-wave velocity is zero if the material is acoustic + if (idomain_id == 1 .and. vs_val >= 0.0001) & + stop 'Error in nummaterial_velocity_file: acoustic material defined with a non-zero shear-wave velocity Vs.' + + ! check that the S-wave velocity is not zero if the material is elastic + if (idomain_id == 2 .and. vs_val <= 0.0001) & + stop 'Error in nummaterial_velocity_file: (visco)elastic material defined with a zero shear-wave velocity Vs.' + + ! checks material id + if (imat < 1 .or. imat > nbmodels) call stop_the_code('Wrong material number!') + + ! set material type for arrays + ! (nummaterial_velocity_file only supports isotropic materials for now) + if (idomain_id == 1 .or. idomain_id == 2) then + ! acoustic/elastic + ! isotropic materials + icodemat(i) = ISOTROPIC_MATERIAL + rho_s_read(i) = rho_val ! density + cp(i) = vp_val ! Vp + cs(i) = vs_val ! Vs + compaction_grad(i) = comp_grad ! compaction gradient (for Marmousi2) + QKappa(i) = qkappa_val ! bulk attenuation + Qmu(i) = qmu_val ! shear attenuation + + ! for Cs we use a less restrictive test because acoustic media have Cs exactly equal to zero + if (rho_s_read(i) <= 0.00000001d0 .or. cp(i) <= 0.00000001d0 .or. cs(i) < 0.d0) then + write(*,*) 'rho,cp,cs=',rho_s_read(i),cp(i),cs(i) + call stop_the_code('negative value of velocity or density') + endif + if (QKappa(i) <= 0.00000001d0 .or. Qmu(i) <= 0.00000001d0) then + call stop_the_code('non-positive value of QKappa or Qmu') + endif + + ! phi_read is used to determine element type + if (abs(cs(i)) > TINYVAL) then + phi_read(i) = 0.d0 ! elastic + else + phi_read(i) = 1.d0 ! acoustic + endif + + else if (idomain_id == 3) then + ! poroelastic materials + icodemat(i) = POROELASTIC_MATERIAL + rho_s_read(i) = rhos_val + rho_f_read(i) = rhof_val + phi_read(i) = phi_val + tortuosity_read(i) = tort_val + permxx_read(i) = kxx_val + permxz_read(i) = kxz_val + permzz_read(i) = kzz_val + kappa_s_read(i) = kappas_val + kappa_f_read(i) = kappaf_val + kappa_fr_read(i) = kappafr_val + eta_f_read(i) = eta_val + mu_fr_read(i) = mufr_val + Qmu(i) = qmu_val + + if (rho_s_read(i) <= 0.d0 .or. rho_f_read(i) <= 0.d0) & + call stop_the_code('Invalid poroelastic material: non-positive value of density') + if (phi_read(i) <= 0.d0 .or. tortuosity_read(i) <= 0.d0) & + call stop_the_code('Invalid poroelastic material: non-positive value of porosity or tortuosity') + if (kappa_s_read(i) <= 0.d0 .or. kappa_f_read(i) <= 0.d0 .or. kappa_fr_read(i) <= 0.d0 .or. mu_fr_read(i) <= 0.d0) & + call stop_the_code('Invalid poroelastic material: non-positive value of modulus') + if (Qmu(i) <= 0.00000001d0) & + call stop_the_code('Invalid poroelastic material: non-positive value of Qmu') + + endif + + else if (imat < 0) then + ! undefined material (e.g., tomography material) + ! tomographic material + ! format: + ! #domain_id #material_id(negative) tomography elastic tomography_filename positive_identifier' + ! line will have 6 arguments, e.g.: 2 -1 tomography elastic tomography_model.xyz 1 + read(line,*,iostat=ier) idomain_id,imat,undef_mat_prop(1),undef_mat_prop(2),undef_mat_prop(3),idummy + if (ier /= 0) stop 'Error reading nummaterial_velocity_file, please check if tomography material has the required format...' + + ! checks domain id + if (idomain_id /= 1 .and. idomain_id /= 2) then + print *,'Error: nummaterial_velocity_file found invalid domain id ',idomain_id + print *,' line: ',trim(line) + print *,' idomain_id must be 1 == acoustic or 2 == elastic for tomography material' + print *,'Please also check formatting of the material property lines to align with:' + print *,' acoustic/elastic' + print *,' #domain_id #material_id #rho #vp #vs #Qkappa #Qmu #aniso_flag' + print *,' poroelastic' + print *,' #domain_id #material_id #rhos #rhof #phi #c #kxx #kxz #kzz #Ks #Kf #Kfr #etaf #mufr #Qmu' + print *,' tomo' + print *,' #domain_id #material_id(negative) tomography elastic tomography_filename positive_identifier' + call stop_the_code('Invalid domain id for tomographic material, must be 1 == acoustic or 2 == elastic') + endif + + ! Assign dummy values for now (they will be read by the solver). Vs must be == 0 for acoustic media anyway + rho_s_read(i) = -1.0d0 + cp(i) = -1.0d0 + if (idomain_id == 1) then + ! acoustic has vs==0 + cs(i) = 0.d0 + else if (idomain_id == 2) then + ! elastic has vs > 0 + cs(i) = 1.d0 + else + call stop_the_code('Invalid domain id for tomographic material, must be 1 == acoustic or 2 == elastic') + endif + + QKappa(i) = -1.0d0 + Qmu(i) = -1.0d0 + + ! phi_read is used to determine element type + if (abs(cs(i)) > TINYVAL) then + phi_read(i) = 0.d0 ! elastic + else + phi_read(i) = 1.d0 ! acoustic + endif + + ! counter + number_of_materials_defined_by_tomo_file = number_of_materials_defined_by_tomo_file + 1 + + if (number_of_materials_defined_by_tomo_file > 1) & + call stop_the_code( & +'Just one material can be defined by a tomo file for now') + + else + call stop_the_code('Error reading material properties, some materials have zero material index') + endif + + enddo + + close(IIN) + + ! user output + call print_materials_info() + + end subroutine read_external_material_properties + +! +!--------------------------------------------------------------------------------------- +! + !----------------------------------------------- ! Read the mesh and storing it in array 'elmnts' (which is allocated here). ! 'remove_min_to_start_at_zero' is used to have the numbering of the nodes starting at '0'. diff --git a/src/meshfem2D/save_databases.f90 b/src/meshfem2D/save_databases.f90 index c2cb08b7a..143b79067 100644 --- a/src/meshfem2D/save_databases.f90 +++ b/src/meshfem2D/save_databases.f90 @@ -462,13 +462,13 @@ subroutine save_databases_materials() if (indic == ISOTROPIC_MATERIAL) then ! isotropic elastic/acoustic - val0 = rho_s_read(i) - val1 = cp(i) - val2 = cs(i) - val3 = comp_g(i) + val0 = rho_s_read(i) ! density + val1 = cp(i) ! Vp + val2 = cs(i) ! Vs + val3 = compaction_grad(i) ! compaction gradient val4 = 0.d0 - val5 = QKappa(i) - val6 = Qmu(i) + val5 = QKappa(i) ! bulk attenuation + val6 = Qmu(i) ! shear attenuation val7 = 0.d0 val8 = 0.d0 val9 = 0.d0 diff --git a/src/shared/read_material_table.f90 b/src/shared/read_material_table.f90 index a162515e5..03d5d8f58 100644 --- a/src/shared/read_material_table.f90 +++ b/src/shared/read_material_table.f90 @@ -38,13 +38,15 @@ subroutine read_material_table() use constants, only: IMAIN,TINYVAL,ISOTROPIC_MATERIAL,ANISOTROPIC_MATERIAL,POROELASTIC_MATERIAL, & ATTENUATION_COMP_MAXIMUM - use shared_parameters, only: AXISYM,nbmodels,icodemat,cp,cs, & - aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12, & - comp_g,QKappa,Qmu, & - rho_s_read,rho_f_read, & - phi_read,tortuosity_read, & - permxx_read,permxz_read,permzz_read,kappa_s_read,kappa_f_read,kappa_fr_read, & - eta_f_read,mu_fr_read + use shared_parameters, only: nbmodels,icodemat, & + cp,cs, & + aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12, & + QKappa,Qmu, & + rho_s_read,rho_f_read, & + phi_read,tortuosity_read, & + permxx_read,permxz_read,permzz_read,kappa_s_read,kappa_f_read,kappa_fr_read, & + eta_f_read,mu_fr_read, & + compaction_grad implicit none @@ -63,76 +65,8 @@ subroutine read_material_table() ! check if (reread_nbmodels /= nbmodels) call stop_the_code('Invalid reread value of nbmodels in reading material table') - ! safety check - if (nbmodels <= 0) call stop_the_code('Non-positive number of materials not allowed!') - - ! allocates material tables - allocate(icodemat(nbmodels)) - allocate(cp(nbmodels)) - allocate(cs(nbmodels)) - - allocate(aniso3(nbmodels)) - allocate(aniso4(nbmodels)) - allocate(aniso5(nbmodels)) - allocate(aniso6(nbmodels)) - allocate(aniso7(nbmodels)) - allocate(aniso8(nbmodels)) - allocate(aniso9(nbmodels)) - allocate(aniso10(nbmodels)) - allocate(aniso11(nbmodels)) - allocate(aniso12(nbmodels)) - - allocate(comp_g(nbmodels)) - allocate(QKappa(nbmodels)) - allocate(Qmu(nbmodels)) - - allocate(rho_s_read(nbmodels)) - allocate(rho_f_read(nbmodels)) - - allocate( phi_read(nbmodels), & - tortuosity_read(nbmodels), & - permxx_read(nbmodels), & - permxz_read(nbmodels), & - permzz_read(nbmodels), & - kappa_s_read(nbmodels), & - kappa_f_read(nbmodels), & - kappa_fr_read(nbmodels), & - eta_f_read(nbmodels), & - mu_fr_read(nbmodels)) - - ! initializes material properties - icodemat(:) = 0 - - cp(:) = 0.d0 - cs(:) = 0.d0 - - aniso3(:) = 0.d0 - aniso4(:) = 0.d0 - aniso5(:) = 0.d0 - aniso6(:) = 0.d0 - aniso7(:) = 0.d0 - aniso8(:) = 0.d0 - aniso9(:) = 0.d0 - aniso10(:) = 0.d0 - aniso11(:) = 0.d0 - - comp_g(:) = 0.0d0 - QKappa(:) = ATTENUATION_COMP_MAXIMUM - Qmu(:) = ATTENUATION_COMP_MAXIMUM - - rho_s_read(:) = 0.d0 - rho_f_read(:) = 0.d0 - - phi_read(:) = 0.d0 - tortuosity_read(:) = 0.d0 - permxx_read(:) = 0.d0 - permxz_read(:) = 0.d0 - permzz_read(:) = 0.d0 - kappa_s_read(:) = 0.d0 - kappa_f_read(:) = 0.d0 - kappa_fr_read(:) = 0.d0 - eta_f_read(:) = 0.d0 - mu_fr_read(:) = 0.d0 + ! allocates and initializes material arrays + call initialize_material_properties() number_of_materials_defined_by_tomo_file = 0 @@ -145,6 +79,9 @@ subroutine read_material_table() ! anisotropic (in AXISYM) - model_number 2 rho c11 c13 c15 c33 c35 c55 c12 c23 c25 c22 QKappa Qmu ! poroelastic - model_number 3 rhos rhof phi c kxx kxz kzz Ks Kf Kfr etaf mufr Qmu ! tomo - model_number -1 0 0 A 0 0 0 0 0 0 0 0 0 0 + ! + ! and specially for Marmousi2-type models with a compaction gradient k + ! elastic - model_number 1 rho Vp Vs k 0 QKappa Qmu 0 0 0 0 0 0 call read_material_parameters_p(i,icodematread, & val0read,val1read,val2read,val3read, & @@ -158,12 +95,12 @@ subroutine read_material_table() ! sets material properties if (icodemat(i) == ISOTROPIC_MATERIAL) then ! isotropic materials - rho_s_read(i) = val0read - cp(i) = val1read - cs(i) = val2read - comp_g(i) = val3read - QKappa(i) = val5read - Qmu(i) = val6read + rho_s_read(i) = val0read ! density + cp(i) = val1read ! Vp + cs(i) = val2read ! Vs + compaction_grad(i) = val3read ! compaction gradient (for Marmousi2) + QKappa(i) = val5read ! bulk attenuation + Qmu(i) = val6read ! shear attenuation ! for Cs we use a less restrictive test because acoustic media have Cs exactly equal to zero if (rho_s_read(i) <= 0.00000001d0 .or. cp(i) <= 0.00000001d0 .or. cs(i) < 0.d0) then @@ -176,6 +113,8 @@ subroutine read_material_table() aniso3(i) = val3read aniso4(i) = val4read + + ! phi_read is used to determine element type if (abs(cs(i)) > TINYVAL) then phi_read(i) = 0.d0 ! elastic else @@ -217,13 +156,13 @@ subroutine read_material_table() if (val12read > 0.1) Qmu(i) = val12read if (rho_s_read(i) <= 0.d0 .or. rho_f_read(i) <= 0.d0) & - call stop_the_code('non-positive value of density') + call stop_the_code('Invalid poroelastic material: non-positive value of density') if (phi_read(i) <= 0.d0 .or. tortuosity_read(i) <= 0.d0) & - call stop_the_code('non-positive value of porosity or tortuosity') + call stop_the_code('Invalid poroelastic material: non-positive value of porosity or tortuosity') if (kappa_s_read(i) <= 0.d0 .or. kappa_f_read(i) <= 0.d0 .or. kappa_fr_read(i) <= 0.d0 .or. mu_fr_read(i) <= 0.d0) & - call stop_the_code('non-positive value of modulus') + call stop_the_code('Invalid poroelastic material: non-positive value of modulus') if (Qmu(i) <= 0.00000001d0) & - call stop_the_code('non-positive value of Qmu') + call stop_the_code('Invalid poroelastic material: non-positive value of Qmu') else if (icodemat(i) <= 0) then ! tomographic material @@ -239,8 +178,11 @@ subroutine read_material_table() cs(i) = val2read QKappa(i) = -1.0d0 Qmu(i) = -1.0d0 + aniso3(i) = -1.0d0 aniso4(i) = -1.0d0 + + ! phi_read is used to determine element type if (abs(cs(i)) > TINYVAL) then phi_read(i) = 0.d0 ! elastic else @@ -256,7 +198,150 @@ subroutine read_material_table() enddo ! nbmodels ! user output - write(IMAIN,*) 'Materials:' + call print_materials_info() + + end subroutine read_material_table + +! +!--------------------------------------------------------------------------------------- +! + + subroutine initialize_material_properties() + +! allocates and initializes material arrays + + use constants, only: ATTENUATION_COMP_MAXIMUM + + use shared_parameters, only: nbmodels, & + icodemat,compaction_grad + + ! isotropy + use shared_parameters, only: cp,cs + + ! anisotropy + use shared_parameters, only: aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12 + + ! attenuation + use shared_parameters, only: QKappa,Qmu + + ! poroelasticity + use shared_parameters, only: rho_s_read,rho_f_read, & + phi_read,tortuosity_read, & + permxx_read,permxz_read,permzz_read, & + kappa_s_read,kappa_f_read,kappa_fr_read, & + eta_f_read,mu_fr_read + + implicit none + + ! safety check + if (nbmodels <= 0) call stop_the_code('Non-positive number of materials not allowed!') + + ! allocates material tables + allocate(icodemat(nbmodels)) + allocate(cp(nbmodels)) + allocate(cs(nbmodels)) + + allocate(aniso3(nbmodels)) + allocate(aniso4(nbmodels)) + allocate(aniso5(nbmodels)) + allocate(aniso6(nbmodels)) + allocate(aniso7(nbmodels)) + allocate(aniso8(nbmodels)) + allocate(aniso9(nbmodels)) + allocate(aniso10(nbmodels)) + allocate(aniso11(nbmodels)) + allocate(aniso12(nbmodels)) + + allocate(QKappa(nbmodels)) + allocate(Qmu(nbmodels)) + + allocate(rho_s_read(nbmodels)) + allocate(rho_f_read(nbmodels)) + + allocate(phi_read(nbmodels), & + tortuosity_read(nbmodels), & + permxx_read(nbmodels), & + permxz_read(nbmodels), & + permzz_read(nbmodels), & + kappa_s_read(nbmodels), & + kappa_f_read(nbmodels), & + kappa_fr_read(nbmodels), & + eta_f_read(nbmodels), & + mu_fr_read(nbmodels)) + + allocate(compaction_grad(nbmodels)) + + ! initializes material properties + icodemat(:) = 0 + + cp(:) = 0.d0 + cs(:) = 0.d0 + + aniso3(:) = 0.d0 + aniso4(:) = 0.d0 + aniso5(:) = 0.d0 + aniso6(:) = 0.d0 + aniso7(:) = 0.d0 + aniso8(:) = 0.d0 + aniso9(:) = 0.d0 + aniso10(:) = 0.d0 + aniso11(:) = 0.d0 + + QKappa(:) = ATTENUATION_COMP_MAXIMUM + Qmu(:) = ATTENUATION_COMP_MAXIMUM + + rho_s_read(:) = 0.d0 + rho_f_read(:) = 0.d0 + + phi_read(:) = 0.d0 + tortuosity_read(:) = 0.d0 + permxx_read(:) = 0.d0 + permxz_read(:) = 0.d0 + permzz_read(:) = 0.d0 + kappa_s_read(:) = 0.d0 + kappa_f_read(:) = 0.d0 + kappa_fr_read(:) = 0.d0 + eta_f_read(:) = 0.d0 + mu_fr_read(:) = 0.d0 + + compaction_grad(:) = 0.0d0 + + end subroutine initialize_material_properties + +! +!--------------------------------------------------------------------------------------- +! + + subroutine print_materials_info() + + use constants, only: IMAIN,TINYVAL, & + ISOTROPIC_MATERIAL,ANISOTROPIC_MATERIAL,POROELASTIC_MATERIAL + + use shared_parameters, only: nbmodels, & + icodemat,AXISYM + + ! isotropy + use shared_parameters, only: cp,cs,rho_s_read + + ! anisotropy + use shared_parameters, only: aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12 + + ! attenuation + use shared_parameters, only: QKappa,Qmu + + ! poroelasticity + use shared_parameters, only: rho_f_read, & + phi_read,tortuosity_read, & + permxx_read,permxz_read,permzz_read, & + kappa_s_read,kappa_f_read,kappa_fr_read, & + eta_f_read,mu_fr_read + + implicit none + ! local parameters + integer :: i + + ! user output + write(IMAIN,*) ' Materials:' write(IMAIN,*) ' Nb of solid, fluid or porous materials = ',nbmodels write(IMAIN,*) do i = 1,nbmodels @@ -304,4 +389,4 @@ subroutine read_material_table() write(IMAIN,*) call flush_IMAIN() - end subroutine read_material_table + end subroutine print_materials_info diff --git a/src/shared/read_parameter_file.F90 b/src/shared/read_parameter_file.F90 index 389c87b20..9f6572a59 100644 --- a/src/shared/read_parameter_file.F90 +++ b/src/shared/read_parameter_file.F90 @@ -31,7 +31,7 @@ ! !======================================================================== - subroutine read_parameter_file(is_mesher,BROADCAST_AFTER_READ) + subroutine read_parameter_file(BROADCAST_AFTER_READ) ! reads in DATA/Par_file @@ -40,7 +40,6 @@ subroutine read_parameter_file(is_mesher,BROADCAST_AFTER_READ) implicit none - logical, intent(in) :: is_mesher logical, intent(in) :: BROADCAST_AFTER_READ ! initializes @@ -69,53 +68,9 @@ subroutine read_parameter_file(is_mesher,BROADCAST_AFTER_READ) endif call flush_IMAIN() - ! reads receiver lines - if (is_mesher) then - ! user output - write(IMAIN,*) 'Receiver lines:' - write(IMAIN,*) ' Nb of line sets = ',nreceiversets - write(IMAIN,*) - call flush_IMAIN() - endif + ! reads receivers call read_parameter_file_receiversets() - ! only mesher needs to reads this - if (is_mesher) then - ! reads material definitions - call read_material_table() - - ! mesher reads in internal region table for setting up mesh elements - if (.not. read_external_mesh) then - ! internal meshing - ! user output - write(IMAIN,*) - write(IMAIN,*) 'Mesh from internal meshing:' - write(IMAIN,*) - call flush_IMAIN() - - ! reads interface definitions from interface file (we need to have nxread & nzread value for checking regions) - call read_interfaces_file() - - ! internal meshing - nx_elem_internal = nxread - nz_elem_internal = nzread - - ! setup mesh array - ! multiply by 2 if elements have 9 nodes - if (NGNOD == 9) then - nx_elem_internal = nx_elem_internal * 2 - nz_elem_internal = nz_elem_internal * 2 - nz_layer(:) = nz_layer(:) * 2 - endif - - ! total number of elements - nelmnts = nxread * nzread - - ! reads material regions defined in Par_file - call read_regions() - endif - endif - ! closes file Par_file call close_parameter_file() endif @@ -210,14 +165,18 @@ subroutine read_parameter_file(is_mesher,BROADCAST_AFTER_READ) call bcast_all_singledp(PERIODIC_HORIZ_DIST) ! velocity and density models - call bcast_all_singlei(nbmodels) call bcast_all_string(TOMOGRAPHY_FILE) call bcast_all_singlel(read_external_mesh) + ! infos for mesher + ! note: the mesher doesn't need to broadcast as only the main process (myrank==0) + ! is doing work in the mesher. + ! thus, this could be removed at the moment, but left for possible future use... if (read_external_mesh) then call bcast_all_string(mesh_file) call bcast_all_string(nodes_coords_file) call bcast_all_string(materials_file) + call bcast_all_string(nummaterial_velocity_file) call bcast_all_string(free_surface_file) call bcast_all_string(axial_elements_file) call bcast_all_string(absorbing_surface_file) @@ -225,6 +184,7 @@ subroutine read_parameter_file(is_mesher,BROADCAST_AFTER_READ) call bcast_all_string(absorbing_cpml_file) call bcast_all_string(tangential_detection_curve_file) else + call bcast_all_singlei(nbmodels) call bcast_all_string(interfacesfile) call bcast_all_singledp(xmin_param) call bcast_all_singledp(xmax_param) @@ -306,6 +266,7 @@ subroutine read_parameter_file_init() mesh_file = '' nodes_coords_file = '' materials_file = '' + nummaterial_velocity_file = '' free_surface_file = '' axial_elements_file = '' absorbing_surface_file = '' @@ -324,6 +285,7 @@ subroutine read_parameter_file_init() absorbtop = .false. absorbleft = .false. + nbmodels = 0 nbregions = 0 end subroutine read_parameter_file_init @@ -928,15 +890,8 @@ subroutine read_parameter_file_only() ! !-------------------------------------------------------------------- - ! read the different material materials (i.e. the number of models) - call read_value_integer_p(nbmodels, 'nbmodels') - if (err_occurred() /= 0) then - some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'nbmodels = 1' - write(*,*) - endif - - ! material definitions will be read later on... + ! material definitions in the Par_file are only needed for internal meshes; + ! external meshes have to define the materials in MESH/nummaterial_velocity_file call read_value_string_p(TOMOGRAPHY_FILE, 'TOMOGRAPHY_FILE') if (err_occurred() /= 0) then @@ -968,63 +923,70 @@ subroutine read_parameter_file_only() call read_value_string_p(mesh_file, 'mesh_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'mesh_file = ./DATA/mesh_file' + write(*,'(a)') 'mesh_file = ./MESH/mesh_file' write(*,*) endif call read_value_string_p(nodes_coords_file, 'nodes_coords_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'nodes_coords_file = ./DATA/nodes_coords_file' + write(*,'(a)') 'nodes_coords_file = ./MESH/nodes_coords_file' write(*,*) endif call read_value_string_p(materials_file, 'materials_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'materials_file = ./DATA/materials_file' + write(*,'(a)') 'materials_file = ./MESH/materials_file' + write(*,*) + endif + + call read_value_string_p(nummaterial_velocity_file, 'nummaterial_velocity_file') + if (err_occurred() /= 0) then + some_parameters_missing_from_Par_file = .true. + write(*,'(a)') 'nummaterial_velocity_file = ./MESH/nummaterial_velocity_file' write(*,*) endif call read_value_string_p(free_surface_file, 'free_surface_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'free_surface_file = ./DATA/free_surface_file' + write(*,'(a)') 'free_surface_file = ./MESH/free_surface_file' write(*,*) endif call read_value_string_p(axial_elements_file, 'axial_elements_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'axial_elements_file = ./DATA/axial_elements_file' + write(*,'(a)') 'axial_elements_file = ./MESH/axial_elements_file' write(*,*) endif call read_value_string_p(absorbing_surface_file, 'absorbing_surface_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'absorbing_surface_file = ./DATA/absorbing_surface_file' + write(*,'(a)') 'absorbing_surface_file = ./MESH/absorbing_surface_file' write(*,*) endif call read_value_string_p(acoustic_forcing_surface_file, 'acoustic_forcing_surface_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh' + write(*,'(a)') 'acoustic_forcing_surface_file = ./MESH/acoustic_forcing_surface_file' write(*,*) endif call read_value_string_p(absorbing_cpml_file, 'absorbing_cpml_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'absorbing_cpml_file = ./DATA/absorbing_cpml_file' + write(*,'(a)') 'absorbing_cpml_file = ./MESH/absorbing_cpml_file' write(*,*) endif call read_value_string_p(tangential_detection_curve_file, 'tangential_detection_curve_file') if (err_occurred() /= 0) then some_parameters_missing_from_Par_file = .true. - write(*,'(a)') 'tangential_detection_curve_file = ./DATA/courbe_eros_nodes' + write(*,'(a)') 'tangential_detection_curve_file = ./MESH/tangential_detection_curve_file' write(*,*) endif @@ -1033,6 +995,16 @@ subroutine read_parameter_file_only() !----------------- ! internal mesh parameters + ! read the different material materials (i.e. the number of models) + call read_value_integer_p(nbmodels, 'nbmodels') + if (err_occurred() /= 0) then + some_parameters_missing_from_Par_file = .true. + write(*,'(a)') 'nbmodels = 1' + write(*,*) + endif + + ! material definitions will be read later on... + ! interfaces file call read_value_string_p(interfacesfile, 'interfacesfile') if (err_occurred() /= 0) then @@ -1487,10 +1459,6 @@ subroutine check_parameters() if (DT == 0.d0) call stop_the_code('DT must be non-zero value') - ! reads in material definitions - if (nbmodels <= 0) & - call stop_the_code('Non-positive number of materials not allowed!') - ! CPML and Stacey are mutually exclusive if (STACEY_ABSORBING_CONDITIONS .and. PML_BOUNDARY_CONDITIONS) & call stop_the_code('STACEY_ABSORBING_CONDITIONS and PML_BOUNDARY_CONDITIONS are mutually exclusive but are both set to .true.') @@ -1513,8 +1481,9 @@ subroutine check_parameters() call stop_the_code('Error bad value for parameter SAVE_MODEL') end select - ! check regions + ! check regions and material definitions if (read_external_mesh .eqv. .false.) then + if (nbmodels <= 0) call stop_the_code('Non-positive number of materials not allowed!') if (nbregions <= 0) call stop_the_code('Negative number of regions not allowed for internal meshing!') endif @@ -1559,7 +1528,7 @@ subroutine read_parameter_file_receiversets() if (reread_rec_normal_to_surface .neqv. rec_normal_to_surface) & call stop_the_code('Invalid re-reading of rec_normal_to_surface parameter') - ! reads in receiver sets + ! reads in receivers if (use_existing_STATIONS) then ! checks if STATIONS file exisits stations_filename = trim(IN_DATA_FILES)//'STATIONS' ! by default: DATA/STATIONS @@ -1603,9 +1572,16 @@ subroutine read_parameter_file_receiversets() write(IMAIN,*) ' file name is ',trim(stations_filename) write(IMAIN,*) ' found ',nrec,' receivers' write(IMAIN,*) + call flush_IMAIN() else ! receiver lines specified in Par_file + ! user output + write(IMAIN,*) 'Receiver lines:' + write(IMAIN,*) ' Nb of line sets = ',nreceiversets + write(IMAIN,*) + call flush_IMAIN() + ! only valid if at least 1 receiver line is specified if (nreceiversets < 1) & call stop_the_code('number of receiver sets must be greater than 1') diff --git a/src/shared/read_value_parameters.f90 b/src/shared/read_value_parameters.f90 index 1a46b359b..b07e4b5a0 100644 --- a/src/shared/read_value_parameters.f90 +++ b/src/shared/read_value_parameters.f90 @@ -139,33 +139,33 @@ subroutine read_next_line(iin,ignore_junk,string_read) read(unit=iin,fmt="(a256)",iostat=ios) string_read if (ios /= 0) call stop_the_code('error while reading input file') -! suppress leading white spaces, if any + ! suppress leading white spaces, if any string_read = adjustl(string_read) -! suppress trailing carriage return (ASCII code 13) if any (e.g. if input text file coming from Windows/DOS) + ! suppress trailing carriage return (ASCII code 13) if any (e.g. if input text file coming from Windows/DOS) if (index(string_read,achar(13)) > 0) string_read = string_read(1:index(string_read,achar(13))-1) -! exit loop when we find the first line that is not a comment or a white line + ! exit loop when we find the first line that is not a comment or a white line if (len_trim(string_read) == 0) cycle - if (string_read(1:1) /= '#') exit + if (string_read(1:1) /= '#' .and. string_read(1:1) /= '!') exit enddo -! suppress trailing white spaces, if any + ! suppress trailing white spaces, if any string_read = string_read(1:len_trim(string_read)) -! suppress trailing comments, if any + ! suppress trailing comments, if any if (index(string_read,'#') > 0) string_read = string_read(1:index(string_read,'#')-1) -! suppress leading junk (up to the first equal sign, included) if needed + ! suppress leading junk (up to the first equal sign, included) if needed if (ignore_junk) then index_equal_sign = index(string_read,'=') - if (index_equal_sign <= 1 .or. index_equal_sign == len_trim(string_read)) call stop_the_code( & -'incorrect syntax detected in DATA/Par_file') + if (index_equal_sign <= 1 .or. index_equal_sign == len_trim(string_read)) & + call stop_the_code('incorrect syntax detected in DATA/Par_file') string_read = string_read(index_equal_sign + 1:len_trim(string_read)) endif -! suppress leading and trailing white spaces again, if any, after having suppressed the leading junk + ! suppress leading and trailing white spaces again, if any, after having suppressed the leading junk string_read = adjustl(string_read) string_read = string_read(1:len_trim(string_read)) diff --git a/src/shared/shared_par.F90 b/src/shared/shared_par.F90 index de2d7c8d8..c943f13c6 100644 --- a/src/shared/shared_par.F90 +++ b/src/shared/shared_par.F90 @@ -275,6 +275,7 @@ module shared_input_parameters !# !#----------------------------------------------------------------------------- character(len=MAX_STRING_LEN) :: mesh_file, nodes_coords_file, materials_file + character(len=MAX_STRING_LEN) :: nummaterial_velocity_file character(len=MAX_STRING_LEN) :: free_surface_file character(len=MAX_STRING_LEN) :: absorbing_surface_file @@ -398,9 +399,12 @@ module shared_parameters double precision, dimension(:),allocatable :: rho_s_read double precision, dimension(:),allocatable :: rho_f_read - ! acoustic/elastic/anisotropic - double precision, dimension(:),allocatable :: cp,cs, & - aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12,comp_g,QKappa,Qmu + ! acoustic/elastic + double precision, dimension(:),allocatable :: cp,cs,QKappa,Qmu + + ! anisotropic + double precision, dimension(:),allocatable :: & + aniso3,aniso4,aniso5,aniso6,aniso7,aniso8,aniso9,aniso10,aniso11,aniso12 ! poroelastic ! note: adds ending _read to indicate these are readin values and to distinguish from solver arrays @@ -408,6 +412,10 @@ module shared_parameters double precision, dimension(:),allocatable :: phi_read,tortuosity_read,permxx_read,permxz_read, & permzz_read,kappa_s_read,kappa_f_read,kappa_fr_read,eta_f_read,mu_fr_read + ! compaction gradient + ! (in particular for Marmousi2 which defines a compaction gradient to increase velocities with depth) + double precision, dimension(:),allocatable :: compaction_grad + ! mesh setup ! total number of elements integer :: nelmnts diff --git a/src/specfem2D/define_external_model_from_marmousi.f90 b/src/specfem2D/define_external_model_from_marmousi.f90 index 36c239a85..674c778b1 100644 --- a/src/specfem2D/define_external_model_from_marmousi.f90 +++ b/src/specfem2D/define_external_model_from_marmousi.f90 @@ -54,7 +54,7 @@ subroutine define_external_model_from_marmousi(coord,ibool,rho,vp,vs,QKappa_atte ! local parameters integer :: i,j,ispec,iglob,imat - double precision :: x,z,rho0,vp0,vs0,comp_grad + double precision :: x,z,rho0,vp0,vs0,compaction_grad ! dummy routine here, just to demonstrate how the model can be assigned ! and how such a routine can be written @@ -81,14 +81,14 @@ subroutine define_external_model_from_marmousi(coord,ibool,rho,vp,vs,QKappa_atte rho0 = density(1,imat) vp0 = sqrt(poroelastcoef(3,1,imat)/rho0) vs0 = sqrt(poroelastcoef(2,1,imat)/rho0) - comp_grad = poroelastcoef(4,1,imat) + compaction_grad = poroelastcoef(4,1,imat) x = coord(1,iglob) z = coord(2,iglob) ! updates model values using depth and compaction gradient information rho(i,j,ispec) = rho0 - vp(i,j,ispec) = vp0 + comp_grad*z + vp(i,j,ispec) = vp0 + compaction_grad * z ! assumes Poisson solids vs(i,j,ispec) = vp(i,j,ispec) / sqrt(3.d0) diff --git a/src/specfem2D/initialize_simulation.F90 b/src/specfem2D/initialize_simulation.F90 index 3645c5cea..1f0cb3029 100644 --- a/src/specfem2D/initialize_simulation.F90 +++ b/src/specfem2D/initialize_simulation.F90 @@ -128,7 +128,7 @@ subroutine initialize_simulation() ! read the parameter file BROADCAST_AFTER_READ = .true. - call read_parameter_file(.false.,BROADCAST_AFTER_READ) + call read_parameter_file(BROADCAST_AFTER_READ) ! reads in source descriptions ! note: we will need a source frequency for outputting poroelastic velocities when reading the mesh databases @@ -213,9 +213,9 @@ subroutine initialize_simulation() ! sets model flag if (trim(MODEL) == 'default') then - assign_external_model = .false. + use_external_velocity_model = .false. else - assign_external_model = .true. + use_external_velocity_model = .true. endif end subroutine initialize_simulation diff --git a/src/specfem2D/read_external_model.f90 b/src/specfem2D/read_external_model.f90 index 8bbb65ba9..7d85369ab 100644 --- a/src/specfem2D/read_external_model.f90 +++ b/src/specfem2D/read_external_model.f90 @@ -343,7 +343,7 @@ end subroutine read_ascii_model subroutine read_binary_gll_model(rhoext,vpext,vsext,Qkappa_attenuationext,Qmu_attenuationext) -! reads in binary and gll format model +! reads in binary and GLL format model use constants, only: CUSTOM_REAL,NGLLX,NGLLZ,IMAIN,IN_DATA_FILES,IIN,MAX_STRING_LEN, & ATTENUATION_COMP_MAXIMUM diff --git a/src/specfem2D/read_materials.f90 b/src/specfem2D/read_materials.f90 index 2316f407d..607afaa3b 100644 --- a/src/specfem2D/read_materials.f90 +++ b/src/specfem2D/read_materials.f90 @@ -41,7 +41,8 @@ subroutine read_materials(f0) use specfem_par, only: AXISYM,density,porosity,tortuosity,anisotropycoef,permeability,poroelastcoef, & numat,myrank,QKappa_attenuationcoef,Qmu_attenuationcoef, & - freq0_poroelastic,Q0_poroelastic,ATTENUATION_PORO_FLUID_PART,assign_external_model,tomo_material,myrank + freq0_poroelastic,Q0_poroelastic,ATTENUATION_PORO_FLUID_PART, & + use_external_velocity_model,tomo_material,myrank implicit none @@ -303,7 +304,7 @@ subroutine read_materials(f0) ! line format: ! #model_number #-1 #(val0)0 #(val1)0 #(val2)A 0 0 0 0 0 0 0 0 0 0 - assign_external_model = .true. + use_external_velocity_model = .true. tomo_material = n mu = val2 ! for acoustic medium vs must be 0 anyway diff --git a/src/specfem2D/setup_mesh.F90 b/src/specfem2D/setup_mesh.F90 index 8a0e79765..78be41fd6 100644 --- a/src/specfem2D/setup_mesh.F90 +++ b/src/specfem2D/setup_mesh.F90 @@ -558,15 +558,15 @@ subroutine setup_mesh_material_properties() ! user output if (myrank == 0) then write(IMAIN,*) 'Material properties:' - write(IMAIN,*) ' MODEL : ',trim(MODEL) - write(IMAIN,*) ' nspec : ',nspec_all - write(IMAIN,*) ' assign external model : ',assign_external_model + write(IMAIN,*) ' MODEL : ',trim(MODEL) + write(IMAIN,*) ' nspec : ',nspec_all + write(IMAIN,*) ' external velocity model : ',use_external_velocity_model write(IMAIN,*) call flush_IMAIN() endif ! allocates material arrays - if (assign_external_model) then + if (use_external_velocity_model) then nspec_ext = nspec else ! dummy allocations @@ -602,7 +602,7 @@ subroutine setup_mesh_material_properties() c22ext(:,:,:) = 0.0_CUSTOM_REAL ! reads in external models - if (assign_external_model) then + if (use_external_velocity_model) then ! user output if (myrank == 0) then if (trim(MODEL) == 'tomo') then @@ -673,7 +673,7 @@ subroutine setup_mesh_material_properties() do j = 1,NGLLZ do i = 1,NGLLX ! gets material values - if (assign_external_model) then + if (use_external_velocity_model) then ! external model rhol = rhoext(i,j,ispec) vp = vpext(i,j,ispec) @@ -844,7 +844,7 @@ subroutine setup_mesh_material_properties() ! for non-elastic elements, the values in arrays c11ext,.. or anistropycoef(..) are just zero do j = 1,NGLLZ do i = 1,NGLLX - if (assign_external_model) then + if (use_external_velocity_model) then c11store(i,j,ispec) = c11ext(i,j,ispec) c12store(i,j,ispec) = c12ext(i,j,ispec) c13store(i,j,ispec) = c13ext(i,j,ispec) diff --git a/src/specfem2D/specfem2D_par.f90 b/src/specfem2D/specfem2D_par.f90 index 721b98e47..491f8797a 100644 --- a/src/specfem2D/specfem2D_par.f90 +++ b/src/specfem2D/specfem2D_par.f90 @@ -66,8 +66,8 @@ module specfem_par double precision, dimension(:), allocatable :: QKappa_attenuationcoef double precision, dimension(:), allocatable :: Qmu_attenuationcoef - ! external models - logical :: assign_external_model + ! external velocity models + logical :: use_external_velocity_model integer :: nspec_ATT_el,nspec_ATT_ac,nglob_att real(kind=CUSTOM_REAL), dimension(:,:,:,:), allocatable :: inv_tau_sigma_nu1,phi_nu1,inv_tau_sigma_nu2,phi_nu2 From 784966c6137f000423d785fa75160d5a35599803 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 8 Feb 2024 18:08:55 +0100 Subject: [PATCH 10/13] updates doc --- doc/USER_MANUAL/03_mesh_generation.tex | 2 ++ doc/USER_MANUAL/manual_SPECFEM2D.pdf | Bin 5484054 -> 5484487 bytes 2 files changed, 2 insertions(+) diff --git a/doc/USER_MANUAL/03_mesh_generation.tex b/doc/USER_MANUAL/03_mesh_generation.tex index 8cb7001b1..49f673d06 100644 --- a/doc/USER_MANUAL/03_mesh_generation.tex +++ b/doc/USER_MANUAL/03_mesh_generation.tex @@ -119,6 +119,8 @@ \section*{Notes about \texttt{DATA/Par\_file} parameters} \item[{\texttt{materials\_file}}] is the number of the material for every element : an integer ranging from 1 to \texttt{nbmodels} on each line. + \item[{\texttt{nummaterial\_velocity\_file}}] specifies the material properties for each material of the \texttt{nbmodels} defined in the materials file. The material specification follows a format slightly different than the \texttt{nbmodels} section in the \texttt{Par\_file}, but identical to the SPECFEM3D\_Cartesian version where you can find more informations about it. Also, examples of such \texttt{nummaterial\_velocity\_file} files can be found in the \texttt{EXAMPLES/} folder and the format is described in more detail therein in the header of the files. + \item[{\texttt{free\_surface\_file}}] is the file describing the edges forming the acoustic free surface: number of edges on the first line, then on each line: number of the element, number of nodes forming the free surface (1 for a point, 2 for an edge), the nodes forming the free surface for this element. If you do not want any free surface, just put 0 on the first line; you then get a rigid surface instead. \item[{\texttt{axial\_elements\_file}}] is the file describing the axial elements in the case of an axisymmetric simulation. See Section~\ref{sec:axisym}. diff --git a/doc/USER_MANUAL/manual_SPECFEM2D.pdf b/doc/USER_MANUAL/manual_SPECFEM2D.pdf index bcd5cf5729fee336941e3c651e02049a9d6be12e..a55433b1700cb0a7521e0d59328006ffa1e3b80d 100644 GIT binary patch delta 30472 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≪7^OcUh^~M!)9m zr;ykVZ$2gp1+ZJC*cmv)uzUJE;8c{EUTU>D@kejXwh8!TyqJlA0+}xMl+4}QM~$`> zrPdQc^GI2IHp*yW{C^^A_U4kcOfqM%t$>rNsj#1BHD!e08)I`S<-^2fg}a`qu#ZGF zR)pY7hh8Oy?}cFVBE1X7wc_ibiW8mF!fef}Cocx>2L$E%E@4INHlfJ32 z_fW#}M~*v%@Do5Ojj;JIhdd-fNjkFd!+z$TwbMyDl7w$tX4IFPh*q$}(q%F-|8Cfc zPtEY?I^=!~1O_IqX^m!(t=hF(7;; zE)8>Fy3UAOqp z+;w6*y;YK5M-1Ob*vCUYfZ^-~(u4;H#G@jJkkLR4=0PO~ven@v2O+4ySBP+yfj8%& z%m=|t!#xDN<-rqzP3A!pLcofq4)AxE8f_tlh^Moflj4kNpGAam zp`=9#k$?ab7Kou9R%gQKAb1vdB~X$vel`TVG4@1&cRZMEJOrXKIzxbkGkz6Fvkqno z zVs86OI(VZo%0v*9OyCzCuqb1AhM+lP=&C?YXPBy>@5YeXuvx~4_Cbi-U#FSWUGC-l z^5poHHMzm00)99Ol|d=yA(u5Y^A6XQb+Ms~{7koj)JVXS8<-##0aTM`=oH7xyw?$` zptKliV82Kn|ES_A>o2w*UnX4lndn{6vrS4jF7Cmu*_3Y1=z?o{=ZBdJ_wk5exarTw1U&iXVrS6{9AfRWm^y?7#BhGy-f@Aa4T3CuQqm_>u2ch)tt(R&)+~ z37OQUNcSfw>KnHqYCKROK_*}(b}I@R z8n~{A_6)Dc(iGD)*7q+*e7vYfCv9MLRK&~>Rl&pZB6!BV{Dvqx2eH}^*sZ$@Aj)$u zMq@I5LsXrvSd#xN>ZU+0XSAjuagmTNy6dej?GF?KEO%p@G{w>B;jee9q0NpZK_vvk zvjJg-BS()!FvLdygd#?_uR0J%&GrHwwWxq7%+eb|JdFq=DtwgsPta&_IQ9yU!HC^w zT$Kezss}V6d`r~Hj1n898c~YK=@D%OOZk4a*4D*!*fv1oCvK3rQ3~m|5i*^U|D)~4 z0tFAaQXnl0vQhvZ3*teKfDDL2CIC7@n9Jm}x%-NNm>CSX)bZOjx|_r9#n6E%?M2Xm zw%bP1fwk)8jS#-B5^5*APK#RLW4_KJ(XdkwtzfQfrW7wE(X!JI6}pj^4i$P%{*BWk z3DWU*fE+j>*CMHZUSYcn+xGzpuIrr1BF zioW=rJU$I*lPpxGu(|DG+8(FMk&7h#XhwS5k2YL}bu$7Xml*8r78)3F+o`nF>T}$) zy{NI z6)2$8;=-K>@AY$oI2x${x?&5WWrPrJTg@+i+IMRvnD;Iq6eE&~{)hmuTO_R=V&t}bp0pGk=S*@G06w*=>A z7LPtPcP?^5Rx632?Z{o_c*`kcddPorqLhd2IpMvDp2zPOos@HNs;cSzJ8L-jKy}jl zJhAP&2#}Y?HQjn_NycukSJ_3>V}5j9ys0WH;3kavCw)ZJEa0^KvFd*Gqxk#0#-zx%5tEPQqS( zy2qCgaXpIbM<}Y_|}K_wzrTTC(Ct7fp-IG^`t7wiMSsVVeceJPk73a(}z2IYJF*`A~`DgClH_ zB#X-9=c*I`Jsolk@sU=)MKR2VQC!E$kydm5#^yIj^t!aepQ8+M9JGy?qaOuifhk2dQ2h|04tjvrl21X6Hg`iN@7ACdMyTEvUMz?)CW-t=GcytWTY zF&bsgV2xK$Y5O zqMrT|wNwwyG;{H@E3dliFnB5B#pl*{(34!`QFGil2Ld1b3El|$j^k;lmS!}q z&y(rm-k+lx)-I9+9PuyqBo+xJOuz6TI4cKX)gfq*T2Z(=$T*pNYzo41fx$vwP%T3! z=++Q7O`p{e*Qy}5`;`41xw-7D$ch`W;)b|0myA=F=afxZjt5*2yXA z+N#y+Dl)X!suaPN>n_pCXK*_#)1*MObE?o}K-4Cfr%QkaKGJMc#`@TwA1_iz`|NVn z>}naLEEnj~2K(u9HxP6?UX5%u$NuK-mupf+ap$U4>ZLw7m1~mAzcH6<(#vaKs8lMY z<`}6|8m7K8S7-$>#0i!wHuRa=<_;>f5Bk+gp1fhpKk8KZjhntz3_dwTol{2r zWQ^K+1`QUowKEDi=MMffs%tw{W)QkTj-nTy#>vk%NN%h=bW3V@)m375g;?dtQw+i- zJ%Qc#of7$T90^nZ)#e)azv zVsIJLp^mhQ#Ho(9g8UFi{#%HkYTQGmXducogFZ!&NSu>R9SG)s4(E*JQfof~95%v$ ivsd9_kzTa_+3Pv2s8$^Z>9a(IhXa9K#`pQ From 7d45cfd64572a3467cfc39c0a3d8fd91888fbdb6 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 8 Feb 2024 18:12:13 +0100 Subject: [PATCH 11/13] updates examples to accommodate changes due to nummaterial_velocity_file usage --- DATA/Par_file | 19 ++--- EXAMPLES/BENCHIE_water_PVC/DATA/Par_file | 19 ++--- .../{DATA => MESH}/absorbing_cpml_file | 0 .../{DATA => MESH}/absorbing_surface_file | 0 .../{DATA => MESH}/free_surface_file | 0 .../{DATA => MESH}/materials_file | 0 .../{DATA => MESH}/mesh_file | 0 .../{DATA => MESH}/nodes_coords_file | 0 .../MESH/nummaterial_velocity_file | 33 +++++++++ .../ACOUSTIC/DATA/Par_file | 1 + .../ACOUSTIC_ELASTIC/DATA/Par_file | 1 + .../ELASTIC/DATA/Par_file | 1 + .../Gmsh_example_Stacey_MPI/DATA/Par_file | 19 ++--- .../DATA/Par_file.serial | 19 ++--- .../MESH/nummaterial_velocity_file | 33 +++++++++ EXAMPLES/Industrial_Format_SEP/DATA/Par_file | 19 ++--- .../REF_SEIS/Par_file.step_1 | 19 ++--- .../REF_SEIS/Par_file.step_2 | 19 ++--- .../LuoYang_fluid_solid_kernel/DATA/Par_file | 19 ++--- .../DATA/Par_file | 29 ++++---- .../run_this_example.sh | 72 ++++++++++++++----- EXAMPLES/Rayleigh_wave_no_crack/DATA/Par_file | 19 ++--- .../DATA/Par_file | 19 ++--- .../Rayleigh_wave_with_crack/DATA/Par_file | 19 ++--- .../DATA/Par_file_Tape2007_132rec_checker | 19 ++--- .../Tape2007/DATA/Par_file_Tape2007_onerec | 19 ++--- EXAMPLES/Tape2007/REF_SEIS/Par_file | 19 ++--- EXAMPLES/Tape2007_kernel/DATA/Par_file | 19 ++--- EXAMPLES/Tromp2005/DATA/Par_file | 19 ++--- .../Tromp2005/DATA/Par_file_Tromp2005_s100 | 19 ++--- EXAMPLES/Tromp2005_kernel/DATA/Par_file | 19 ++--- .../anisotropic_isotropic_model/DATA/Par_file | 1 + .../Par_file_homogeneous_with_attenuation | 1 + .../anisotropic_zinc_crystal/DATA/Par_file | 19 ++--- .../DATA/Par_file | 19 ++--- .../DATA/Par_file | 19 ++--- ...ation_2D_source_in_point_inside_an_element | 1 + ...2D_source_in_point_shared_by_four_elements | 1 + .../DATA/Par_file | 1 + .../REF_SEIS/Par_file | 1 + EXAMPLES/canyon/DATA/Par_file | 19 ++--- .../canyon_absorbing_surface_file | 0 .../mesh => MESH}/canyon_free_surface_file | 0 .../{DATA/mesh => MESH}/canyon_materials_file | 0 .../{DATA/mesh => MESH}/canyon_mesh_file | 0 .../mesh => MESH}/canyon_nodes_coords_file | 0 .../MESH/canyon_nummaterial_velocity_file | 32 +++++++++ ...e_corner_between_several_spectral_elements | 19 ++--- ...nuation_2D_inside_a_given_spectral_element | 19 ++--- .../REF_SEIS/Par_file | 19 ++--- ...e_corner_between_several_spectral_elements | 19 ++--- .../REF_SEIS/Par_file | 19 ++--- ...e_corner_between_several_spectral_elements | 19 ++--- ...nuation_2D_inside_a_given_spectral_element | 19 ++--- .../REF_SEIS/Par_file | 19 ++--- EXAMPLES/fluid_solid/README | 6 ++ .../fluid_solid_external_mesh/DATA/Par_file | 19 ++--- .../{mesh => MESH}/mat | 0 .../{mesh => MESH}/mesh | 0 .../{mesh => MESH}/nodes_coords | 0 .../MESH/nummaterial_velocity_file | 33 +++++++++ .../{mesh => MESH}/surface_abs | 0 .../{mesh => MESH}/surface_free | 0 .../fluid_solid_external_mesh/README | 2 +- .../run_this_example.sh | 1 - .../DATA/Par_file | 19 ++--- .../README | 2 +- .../{ => REF_ANALYTIC}/trace2an.dat | 0 ...ll_comparison_with_analytical_solution.gnu | 4 +- .../run_this_example.sh | 1 - .../DATA/Par_file | 19 ++--- .../README | 2 +- .../run_this_example.sh | 1 - EXAMPLES/global_Earth_ak135f/DATA/Par_file | 19 ++--- ...esh_AK135F_2D_with_central_cube_no_PML.F90 | 24 +++---- .../make_specific_mesher_for_2D_Earth.sh | 2 + .../DATA/Par_file | 1 + .../DATA/Par_file | 19 ++--- EXAMPLES/initial_mode_LDDRK/DATA/Par_file | 19 ++--- .../DATA/Par_file | 1 + .../moving_sources_acoustic/DATA/Par_file | 1 + EXAMPLES/noise_uniform/DATA/Par_file | 1 + EXAMPLES/noise_uniform/REF_SEIS/Par_file | 19 ++--- .../{ => DATA}/Par_file | 21 +++--- .../{ => DATA}/SOURCE | 0 .../MESH_SMALL/nummaterial_velocity_file | 33 +++++++++ EXAMPLES/paper_axisymmetry_example/README | 2 +- .../{ => REF_COMSOL}/TLcomsol.txt | 0 .../make_comparison.sh | 4 +- .../paper_axisymmetry_example/make_mesh.sh | 12 ++-- .../run_this_example.sh | 36 ++++++---- .../Pekeris_waveguide/DATA/Par_file | 1 + .../with_free_bottom_surface/DATA/Par_file | 1 + .../with_rigid_bottom_surface/DATA/Par_file | 1 + EXAMPLES/poroelastic_acoustic/DATA/Par_file | 1 + .../DATA/Par_file | 1 + ...pdate_their_parameters_from_a_main_file.py | 7 +- .../CPML_homogeneous/DATA/Par_file | 19 ++--- ...modelY1_PML_inner_edge_for_plane_wave_file | 0 .../modelY1_absorbing_surface_file | 0 .../{DATA => MESH}/modelY1_elements_CPML_list | 0 .../{DATA => MESH}/modelY1_free_surface_file | 0 .../{DATA => MESH}/modelY1_materials_file | 0 .../{DATA => MESH}/modelY1_mesh_file | 0 .../{DATA => MESH}/modelY1_nodes_coords_file | 0 .../MESH/modelY1_nummaterial_velocity_file | 32 +++++++++ .../CPML_homogeneous/run_this_example.sh | 1 - .../CPML_normal_fluid_solid/DATA/Par_file | 19 ++--- ...modelY1_PML_inner_edge_for_plane_wave_file | 0 .../modelY1_absorbing_surface_file | 0 .../{DATA => MESH}/modelY1_elements_CPML_list | 0 .../{DATA => MESH}/modelY1_free_surface_file | 0 .../modelY1_geometry_ACIS_ascii_format.sat | 0 .../modelY1_geometry_IGES_ascii_format.iges | 0 .../modelY1_geometry_STL_ascii_format.txt | 0 .../{DATA => MESH}/modelY1_materials_file | 0 .../{DATA => MESH}/modelY1_mesh_file | 0 .../{DATA => MESH}/modelY1_nodes_coords_file | 0 .../MESH/modelY1_nummaterial_velocity_file | 39 ++++++++++ .../run_this_example.sh | 1 - .../CPML_normal_solid_only/DATA/Par_file | 19 ++--- ...modelY1_PML_inner_edge_for_plane_wave_file | 0 .../modelY1_absorbing_surface_file | 0 .../{DATA => MESH}/modelY1_elements_CPML_list | 0 .../{DATA => MESH}/modelY1_free_surface_file | 0 .../{DATA => MESH}/modelY1_materials_file | 0 .../{DATA => MESH}/modelY1_mesh_file | 0 .../{DATA => MESH}/modelY1_nodes_coords_file | 0 .../MESH/modelY1_nummaterial_velocity_file | 38 ++++++++++ .../run_this_example.sh | 1 - .../README | 9 +++ .../Stacey_homogeneous/DATA/Par_file | 19 ++--- .../modelY1_absorbing_surface_file | 0 .../{DATA => MESH}/modelY1_free_surface_file | 0 .../{DATA => MESH}/modelY1_materials_file | 0 .../{DATA => MESH}/modelY1_mesh_file | 0 .../{DATA => MESH}/modelY1_nodes_coords_file | 0 .../MESH/modelY1_nummaterial_velocity_file | 32 +++++++++ .../Stacey_homogeneous/run_this_example.sh | 1 - .../Stacey_normal_fluid_solid/DATA/Par_file | 19 ++--- .../modelY1_absorbing_surface_file | 0 .../{DATA => MESH}/modelY1_free_surface_file | 0 .../{DATA => MESH}/modelY1_materials_file | 0 .../{DATA => MESH}/modelY1_mesh_file | 0 .../{DATA => MESH}/modelY1_nodes_coords_file | 0 .../MESH/modelY1_nummaterial_velocity_file | 39 ++++++++++ .../run_this_example.sh | 1 - .../DATA/Par_file | 19 ++--- .../DATA/Par_file_adj | 19 ++--- .../DATA/Par_file_fwd | 19 ++--- .../DATA/Par_file_kernel | 19 ++--- .../DATA/Par_file_save_forward | 19 ++--- .../{ => MESH}/absorbing_surface_file | 0 .../{ => MESH}/elements_cpml_list | 0 .../{ => MESH}/free_surface_file | 0 .../{ => MESH}/materials_file | 0 .../{ => MESH}/mesh_file | 0 .../{ => MESH}/nodes_coords_file | 0 .../MESH/nummaterial_velocity_file | 33 +++++++++ .../semi_infinite_homogeneous/DATA/Par_file | 19 ++--- .../DATA/Par_file | 19 ++--- .../REF_KERNEL/Par_file | 1 + .../REF_SEIS/Par_file | 19 ++--- EXAMPLES/thermocline/DATA/Par_file | 1 + .../tomographic_ocean_model/DATA/Par_file | 1 + .../tomographic_ocean_model/REF_SEIS/Par_file | 1 + .../Par_file_fluid_solid | 19 ++--- .../Par_file_fluid_solid | 19 ++--- .../DATA/Par_file | 19 ++--- ...file_to_use_with_this_timing_routine_HOWTO | 19 ++--- 170 files changed, 1090 insertions(+), 577 deletions(-) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/absorbing_cpml_file (100%) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/absorbing_surface_file (100%) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/free_surface_file (100%) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/materials_file (100%) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/mesh_file (100%) rename EXAMPLES/BENCHIE_water_PVC/{DATA => MESH}/nodes_coords_file (100%) create mode 100644 EXAMPLES/BENCHIE_water_PVC/MESH/nummaterial_velocity_file create mode 100644 EXAMPLES/Gmsh_example_Stacey_MPI/MESH/nummaterial_velocity_file rename EXAMPLES/canyon/{DATA/mesh => MESH}/canyon_absorbing_surface_file (100%) rename EXAMPLES/canyon/{DATA/mesh => MESH}/canyon_free_surface_file (100%) rename EXAMPLES/canyon/{DATA/mesh => MESH}/canyon_materials_file (100%) rename EXAMPLES/canyon/{DATA/mesh => MESH}/canyon_mesh_file (100%) rename EXAMPLES/canyon/{DATA/mesh => MESH}/canyon_nodes_coords_file (100%) create mode 100644 EXAMPLES/canyon/MESH/canyon_nummaterial_velocity_file create mode 100644 EXAMPLES/fluid_solid/README rename EXAMPLES/fluid_solid/fluid_solid_external_mesh/{mesh => MESH}/mat (100%) rename EXAMPLES/fluid_solid/fluid_solid_external_mesh/{mesh => MESH}/mesh (100%) rename EXAMPLES/fluid_solid/fluid_solid_external_mesh/{mesh => MESH}/nodes_coords (100%) create mode 100644 EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nummaterial_velocity_file rename EXAMPLES/fluid_solid/fluid_solid_external_mesh/{mesh => MESH}/surface_abs (100%) rename EXAMPLES/fluid_solid/fluid_solid_external_mesh/{mesh => MESH}/surface_free (100%) rename EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/{ => REF_ANALYTIC}/trace2an.dat (100%) rename EXAMPLES/paper_axisymmetry_example/{ => DATA}/Par_file (95%) rename EXAMPLES/paper_axisymmetry_example/{ => DATA}/SOURCE (100%) create mode 100644 EXAMPLES/paper_axisymmetry_example/MESH_SMALL/nummaterial_velocity_file rename EXAMPLES/paper_axisymmetry_example/{ => REF_COMSOL}/TLcomsol.txt (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_PML_inner_edge_for_plane_wave_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_absorbing_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_elements_CPML_list (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_free_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_materials_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_mesh_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/{DATA => MESH}/modelY1_nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nummaterial_velocity_file rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_PML_inner_edge_for_plane_wave_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_absorbing_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_elements_CPML_list (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_free_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_geometry_ACIS_ascii_format.sat (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_geometry_IGES_ascii_format.iges (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_geometry_STL_ascii_format.txt (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_materials_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_mesh_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/{DATA => MESH}/modelY1_nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_PML_inner_edge_for_plane_wave_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_absorbing_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_elements_CPML_list (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_free_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_materials_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_mesh_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/{DATA => MESH}/modelY1_nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nummaterial_velocity_file create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/README rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/{DATA => MESH}/modelY1_absorbing_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/{DATA => MESH}/modelY1_free_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/{DATA => MESH}/modelY1_materials_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/{DATA => MESH}/modelY1_mesh_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/{DATA => MESH}/modelY1_nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nummaterial_velocity_file rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/{DATA => MESH}/modelY1_absorbing_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/{DATA => MESH}/modelY1_free_surface_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/{DATA => MESH}/modelY1_materials_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/{DATA => MESH}/modelY1_mesh_file (100%) rename EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/{DATA => MESH}/modelY1_nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/absorbing_surface_file (100%) rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/elements_cpml_list (100%) rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/free_surface_file (100%) rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/materials_file (100%) rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/mesh_file (100%) rename EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/{ => MESH}/nodes_coords_file (100%) create mode 100644 EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nummaterial_velocity_file diff --git a/DATA/Par_file b/DATA/Par_file index 0746c2422..0137c08c9 100644 --- a/DATA/Par_file +++ b/DATA/Par_file @@ -279,15 +279,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/Par_file b/EXAMPLES/BENCHIE_water_PVC/DATA/Par_file index 21b460821..8c21ec6e9 100644 --- a/EXAMPLES/BENCHIE_water_PVC/DATA/Par_file +++ b/EXAMPLES/BENCHIE_water_PVC/DATA/Par_file @@ -278,15 +278,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/absorbing_cpml_file # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/absorbing_cpml_file b/EXAMPLES/BENCHIE_water_PVC/MESH/absorbing_cpml_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/absorbing_cpml_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/absorbing_cpml_file diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/absorbing_surface_file b/EXAMPLES/BENCHIE_water_PVC/MESH/absorbing_surface_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/absorbing_surface_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/absorbing_surface_file diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/free_surface_file b/EXAMPLES/BENCHIE_water_PVC/MESH/free_surface_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/free_surface_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/free_surface_file diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/materials_file b/EXAMPLES/BENCHIE_water_PVC/MESH/materials_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/materials_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/materials_file diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/mesh_file b/EXAMPLES/BENCHIE_water_PVC/MESH/mesh_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/mesh_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/mesh_file diff --git a/EXAMPLES/BENCHIE_water_PVC/DATA/nodes_coords_file b/EXAMPLES/BENCHIE_water_PVC/MESH/nodes_coords_file similarity index 100% rename from EXAMPLES/BENCHIE_water_PVC/DATA/nodes_coords_file rename to EXAMPLES/BENCHIE_water_PVC/MESH/nodes_coords_file diff --git a/EXAMPLES/BENCHIE_water_PVC/MESH/nummaterial_velocity_file b/EXAMPLES/BENCHIE_water_PVC/MESH/nummaterial_velocity_file new file mode 100644 index 000000000..ef05430ee --- /dev/null +++ b/EXAMPLES/BENCHIE_water_PVC/MESH/nummaterial_velocity_file @@ -0,0 +1,33 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 1412.d0 2260.d0 1050.d0 9999.0 9999.0 0 +1 2 1000.d0 1477.d0 0.d0 9999.0 9999.0 0 diff --git a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC/DATA/Par_file b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC/DATA/Par_file index b359f209e..15ac32f29 100644 --- a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC/DATA/Par_file +++ b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC/DATA/Par_file @@ -263,6 +263,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC_ELASTIC/DATA/Par_file b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC_ELASTIC/DATA/Par_file index 152995868..b01de98e5 100644 --- a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC_ELASTIC/DATA/Par_file +++ b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ACOUSTIC_ELASTIC/DATA/Par_file @@ -264,6 +264,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ELASTIC/DATA/Par_file b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ELASTIC/DATA/Par_file index d8680e287..6754643aa 100644 --- a/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ELASTIC/DATA/Par_file +++ b/EXAMPLES/BENCHMARK_CLAERBOUT_ADJOINT/ELASTIC/DATA/Par_file @@ -263,6 +263,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file b/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file index faeb32da7..0ba61498d 100644 --- a/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file +++ b/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = MESH/Mesh_SqrCirc # file containing the mesh -nodes_coords_file = MESH/Nodes_SqrCirc # file containing the nodes coordinates -materials_file = MESH/Material_SqrCirc # file containing the material number for each element -free_surface_file = MESH/Surf_free_SqrCirc # file containing the free surface -axial_elements_file = dummy # file containing the axial elements if AXISYM is true -absorbing_surface_file = MESH/Surf_abs_SqrCirc # file containing the absorbing surface -acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface -absorbing_cpml_file = dummy # file containing the CPML element numbers -tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model +mesh_file = ./MESH/Mesh_SqrCirc # file containing the mesh +nodes_coords_file = ./MESH/Nodes_SqrCirc # file containing the nodes coordinates +materials_file = ./MESH/Material_SqrCirc # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/Surf_free_SqrCirc # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/Surf_abs_SqrCirc # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file.serial b/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file.serial index 89d2ae7c2..0cdab013b 100644 --- a/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file.serial +++ b/EXAMPLES/Gmsh_example_Stacey_MPI/DATA/Par_file.serial @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = MESH/Mesh_SqrCirc # file containing the mesh -nodes_coords_file = MESH/Nodes_SqrCirc # file containing the nodes coordinates -materials_file = MESH/Material_SqrCirc # file containing the material number for each element -free_surface_file = MESH/Surf_free_SqrCirc # file containing the free surface -axial_elements_file = dummy # file containing the axial elements if AXISYM is true -absorbing_surface_file = MESH/Surf_abs_SqrCirc # file containing the absorbing surface -acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface -absorbing_cpml_file = dummy # file containing the CPML element numbers -tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model +mesh_file = ./MESH/Mesh_SqrCirc # file containing the mesh +nodes_coords_file = ./MESH/Nodes_SqrCirc # file containing the nodes coordinates +materials_file = ./MESH/Material_SqrCirc # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/Surf_free_SqrCirc # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/Surf_abs_SqrCirc # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Gmsh_example_Stacey_MPI/MESH/nummaterial_velocity_file b/EXAMPLES/Gmsh_example_Stacey_MPI/MESH/nummaterial_velocity_file new file mode 100644 index 000000000..d149aa0a0 --- /dev/null +++ b/EXAMPLES/Gmsh_example_Stacey_MPI/MESH/nummaterial_velocity_file @@ -0,0 +1,33 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +1 1 2000.d0 1680.d0 0.0d0 10.d0 10.d0 0 +1 2 1000.d0 1477.d0 0.0d0 10.d0 10.d0 0 diff --git a/EXAMPLES/Industrial_Format_SEP/DATA/Par_file b/EXAMPLES/Industrial_Format_SEP/DATA/Par_file index 0889970bd..37d34d28c 100644 --- a/EXAMPLES/Industrial_Format_SEP/DATA/Par_file +++ b/EXAMPLES/Industrial_Format_SEP/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh/mesh # file containing the mesh -nodes_coords_file = ./mesh/nodes_coords # file containing the nodes coordinates -materials_file = ./mesh/mat # file containing the material number for each element -free_surface_file = ./mesh/surface_free # file containing the free surface -axial_elements_file = ./mesh/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./mesh/surface_abs # file containing the absorbing surface -acoustic_forcing_surface_file = ./mesh/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./mesh/Elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./mesh/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_1 b/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_1 index 96805af58..27652276d 100644 --- a/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_1 +++ b/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_1 @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh/mesh # file containing the mesh -nodes_coords_file = ./mesh/nodes_coords # file containing the nodes coordinates -materials_file = ./mesh/mat # file containing the material number for each element -free_surface_file = ./mesh/surface_free # file containing the free surface -axial_elements_file = ./mesh/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./mesh/surface_abs # file containing the absorbing surface -acoustic_forcing_surface_file = ./mesh/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./mesh/Elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./mesh/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_2 b/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_2 index bf0dfb6ba..24d02bf99 100644 --- a/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_2 +++ b/EXAMPLES/Industrial_Format_SEP/REF_SEIS/Par_file.step_2 @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh/mesh # file containing the mesh -nodes_coords_file = ./mesh/nodes_coords # file containing the nodes coordinates -materials_file = ./mesh/mat # file containing the material number for each element -free_surface_file = ./mesh/surface_free # file containing the free surface -axial_elements_file = ./mesh/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./mesh/surface_abs # file containing the absorbing surface -acoustic_forcing_surface_file = ./mesh/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./mesh/Elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./mesh/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/LuoYang_fluid_solid_kernel/DATA/Par_file b/EXAMPLES/LuoYang_fluid_solid_kernel/DATA/Par_file index 716a7d386..de6be6c39 100644 --- a/EXAMPLES/LuoYang_fluid_solid_kernel/DATA/Par_file +++ b/EXAMPLES/LuoYang_fluid_solid_kernel/DATA/Par_file @@ -271,15 +271,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/DATA/Par_file b/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/DATA/Par_file index cd6c60b2a..989ebb60d 100644 --- a/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/DATA/Par_file +++ b/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/DATA/Par_file @@ -17,7 +17,7 @@ NOISE_TOMOGRAPHY = 0 SAVE_FORWARD = .false. # parameters concerning partitioning -NPROC = 20 # number of processes +NPROC = 2 # number of processes # time step parameters # total number of time steps @@ -46,7 +46,7 @@ AXISYM = .false. PARTITIONING_TYPE = 3 # SCOTCH = 3, ascending order (very bad idea) = 1 # number of control nodes per element (4 or 9) -NGNOD = 9 +NGNOD = 4 # creates/reads a binary database that allows to skip all time consuming setup steps in initialization # 0 = does not read/create database @@ -148,7 +148,7 @@ seismotype = 1 # several values can be chosen. # every how many time steps we save the seismograms # (costly, do not use a very small value; if you use a very large value that is larger than the total number # of time steps of the run, the seismograms will automatically be saved once at the end of the run anyway) -NTSTEP_BETWEEN_OUTPUT_SEISMOS = 1000 +NTSTEP_BETWEEN_OUTPUT_SEISMOS = 100000 # set to n to reduce the sampling rate of output seismograms by a factor of n # defaults to 1, which means no down-sampling @@ -162,7 +162,7 @@ USER_T0 = 0.0d0 # seismogram formats save_ASCII_seismograms = .true. # save seismograms in ASCII format or not -save_binary_seismograms_single = .true. # save seismograms in single precision binary format or not (can be used jointly with ASCII above to save both) +save_binary_seismograms_single = .false. # save seismograms in single precision binary format or not (can be used jointly with ASCII above to save both) save_binary_seismograms_double = .false. # save seismograms in double precision binary format or not (can be used jointly with both flags above to save all) SU_FORMAT = .false. # output single precision binary seismograms in Seismic Unix format (adjoint traces will be read in the same format) @@ -273,15 +273,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = Elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # @@ -290,7 +291,7 @@ tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing th #----------------------------------------------------------- # file containing interfaces for internal mesh -interfacesfile = ./DATA/interfaces_simple_topo_curved.dat +interfacesfile = interfaces_simple_topo_curved.dat # geometry of the model (origin lower-left corner = 0,0) and mesh description xmin = 0.d0 # abscissa of left side of the model diff --git a/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/run_this_example.sh b/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/run_this_example.sh index 3522e558c..97bdb4763 100755 --- a/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/run_this_example.sh +++ b/EXAMPLES/Marmousi2_to_be_done_one_day_not_ready_yet/run_this_example.sh @@ -1,18 +1,24 @@ -#!/bin/bash -eu -################################# -# USER PARAMETER +#!/bin/bash +# +# script runs mesher and solver (in serial) +# using this example setup +# -NPROC=20 +echo "running example: `date`" +currentdir=`pwd` -################################# - -echo "setting up example: `pwd`" +# sets up directory structure in current example directoy +echo +echo "setting up example..." echo mkdir -p OUTPUT_FILES -# cleanup + +# cleans output files rm -rf OUTPUT_FILES/* +cd $currentdir + # links executables mkdir -p bin cd bin/ @@ -21,21 +27,53 @@ ln -s ../../../bin/xmeshfem2D ln -s ../../../bin/xspecfem2D cd ../ -echo -echo "running mesher..." -echo -./bin/xmeshfem2D +# stores setup +cp DATA/Par_file OUTPUT_FILES/ +cp DATA/SOURCE OUTPUT_FILES/ + +# Get the number of processors +NPROC=`grep ^NPROC DATA/Par_file | cut -d = -f 2 | cut -d \# -f 1 | tr -d ' '` + +# runs database generation +if [ "$NPROC" -eq 1 ]; then + # This is a serial simulation + echo + echo "running mesher..." + echo + ./bin/xmeshfem2D +else + # This is a MPI simulation + echo + echo "running mesher on $NPROC processors..." + echo + mpirun -np $NPROC ./bin/xmeshfem2D +fi # checks exit code if [[ $? -ne 0 ]]; then exit 1; fi -echo -echo "running solver..." -echo -mpirun -np $NPROC ./bin/xspecfem2D +# runs simulation +if [ "$NPROC" -eq 1 ]; then + # This is a serial simulation + echo + echo "running solver..." + echo + ./bin/xspecfem2D +else + # This is a MPI simulation + echo + echo "running solver on $NPROC processors..." + echo + mpirun -np $NPROC ./bin/xspecfem2D +fi # checks exit code if [[ $? -ne 0 ]]; then exit 1; fi +# stores output +cp DATA/*SOURCE* DATA/*STATIONS* OUTPUT_FILES + echo -echo "done" +echo "see results in directory: OUTPUT_FILES/" echo +echo "done" +echo `date` diff --git a/EXAMPLES/Rayleigh_wave_no_crack/DATA/Par_file b/EXAMPLES/Rayleigh_wave_no_crack/DATA/Par_file index d9032a529..a3db33576 100644 --- a/EXAMPLES/Rayleigh_wave_no_crack/DATA/Par_file +++ b/EXAMPLES/Rayleigh_wave_no_crack/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/mesh/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/mesh/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/mesh/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/mesh/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Rayleigh_wave_no_crack_simpler_way_to_generate_the_wave/DATA/Par_file b/EXAMPLES/Rayleigh_wave_no_crack_simpler_way_to_generate_the_wave/DATA/Par_file index dc6c391ec..ad79cbddb 100644 --- a/EXAMPLES/Rayleigh_wave_no_crack_simpler_way_to_generate_the_wave/DATA/Par_file +++ b/EXAMPLES/Rayleigh_wave_no_crack_simpler_way_to_generate_the_wave/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Rayleigh_wave_with_crack/DATA/Par_file b/EXAMPLES/Rayleigh_wave_with_crack/DATA/Par_file index 5b13ee071..0b834f108 100644 --- a/EXAMPLES/Rayleigh_wave_with_crack/DATA/Par_file +++ b/EXAMPLES/Rayleigh_wave_with_crack/DATA/Par_file @@ -272,15 +272,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/mesh/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/mesh/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/mesh/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/mesh/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_132rec_checker b/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_132rec_checker index 7f9199998..f86f0568f 100644 --- a/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_132rec_checker +++ b/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_132rec_checker @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_onerec b/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_onerec index 4d9b24b33..ebbb8ebce 100644 --- a/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_onerec +++ b/EXAMPLES/Tape2007/DATA/Par_file_Tape2007_onerec @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tape2007/REF_SEIS/Par_file b/EXAMPLES/Tape2007/REF_SEIS/Par_file index 7f9199998..f86f0568f 100644 --- a/EXAMPLES/Tape2007/REF_SEIS/Par_file +++ b/EXAMPLES/Tape2007/REF_SEIS/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tape2007_kernel/DATA/Par_file b/EXAMPLES/Tape2007_kernel/DATA/Par_file index 93e1a421e..bc441d3b2 100644 --- a/EXAMPLES/Tape2007_kernel/DATA/Par_file +++ b/EXAMPLES/Tape2007_kernel/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tromp2005/DATA/Par_file b/EXAMPLES/Tromp2005/DATA/Par_file index 873113d1d..5676b5216 100644 --- a/EXAMPLES/Tromp2005/DATA/Par_file +++ b/EXAMPLES/Tromp2005/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tromp2005/DATA/Par_file_Tromp2005_s100 b/EXAMPLES/Tromp2005/DATA/Par_file_Tromp2005_s100 index 2cd7be06a..48007a9e4 100644 --- a/EXAMPLES/Tromp2005/DATA/Par_file_Tromp2005_s100 +++ b/EXAMPLES/Tromp2005/DATA/Par_file_Tromp2005_s100 @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/Tromp2005_kernel/DATA/Par_file b/EXAMPLES/Tromp2005_kernel/DATA/Par_file index 9b3717dbe..8799083a6 100644 --- a/EXAMPLES/Tromp2005_kernel/DATA/Par_file +++ b/EXAMPLES/Tromp2005_kernel/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file index 9f149b294..672b368ad 100644 --- a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file +++ b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file @@ -273,6 +273,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation index 7c5914ada..2e5634d26 100644 --- a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation +++ b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation @@ -278,6 +278,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/anisotropic_zinc_crystal/DATA/Par_file b/EXAMPLES/anisotropic_zinc_crystal/DATA/Par_file index 39017db40..bf6842063 100644 --- a/EXAMPLES/anisotropic_zinc_crystal/DATA/Par_file +++ b/EXAMPLES/anisotropic_zinc_crystal/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/attenuation/viscoacoustic_attenuation_off_versus_analytical/DATA/Par_file b/EXAMPLES/attenuation/viscoacoustic_attenuation_off_versus_analytical/DATA/Par_file index 89297850d..7bc2c9606 100644 --- a/EXAMPLES/attenuation/viscoacoustic_attenuation_off_versus_analytical/DATA/Par_file +++ b/EXAMPLES/attenuation/viscoacoustic_attenuation_off_versus_analytical/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/attenuation/viscoacoustic_attenuation_on_versus_analytical/DATA/Par_file b/EXAMPLES/attenuation/viscoacoustic_attenuation_on_versus_analytical/DATA/Par_file index b918a1bc1..28a562803 100644 --- a/EXAMPLES/attenuation/viscoacoustic_attenuation_on_versus_analytical/DATA/Par_file +++ b/EXAMPLES/attenuation/viscoacoustic_attenuation_on_versus_analytical/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_inside_an_element b/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_inside_an_element index 701648efa..98e259f14 100644 --- a/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_inside_an_element +++ b/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_inside_an_element @@ -268,6 +268,7 @@ read_external_mesh = .false. mesh_file = ./DATA/mesh_file # file containing the mesh nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_shared_by_four_elements b/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_shared_by_four_elements index a758010a1..6020fe615 100644 --- a/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_shared_by_four_elements +++ b/EXAMPLES/attenuation/viscoelastic/DATA/Par_file_attenuation_2D_source_in_point_shared_by_four_elements @@ -268,6 +268,7 @@ read_external_mesh = .false. mesh_file = ./DATA/mesh_file # file containing the mesh nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/axisymmetric_case_AXISYM_option/DATA/Par_file b/EXAMPLES/axisymmetric_case_AXISYM_option/DATA/Par_file index 6ea25b5ba..4fb14b6b4 100644 --- a/EXAMPLES/axisymmetric_case_AXISYM_option/DATA/Par_file +++ b/EXAMPLES/axisymmetric_case_AXISYM_option/DATA/Par_file @@ -288,6 +288,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/axisymmetric_case_AXISYM_option/REF_SEIS/Par_file b/EXAMPLES/axisymmetric_case_AXISYM_option/REF_SEIS/Par_file index 6ea25b5ba..4fb14b6b4 100644 --- a/EXAMPLES/axisymmetric_case_AXISYM_option/REF_SEIS/Par_file +++ b/EXAMPLES/axisymmetric_case_AXISYM_option/REF_SEIS/Par_file @@ -288,6 +288,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/canyon/DATA/Par_file b/EXAMPLES/canyon/DATA/Par_file index 4d8790b95..9ec4e30cb 100644 --- a/EXAMPLES/canyon/DATA/Par_file +++ b/EXAMPLES/canyon/DATA/Par_file @@ -259,15 +259,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/mesh/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/mesh/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/mesh/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/mesh/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/canyon_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/canyon_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/canyon_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/canyon_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/canyon_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/canyon_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/canyon/DATA/mesh/canyon_absorbing_surface_file b/EXAMPLES/canyon/MESH/canyon_absorbing_surface_file similarity index 100% rename from EXAMPLES/canyon/DATA/mesh/canyon_absorbing_surface_file rename to EXAMPLES/canyon/MESH/canyon_absorbing_surface_file diff --git a/EXAMPLES/canyon/DATA/mesh/canyon_free_surface_file b/EXAMPLES/canyon/MESH/canyon_free_surface_file similarity index 100% rename from EXAMPLES/canyon/DATA/mesh/canyon_free_surface_file rename to EXAMPLES/canyon/MESH/canyon_free_surface_file diff --git a/EXAMPLES/canyon/DATA/mesh/canyon_materials_file b/EXAMPLES/canyon/MESH/canyon_materials_file similarity index 100% rename from EXAMPLES/canyon/DATA/mesh/canyon_materials_file rename to EXAMPLES/canyon/MESH/canyon_materials_file diff --git a/EXAMPLES/canyon/DATA/mesh/canyon_mesh_file b/EXAMPLES/canyon/MESH/canyon_mesh_file similarity index 100% rename from EXAMPLES/canyon/DATA/mesh/canyon_mesh_file rename to EXAMPLES/canyon/MESH/canyon_mesh_file diff --git a/EXAMPLES/canyon/DATA/mesh/canyon_nodes_coords_file b/EXAMPLES/canyon/MESH/canyon_nodes_coords_file similarity index 100% rename from EXAMPLES/canyon/DATA/mesh/canyon_nodes_coords_file rename to EXAMPLES/canyon/MESH/canyon_nodes_coords_file diff --git a/EXAMPLES/canyon/MESH/canyon_nummaterial_velocity_file b/EXAMPLES/canyon/MESH/canyon_nummaterial_velocity_file new file mode 100644 index 000000000..a884684e1 --- /dev/null +++ b/EXAMPLES/canyon/MESH/canyon_nummaterial_velocity_file @@ -0,0 +1,32 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 1.d0 2.d0 1.d0 9999.d0 9999.d0 0 diff --git a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements index 6a673b42b..e066abbe4 100644 --- a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements +++ b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element index 76f2354cd..9e064730f 100644 --- a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element +++ b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/REF_SEIS/Par_file b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/REF_SEIS/Par_file index 6a673b42b..e066abbe4 100644 --- a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/REF_SEIS/Par_file +++ b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_elastic/REF_SEIS/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements index 499d1d45b..8ce5afc65 100644 --- a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements +++ b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/REF_SEIS/Par_file b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/REF_SEIS/Par_file index 499d1d45b..8ce5afc65 100644 --- a/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/REF_SEIS/Par_file +++ b/EXAMPLES/check_absolute_amplitude_of_force_source_seismograms_viscoelastic/REF_SEIS/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements index 160050066..36eaeccfc 100644 --- a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements +++ b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_at_the_corner_between_several_spectral_elements @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element index 6a63a7157..0cb38dc34 100644 --- a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element +++ b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/DATA/Par_file_no_attenuation_2D_inside_a_given_spectral_element @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/REF_SEIS/Par_file b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/REF_SEIS/Par_file index 160050066..36eaeccfc 100644 --- a/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/REF_SEIS/Par_file +++ b/EXAMPLES/check_absolute_amplitude_of_pressure_source_seismograms_acoustic/REF_SEIS/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/fluid_solid/README b/EXAMPLES/fluid_solid/README new file mode 100644 index 000000000..6c15cf6c2 --- /dev/null +++ b/EXAMPLES/fluid_solid/README @@ -0,0 +1,6 @@ +---------------------------------------------------------------------- +README +---------------------------------------------------------------------- + +In this folder we provide different fluid-solid examples from the 2000 Geophysics paper of Komatitsch, Barnes and Tromp. + diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/DATA/Par_file b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/DATA/Par_file index bf2ebee7e..c6e3e2204 100644 --- a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/DATA/Par_file +++ b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/DATA/Par_file @@ -260,15 +260,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh/mesh # file containing the mesh -nodes_coords_file = ./mesh/nodes_coords # file containing the nodes coordinates -materials_file = ./mesh/mat # file containing the material number for each element -free_surface_file = ./mesh/surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./mesh/surface_abs # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords # file containing the nodes coordinates +materials_file = ./MESH/mat # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/surface_free # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/surface_abs # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/absorbing_cpml_file # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/mat b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/mat similarity index 100% rename from EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/mat rename to EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/mat diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/mesh b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/mesh similarity index 100% rename from EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/mesh rename to EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/mesh diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/nodes_coords b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nodes_coords similarity index 100% rename from EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/nodes_coords rename to EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nodes_coords diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nummaterial_velocity_file b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nummaterial_velocity_file new file mode 100644 index 000000000..fb868687f --- /dev/null +++ b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/nummaterial_velocity_file @@ -0,0 +1,33 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +1 1 1000.d0 1500.d0 0.0d0 10.d0 10.d0 0 +2 2 2500.d0 5000.d0 2500.0d0 10.d0 10.d0 0 diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/surface_abs b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/surface_abs similarity index 100% rename from EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/surface_abs rename to EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/surface_abs diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/surface_free b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/surface_free similarity index 100% rename from EXAMPLES/fluid_solid/fluid_solid_external_mesh/mesh/surface_free rename to EXAMPLES/fluid_solid/fluid_solid_external_mesh/MESH/surface_free diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/README b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/README index 056f59a2f..e8aeb35bd 100644 --- a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/README +++ b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/README @@ -6,6 +6,6 @@ This example creates an external mesh with fluid and solid domains, and topograp To run the example, type: - ./process.sh + ./run_this_example.sh in this directory. diff --git a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/run_this_example.sh b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/run_this_example.sh index 96198b432..b8469a199 100755 --- a/EXAMPLES/fluid_solid/fluid_solid_external_mesh/run_this_example.sh +++ b/EXAMPLES/fluid_solid/fluid_solid_external_mesh/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/DATA/Par_file b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/DATA/Par_file index 47a6d4945..ed02074b2 100644 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/DATA/Par_file +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/DATA/Par_file @@ -260,15 +260,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/README b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/README index b8211cc76..078cdc99f 100644 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/README +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/README @@ -6,7 +6,7 @@ This example creates the fluid-solid example with flat ocean bottom from the 200 To run the example, type: - ./process.sh + ./run_this_example.sh in this directory. diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/trace2an.dat b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/REF_ANALYTIC/trace2an.dat similarity index 100% rename from EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/trace2an.dat rename to EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/REF_ANALYTIC/trace2an.dat diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/plotall_comparison_with_analytical_solution.gnu b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/plotall_comparison_with_analytical_solution.gnu index 1c9f118b4..1f8155c9d 100644 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/plotall_comparison_with_analytical_solution.gnu +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/plotall_comparison_with_analytical_solution.gnu @@ -19,9 +19,9 @@ set xrange [1.3:2.1] amplitude_of_source = 44705882000. -plot "OUTPUT_FILES/AA.S0040.BXX.semv" using ($1 + 0.104):(- amplitude_of_source * $2) title 'Ux SEM' w l lc 1, "trace2an.dat" using 1:2 title 'Ux analytical' w l lc 3 +plot "OUTPUT_FILES/AA.S0040.BXX.semv" using ($1 + 0.104):(- amplitude_of_source * $2) title 'Ux SEM' w l lc 1, "REF_ANALYTIC/trace2an.dat" using 1:2 title 'Ux analytical' w l lc 3 pause -1 "Hit any key..." -plot "OUTPUT_FILES/AA.S0040.BXZ.semv" using ($1 + 0.104):(+ amplitude_of_source * $2) title 'Uz SEM' w l lc 1, "trace2an.dat" using 1:3 title 'Uz analytical' w l lc 3 +plot "OUTPUT_FILES/AA.S0040.BXZ.semv" using ($1 + 0.104):(+ amplitude_of_source * $2) title 'Uz SEM' w l lc 1, "REF_ANALYTIC/trace2an.dat" using 1:3 title 'Uz analytical' w l lc 3 pause -1 "Hit any key..." diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/run_this_example.sh b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/run_this_example.sh index fa18a3c23..753d54ee5 100755 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/run_this_example.sh +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_flat_ocean_bottom/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/DATA/Par_file b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/DATA/Par_file index 2de82f19b..31bb32626 100644 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/DATA/Par_file +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/DATA/Par_file @@ -260,15 +260,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/README b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/README index b8211cc76..078cdc99f 100644 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/README +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/README @@ -6,7 +6,7 @@ This example creates the fluid-solid example with flat ocean bottom from the 200 To run the example, type: - ./process.sh + ./run_this_example.sh in this directory. diff --git a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/run_this_example.sh b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/run_this_example.sh index fa18a3c23..753d54ee5 100755 --- a/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/run_this_example.sh +++ b/EXAMPLES/fluid_solid/from_2000_Geophysics_paper_sinusoidal_ocean_bottom/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/global_Earth_ak135f/DATA/Par_file b/EXAMPLES/global_Earth_ak135f/DATA/Par_file index 9c99a8198..c460e8561 100644 --- a/EXAMPLES/global_Earth_ak135f/DATA/Par_file +++ b/EXAMPLES/global_Earth_ak135f/DATA/Par_file @@ -271,15 +271,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_AK135F_NO_MUD # file containing the mesh -nodes_coords_file = ./DATA/Nodes_AK135F_NO_MUD # file containing the nodes coordinates -materials_file = ./DATA/Material_AK135F_NO_MUD # file containing the material number for each element -free_surface_file = ./DATA/Surf_free_AK135F_NO_MUD # file containing the free surface -axial_elements_file = ./DATA/Symmetry_axis_elements_AK135F_NO_MUD # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Surf_abs_AK135F_NO_MUD # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/Mesh_AK135F_NO_MUD # file containing the mesh +nodes_coords_file = ./MESH/Nodes_AK135F_NO_MUD # file containing the nodes coordinates +materials_file = ./MESH/Material_AK135F_NO_MUD # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/Surf_free_AK135F_NO_MUD # file containing the free surface +axial_elements_file = ./MESH/Symmetry_axis_elements_AK135F_NO_MUD # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/Surf_abs_AK135F_NO_MUD # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/absorbing_cpml_file # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/global_Earth_ak135f/create_mesh_AK135F_2D_with_central_cube_no_PML.F90 b/EXAMPLES/global_Earth_ak135f/create_mesh_AK135F_2D_with_central_cube_no_PML.F90 index c433f0145..70093e496 100644 --- a/EXAMPLES/global_Earth_ak135f/create_mesh_AK135F_2D_with_central_cube_no_PML.F90 +++ b/EXAMPLES/global_Earth_ak135f/create_mesh_AK135F_2D_with_central_cube_no_PML.F90 @@ -1174,10 +1174,10 @@ program generate_mesh ! write the mesh points #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Nodes_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Nodes_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') write(22) npoin #else - open(unit=22,file='DATA/Nodes_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Nodes_AK135F_NO_MUD',form='formatted',status='unknown',action='write') write(22,*) npoin #endif do ipoin = 1,npoin @@ -1191,10 +1191,10 @@ program generate_mesh ! write the mesh elements #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Mesh_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Mesh_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') write(22) nspec #else - open(unit=22,file='DATA/Mesh_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Mesh_AK135F_NO_MUD',form='formatted',status='unknown',action='write') write(22,*) nspec #endif do ispec = 1,nspec @@ -1208,9 +1208,9 @@ program generate_mesh ! write the material properties #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Material_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Material_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') #else - open(unit=22,file='DATA/Material_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Material_AK135F_NO_MUD',form='formatted',status='unknown',action='write') #endif do ispec = 1,nspec #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE @@ -1223,20 +1223,20 @@ program generate_mesh ! write empty file for the absorbing boundary #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Surf_abs_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Surf_abs_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') write(22) 0 #else - open(unit=22,file='DATA/Surf_abs_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Surf_abs_AK135F_NO_MUD',form='formatted',status='unknown',action='write') write(22,*) 0 #endif close(22) ! write empty file for the acoustic free surface boundary (since there is no acoustic free surface in the 1D Earth without oceans) #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Surf_free_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Surf_free_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') write(22) 0 #else - open(unit=22,file='DATA/Surf_free_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Surf_free_AK135F_NO_MUD',form='formatted',status='unknown',action='write') write(22,*) 0 #endif close(22) @@ -1271,10 +1271,10 @@ program generate_mesh ! then save them to a file and also save the (only) edge that is in contact #ifdef USE_BINARY_FOR_EXTERNAL_MESH_DATABASE - open(unit=22,file='DATA/Symmetry_axis_elements_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') + open(unit=22,file='MESH/Symmetry_axis_elements_AK135F_NO_MUD',form='unformatted',status='unknown',action='write') write(22) ispec_count #else - open(unit=22,file='DATA/Symmetry_axis_elements_AK135F_NO_MUD',form='formatted',status='unknown',action='write') + open(unit=22,file='MESH/Symmetry_axis_elements_AK135F_NO_MUD',form='formatted',status='unknown',action='write') write(22,*) ispec_count #endif diff --git a/EXAMPLES/global_Earth_ak135f/make_specific_mesher_for_2D_Earth.sh b/EXAMPLES/global_Earth_ak135f/make_specific_mesher_for_2D_Earth.sh index 62d586cf6..eb689593c 100755 --- a/EXAMPLES/global_Earth_ak135f/make_specific_mesher_for_2D_Earth.sh +++ b/EXAMPLES/global_Earth_ak135f/make_specific_mesher_for_2D_Earth.sh @@ -17,6 +17,8 @@ rm -f bin/xcreate_mesh_files # compile $f90 $flags -o bin/xcreate_mesh_files create_mesh_AK135F_2D_with_central_cube_no_PML.F90 +mkdir -p MESH/ + ./bin/xcreate_mesh_files # checks exit code if [[ $? -ne 0 ]]; then exit 1; fi diff --git a/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file b/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file index 5e5e86f6c..80fe12ff6 100644 --- a/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file +++ b/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file @@ -262,6 +262,7 @@ read_external_mesh = .false. mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/infinite_homogeneous_plane_wave/DATA/Par_file b/EXAMPLES/infinite_homogeneous_plane_wave/DATA/Par_file index 2f6c95fd0..d896753c8 100644 --- a/EXAMPLES/infinite_homogeneous_plane_wave/DATA/Par_file +++ b/EXAMPLES/infinite_homogeneous_plane_wave/DATA/Par_file @@ -265,15 +265,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/initial_mode_LDDRK/DATA/Par_file b/EXAMPLES/initial_mode_LDDRK/DATA/Par_file index 16eec6d90..c85aa12f5 100644 --- a/EXAMPLES/initial_mode_LDDRK/DATA/Par_file +++ b/EXAMPLES/initial_mode_LDDRK/DATA/Par_file @@ -260,15 +260,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file b/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file index c52307f7f..19e93e298 100644 --- a/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file +++ b/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file @@ -262,6 +262,7 @@ read_external_mesh = .false. mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface diff --git a/EXAMPLES/moving_sources_acoustic/DATA/Par_file b/EXAMPLES/moving_sources_acoustic/DATA/Par_file index fb9057bdb..48bccee17 100644 --- a/EXAMPLES/moving_sources_acoustic/DATA/Par_file +++ b/EXAMPLES/moving_sources_acoustic/DATA/Par_file @@ -262,6 +262,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/noise_uniform/DATA/Par_file b/EXAMPLES/noise_uniform/DATA/Par_file index dd0cd2ebd..10d141cc9 100644 --- a/EXAMPLES/noise_uniform/DATA/Par_file +++ b/EXAMPLES/noise_uniform/DATA/Par_file @@ -280,6 +280,7 @@ read_external_mesh = .false. mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/noise_uniform/REF_SEIS/Par_file b/EXAMPLES/noise_uniform/REF_SEIS/Par_file index dd0cd2ebd..1848484f2 100644 --- a/EXAMPLES/noise_uniform/REF_SEIS/Par_file +++ b/EXAMPLES/noise_uniform/REF_SEIS/Par_file @@ -277,15 +277,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/paper_axisymmetry_example/Par_file b/EXAMPLES/paper_axisymmetry_example/DATA/Par_file similarity index 95% rename from EXAMPLES/paper_axisymmetry_example/Par_file rename to EXAMPLES/paper_axisymmetry_example/DATA/Par_file index 2cf8d0767..011c6c234 100644 --- a/EXAMPLES/paper_axisymmetry_example/Par_file +++ b/EXAMPLES/paper_axisymmetry_example/DATA/Par_file @@ -17,7 +17,7 @@ NOISE_TOMOGRAPHY = 0 SAVE_FORWARD = .false. # parameters concerning partitioning -NPROC = 16 # number of processes +NPROC = 8 # number of processes # time step parameters # total number of time steps @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = MESH_SMALL/mesh_file # file containing the mesh -nodes_coords_file = MESH_SMALL/nodes_coords_file # file containing the nodes coordinates -materials_file = MESH_SMALL/materials_file # file containing the material number for each element -free_surface_file = MESH_SMALL/free_surface_file # file containing the free surface -axial_elements_file = MESH_SMALL/elements_axis # file containing the axial elements if AXISYM is true -absorbing_surface_file = MESH_SMALL/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA_PML/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = MESH_SMALL/elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = MESH_SMALL/mesh_file # file containing the mesh +nodes_coords_file = MESH_SMALL/nodes_coords_file # file containing the nodes coordinates +materials_file = MESH_SMALL/materials_file # file containing the material number for each element +nummaterial_velocity_file = MESH_SMALL/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = MESH_SMALL/free_surface_file # file containing the free surface +axial_elements_file = MESH_SMALL/elements_axis # file containing the axial elements if AXISYM is true +absorbing_surface_file = MESH_SMALL/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = MESH_SMALL/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = MESH_SMALL/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = MESH_SMALL/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/paper_axisymmetry_example/SOURCE b/EXAMPLES/paper_axisymmetry_example/DATA/SOURCE similarity index 100% rename from EXAMPLES/paper_axisymmetry_example/SOURCE rename to EXAMPLES/paper_axisymmetry_example/DATA/SOURCE diff --git a/EXAMPLES/paper_axisymmetry_example/MESH_SMALL/nummaterial_velocity_file b/EXAMPLES/paper_axisymmetry_example/MESH_SMALL/nummaterial_velocity_file new file mode 100644 index 000000000..eb91fbc8e --- /dev/null +++ b/EXAMPLES/paper_axisymmetry_example/MESH_SMALL/nummaterial_velocity_file @@ -0,0 +1,33 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 2400.d0 1200.0d0 136.43763536114344 136.43763536114344 0 +1 2 1000.d0 1500.d0 0.0d0 9999.0 9999.0 0 diff --git a/EXAMPLES/paper_axisymmetry_example/README b/EXAMPLES/paper_axisymmetry_example/README index 8a1d92434..3d0c3caed 100644 --- a/EXAMPLES/paper_axisymmetry_example/README +++ b/EXAMPLES/paper_axisymmetry_example/README @@ -53,6 +53,6 @@ To speed up the results the calculation are made at low resolution, you can obta If you change the number of receivers you will have to change the factor at the beginning of the script in make_comparison.sh It is just a multiplying factor that set the reference. -To clean this directory : rm -rf DATA/ OUTPUT_FILES/ x* *~ +To clean this directory : rm -rf OUTPUT_FILES/ x* *~ If you have any questions feel free to contact me : alexis dot bottero at gmail doT com diff --git a/EXAMPLES/paper_axisymmetry_example/TLcomsol.txt b/EXAMPLES/paper_axisymmetry_example/REF_COMSOL/TLcomsol.txt similarity index 100% rename from EXAMPLES/paper_axisymmetry_example/TLcomsol.txt rename to EXAMPLES/paper_axisymmetry_example/REF_COMSOL/TLcomsol.txt diff --git a/EXAMPLES/paper_axisymmetry_example/make_comparison.sh b/EXAMPLES/paper_axisymmetry_example/make_comparison.sh index 1c77453e5..25178f27a 100755 --- a/EXAMPLES/paper_axisymmetry_example/make_comparison.sh +++ b/EXAMPLES/paper_axisymmetry_example/make_comparison.sh @@ -15,7 +15,7 @@ factor=0.00000000000055 # TODO change that to obtain a good fit, it is just a mu #/home/bottero/bin/mpiexec -n 12 python ./computeTLmpi.py OUTPUT_FILES/ --freq 5.0 --NdownSampled 4 --outputPath OUTPUT_FILES/lossesGOOD --noplot # Convert kilometers to meters: -awk '{ print $1/1000," ",$2}' TLcomsol.txt > TLcomsolKM.txt +awk '{ print $1/1000," ",$2}' REF_COMSOL/TLcomsol.txt > REF_COMSOL/TLcomsolKM.txt # Scale amplitudes: ./processAmplitudes.py OUTPUT_FILES/lossesGOODampl --ref $factor --noplot @@ -24,4 +24,4 @@ awk '{ print $1/1000," ",$2}' TLcomsol.txt > TLcomsolKM.txt awk '{ print $1-0.03386," ",-$2}' rotvars_Jensen_2007_Figure7a.txt > rotvars_Jensen_2007_Figure7a2.txt # Plot comparison -../../utils/Visualization/plot.py rotvars_Jensen_2007_Figure7a2.txt TLcomsolKM.txt OUTPUT_FILES/lossesGOODamplLosses --hold -w 3 --fontsize 16 --xlabel "Range (km)" --ylabel "Transmission losses (dB)" --invert_yaxis -l 'ROTVARS','COMSOL','Spectral elements' -c 0,0,0.8+0,0.8,0+0.8,0,0 +../../utils/Visualization/plot.py rotvars_Jensen_2007_Figure7a2.txt REF_COMSOL/TLcomsolKM.txt OUTPUT_FILES/lossesGOODamplLosses --hold -w 3 --fontsize 16 --xlabel "Range (km)" --ylabel "Transmission losses (dB)" --invert_yaxis -l 'ROTVARS','COMSOL','Spectral elements' -c 0,0,0.8+0,0.8,0+0.8,0,0 diff --git a/EXAMPLES/paper_axisymmetry_example/make_mesh.sh b/EXAMPLES/paper_axisymmetry_example/make_mesh.sh index 6b56640cf..9a0dedcba 100755 --- a/EXAMPLES/paper_axisymmetry_example/make_mesh.sh +++ b/EXAMPLES/paper_axisymmetry_example/make_mesh.sh @@ -20,23 +20,25 @@ # mesh_file = MESH_SMALL/mesh_file # file containing the mesh # nodes_coords_file = MESH_SMALL/nodes_coords_file # file containing the nodes coordinates # materials_file = MESH_SMALL/materials_file # file containing the material number for each element +# nummaterial_velocity_file = MESH_SMALL/nummaterial_velocity_file # file containing the material properties for each material # free_surface_file = MESH_SMALL/free_surface_file # file containing the free surface # axial_elements_file = MESH_SMALL/elements_axis # file containing the axial elements if AXISYM is true # absorbing_surface_file = MESH_SMALL/absorbing_surface_file # file containing the absorbing surface -# acoustic_forcing_surface_file = ./DATA_PML/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +# acoustic_forcing_surface_file = MESH_SMALL/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface # CPML_element_file = MESH_SMALL/elements_cpml_list # file containing the CPML element numbers -# tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +# tangential_detection_curve_file = MESH_SMALL/courbe_eros_nodes # file containing the curve delimiting the velocity model # # Has to be changed to: # mesh_file = MESH/mesh_file # file containing the mesh # nodes_coords_file = MESH/nodes_coords_file # file containing the nodes coordinates # materials_file = MESH/materials_file # file containing the material number for each element +# nummaterial_velocity_file = MESH/nummaterial_velocity_file # file containing the material properties for each material # free_surface_file = MESH/free_surface_file # file containing the free surface # axial_elements_file = MESH/elements_axis # file containing the axial elements if AXISYM is true # absorbing_surface_file = MESH/absorbing_surface_file # file containing the absorbing surface -# acoustic_forcing_surface_file = ./DATA_PML/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +# acoustic_forcing_surface_file = MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface # CPML_element_file = MESH/elements_cpml_list # file containing the CPML element numbers -# tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +# tangential_detection_curve_file = MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model # PATH_TO_CUBIT=/opt/Trelis-15.0/bin/trelis # TODO update that line: path to cubit executable @@ -57,7 +59,7 @@ echo "Making mesh ..." $PATH_TO_CUBIT -nographics -batch ./JensenMesh.py # >> /dev/null 2>&1 -echo "Done! Mesh files has been written in directory MESH" +echo "Done! Mesh files has been written in directory MESH/" rm -rf history* free_surface_file materials_file mesh_file nodes_coords_file elements_cpml_list absorbing_surface_file diff --git a/EXAMPLES/paper_axisymmetry_example/run_this_example.sh b/EXAMPLES/paper_axisymmetry_example/run_this_example.sh index 25ba14dff..06ded9b10 100755 --- a/EXAMPLES/paper_axisymmetry_example/run_this_example.sh +++ b/EXAMPLES/paper_axisymmetry_example/run_this_example.sh @@ -14,16 +14,10 @@ echo " Setting up the simulation..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # Clean output files -rm -rf OUTPUT_FILES/* DATA/* +rm -rf OUTPUT_FILES/* -# Sets up local DATA/ directory -cd DATA/ -ln -s ../Par_file Par_file -ln -s ../SOURCE SOURCE -cd ../ # Compiles executables in root directory cd ../../ @@ -49,18 +43,32 @@ cp DATA/SOURCE OUTPUT_FILES/ # Get the number of processors NPROC=`grep NPROC DATA/Par_file | cut -d = -f 2 | cut -d \# -f 1 | tr -d ' '` -# Run database generation -echo -echo " Running mesher..." -echo -./bin/xmeshfem2D +# runs database generation +if [ "$NPROC" -eq 1 ]; then + # This is a serial simulation + echo + echo "running mesher..." + echo + ./bin/xmeshfem2D +else + # This is a MPI simulation + echo + echo "running mesher on $NPROC processors..." + echo + mpirun -np $NPROC ./bin/xmeshfem2D +fi +# checks exit code +if [[ $? -ne 0 ]]; then exit 1; fi -if [ "$NPROC" -eq 1 ]; then # This is a serial simulation +# runs simulation +if [ "$NPROC" -eq 1 ]; then + # This is a serial simulation echo echo " Running solver..." echo ./bin/xspecfem2D -else # This is a MPI simulation +else + # This is a MPI simulation echo echo " Running solver on $NPROC processors..." echo diff --git a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/Pekeris_waveguide/DATA/Par_file b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/Pekeris_waveguide/DATA/Par_file index b1346dc4e..2845cb75b 100644 --- a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/Pekeris_waveguide/DATA/Par_file +++ b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/Pekeris_waveguide/DATA/Par_file @@ -263,6 +263,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_free_bottom_surface/DATA/Par_file b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_free_bottom_surface/DATA/Par_file index d7ca4dcb3..a6e5f4e88 100644 --- a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_free_bottom_surface/DATA/Par_file +++ b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_free_bottom_surface/DATA/Par_file @@ -262,6 +262,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_rigid_bottom_surface/DATA/Par_file b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_rigid_bottom_surface/DATA/Par_file index a55c55390..9eec14083 100644 --- a/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_rigid_bottom_surface/DATA/Par_file +++ b/EXAMPLES/perfect_idealized_oceanic_guide_in_underwater_acoustics/with_rigid_bottom_surface/DATA/Par_file @@ -271,6 +271,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/poroelastic_acoustic/DATA/Par_file b/EXAMPLES/poroelastic_acoustic/DATA/Par_file index 8ce7c8cc6..becc79f66 100644 --- a/EXAMPLES/poroelastic_acoustic/DATA/Par_file +++ b/EXAMPLES/poroelastic_acoustic/DATA/Par_file @@ -284,6 +284,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/poroelastic_semi_infinite_homogeneous/DATA/Par_file b/EXAMPLES/poroelastic_semi_infinite_homogeneous/DATA/Par_file index 1e9b6e584..124bc60d9 100644 --- a/EXAMPLES/poroelastic_semi_infinite_homogeneous/DATA/Par_file +++ b/EXAMPLES/poroelastic_semi_infinite_homogeneous/DATA/Par_file @@ -271,6 +271,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/process_DATA_Par_files_to_update_their_parameters_from_a_main_file.py b/EXAMPLES/process_DATA_Par_files_to_update_their_parameters_from_a_main_file.py index 1e6678e18..3d9eb8d1e 100755 --- a/EXAMPLES/process_DATA_Par_files_to_update_their_parameters_from_a_main_file.py +++ b/EXAMPLES/process_DATA_Par_files_to_update_their_parameters_from_a_main_file.py @@ -383,7 +383,8 @@ def write_template_file(parameters,tmp_file,verbose=False): f.write( "%s\n" % comment ) # for slightly different output format - external_model_parameter = ['mesh_file','nodes_coords_file','materials_file','free_surface_file', \ + external_model_parameter = ['mesh_file','nodes_coords_file','materials_file', \ + 'nummaterial_velocity_file','free_surface_file', \ 'axial_elements_file','absorbing_surface_file','acoustic_forcing_surface_file', \ 'absorbing_cpml_file','tangential_detection_curve_file'] @@ -393,8 +394,8 @@ def write_template_file(parameters,tmp_file,verbose=False): if appendix: # special section with appendix comment moved further to the right if name in external_model_parameter: - if len(value) <= 25: - f.write( "%s = %s %s\n" % (name.ljust(max_name_length),value.ljust(25),appendix) ) + if len(value) <= 39: + f.write( "%s = %s %s\n" % (name.ljust(max_name_length),value.ljust(39),appendix) ) else: f.write( "%s = %s %s\n" % (name.ljust(max_name_length),value,appendix) ) else: diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/Par_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/Par_file index 6b8c5f26c..d7eb07f1c 100644 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/Par_file +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/Par_file @@ -259,15 +259,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/modelY1_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/modelY1_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/modelY1_materials_file # file containing the material number for each element -free_surface_file = ./DATA/modelY1_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/modelY1_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/modelY1_elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/modelY1_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/modelY1_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/modelY1_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/modelY1_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/modelY1_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/modelY1_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/modelY1_elements_CPML_list # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_PML_inner_edge_for_plane_wave_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_PML_inner_edge_for_plane_wave_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_PML_inner_edge_for_plane_wave_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_PML_inner_edge_for_plane_wave_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_absorbing_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_absorbing_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_absorbing_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_elements_CPML_list b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_elements_CPML_list similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_elements_CPML_list rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_elements_CPML_list diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_free_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_free_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_free_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_materials_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_materials_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_materials_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_materials_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_mesh_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_mesh_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_mesh_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_mesh_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_nodes_coords_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/DATA/modelY1_nodes_coords_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nodes_coords_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nummaterial_velocity_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nummaterial_velocity_file new file mode 100644 index 000000000..196429873 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/MESH/modelY1_nummaterial_velocity_file @@ -0,0 +1,32 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 3500.d0 2000.d0 9999 9999 0 diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/run_this_example.sh b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/run_this_example.sh index 13bf5ddd7..461840030 100755 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/run_this_example.sh +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_homogeneous/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/Par_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/Par_file index 3313ad1d0..7f378de15 100644 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/Par_file +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/Par_file @@ -266,15 +266,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/modelY1_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/modelY1_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/modelY1_materials_file # file containing the material number for each element -free_surface_file = ./DATA/modelY1_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/modelY1_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/modelY1_elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/modelY1_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/modelY1_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/modelY1_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/modelY1_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/modelY1_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/modelY1_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/modelY1_elements_CPML_list # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_PML_inner_edge_for_plane_wave_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_PML_inner_edge_for_plane_wave_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_PML_inner_edge_for_plane_wave_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_PML_inner_edge_for_plane_wave_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_absorbing_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_absorbing_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_absorbing_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_elements_CPML_list b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_elements_CPML_list similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_elements_CPML_list rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_elements_CPML_list diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_free_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_free_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_free_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_ACIS_ascii_format.sat b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_ACIS_ascii_format.sat similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_ACIS_ascii_format.sat rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_ACIS_ascii_format.sat diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_IGES_ascii_format.iges b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_IGES_ascii_format.iges similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_IGES_ascii_format.iges rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_IGES_ascii_format.iges diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_STL_ascii_format.txt b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_STL_ascii_format.txt similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_geometry_STL_ascii_format.txt rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_geometry_STL_ascii_format.txt diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_materials_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_materials_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_materials_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_materials_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_mesh_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_mesh_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_mesh_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_mesh_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_nodes_coords_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/DATA/modelY1_nodes_coords_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nodes_coords_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file new file mode 100644 index 000000000..d455b07f2 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file @@ -0,0 +1,39 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 4000.d0 2300.d0 9999 9999 0 +2 2 1800.d0 3000.d0 1500.d0 9999 9999 0 +2 3 2000.d0 3500.d0 2000.d0 9999 9999 0 +2 4 1800.d0 2700.d0 1300.d0 9999 9999 0 +1 5 1000.d0 1500.d0 0.d0 9999 9999 0 +2 6 1800.d0 2500.d0 1000.d0 9999 9999 0 +2 7 1600.d0 2200.d0 800.d0 9999 9999 0 +2 8 1600.d0 5000.d0 3000.d0 9999 9999 0 diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/run_this_example.sh b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/run_this_example.sh index 13bf5ddd7..461840030 100755 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/run_this_example.sh +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_fluid_solid/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/Par_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/Par_file index bd98c7d35..0cdc97f8a 100644 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/Par_file +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/Par_file @@ -265,15 +265,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/modelY1_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/modelY1_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/modelY1_materials_file # file containing the material number for each element -free_surface_file = ./DATA/modelY1_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/modelY1_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/modelY1_elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/modelY1_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/modelY1_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/modelY1_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/modelY1_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/modelY1_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/modelY1_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/modelY1_elements_CPML_list # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_PML_inner_edge_for_plane_wave_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_PML_inner_edge_for_plane_wave_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_PML_inner_edge_for_plane_wave_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_PML_inner_edge_for_plane_wave_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_absorbing_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_absorbing_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_absorbing_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_elements_CPML_list b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_elements_CPML_list similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_elements_CPML_list rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_elements_CPML_list diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_free_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_free_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_free_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_materials_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_materials_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_materials_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_materials_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_mesh_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_mesh_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_mesh_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_mesh_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_nodes_coords_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/DATA/modelY1_nodes_coords_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nodes_coords_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nummaterial_velocity_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nummaterial_velocity_file new file mode 100644 index 000000000..1c9ceb515 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/MESH/modelY1_nummaterial_velocity_file @@ -0,0 +1,38 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 4000.d0 2300.d0 9999 9999 0 +2 2 1800.d0 3000.d0 1500.d0 9999 9999 0 +2 3 2000.d0 3500.d0 2000.d0 9999 9999 0 +2 4 1800.d0 2700.d0 1300.d0 9999 9999 0 +2 5 1600.d0 5000.d0 3000.d0 9999 9999 0 +2 6 1800.d0 2500.d0 1000.d0 9999 9999 0 +2 7 1600.d0 2200.d0 800.d0 9999 9999 0 diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/run_this_example.sh b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/run_this_example.sh index 13bf5ddd7..461840030 100755 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/run_this_example.sh +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/CPML_normal_solid_only/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/README b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/README new file mode 100644 index 000000000..adafc1ac9 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/README @@ -0,0 +1,9 @@ +----------------------------------------- +README +----------------------------------------- + +This folder provides different examples using an external mesh. The mesh was created by Cubit/Trelis with an included salt dome. +The examples show how to setup and use such an external mesh with and without PML elements. + + +(originally added by Dimitri Komatitsch, Nov. 2012) diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/Par_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/Par_file index 36f350183..8e4bbcff3 100644 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/Par_file +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/Par_file @@ -259,15 +259,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/modelY1_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/modelY1_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/modelY1_materials_file # file containing the material number for each element -free_surface_file = ./DATA/modelY1_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/modelY1_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/modelY1_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/modelY1_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/modelY1_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/modelY1_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/modelY1_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/modelY1_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_absorbing_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_absorbing_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_absorbing_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_free_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_free_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_free_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_materials_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_materials_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_materials_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_materials_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_mesh_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_mesh_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_mesh_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_mesh_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_nodes_coords_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/DATA/modelY1_nodes_coords_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nodes_coords_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nummaterial_velocity_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nummaterial_velocity_file new file mode 100644 index 000000000..196429873 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/MESH/modelY1_nummaterial_velocity_file @@ -0,0 +1,32 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 3500.d0 2000.d0 9999 9999 0 diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/run_this_example.sh b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/run_this_example.sh index 13bf5ddd7..461840030 100755 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/run_this_example.sh +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_homogeneous/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/Par_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/Par_file index fd334a922..bac36cd8b 100644 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/Par_file +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/Par_file @@ -266,15 +266,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/modelY1_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/modelY1_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/modelY1_materials_file # file containing the material number for each element -free_surface_file = ./DATA/modelY1_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/modelY1_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/modelY1_mesh_file # file containing the mesh +nodes_coords_file = ./MESH/modelY1_nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/modelY1_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/modelY1_nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/modelY1_free_surface_file # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/modelY1_absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_absorbing_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_absorbing_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_absorbing_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_free_surface_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_free_surface_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_free_surface_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_materials_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_materials_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_materials_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_materials_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_mesh_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_mesh_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_mesh_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_mesh_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_nodes_coords_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/DATA/modelY1_nodes_coords_file rename to EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nodes_coords_file diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file new file mode 100644 index 000000000..d455b07f2 --- /dev/null +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/MESH/modelY1_nummaterial_velocity_file @@ -0,0 +1,39 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 2000.d0 4000.d0 2300.d0 9999 9999 0 +2 2 1800.d0 3000.d0 1500.d0 9999 9999 0 +2 3 2000.d0 3500.d0 2000.d0 9999 9999 0 +2 4 1800.d0 2700.d0 1300.d0 9999 9999 0 +1 5 1000.d0 1500.d0 0.d0 9999 9999 0 +2 6 1800.d0 2500.d0 1000.d0 9999 9999 0 +2 7 1600.d0 2200.d0 800.d0 9999 9999 0 +2 8 1600.d0 5000.d0 3000.d0 9999 9999 0 diff --git a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/run_this_example.sh b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/run_this_example.sh index 13bf5ddd7..461840030 100755 --- a/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/run_this_example.sh +++ b/EXAMPLES/salt_dome_CUBIT_mesh_from_Ronan_Madec/Stacey_normal_fluid_solid/run_this_example.sh @@ -17,7 +17,6 @@ echo " setting up example..." echo mkdir -p OUTPUT_FILES -mkdir -p DATA # cleans output files rm -rf OUTPUT_FILES/* diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file index 153d3b105..3149f43df 100644 --- a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh_file # file containing the mesh -nodes_coords_file = ./nodes_coords_file # file containing the nodes coordinates -materials_file = ./materials_file # file containing the material number for each element -free_surface_file = ./free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_adj b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_adj index 592e31074..015bec084 100644 --- a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_adj +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_adj @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh_file # file containing the mesh -nodes_coords_file = ./nodes_coords_file # file containing the nodes coordinates -materials_file = ./materials_file # file containing the material number for each element -free_surface_file = ./free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_fwd b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_fwd index 19e01e626..383fadc97 100644 --- a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_fwd +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_fwd @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh_file # file containing the mesh -nodes_coords_file = ./nodes_coords_file # file containing the nodes coordinates -materials_file = ./materials_file # file containing the material number for each element -free_surface_file = ./free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_kernel b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_kernel index 213b2faf0..a69a74cae 100644 --- a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_kernel +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_kernel @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh_file # file containing the mesh -nodes_coords_file = ./nodes_coords_file # file containing the nodes coordinates -materials_file = ./materials_file # file containing the material number for each element -free_surface_file = ./free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_save_forward b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_save_forward index 4bce5db76..15be27998 100644 --- a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_save_forward +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/DATA/Par_file_save_forward @@ -269,15 +269,16 @@ read_external_mesh = .true. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./mesh_file # file containing the mesh -nodes_coords_file = ./nodes_coords_file # file containing the nodes coordinates -materials_file = ./materials_file # file containing the material number for each element -free_surface_file = ./free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./elements_cpml_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = ./MESH/mesh_file # file containing the mesh +nodes_coords_file = ./MESH/nodes_coords_file # file containing the nodes coordinates +materials_file = ./MESH/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +free_surface_file = ./MESH/free_surface_file # file containing the free surface +axial_elements_file = ./MESH/axial_elements_file # file containing the axial elements if AXISYM is true +absorbing_surface_file = ./MESH/absorbing_surface_file # file containing the absorbing surface +acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface +absorbing_cpml_file = ./MESH/elements_cpml_list # file containing the CPML element numbers +tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/absorbing_surface_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/absorbing_surface_file similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/absorbing_surface_file rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/absorbing_surface_file diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/elements_cpml_list b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/elements_cpml_list similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/elements_cpml_list rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/elements_cpml_list diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/free_surface_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/free_surface_file similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/free_surface_file rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/free_surface_file diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/materials_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/materials_file similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/materials_file rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/materials_file diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/mesh_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/mesh_file similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/mesh_file rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/mesh_file diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/nodes_coords_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nodes_coords_file similarity index 100% rename from EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/nodes_coords_file rename to EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nodes_coords_file diff --git a/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nummaterial_velocity_file b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nummaterial_velocity_file new file mode 100644 index 000000000..5b734c5b0 --- /dev/null +++ b/EXAMPLES/salt_dome_Vadim/specfem2d_run_input_files_and_scripts/MESH/nummaterial_velocity_file @@ -0,0 +1,33 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +1 1 1000.d0 1500.d0 0.0d0 9999.d0 9999.d0 0 +2 -1 2000.d0 2000.d0 1176.0d0 9999.d0 9999.d0 0 diff --git a/EXAMPLES/semi_infinite_homogeneous/DATA/Par_file b/EXAMPLES/semi_infinite_homogeneous/DATA/Par_file index 5d2ff87c9..3aab6c4b9 100644 --- a/EXAMPLES/semi_infinite_homogeneous/DATA/Par_file +++ b/EXAMPLES/semi_infinite_homogeneous/DATA/Par_file @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/DATA/Par_file b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/DATA/Par_file index deb79853e..6e3d857c4 100644 --- a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/DATA/Par_file +++ b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/DATA/Par_file @@ -279,15 +279,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file index 8288ce7a6..1b731630a 100644 --- a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file +++ b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file @@ -282,6 +282,7 @@ read_external_mesh = .false. mesh_file = ./DATA/mesh_file # file containing the mesh nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_SEIS/Par_file b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_SEIS/Par_file index deb79853e..6e3d857c4 100644 --- a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_SEIS/Par_file +++ b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_SEIS/Par_file @@ -279,15 +279,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/thermocline/DATA/Par_file b/EXAMPLES/thermocline/DATA/Par_file index 1210a821b..cedf88d4a 100644 --- a/EXAMPLES/thermocline/DATA/Par_file +++ b/EXAMPLES/thermocline/DATA/Par_file @@ -271,6 +271,7 @@ read_external_mesh = .false. mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface diff --git a/EXAMPLES/tomographic_ocean_model/DATA/Par_file b/EXAMPLES/tomographic_ocean_model/DATA/Par_file index d1d62a44f..078d9c5ad 100644 --- a/EXAMPLES/tomographic_ocean_model/DATA/Par_file +++ b/EXAMPLES/tomographic_ocean_model/DATA/Par_file @@ -281,6 +281,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file b/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file index d1d62a44f..078d9c5ad 100644 --- a/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file +++ b/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file @@ -281,6 +281,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/Par_file_fluid_solid b/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/Par_file_fluid_solid index 1293e9d0a..8a3ae4f02 100644 --- a/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/Par_file_fluid_solid +++ b/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/Par_file_fluid_solid @@ -275,15 +275,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/the_same_bug_appears_from_the_right_PML/Par_file_fluid_solid b/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/the_same_bug_appears_from_the_right_PML/Par_file_fluid_solid index 1293e9d0a..8a3ae4f02 100644 --- a/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/the_same_bug_appears_from_the_right_PML/Par_file_fluid_solid +++ b/EXAMPLES/unresolved_bugs/bugPMLs_1_extra_phase_coming_back_from_the_left_PML/the_same_bug_appears_from_the_right_PML/Par_file_fluid_solid @@ -275,15 +275,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/unresolved_bugs/bugPMLs_2_weak_instability_in_long_times/DATA/Par_file b/EXAMPLES/unresolved_bugs/bugPMLs_2_weak_instability_in_long_times/DATA/Par_file index ffbd1a324..e4ecb6698 100644 --- a/EXAMPLES/unresolved_bugs/bugPMLs_2_weak_instability_in_long_times/DATA/Par_file +++ b/EXAMPLES/unresolved_bugs/bugPMLs_2_weak_instability_in_long_times/DATA/Par_file @@ -270,15 +270,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/utils/CPML/Par_file_to_use_with_this_timing_routine_HOWTO b/utils/CPML/Par_file_to_use_with_this_timing_routine_HOWTO index 9f3e5b863..57ae1bfcc 100644 --- a/utils/CPML/Par_file_to_use_with_this_timing_routine_HOWTO +++ b/utils/CPML/Par_file_to_use_with_this_timing_routine_HOWTO @@ -268,15 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = Elements_CPML_list # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # From 32ad037a9411356816c89ef8c5e6329b6bc4192d Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 8 Feb 2024 21:12:50 +0100 Subject: [PATCH 12/13] updates example Par_files --- .../anisotropic_isotropic_model/DATA/Par_file | 2 +- .../Par_file_homogeneous_with_attenuation | 2 +- EXAMPLES/global_Earth_ak135f/DATA/Par_file | 8 ++--- .../MESH/Nummaterial_velocity_file_NO_MUD | 35 +++++++++++++++++++ .../DATA/Par_file | 20 +++++------ .../DATA/Par_file | 20 +++++------ EXAMPLES/noise_uniform/DATA/Par_file | 20 +++++------ .../REF_KERNEL/Par_file | 20 +++++------ EXAMPLES/thermocline/DATA/Par_file | 20 +++++------ .../tomographic_ocean_model/DATA/Par_file | 2 +- .../tomographic_ocean_model/REF_SEIS/Par_file | 2 +- .../run_this_example.sh | 2 +- 12 files changed, 94 insertions(+), 59 deletions(-) create mode 100644 EXAMPLES/global_Earth_ak135f/MESH/Nummaterial_velocity_file_NO_MUD diff --git a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file index 672b368ad..c6f51027c 100644 --- a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file +++ b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file @@ -273,7 +273,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation index 2e5634d26..39c74f39f 100644 --- a/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation +++ b/EXAMPLES/anisotropic_isotropic_model/DATA/Par_file_homogeneous_with_attenuation @@ -278,7 +278,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/global_Earth_ak135f/DATA/Par_file b/EXAMPLES/global_Earth_ak135f/DATA/Par_file index c460e8561..3c3fca3c5 100644 --- a/EXAMPLES/global_Earth_ak135f/DATA/Par_file +++ b/EXAMPLES/global_Earth_ak135f/DATA/Par_file @@ -274,13 +274,13 @@ read_external_mesh = .true. mesh_file = ./MESH/Mesh_AK135F_NO_MUD # file containing the mesh nodes_coords_file = ./MESH/Nodes_AK135F_NO_MUD # file containing the nodes coordinates materials_file = ./MESH/Material_AK135F_NO_MUD # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +nummaterial_velocity_file = ./MESH/Nummaterial_velocity_file_NO_MUD # file containing the material properties for each material free_surface_file = ./MESH/Surf_free_AK135F_NO_MUD # file containing the free surface axial_elements_file = ./MESH/Symmetry_axis_elements_AK135F_NO_MUD # file containing the axial elements if AXISYM is true absorbing_surface_file = ./MESH/Surf_abs_AK135F_NO_MUD # file containing the absorbing surface -acoustic_forcing_surface_file = ./MESH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./MESH/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./MESH/courbe_eros_nodes # file containing the curve delimiting the velocity model +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/global_Earth_ak135f/MESH/Nummaterial_velocity_file_NO_MUD b/EXAMPLES/global_Earth_ak135f/MESH/Nummaterial_velocity_file_NO_MUD new file mode 100644 index 000000000..c514f000a --- /dev/null +++ b/EXAMPLES/global_Earth_ak135f/MESH/Nummaterial_velocity_file_NO_MUD @@ -0,0 +1,35 @@ +# nummaterial_velocity_file +# format: +#(1)domain_id #(2)material_id #(3)rho #(4)vp #(5)vs #(6)Q_k #(7)Q_mu #(8)ani +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : POSITIVE integer identifier of material block +# rho : density +# vp : P-velocity +# vs : S-velocity +# Q_k : 9999 = no Q_kappa attenuation +# Q_mu : 9999 = no Q_mu attenuation +# ani : 0=no anisotropy/ 1,2,.. check with aniso_model.f90 +# +# example: +# 2 1 2300 2800 1500 9999.0 9999.0 0 +# +# or +# +#(1)domain_id #(2)material_id tomography elastic #(3)filename #(4)positive +# +# where +# domain_id : 1=acoustic / 2=elastic / 3=poroelastic +# material_id : NEGATIVE integer identifier of material block +# filename : filename of the tomography file +# positive : a positive unique identifier +# +# example: +# 2 -1 tomography elastic tomo.xyz 1 +# +# materials +2 1 3320.d0 8040.d0 4480.0d0 9999.d0 9999.d0 0 +2 2 4985.d0 12503.d0 6805.0d0 9999.d0 9999.d0 0 +1 3 11539.d0 9751.d0 0.0d0 9999.d0 9999.d0 0 +2 4 13004.d0 11256.d0 3663.0d0 9999.d0 9999.d0 0 diff --git a/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file b/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file index 80fe12ff6..b6ca026ba 100644 --- a/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file +++ b/EXAMPLES/infinite_homogeneous_moment_tensor_vertical_dip_slip/DATA/Par_file @@ -259,16 +259,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file b/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file index 19e93e298..be23eacc3 100644 --- a/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file +++ b/EXAMPLES/initial_plane_wave_with_free_surface/DATA/Par_file @@ -259,16 +259,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_elements # file containing the mesh -nodes_coords_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_nodes # file containing the nodes coordinates -materials_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_material # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material -free_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_free # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/ice_water_rock_1D/ice_water_rock_1D_surface_absorb # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/noise_uniform/DATA/Par_file b/EXAMPLES/noise_uniform/DATA/Par_file index 10d141cc9..1848484f2 100644 --- a/EXAMPLES/noise_uniform/DATA/Par_file +++ b/EXAMPLES/noise_uniform/DATA/Par_file @@ -277,16 +277,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file index 1b731630a..a063dd93f 100644 --- a/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file +++ b/EXAMPLES/simple_topography_and_also_a_simple_fluid_layer/REF_KERNEL/Par_file @@ -279,16 +279,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/mesh_file # file containing the mesh -nodes_coords_file = ./DATA/nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/materials_file # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material -free_surface_file = ./DATA/free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/thermocline/DATA/Par_file b/EXAMPLES/thermocline/DATA/Par_file index cedf88d4a..6673a67b4 100644 --- a/EXAMPLES/thermocline/DATA/Par_file +++ b/EXAMPLES/thermocline/DATA/Par_file @@ -268,16 +268,16 @@ read_external_mesh = .false. # data concerning mesh, when generated using third-party app (more info in README) # (see also absorbing_conditions above) -mesh_file = ./DATA/Mesh_canyon/canyon_mesh_file # file containing the mesh -nodes_coords_file = ./DATA/Mesh_canyon/canyon_nodes_coords_file # file containing the nodes coordinates -materials_file = ./DATA/Mesh_canyon/canyon_materials_file # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material -free_surface_file = ./DATA/Mesh_canyon/canyon_free_surface_file # file containing the free surface -axial_elements_file = ./DATA/axial_elements_file # file containing the axial elements if AXISYM is true -absorbing_surface_file = ./DATA/Mesh_canyon/canyon_absorbing_surface_file # file containing the absorbing surface -acoustic_forcing_surface_file = ./DATA/MSH/Surf_acforcing_Bottom_enforcing_mesh # file containing the acoustic forcing surface -absorbing_cpml_file = ./DATA/absorbing_cpml_file # file containing the CPML element numbers -tangential_detection_curve_file = ./DATA/courbe_eros_nodes # file containing the curve delimiting the velocity model +mesh_file = dummy # file containing the mesh +nodes_coords_file = dummy # file containing the nodes coordinates +materials_file = dummy # file containing the material number for each element +nummaterial_velocity_file = dummy # file containing the material properties for each material +free_surface_file = dummy # file containing the free surface +axial_elements_file = dummy # file containing the axial elements if AXISYM is true +absorbing_surface_file = dummy # file containing the absorbing surface +acoustic_forcing_surface_file = dummy # file containing the acoustic forcing surface +absorbing_cpml_file = dummy # file containing the CPML element numbers +tangential_detection_curve_file = dummy # file containing the curve delimiting the velocity model #----------------------------------------------------------- # diff --git a/EXAMPLES/tomographic_ocean_model/DATA/Par_file b/EXAMPLES/tomographic_ocean_model/DATA/Par_file index 078d9c5ad..eaf1e842a 100644 --- a/EXAMPLES/tomographic_ocean_model/DATA/Par_file +++ b/EXAMPLES/tomographic_ocean_model/DATA/Par_file @@ -281,7 +281,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file b/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file index 078d9c5ad..eaf1e842a 100644 --- a/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file +++ b/EXAMPLES/tomographic_ocean_model/REF_SEIS/Par_file @@ -281,7 +281,7 @@ read_external_mesh = .false. mesh_file = dummy # file containing the mesh nodes_coords_file = dummy # file containing the nodes coordinates materials_file = dummy # file containing the material number for each element -nummaterial_velocity_file = ./MESH/nummaterial_velocity_file # file containing the material properties for each material +nummaterial_velocity_file = dummy # file containing the material properties for each material free_surface_file = dummy # file containing the free surface axial_elements_file = dummy # file containing the axial elements if AXISYM is true absorbing_surface_file = dummy # file containing the absorbing surface diff --git a/EXAMPLES/tomographic_ocean_model/run_this_example.sh b/EXAMPLES/tomographic_ocean_model/run_this_example.sh index 3ae1b6361..b26bef3f1 100755 --- a/EXAMPLES/tomographic_ocean_model/run_this_example.sh +++ b/EXAMPLES/tomographic_ocean_model/run_this_example.sh @@ -27,7 +27,7 @@ cd ../ # scripts if [ ! -e createTomographyFile.py ]; then - ln -s ../../utils/createTomographyFile.py + ln -s ../../utils/scripts/createTomographyFile.py fi if [ ! -e plot_model_from_gll_or_binary_file.py ]; then ln -s ../../utils/Visualization/plot_model_from_gll_or_binary_file.py From e65b987027e5ce19bc8fa54cbb8ecc8b22259607 Mon Sep 17 00:00:00 2001 From: Daniel Peter Date: Thu, 8 Feb 2024 21:23:47 +0100 Subject: [PATCH 13/13] updates citation line --- CITATION.cff | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index b8dfd6c3b..588be3318 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -95,8 +95,7 @@ preferred-citation: given-names: Dimitri - family-names: Vilotte given-names: Jean-Pierre - title: "The spectral-element method: an efficient tool to simulate the seismic response of 2D -and 3D geological structures" + title: "The spectral-element method: an efficient tool to simulate the seismic response of 2D and 3D geological structures" journal: "Bull. seism. Soc. Am." volume: 88 issue: 2